summaryrefslogtreecommitdiff
path: root/chromium/net
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net')
-rw-r--r--chromium/net/BUILD.gn200
-rw-r--r--chromium/net/android/BUILD.gn2
-rw-r--r--chromium/net/android/cert_verify_result_android.cc6
-rw-r--r--chromium/net/android/cert_verify_result_android.h8
-rw-r--r--chromium/net/android/dummy_spnego_authenticator.cc10
-rw-r--r--chromium/net/android/http_auth_negotiate_android.cc12
-rw-r--r--chromium/net/android/http_auth_negotiate_android_unittest.cc6
-rw-r--r--chromium/net/android/keystore.cc6
-rw-r--r--chromium/net/android/keystore.h6
-rw-r--r--chromium/net/android/network_change_notifier_android.cc35
-rw-r--r--chromium/net/android/network_change_notifier_android.h15
-rw-r--r--chromium/net/android/network_change_notifier_android_unittest.cc63
-rw-r--r--chromium/net/android/network_change_notifier_delegate_android.cc26
-rw-r--r--chromium/net/android/network_change_notifier_delegate_android.h25
-rw-r--r--chromium/net/android/network_change_notifier_factory_android.cc6
-rw-r--r--chromium/net/android/network_library.cc26
-rw-r--r--chromium/net/android/network_library.h28
-rw-r--r--chromium/net/android/network_library_unittest.cc34
-rw-r--r--chromium/net/android/radio_activity_tracker.cc6
-rw-r--r--chromium/net/android/traffic_stats.cc12
-rw-r--r--chromium/net/android/traffic_stats.h12
-rw-r--r--chromium/net/base/address_family.cc13
-rw-r--r--chromium/net/base/address_family.h3
-rw-r--r--chromium/net/base/address_family_unittest.cc7
-rw-r--r--chromium/net/base/address_list.cc4
-rw-r--r--chromium/net/base/address_tracker_linux.cc12
-rw-r--r--chromium/net/base/address_tracker_linux.h8
-rw-r--r--chromium/net/base/address_tracker_linux_unittest.cc8
-rw-r--r--chromium/net/base/backoff_entry_serializer.cc43
-rw-r--r--chromium/net/base/backoff_entry_serializer.h24
-rw-r--r--chromium/net/base/backoff_entry_serializer_unittest.cc17
-rw-r--r--chromium/net/base/chunked_upload_data_stream.cc5
-rw-r--r--chromium/net/base/chunked_upload_data_stream.h3
-rw-r--r--chromium/net/base/chunked_upload_data_stream_unittest.cc3
-rw-r--r--chromium/net/base/connection_endpoint_metadata.cc16
-rw-r--r--chromium/net/base/connection_endpoint_metadata.h8
-rw-r--r--chromium/net/base/connection_endpoint_metadata_test_util.cc27
-rw-r--r--chromium/net/base/connection_endpoint_metadata_test_util.h3
-rw-r--r--chromium/net/base/datagram_buffer.cc6
-rw-r--r--chromium/net/base/datagram_buffer.h4
-rw-r--r--chromium/net/base/datagram_buffer_unittest.cc8
-rw-r--r--chromium/net/base/directory_lister.cc4
-rw-r--r--chromium/net/base/directory_lister_unittest.cc7
-rw-r--r--chromium/net/base/elements_upload_data_stream.cc4
-rw-r--r--chromium/net/base/elements_upload_data_stream_unittest.cc100
-rw-r--r--chromium/net/base/expiring_cache.h2
-rw-r--r--chromium/net/base/expiring_cache_unittest.cc4
-rw-r--r--chromium/net/base/features.cc57
-rw-r--r--chromium/net/base/features.h65
-rw-r--r--chromium/net/base/file_stream_context_win.cc3
-rw-r--r--chromium/net/base/file_stream_unittest.cc54
-rw-r--r--chromium/net/base/filename_util_unittest.cc2
-rw-r--r--chromium/net/base/interval_test.cc6
-rw-r--r--chromium/net/base/io_buffer.cc3
-rw-r--r--chromium/net/base/ip_address.h3
-rw-r--r--chromium/net/base/isolation_info.cc96
-rw-r--r--chromium/net/base/isolation_info.h20
-rw-r--r--chromium/net/base/isolation_info_unittest.cc197
-rw-r--r--chromium/net/base/load_flags_list.h9
-rw-r--r--chromium/net/base/logging_network_change_observer.cc19
-rw-r--r--chromium/net/base/logging_network_change_observer.h13
-rw-r--r--chromium/net/base/mime_sniffer.cc4
-rw-r--r--chromium/net/base/mime_util.cc27
-rw-r--r--chromium/net/base/mime_util.h3
-rw-r--r--chromium/net/base/mock_file_stream.cc8
-rw-r--r--chromium/net/base/mock_network_change_notifier.cc18
-rw-r--r--chromium/net/base/mock_network_change_notifier.h13
-rw-r--r--chromium/net/base/net_error_details.h2
-rw-r--r--chromium/net/base/net_error_list.h11
-rw-r--r--chromium/net/base/net_string_util_icu_alternatives_ios.mm2
-rw-r--r--chromium/net/base/network_activity_monitor.cc6
-rw-r--r--chromium/net/base/network_activity_monitor.h6
-rw-r--r--chromium/net/base/network_activity_monitor_unittest.cc8
-rw-r--r--chromium/net/base/network_anonymization_key.cc107
-rw-r--r--chromium/net/base/network_anonymization_key.h172
-rw-r--r--chromium/net/base/network_anonymization_key_unittest.cc333
-rw-r--r--chromium/net/base/network_change_notifier.cc95
-rw-r--r--chromium/net/base/network_change_notifier.h77
-rw-r--r--chromium/net/base/network_change_notifier_factory.h4
-rw-r--r--chromium/net/base/network_change_notifier_fuchsia_unittest.cc2
-rw-r--r--chromium/net/base/network_change_notifier_mac.h3
-rw-r--r--chromium/net/base/network_change_notifier_mac.mm20
-rw-r--r--chromium/net/base/network_change_notifier_posix.cc2
-rw-r--r--chromium/net/base/network_change_notifier_posix_unittest.cc6
-rw-r--r--chromium/net/base/network_change_notifier_win.cc2
-rw-r--r--chromium/net/base/network_config_watcher_mac.cc24
-rw-r--r--chromium/net/base/network_delegate.cc10
-rw-r--r--chromium/net/base/network_delegate.h15
-rw-r--r--chromium/net/base/network_delegate_impl.cc13
-rw-r--r--chromium/net/base/network_delegate_impl.h6
-rw-r--r--chromium/net/base/network_handle.h27
-rw-r--r--chromium/net/base/network_interfaces_getifaddrs.cc4
-rw-r--r--chromium/net/base/network_interfaces_getifaddrs.h6
-rw-r--r--chromium/net/base/network_interfaces_getifaddrs_android.cc6
-rw-r--r--chromium/net/base/network_interfaces_getifaddrs_android.h6
-rw-r--r--chromium/net/base/network_interfaces_getifaddrs_unittest.cc2
-rw-r--r--chromium/net/base/network_interfaces_linux.cc22
-rw-r--r--chromium/net/base/network_interfaces_linux.h6
-rw-r--r--chromium/net/base/network_interfaces_posix.h6
-rw-r--r--chromium/net/base/network_interfaces_win.cc4
-rw-r--r--chromium/net/base/network_interfaces_win.h7
-rw-r--r--chromium/net/base/network_isolation_key.cc76
-rw-r--r--chromium/net/base/network_isolation_key.h12
-rw-r--r--chromium/net/base/network_isolation_key_unittest.cc130
-rw-r--r--chromium/net/base/prioritized_dispatcher.h2
-rw-r--r--chromium/net/base/prioritized_dispatcher_unittest.cc8
-rw-r--r--chromium/net/base/prioritized_task_runner.cc2
-rw-r--r--chromium/net/base/proxy_server.h2
-rw-r--r--chromium/net/base/registry_controlled_domains/effective_tld_names.dat197
-rw-r--r--chromium/net/base/registry_controlled_domains/effective_tld_names.gperf81
-rw-r--r--chromium/net/base/registry_controlled_domains/registry_controlled_domain.cc14
-rw-r--r--chromium/net/base/registry_controlled_domains/registry_controlled_domain.h6
-rw-r--r--chromium/net/base/registry_controlled_domains/registry_controlled_domain_unittest.cc6
-rw-r--r--chromium/net/base/schemeful_site.h6
-rw-r--r--chromium/net/base/test_completion_callback_unittest.cc2
-rw-r--r--chromium/net/base/upload_bytes_element_reader.cc4
-rw-r--r--chromium/net/base/upload_bytes_element_reader.h2
-rw-r--r--chromium/net/base/upload_data_stream.cc8
-rw-r--r--chromium/net/base/upload_data_stream.h6
-rw-r--r--chromium/net/base/upload_file_element_reader.cc9
-rw-r--r--chromium/net/base/url_util.cc3
-rw-r--r--chromium/net/base/url_util_unittest.cc2
-rw-r--r--chromium/net/cert/asn1_util.cc10
-rw-r--r--chromium/net/cert/asn1_util.h8
-rw-r--r--chromium/net/cert/cert_and_ct_verifier_unittest.cc2
-rw-r--r--chromium/net/cert/cert_database.cc3
-rw-r--r--chromium/net/cert/cert_database.h7
-rw-r--r--chromium/net/cert/cert_database_mac.cc19
-rw-r--r--chromium/net/cert/cert_net_fetcher.h6
-rw-r--r--chromium/net/cert/cert_verifier.h6
-rw-r--r--chromium/net/cert/cert_verify_proc.cc96
-rw-r--r--chromium/net/cert/cert_verify_proc_android.cc6
-rw-r--r--chromium/net/cert/cert_verify_proc_android_unittest.cc2
-rw-r--r--chromium/net/cert/cert_verify_proc_builtin.cc101
-rw-r--r--chromium/net/cert/cert_verify_proc_builtin.h11
-rw-r--r--chromium/net/cert/cert_verify_proc_builtin_unittest.cc311
-rw-r--r--chromium/net/cert/cert_verify_proc_ios.cc10
-rw-r--r--chromium/net/cert/cert_verify_proc_mac.cc50
-rw-r--r--chromium/net/cert/cert_verify_proc_mac_unittest.cc24
-rw-r--r--chromium/net/cert/cert_verify_proc_unittest.cc117
-rw-r--r--chromium/net/cert/cert_verify_proc_win.cc29
-rw-r--r--chromium/net/cert/client_cert_verifier.h6
-rw-r--r--chromium/net/cert/crl_set.cc14
-rw-r--r--chromium/net/cert/ct_log_response_parser.cc8
-rw-r--r--chromium/net/cert/ct_log_response_parser.h8
-rw-r--r--chromium/net/cert/ct_log_response_parser_unittest.cc8
-rw-r--r--chromium/net/cert/ct_log_verifier.cc5
-rw-r--r--chromium/net/cert/ct_log_verifier_unittest.cc8
-rw-r--r--chromium/net/cert/ct_log_verifier_util.cc12
-rw-r--r--chromium/net/cert/ct_log_verifier_util.h12
-rw-r--r--chromium/net/cert/ct_objects_extractor.cc8
-rw-r--r--chromium/net/cert/ct_objects_extractor.h8
-rw-r--r--chromium/net/cert/ct_objects_extractor_unittest.cc8
-rw-r--r--chromium/net/cert/ct_policy_status.h8
-rw-r--r--chromium/net/cert/ct_sct_to_string.cc8
-rw-r--r--chromium/net/cert/ct_sct_to_string.h8
-rw-r--r--chromium/net/cert/ct_serialization.cc11
-rw-r--r--chromium/net/cert/ct_serialization.h8
-rw-r--r--chromium/net/cert/ct_signed_certificate_timestamp_log_param.cc6
-rw-r--r--chromium/net/cert/ct_verifier.h2
-rw-r--r--chromium/net/cert/internal/cert_issuer_source_aia.cc4
-rw-r--r--chromium/net/cert/internal/cert_issuer_source_aia.h2
-rw-r--r--chromium/net/cert/internal/cert_issuer_source_aia_unittest.cc27
-rw-r--r--chromium/net/cert/internal/cert_issuer_source_sync_unittest.cc2
-rw-r--r--chromium/net/cert/internal/crl_getcrlstatusforcert_fuzzer.cc2
-rw-r--r--chromium/net/cert/internal/crl_parse_crl_certificatelist_fuzzer.cc2
-rw-r--r--chromium/net/cert/internal/crl_parse_crl_tbscertlist_fuzzer.cc2
-rw-r--r--chromium/net/cert/internal/crl_parse_issuing_distribution_point_fuzzer.cc2
-rw-r--r--chromium/net/cert/internal/crl_unittest.cc8
-rw-r--r--chromium/net/cert/internal/general_names_unittest.cc4
-rw-r--r--chromium/net/cert/internal/parse_authority_key_identifier_fuzzer.cc2
-rw-r--r--chromium/net/cert/internal/revocation_checker.cc13
-rw-r--r--chromium/net/cert/internal/revocation_checker.h6
-rw-r--r--chromium/net/cert/internal/revocation_checker_unittest.cc53
-rw-r--r--chromium/net/cert/internal/revocation_util_unittest.cc2
-rw-r--r--chromium/net/cert/internal/signature_algorithm.h156
-rw-r--r--chromium/net/cert/internal/system_trust_store.cc223
-rw-r--r--chromium/net/cert/internal/system_trust_store.h5
-rw-r--r--chromium/net/cert/internal/system_trust_store_nss.h14
-rw-r--r--chromium/net/cert/internal/system_trust_store_nss_unittest.cc9
-rw-r--r--chromium/net/cert/internal/system_trust_store_unittest.cc2
-rw-r--r--chromium/net/cert/internal/trust_store_chrome.cc32
-rw-r--r--chromium/net/cert/internal/trust_store_chrome.h8
-rw-r--r--chromium/net/cert/internal/trust_store_chrome_unittest.cc4
-rw-r--r--chromium/net/cert/internal/trust_store_mac.cc429
-rw-r--r--chromium/net/cert/internal/trust_store_mac.h26
-rw-r--r--chromium/net/cert/internal/trust_store_mac_unittest.cc165
-rw-r--r--chromium/net/cert/internal/trust_store_nss.cc44
-rw-r--r--chromium/net/cert/internal/trust_store_nss.h78
-rw-r--r--chromium/net/cert/internal/trust_store_nss_unittest.cc38
-rw-r--r--chromium/net/cert/internal/trust_store_win.cc6
-rw-r--r--chromium/net/cert/internal/trust_store_win.h2
-rw-r--r--chromium/net/cert/internal/trust_store_win_unittest.cc10
-rw-r--r--chromium/net/cert/known_roots_mac.cc4
-rw-r--r--chromium/net/cert/known_roots_nss.cc3
-rw-r--r--chromium/net/cert/merkle_audit_proof.cc6
-rw-r--r--chromium/net/cert/merkle_audit_proof.h6
-rw-r--r--chromium/net/cert/merkle_audit_proof_unittest.cc6
-rw-r--r--chromium/net/cert/merkle_consistency_proof.cc8
-rw-r--r--chromium/net/cert/merkle_consistency_proof.h8
-rw-r--r--chromium/net/cert/merkle_tree_leaf.cc8
-rw-r--r--chromium/net/cert/merkle_tree_leaf_unittest.cc8
-rw-r--r--chromium/net/cert/nss_cert_database.cc6
-rw-r--r--chromium/net/cert/nss_cert_database.h4
-rw-r--r--chromium/net/cert/nss_profile_filter_chromeos.cc36
-rw-r--r--chromium/net/cert/nss_profile_filter_chromeos_unittest.cc4
-rw-r--r--chromium/net/cert/pem.cc11
-rw-r--r--chromium/net/cert/pki/README.md11
-rw-r--r--chromium/net/cert/pki/cert_error_id.cc (renamed from chromium/net/cert/internal/cert_error_id.cc)2
-rw-r--r--chromium/net/cert/pki/cert_error_id.h (renamed from chromium/net/cert/internal/cert_error_id.h)6
-rw-r--r--chromium/net/cert/pki/cert_error_params.cc (renamed from chromium/net/cert/internal/cert_error_params.cc)2
-rw-r--r--chromium/net/cert/pki/cert_error_params.h (renamed from chromium/net/cert/internal/cert_error_params.h)6
-rw-r--r--chromium/net/cert/pki/cert_errors.cc (renamed from chromium/net/cert/internal/cert_errors.cc)43
-rw-r--r--chromium/net/cert/pki/cert_errors.h (renamed from chromium/net/cert/internal/cert_errors.h)10
-rw-r--r--chromium/net/cert/pki/cert_issuer_source.h (renamed from chromium/net/cert/internal/cert_issuer_source.h)8
-rw-r--r--chromium/net/cert/pki/cert_issuer_source_static.cc (renamed from chromium/net/cert/internal/cert_issuer_source_static.cc)6
-rw-r--r--chromium/net/cert/pki/cert_issuer_source_static.h (renamed from chromium/net/cert/internal/cert_issuer_source_static.h)11
-rw-r--r--chromium/net/cert/pki/cert_issuer_source_static_unittest.cc (renamed from chromium/net/cert/internal/cert_issuer_source_static_unittest.cc)6
-rw-r--r--chromium/net/cert/pki/cert_issuer_source_sync_unittest.h (renamed from chromium/net/cert/internal/cert_issuer_source_sync_unittest.h)12
-rw-r--r--chromium/net/cert/pki/certificate_policies.cc (renamed from chromium/net/cert/internal/certificate_policies.cc)6
-rw-r--r--chromium/net/cert/pki/certificate_policies.h (renamed from chromium/net/cert/internal/certificate_policies.h)6
-rw-r--r--chromium/net/cert/pki/certificate_policies_unittest.cc (renamed from chromium/net/cert/internal/certificate_policies_unittest.cc)4
-rw-r--r--chromium/net/cert/pki/common_cert_errors.cc (renamed from chromium/net/cert/internal/common_cert_errors.cc)10
-rw-r--r--chromium/net/cert/pki/common_cert_errors.h (renamed from chromium/net/cert/internal/common_cert_errors.h)16
-rw-r--r--chromium/net/cert/pki/crl.cc (renamed from chromium/net/cert/internal/crl.cc)34
-rw-r--r--chromium/net/cert/pki/crl.h (renamed from chromium/net/cert/internal/crl.h)10
-rw-r--r--chromium/net/cert/pki/extended_key_usage.cc (renamed from chromium/net/cert/internal/extended_key_usage.cc)2
-rw-r--r--chromium/net/cert/pki/extended_key_usage.h (renamed from chromium/net/cert/internal/extended_key_usage.h)6
-rw-r--r--chromium/net/cert/pki/extended_key_usage_unittest.cc (renamed from chromium/net/cert/internal/extended_key_usage_unittest.cc)2
-rw-r--r--chromium/net/cert/pki/general_names.cc (renamed from chromium/net/cert/internal/general_names.cc)17
-rw-r--r--chromium/net/cert/pki/general_names.h (renamed from chromium/net/cert/internal/general_names.h)8
-rw-r--r--chromium/net/cert/pki/name_constraints.cc (renamed from chromium/net/cert/internal/name_constraints.cc)16
-rw-r--r--chromium/net/cert/pki/name_constraints.h (renamed from chromium/net/cert/internal/name_constraints.h)8
-rw-r--r--chromium/net/cert/pki/name_constraints_unittest.cc (renamed from chromium/net/cert/internal/name_constraints_unittest.cc)6
-rw-r--r--chromium/net/cert/pki/nist_pkits_unittest.cc (renamed from chromium/net/cert/internal/nist_pkits_unittest.cc)25
-rw-r--r--chromium/net/cert/pki/nist_pkits_unittest.h (renamed from chromium/net/cert/internal/nist_pkits_unittest.h)8
-rw-r--r--chromium/net/cert/pki/ocsp.cc (renamed from chromium/net/cert/internal/ocsp.cc)23
-rw-r--r--chromium/net/cert/pki/ocsp.h (renamed from chromium/net/cert/internal/ocsp.h)12
-rw-r--r--chromium/net/cert/pki/ocsp_parse_ocsp_cert_id_fuzzer.cc (renamed from chromium/net/cert/internal/ocsp_parse_ocsp_cert_id_fuzzer.cc)2
-rw-r--r--chromium/net/cert/pki/ocsp_parse_ocsp_response_data_fuzzer.cc (renamed from chromium/net/cert/internal/ocsp_parse_ocsp_response_data_fuzzer.cc)2
-rw-r--r--chromium/net/cert/pki/ocsp_parse_ocsp_response_fuzzer.cc (renamed from chromium/net/cert/internal/ocsp_parse_ocsp_response_fuzzer.cc)2
-rw-r--r--chromium/net/cert/pki/ocsp_parse_ocsp_single_response_fuzzer.cc (renamed from chromium/net/cert/internal/ocsp_parse_ocsp_single_response_fuzzer.cc)2
-rw-r--r--chromium/net/cert/pki/ocsp_unittest.cc (renamed from chromium/net/cert/internal/ocsp_unittest.cc)7
-rw-r--r--chromium/net/cert/pki/parse_certificate.cc (renamed from chromium/net/cert/internal/parse_certificate.cc)11
-rw-r--r--chromium/net/cert/pki/parse_certificate.h (renamed from chromium/net/cert/internal/parse_certificate.h)10
-rw-r--r--chromium/net/cert/pki/parse_certificate_fuzzer.cc (renamed from chromium/net/cert/internal/parse_certificate_fuzzer.cc)4
-rw-r--r--chromium/net/cert/pki/parse_certificate_unittest.cc (renamed from chromium/net/cert/internal/parse_certificate_unittest.cc)20
-rw-r--r--chromium/net/cert/pki/parse_name.cc (renamed from chromium/net/cert/internal/parse_name.cc)2
-rw-r--r--chromium/net/cert/pki/parse_name.h (renamed from chromium/net/cert/internal/parse_name.h)6
-rw-r--r--chromium/net/cert/pki/parse_name_unittest.cc (renamed from chromium/net/cert/internal/parse_name_unittest.cc)4
-rw-r--r--chromium/net/cert/pki/parsed_certificate.cc (renamed from chromium/net/cert/internal/parsed_certificate.cc)25
-rw-r--r--chromium/net/cert/pki/parsed_certificate.h (renamed from chromium/net/cert/internal/parsed_certificate.h)26
-rw-r--r--chromium/net/cert/pki/parsed_certificate_unittest.cc (renamed from chromium/net/cert/internal/parsed_certificate_unittest.cc)11
-rw-r--r--chromium/net/cert/pki/path_builder.cc (renamed from chromium/net/cert/internal/path_builder.cc)30
-rw-r--r--chromium/net/cert/pki/path_builder.h (renamed from chromium/net/cert/internal/path_builder.h)22
-rw-r--r--chromium/net/cert/pki/path_builder_pkits_unittest.cc (renamed from chromium/net/cert/internal/path_builder_pkits_unittest.cc)20
-rw-r--r--chromium/net/cert/pki/path_builder_unittest.cc (renamed from chromium/net/cert/internal/path_builder_unittest.cc)48
-rw-r--r--chromium/net/cert/pki/path_builder_verify_certificate_chain_unittest.cc (renamed from chromium/net/cert/internal/path_builder_verify_certificate_chain_unittest.cc)10
-rw-r--r--chromium/net/cert/pki/revocation_util.cc (renamed from chromium/net/cert/internal/revocation_util.cc)2
-rw-r--r--chromium/net/cert/pki/revocation_util.h (renamed from chromium/net/cert/internal/revocation_util.h)6
-rw-r--r--chromium/net/cert/pki/signature_algorithm.cc (renamed from chromium/net/cert/internal/signature_algorithm.cc)412
-rw-r--r--chromium/net/cert/pki/signature_algorithm.h95
-rw-r--r--chromium/net/cert/pki/signature_algorithm_unittest.cc (renamed from chromium/net/cert/internal/signature_algorithm_unittest.cc)322
-rw-r--r--chromium/net/cert/pki/simple_path_builder_delegate.cc (renamed from chromium/net/cert/internal/simple_path_builder_delegate.cc)79
-rw-r--r--chromium/net/cert/pki/simple_path_builder_delegate.h (renamed from chromium/net/cert/internal/simple_path_builder_delegate.h)18
-rw-r--r--chromium/net/cert/pki/simple_path_builder_delegate_unittest.cc (renamed from chromium/net/cert/internal/simple_path_builder_delegate_unittest.cc)38
-rw-r--r--chromium/net/cert/pki/test_helpers.cc (renamed from chromium/net/cert/internal/test_helpers.cc)27
-rw-r--r--chromium/net/cert/pki/test_helpers.h (renamed from chromium/net/cert/internal/test_helpers.h)14
-rw-r--r--chromium/net/cert/pki/trust_store.cc (renamed from chromium/net/cert/internal/trust_store.cc)2
-rw-r--r--chromium/net/cert/pki/trust_store.h (renamed from chromium/net/cert/internal/trust_store.h)10
-rw-r--r--chromium/net/cert/pki/trust_store_collection.cc (renamed from chromium/net/cert/internal/trust_store_collection.cc)2
-rw-r--r--chromium/net/cert/pki/trust_store_collection.h (renamed from chromium/net/cert/internal/trust_store_collection.h)8
-rw-r--r--chromium/net/cert/pki/trust_store_collection_unittest.cc (renamed from chromium/net/cert/internal/trust_store_collection_unittest.cc)6
-rw-r--r--chromium/net/cert/pki/trust_store_in_memory.cc (renamed from chromium/net/cert/internal/trust_store_in_memory.cc)2
-rw-r--r--chromium/net/cert/pki/trust_store_in_memory.h (renamed from chromium/net/cert/internal/trust_store_in_memory.h)8
-rw-r--r--chromium/net/cert/pki/verify_certificate_chain.cc (renamed from chromium/net/cert/internal/verify_certificate_chain.cc)47
-rw-r--r--chromium/net/cert/pki/verify_certificate_chain.h (renamed from chromium/net/cert/internal/verify_certificate_chain.h)12
-rw-r--r--chromium/net/cert/pki/verify_certificate_chain_pkits_unittest.cc (renamed from chromium/net/cert/internal/verify_certificate_chain_pkits_unittest.cc)10
-rw-r--r--chromium/net/cert/pki/verify_certificate_chain_typed_unittest.h (renamed from chromium/net/cert/internal/verify_certificate_chain_typed_unittest.h)14
-rw-r--r--chromium/net/cert/pki/verify_certificate_chain_unittest.cc (renamed from chromium/net/cert/internal/verify_certificate_chain_unittest.cc)10
-rw-r--r--chromium/net/cert/pki/verify_name_match.cc (renamed from chromium/net/cert/internal/verify_name_match.cc)15
-rw-r--r--chromium/net/cert/pki/verify_name_match.h (renamed from chromium/net/cert/internal/verify_name_match.h)6
-rw-r--r--chromium/net/cert/pki/verify_name_match_fuzzer.cc (renamed from chromium/net/cert/internal/verify_name_match_fuzzer.cc)2
-rw-r--r--chromium/net/cert/pki/verify_name_match_normalizename_fuzzer.cc (renamed from chromium/net/cert/internal/verify_name_match_normalizename_fuzzer.cc)4
-rw-r--r--chromium/net/cert/pki/verify_name_match_unittest.cc (renamed from chromium/net/cert/internal/verify_name_match_unittest.cc)4
-rw-r--r--chromium/net/cert/pki/verify_name_match_verifynameinsubtree_fuzzer.cc (renamed from chromium/net/cert/internal/verify_name_match_verifynameinsubtree_fuzzer.cc)2
-rw-r--r--chromium/net/cert/pki/verify_signed_data.cc (renamed from chromium/net/cert/internal/verify_signed_data.cc)143
-rw-r--r--chromium/net/cert/pki/verify_signed_data.h (renamed from chromium/net/cert/internal/verify_signed_data.h)13
-rw-r--r--chromium/net/cert/pki/verify_signed_data_unittest.cc (renamed from chromium/net/cert/internal/verify_signed_data_unittest.cc)12
-rw-r--r--chromium/net/cert/root_cert_list_generated.h7
-rw-r--r--chromium/net/cert/sct_status_flags.cc8
-rw-r--r--chromium/net/cert/sct_status_flags.h8
-rw-r--r--chromium/net/cert/signed_certificate_timestamp.cc11
-rw-r--r--chromium/net/cert/signed_certificate_timestamp.h8
-rw-r--r--chromium/net/cert/signed_certificate_timestamp_unittest.cc8
-rw-r--r--chromium/net/cert/signed_tree_head.cc6
-rw-r--r--chromium/net/cert/signed_tree_head.h8
-rw-r--r--chromium/net/cert/test_root_certs.cc37
-rw-r--r--chromium/net/cert/test_root_certs.h49
-rw-r--r--chromium/net/cert/test_root_certs_android.cc2
-rw-r--r--chromium/net/cert/test_root_certs_builtin.cc2
-rw-r--r--chromium/net/cert/test_root_certs_mac.cc4
-rw-r--r--chromium/net/cert/test_root_certs_unittest.cc115
-rw-r--r--chromium/net/cert/trial_comparison_cert_verifier.cc6
-rw-r--r--chromium/net/cert/trial_comparison_cert_verifier_util.cc4
-rw-r--r--chromium/net/cert/x509_cert_types.cc2
-rw-r--r--chromium/net/cert/x509_certificate.cc35
-rw-r--r--chromium/net/cert/x509_certificate_unittest.cc12
-rw-r--r--chromium/net/cert/x509_util.cc61
-rw-r--r--chromium/net/cert/x509_util.h6
-rw-r--r--chromium/net/cert/x509_util_apple.cc16
-rw-r--r--chromium/net/cert/x509_util_apple.h4
-rw-r--r--chromium/net/cert/x509_util_mac.cc9
-rw-r--r--chromium/net/cert/x509_util_mac.h8
-rw-r--r--chromium/net/cert/x509_util_nss.cc20
-rw-r--r--chromium/net/cert/x509_util_nss.h8
-rw-r--r--chromium/net/cert/x509_util_unittest.cc14
-rw-r--r--chromium/net/cert/x509_util_win.h8
-rw-r--r--chromium/net/cert_net/cert_net_fetcher_url_request.cc13
-rw-r--r--chromium/net/cookies/canonical_cookie.cc193
-rw-r--r--chromium/net/cookies/canonical_cookie.h10
-rw-r--r--chromium/net/cookies/canonical_cookie_unittest.cc238
-rw-r--r--chromium/net/cookies/cookie_access_delegate.cc25
-rw-r--r--chromium/net/cookies/cookie_access_delegate.h41
-rw-r--r--chromium/net/cookies/cookie_constants.h22
-rw-r--r--chromium/net/cookies/cookie_inclusion_status.cc37
-rw-r--r--chromium/net/cookies/cookie_inclusion_status.h65
-rw-r--r--chromium/net/cookies/cookie_monster.cc84
-rw-r--r--chromium/net/cookies/cookie_monster.h21
-rw-r--r--chromium/net/cookies/cookie_monster_perftest.cc14
-rw-r--r--chromium/net/cookies/cookie_monster_store_test.cc9
-rw-r--r--chromium/net/cookies/cookie_monster_unittest.cc368
-rw-r--r--chromium/net/cookies/cookie_partition_key_collection.cc23
-rw-r--r--chromium/net/cookies/cookie_partition_key_collection_unittest.cc10
-rw-r--r--chromium/net/cookies/cookie_partition_key_unittest.cc25
-rw-r--r--chromium/net/cookies/cookie_store_test_callbacks.h3
-rw-r--r--chromium/net/cookies/cookie_store_test_helpers.cc7
-rw-r--r--chromium/net/cookies/cookie_util.cc24
-rw-r--r--chromium/net/cookies/cookie_util.h2
-rw-r--r--chromium/net/cookies/cookie_util_unittest.cc10
-rw-r--r--chromium/net/cookies/first_party_set_entry.cc77
-rw-r--r--chromium/net/cookies/first_party_set_entry.h84
-rw-r--r--chromium/net/cookies/first_party_set_metadata.cc23
-rw-r--r--chromium/net/cookies/first_party_set_metadata.h31
-rw-r--r--chromium/net/cookies/first_party_sets_context_config.cc24
-rw-r--r--chromium/net/cookies/first_party_sets_context_config.h42
-rw-r--r--chromium/net/cookies/parsed_cookie.cc7
-rw-r--r--chromium/net/cookies/parsed_cookie_unittest.cc8
-rw-r--r--chromium/net/cookies/same_party_context.cc27
-rw-r--r--chromium/net/cookies/same_party_context.h22
-rw-r--r--chromium/net/cookies/test_cookie_access_delegate.cc49
-rw-r--r--chromium/net/cookies/test_cookie_access_delegate.h27
-rw-r--r--chromium/net/data/cache_tests/good_2_0/contents.txt38
-rw-r--r--chromium/net/data/cache_tests/good_2_0/data_0bin0 -> 10496 bytes
-rw-r--r--chromium/net/data/cache_tests/good_2_0/data_1bin0 -> 24576 bytes
-rw-r--r--chromium/net/data/cache_tests/good_2_0/data_2bin0 -> 73728 bytes
-rw-r--r--chromium/net/data/cache_tests/good_2_0/data_3bin0 -> 8192 bytes
-rw-r--r--chromium/net/data/cache_tests/good_2_0/indexbin0 -> 262512 bytes
-rw-r--r--chromium/net/data/cache_tests/good_2_1/contents.txt39
-rw-r--r--chromium/net/data/cache_tests/good_2_1/data_0bin0 -> 10496 bytes
-rw-r--r--chromium/net/data/cache_tests/good_2_1/data_1bin0 -> 24576 bytes
-rw-r--r--chromium/net/data/cache_tests/good_2_1/data_2bin0 -> 73728 bytes
-rw-r--r--chromium/net/data/cache_tests/good_2_1/data_3bin0 -> 8192 bytes
-rw-r--r--chromium/net/data/cache_tests/good_2_1/indexbin0 -> 262512 bytes
-rwxr-xr-xchromium/net/data/gencerts/__init__.py8
-rw-r--r--chromium/net/data/ssl/chrome_root_store/OWNERS6
-rw-r--r--chromium/net/data/ssl/chrome_root_store/README.md41
-rw-r--r--chromium/net/data/ssl/chrome_root_store/root_store.md146
-rw-r--r--chromium/net/data/ssl/chrome_root_store/root_store.textproto183
-rw-r--r--chromium/net/data/ssl/root_stores/root_stores.json70537
-rwxr-xr-xchromium/net/data/ssl/root_stores/update_root_stores.py11
-rw-r--r--chromium/net/der/encode_values.cc8
-rw-r--r--chromium/net/der/encode_values.h8
-rw-r--r--chromium/net/der/encode_values_unittest.cc10
-rw-r--r--chromium/net/der/input.cc8
-rw-r--r--chromium/net/der/input.h10
-rw-r--r--chromium/net/der/input_unittest.cc8
-rw-r--r--chromium/net/der/parse_values.cc54
-rw-r--r--chromium/net/der/parse_values.h15
-rw-r--r--chromium/net/der/parse_values_unittest.cc24
-rw-r--r--chromium/net/der/parser.cc8
-rw-r--r--chromium/net/der/parser.h8
-rw-r--r--chromium/net/der/parser_unittest.cc8
-rw-r--r--chromium/net/der/tag.cc8
-rw-r--r--chromium/net/der/tag.h8
-rw-r--r--chromium/net/disk_cache/backend_cleanup_tracker.cc9
-rw-r--r--chromium/net/disk_cache/backend_unittest.cc400
-rw-r--r--chromium/net/disk_cache/blockfile/backend_impl.cc105
-rw-r--r--chromium/net/disk_cache/blockfile/backend_impl.h9
-rw-r--r--chromium/net/disk_cache/blockfile/bitmap.cc28
-rw-r--r--chromium/net/disk_cache/blockfile/bitmap.h12
-rw-r--r--chromium/net/disk_cache/blockfile/block_files.cc10
-rw-r--r--chromium/net/disk_cache/blockfile/block_files_unittest.cc20
-rw-r--r--chromium/net/disk_cache/blockfile/disk_format.cc2
-rw-r--r--chromium/net/disk_cache/blockfile/disk_format.h10
-rw-r--r--chromium/net/disk_cache/blockfile/entry_impl.cc15
-rw-r--r--chromium/net/disk_cache/blockfile/entry_impl.h5
-rw-r--r--chromium/net/disk_cache/blockfile/file.h2
-rw-r--r--chromium/net/disk_cache/blockfile/file_block.h2
-rw-r--r--chromium/net/disk_cache/blockfile/file_ios.cc19
-rw-r--r--chromium/net/disk_cache/blockfile/file_win.cc6
-rw-r--r--chromium/net/disk_cache/blockfile/in_flight_backend_io.cc97
-rw-r--r--chromium/net/disk_cache/blockfile/in_flight_backend_io.h2
-rw-r--r--chromium/net/disk_cache/blockfile/in_flight_io.h2
-rw-r--r--chromium/net/disk_cache/blockfile/mapped_file.cc2
-rw-r--r--chromium/net/disk_cache/blockfile/mapped_file_posix.cc2
-rw-r--r--chromium/net/disk_cache/blockfile/mapped_file_unittest.cc4
-rw-r--r--chromium/net/disk_cache/blockfile/mapped_file_win.cc2
-rw-r--r--chromium/net/disk_cache/blockfile/rankings.cc19
-rw-r--r--chromium/net/disk_cache/blockfile/sparse_control.cc19
-rw-r--r--chromium/net/disk_cache/blockfile/stats.cc6
-rw-r--r--chromium/net/disk_cache/blockfile/stats_unittest.cc8
-rw-r--r--chromium/net/disk_cache/blockfile/storage_block.h2
-rw-r--r--chromium/net/disk_cache/blockfile/storage_block_unittest.cc12
-rw-r--r--chromium/net/disk_cache/disk_cache.cc129
-rw-r--r--chromium/net/disk_cache/disk_cache.h85
-rw-r--r--chromium/net/disk_cache/disk_cache_fuzzer.cc45
-rw-r--r--chromium/net/disk_cache/disk_cache_perftest.cc19
-rw-r--r--chromium/net/disk_cache/disk_cache_test_base.cc31
-rw-r--r--chromium/net/disk_cache/disk_cache_test_util.cc15
-rw-r--r--chromium/net/disk_cache/disk_cache_test_util.h25
-rw-r--r--chromium/net/disk_cache/entry_unittest.cc22
-rw-r--r--chromium/net/disk_cache/memory/mem_backend_impl.cc9
-rw-r--r--chromium/net/disk_cache/memory/mem_entry_impl.cc8
-rw-r--r--chromium/net/disk_cache/net_log_parameters.cc54
-rw-r--r--chromium/net/disk_cache/simple/post_doom_waiter.cc4
-rw-r--r--chromium/net/disk_cache/simple/post_doom_waiter.h2
-rw-r--r--chromium/net/disk_cache/simple/simple_backend_impl.cc18
-rw-r--r--chromium/net/disk_cache/simple/simple_backend_impl.h4
-rw-r--r--chromium/net/disk_cache/simple/simple_entry_format_history.h8
-rw-r--r--chromium/net/disk_cache/simple/simple_entry_impl.cc64
-rw-r--r--chromium/net/disk_cache/simple/simple_file_tracker.cc2
-rw-r--r--chromium/net/disk_cache/simple/simple_file_tracker.h4
-rw-r--r--chromium/net/disk_cache/simple/simple_file_tracker_unittest.cc7
-rw-r--r--chromium/net/disk_cache/simple/simple_index.cc42
-rw-r--r--chromium/net/disk_cache/simple/simple_index_delegate.h2
-rw-r--r--chromium/net/disk_cache/simple/simple_index_file.cc6
-rw-r--r--chromium/net/disk_cache/simple/simple_index_file_unittest.cc10
-rw-r--r--chromium/net/disk_cache/simple/simple_index_unittest.cc7
-rw-r--r--chromium/net/disk_cache/simple/simple_net_log_parameters.cc16
-rw-r--r--chromium/net/disk_cache/simple/simple_synchronous_entry.cc19
-rw-r--r--chromium/net/disk_cache/simple/simple_test_util.cc6
-rw-r--r--chromium/net/disk_cache/simple/simple_test_util.h9
-rw-r--r--chromium/net/disk_cache/simple/simple_util.cc8
-rw-r--r--chromium/net/disk_cache/simple/simple_util.h8
-rw-r--r--chromium/net/disk_cache/simple/simple_util_posix.cc6
-rw-r--r--chromium/net/dns/BUILD.gn3
-rw-r--r--chromium/net/dns/address_info.cc6
-rw-r--r--chromium/net/dns/address_info.h11
-rw-r--r--chromium/net/dns/address_info_unittest.cc9
-rw-r--r--chromium/net/dns/address_sorter.h4
-rw-r--r--chromium/net/dns/address_sorter_posix.cc11
-rw-r--r--chromium/net/dns/address_sorter_posix_unittest.cc73
-rw-r--r--chromium/net/dns/address_sorter_win.cc2
-rw-r--r--chromium/net/dns/context_host_resolver.cc5
-rw-r--r--chromium/net/dns/context_host_resolver.h8
-rw-r--r--chromium/net/dns/context_host_resolver_unittest.cc37
-rw-r--r--chromium/net/dns/dns_alias_utility.cc8
-rw-r--r--chromium/net/dns/dns_alias_utility.h8
-rw-r--r--chromium/net/dns/dns_client.cc10
-rw-r--r--chromium/net/dns/dns_client.h4
-rw-r--r--chromium/net/dns/dns_client_unittest.cc3
-rw-r--r--chromium/net/dns/dns_config_service_android_unittest.cc6
-rw-r--r--chromium/net/dns/dns_config_service_linux.cc42
-rw-r--r--chromium/net/dns/dns_config_service_linux_unittest.cc34
-rw-r--r--chromium/net/dns/dns_config_service_posix.cc6
-rw-r--r--chromium/net/dns/dns_config_service_posix_unittest.cc9
-rw-r--r--chromium/net/dns/dns_config_service_unittest.cc3
-rw-r--r--chromium/net/dns/dns_config_service_win.cc2
-rw-r--r--chromium/net/dns/dns_config_watcher_mac.cc3
-rw-r--r--chromium/net/dns/dns_config_watcher_mac.h6
-rw-r--r--chromium/net/dns/dns_query.cc40
-rw-r--r--chromium/net/dns/dns_query_unittest.cc4
-rw-r--r--chromium/net/dns/dns_response.h2
-rw-r--r--chromium/net/dns/dns_response_result_extractor.cc25
-rw-r--r--chromium/net/dns/dns_response_result_extractor.h2
-rw-r--r--chromium/net/dns/dns_response_result_extractor_unittest.cc134
-rw-r--r--chromium/net/dns/dns_response_unittest.cc15
-rw-r--r--chromium/net/dns/dns_test_util.cc31
-rw-r--r--chromium/net/dns/dns_test_util.h10
-rw-r--r--chromium/net/dns/dns_transaction.cc13
-rw-r--r--chromium/net/dns/dns_transaction.h5
-rw-r--r--chromium/net/dns/dns_transaction_unittest.cc317
-rw-r--r--chromium/net/dns/dns_util_unittest.cc12
-rw-r--r--chromium/net/dns/fuzzed_host_resolver_util.cc3
-rw-r--r--chromium/net/dns/host_cache.cc195
-rw-r--r--chromium/net/dns/host_cache.h64
-rw-r--r--chromium/net/dns/host_cache_unittest.cc717
-rw-r--r--chromium/net/dns/host_resolver.cc111
-rw-r--r--chromium/net/dns/host_resolver.h51
-rw-r--r--chromium/net/dns/host_resolver_manager.cc240
-rw-r--r--chromium/net/dns/host_resolver_manager.h24
-rw-r--r--chromium/net/dns/host_resolver_manager_fuzzer.cc6
-rw-r--r--chromium/net/dns/host_resolver_manager_unittest.cc220
-rw-r--r--chromium/net/dns/host_resolver_mdns_listener_impl.cc9
-rw-r--r--chromium/net/dns/host_resolver_mdns_task.cc12
-rw-r--r--chromium/net/dns/host_resolver_proc.cc40
-rw-r--r--chromium/net/dns/host_resolver_proc.h23
-rw-r--r--chromium/net/dns/httpssvc_metrics.cc6
-rw-r--r--chromium/net/dns/mapped_host_resolver_unittest.cc64
-rw-r--r--chromium/net/dns/mdns_client.cc13
-rw-r--r--chromium/net/dns/mdns_client.h10
-rw-r--r--chromium/net/dns/mdns_client_impl.cc39
-rw-r--r--chromium/net/dns/mdns_client_impl.h4
-rw-r--r--chromium/net/dns/mdns_client_unittest.cc91
-rw-r--r--chromium/net/dns/mock_host_resolver.cc350
-rw-r--r--chromium/net/dns/mock_host_resolver.h103
-rw-r--r--chromium/net/dns/mock_mdns_client.h4
-rw-r--r--chromium/net/dns/mock_mdns_socket_factory.cc5
-rw-r--r--chromium/net/dns/mock_mdns_socket_factory.h3
-rw-r--r--chromium/net/dns/opt_record_rdata.cc303
-rw-r--r--chromium/net/dns/opt_record_rdata.h225
-rw-r--r--chromium/net/dns/opt_record_rdata_unittest.cc459
-rw-r--r--chromium/net/dns/public/dns_protocol.h3
-rw-r--r--chromium/net/dns/public/resolve_error_info.cc2
-rw-r--r--chromium/net/dns/public/resolve_error_info.h3
-rw-r--r--chromium/net/dns/record_parsed.cc10
-rw-r--r--chromium/net/dns/record_rdata.cc90
-rw-r--r--chromium/net/dns/record_rdata.h55
-rw-r--r--chromium/net/dns/record_rdata_unittest.cc76
-rw-r--r--chromium/net/dns/resolve_context.cc16
-rw-r--r--chromium/net/dns/resolve_context.h10
-rw-r--r--chromium/net/dns/resolve_context_unittest.cc9
-rw-r--r--chromium/net/docs/adding_doh_providers.md42
-rw-r--r--chromium/net/docs/bug-triage.md8
-rw-r--r--chromium/net/docs/net-log.md14
-rw-r--r--chromium/net/extras/preload_data/decoder.cc10
-rw-r--r--chromium/net/extras/preload_data/decoder.h8
-rw-r--r--chromium/net/extras/sqlite/OWNERS1
-rw-r--r--chromium/net/extras/sqlite/cookie_crypto_delegate.h2
-rw-r--r--chromium/net/extras/sqlite/sqlite_persistent_cookie_store.cc20
-rw-r--r--chromium/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc4
-rw-r--r--chromium/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc108
-rw-r--r--chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc4
-rw-r--r--chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc2
-rw-r--r--chromium/net/features.gni2
-rw-r--r--chromium/net/filter/brotli_source_stream.cc23
-rw-r--r--chromium/net/filter/brotli_source_stream_fuzzer.cc4
-rw-r--r--chromium/net/filter/brotli_source_stream_unittest.cc2
-rw-r--r--chromium/net/filter/filter_source_stream.cc36
-rw-r--r--chromium/net/filter/filter_source_stream.h16
-rw-r--r--chromium/net/filter/filter_source_stream_unittest.cc138
-rw-r--r--chromium/net/filter/gzip_header.cc4
-rw-r--r--chromium/net/filter/gzip_header.h6
-rw-r--r--chromium/net/filter/gzip_source_stream.cc47
-rw-r--r--chromium/net/filter/gzip_source_stream.h12
-rw-r--r--chromium/net/filter/gzip_source_stream_unittest.cc2
-rw-r--r--chromium/net/http/OWNERS3
-rw-r--r--chromium/net/http/alternative_service.h8
-rw-r--r--chromium/net/http/bidirectional_stream.cc2
-rw-r--r--chromium/net/http/bidirectional_stream.h2
-rw-r--r--chromium/net/http/bidirectional_stream_impl.h2
-rw-r--r--chromium/net/http/bidirectional_stream_unittest.cc219
-rw-r--r--chromium/net/http/broken_alternative_services.h4
-rw-r--r--chromium/net/http/broken_alternative_services_unittest.cc8
-rw-r--r--chromium/net/http/http_auth_cache.cc2
-rw-r--r--chromium/net/http/http_auth_controller.cc8
-rw-r--r--chromium/net/http/http_auth_controller_unittest.cc20
-rw-r--r--chromium/net/http/http_auth_filter.h2
-rw-r--r--chromium/net/http/http_auth_filter_unittest.cc4
-rw-r--r--chromium/net/http/http_auth_gssapi_posix.cc147
-rw-r--r--chromium/net/http/http_auth_gssapi_posix.h37
-rw-r--r--chromium/net/http/http_auth_gssapi_posix_unittest.cc24
-rw-r--r--chromium/net/http/http_auth_handler_basic.cc4
-rw-r--r--chromium/net/http/http_auth_handler_basic.h5
-rw-r--r--chromium/net/http/http_auth_handler_basic_unittest.cc22
-rw-r--r--chromium/net/http/http_auth_handler_digest.cc12
-rw-r--r--chromium/net/http/http_auth_handler_digest.h6
-rw-r--r--chromium/net/http/http_auth_handler_digest_unittest.cc62
-rw-r--r--chromium/net/http/http_auth_handler_factory.cc42
-rw-r--r--chromium/net/http/http_auth_handler_factory.h4
-rw-r--r--chromium/net/http/http_auth_handler_factory_unittest.cc37
-rw-r--r--chromium/net/http/http_auth_handler_mock.cc5
-rw-r--r--chromium/net/http/http_auth_handler_mock.h3
-rw-r--r--chromium/net/http/http_auth_handler_negotiate.cc40
-rw-r--r--chromium/net/http/http_auth_handler_negotiate_unittest.cc33
-rw-r--r--chromium/net/http/http_auth_handler_ntlm.h4
-rw-r--r--chromium/net/http/http_auth_handler_ntlm_portable.cc6
-rw-r--r--chromium/net/http/http_auth_handler_ntlm_win.cc8
-rw-r--r--chromium/net/http/http_auth_preferences.cc8
-rw-r--r--chromium/net/http/http_auth_preferences.h22
-rw-r--r--chromium/net/http/http_auth_preferences_unittest.cc10
-rw-r--r--chromium/net/http/http_auth_sspi_win.cc72
-rw-r--r--chromium/net/http/http_auth_unittest.cc14
-rw-r--r--chromium/net/http/http_basic_state_unittest.cc18
-rw-r--r--chromium/net/http/http_basic_stream.cc11
-rw-r--r--chromium/net/http/http_basic_stream.h2
-rw-r--r--chromium/net/http/http_byte_range_unittest.cc38
-rw-r--r--chromium/net/http/http_cache.cc297
-rw-r--r--chromium/net/http/http_cache.h98
-rw-r--r--chromium/net/http/http_cache_lookup_manager.cc10
-rw-r--r--chromium/net/http/http_cache_transaction.cc252
-rw-r--r--chromium/net/http/http_cache_transaction.h15
-rw-r--r--chromium/net/http/http_cache_unittest.cc196
-rw-r--r--chromium/net/http/http_cache_writers.cc59
-rw-r--r--chromium/net/http/http_chunked_decoder_unittest.cc4
-rw-r--r--chromium/net/http/http_content_disposition_unittest.cc21
-rw-r--r--chromium/net/http/http_network_session.cc15
-rw-r--r--chromium/net/http/http_network_session.h27
-rw-r--r--chromium/net/http/http_network_transaction.cc17
-rw-r--r--chromium/net/http/http_network_transaction_unittest.cc562
-rw-r--r--chromium/net/http/http_proxy_client_socket.cc4
-rw-r--r--chromium/net/http/http_proxy_client_socket.h2
-rw-r--r--chromium/net/http/http_proxy_client_socket_fuzzer.cc4
-rw-r--r--chromium/net/http/http_proxy_client_socket_unittest.cc15
-rw-r--r--chromium/net/http/http_proxy_connect_job.cc10
-rw-r--r--chromium/net/http/http_proxy_connect_job_unittest.cc2
-rw-r--r--chromium/net/http/http_request_headers.cc78
-rw-r--r--chromium/net/http/http_request_headers.h12
-rw-r--r--chromium/net/http/http_response_body_drainer.cc8
-rw-r--r--chromium/net/http/http_response_body_drainer.h4
-rw-r--r--chromium/net/http/http_response_body_drainer_unittest.cc40
-rw-r--r--chromium/net/http/http_response_headers.cc40
-rw-r--r--chromium/net/http/http_response_headers.h1
-rw-r--r--chromium/net/http/http_response_headers_unittest.cc76
-rw-r--r--chromium/net/http/http_response_info.cc15
-rw-r--r--chromium/net/http/http_response_info.h2
-rw-r--r--chromium/net/http/http_response_info_unittest.cc20
-rw-r--r--chromium/net/http/http_server_properties.cc30
-rw-r--r--chromium/net/http/http_server_properties.h18
-rw-r--r--chromium/net/http/http_server_properties_manager.cc53
-rw-r--r--chromium/net/http/http_server_properties_manager_unittest.cc166
-rw-r--r--chromium/net/http/http_status_code.cc7
-rw-r--r--chromium/net/http/http_status_code.h4
-rw-r--r--chromium/net/http/http_status_code_list.h101
-rw-r--r--chromium/net/http/http_stream.h6
-rw-r--r--chromium/net/http/http_stream_factory.cc2
-rw-r--r--chromium/net/http/http_stream_factory.h12
-rw-r--r--chromium/net/http/http_stream_factory_job.cc134
-rw-r--r--chromium/net/http/http_stream_factory_job.h40
-rw-r--r--chromium/net/http/http_stream_factory_job_controller.cc438
-rw-r--r--chromium/net/http/http_stream_factory_job_controller.h51
-rw-r--r--chromium/net/http/http_stream_factory_job_controller_unittest.cc1804
-rw-r--r--chromium/net/http/http_stream_factory_test_util.cc65
-rw-r--r--chromium/net/http/http_stream_factory_test_util.h36
-rw-r--r--chromium/net/http/http_stream_factory_unittest.cc180
-rw-r--r--chromium/net/http/http_stream_parser.cc20
-rw-r--r--chromium/net/http/http_stream_parser.h5
-rw-r--r--chromium/net/http/http_stream_parser_unittest.cc31
-rw-r--r--chromium/net/http/http_stream_request.cc2
-rw-r--r--chromium/net/http/http_stream_request.h6
-rw-r--r--chromium/net/http/http_transaction.h2
-rw-r--r--chromium/net/http/http_transaction_factory.h2
-rw-r--r--chromium/net/http/http_transaction_test_util.cc15
-rw-r--r--chromium/net/http/http_util.cc6
-rw-r--r--chromium/net/http/http_util_unittest.cc73
-rw-r--r--chromium/net/http/http_vary_data_unittest.cc2
-rw-r--r--chromium/net/http/http_version.h3
-rw-r--r--chromium/net/http/mock_http_cache.cc47
-rw-r--r--chromium/net/http/mock_http_cache.h28
-rw-r--r--chromium/net/http/proxy_client_socket.h4
-rw-r--r--chromium/net/http/structured_headers.h6
-rw-r--r--chromium/net/http/transport_security_persister.cc93
-rw-r--r--chromium/net/http/transport_security_persister_unittest.cc16
-rw-r--r--chromium/net/http/transport_security_state.cc49
-rw-r--r--chromium/net/http/transport_security_state.h11
-rw-r--r--chromium/net/http/transport_security_state_static.json.gzbin1409536 -> 1433904 bytes
-rw-r--r--chromium/net/http/transport_security_state_static.pins4
-rw-r--r--chromium/net/http/transport_security_state_unittest.cc43
-rw-r--r--chromium/net/http/url_security_manager.h4
-rw-r--r--chromium/net/http/url_security_manager_unittest.cc13
-rw-r--r--chromium/net/http/url_security_manager_win.cc4
-rw-r--r--chromium/net/http/webfonts_histogram.cc6
-rw-r--r--chromium/net/http/webfonts_histogram.h8
-rw-r--r--chromium/net/http/webfonts_histogram_unittest.cc6
-rw-r--r--chromium/net/log/file_net_log_observer.cc12
-rw-r--r--chromium/net/log/file_net_log_observer_unittest.cc9
-rw-r--r--chromium/net/log/net_log_event_type_list.h35
-rw-r--r--chromium/net/log/net_log_source.cc5
-rw-r--r--chromium/net/log/net_log_source.h2
-rw-r--r--chromium/net/log/net_log_unittest.cc20
-rw-r--r--chromium/net/log/net_log_util.cc4
-rw-r--r--chromium/net/log/net_log_with_source.cc2
-rw-r--r--chromium/net/log/trace_net_log_observer.cc12
-rw-r--r--chromium/net/log/trace_net_log_observer_unittest.cc9
-rw-r--r--chromium/net/network_error_logging/mock_persistent_nel_store.h2
-rw-r--r--chromium/net/network_error_logging/network_error_logging_service.cc12
-rw-r--r--chromium/net/network_error_logging/network_error_logging_service_unittest.cc268
-rw-r--r--chromium/net/nqe/cached_network_quality.cc12
-rw-r--r--chromium/net/nqe/cached_network_quality.h12
-rw-r--r--chromium/net/nqe/effective_connection_type_observer.h4
-rw-r--r--chromium/net/nqe/event_creator.cc29
-rw-r--r--chromium/net/nqe/event_creator.h8
-rw-r--r--chromium/net/nqe/event_creator_unittest.cc12
-rw-r--r--chromium/net/nqe/network_id.cc8
-rw-r--r--chromium/net/nqe/network_id.h8
-rw-r--r--chromium/net/nqe/network_id_unittest.cc8
-rw-r--r--chromium/net/nqe/network_qualities_prefs_manager.h2
-rw-r--r--chromium/net/nqe/network_qualities_prefs_manager_unittest.cc8
-rw-r--r--chromium/net/nqe/network_quality.cc8
-rw-r--r--chromium/net/nqe/network_quality.h8
-rw-r--r--chromium/net/nqe/network_quality_estimator.cc8
-rw-r--r--chromium/net/nqe/network_quality_estimator.h14
-rw-r--r--chromium/net/nqe/network_quality_estimator_params_unittest.cc12
-rw-r--r--chromium/net/nqe/network_quality_estimator_unittest.cc4
-rw-r--r--chromium/net/nqe/network_quality_estimator_util.cc9
-rw-r--r--chromium/net/nqe/network_quality_estimator_util.h8
-rw-r--r--chromium/net/nqe/network_quality_estimator_util_unittest.cc18
-rw-r--r--chromium/net/nqe/network_quality_observation.cc12
-rw-r--r--chromium/net/nqe/network_quality_observation.h12
-rw-r--r--chromium/net/nqe/network_quality_observation_source.h8
-rw-r--r--chromium/net/nqe/network_quality_store.cc22
-rw-r--r--chromium/net/nqe/network_quality_store.h16
-rw-r--r--chromium/net/nqe/observation_buffer.cc12
-rw-r--r--chromium/net/nqe/observation_buffer.h8
-rw-r--r--chromium/net/nqe/observation_buffer_unittest.cc12
-rw-r--r--chromium/net/nqe/peer_to_peer_connections_count_observer.h4
-rw-r--r--chromium/net/nqe/pref_names.cc8
-rw-r--r--chromium/net/nqe/pref_names.h8
-rw-r--r--chromium/net/nqe/rtt_throughput_estimates_observer.h4
-rw-r--r--chromium/net/nqe/socket_watcher.cc12
-rw-r--r--chromium/net/nqe/socket_watcher.h8
-rw-r--r--chromium/net/nqe/socket_watcher_factory.cc12
-rw-r--r--chromium/net/nqe/socket_watcher_factory.h8
-rw-r--r--chromium/net/nqe/socket_watcher_unittest.cc12
-rw-r--r--chromium/net/nqe/throughput_analyzer.cc15
-rw-r--r--chromium/net/nqe/throughput_analyzer.h8
-rw-r--r--chromium/net/nqe/throughput_analyzer_unittest.cc32
-rw-r--r--chromium/net/nqe/weighted_observation.h18
-rw-r--r--chromium/net/ntlm/ntlm.cc10
-rw-r--r--chromium/net/ntlm/ntlm.h6
-rw-r--r--chromium/net/ntlm/ntlm_buffer_reader.cc8
-rw-r--r--chromium/net/ntlm/ntlm_buffer_reader.h6
-rw-r--r--chromium/net/ntlm/ntlm_buffer_reader_unittest.cc6
-rw-r--r--chromium/net/ntlm/ntlm_buffer_writer.cc6
-rw-r--r--chromium/net/ntlm/ntlm_buffer_writer.h6
-rw-r--r--chromium/net/ntlm/ntlm_buffer_writer_unittest.cc6
-rw-r--r--chromium/net/ntlm/ntlm_client.cc6
-rw-r--r--chromium/net/ntlm/ntlm_client.h6
-rw-r--r--chromium/net/ntlm/ntlm_client_unittest.cc6
-rw-r--r--chromium/net/ntlm/ntlm_constants.cc7
-rw-r--r--chromium/net/ntlm/ntlm_constants.h6
-rw-r--r--chromium/net/ntlm/ntlm_test_data.h8
-rw-r--r--chromium/net/ntlm/ntlm_unittest.cc6
-rw-r--r--chromium/net/proxy_resolution/configured_proxy_resolution_service.cc155
-rw-r--r--chromium/net/proxy_resolution/configured_proxy_resolution_service.h25
-rw-r--r--chromium/net/proxy_resolution/configured_proxy_resolution_service_unittest.cc991
-rw-r--r--chromium/net/proxy_resolution/mock_proxy_resolver.cc6
-rw-r--r--chromium/net/proxy_resolution/multi_threaded_proxy_resolver.cc36
-rw-r--r--chromium/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc10
-rw-r--r--chromium/net/proxy_resolution/network_delegate_error_observer.cc3
-rw-r--r--chromium/net/proxy_resolution/pac_file_data.cc12
-rw-r--r--chromium/net/proxy_resolution/pac_file_decider.cc6
-rw-r--r--chromium/net/proxy_resolution/pac_file_decider.h2
-rw-r--r--chromium/net/proxy_resolution/pac_file_decider_unittest.cc9
-rw-r--r--chromium/net/proxy_resolution/polling_proxy_config_service.cc4
-rw-r--r--chromium/net/proxy_resolution/proxy_config.cc24
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service.cc143
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service.h17
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_android.cc15
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_android.h2
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_android_unittest.cc23
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_common_unittest.cc5
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_ios.cc3
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_linux.cc55
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_linux.h6
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_linux_unittest.cc120
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_mac.cc21
-rw-r--r--chromium/net/proxy_resolution/proxy_config_service_mac.h3
-rw-r--r--chromium/net/proxy_resolution/proxy_config_unittest.cc16
-rw-r--r--chromium/net/proxy_resolution/proxy_list_unittest.cc14
-rw-r--r--chromium/net/proxy_resolution/proxy_resolver.h6
-rw-r--r--chromium/net/proxy_resolution/proxy_resolver_error_observer.h4
-rw-r--r--chromium/net/proxy_resolution/proxy_resolver_factory.h2
-rw-r--r--chromium/net/proxy_resolution/proxy_resolver_mac.cc29
-rw-r--r--chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.cc8
-rw-r--r--chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.h2
-rw-r--r--chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win_unittest.cc13
-rw-r--r--chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.cc71
-rw-r--r--chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.h4
-rw-r--r--chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win_unittest.cc67
-rw-r--r--chromium/net/proxy_resolution/win/proxy_config_service_win.h6
-rw-r--r--chromium/net/quic/bidirectional_stream_quic_impl.cc2
-rw-r--r--chromium/net/quic/bidirectional_stream_quic_impl.h2
-rw-r--r--chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc134
-rw-r--r--chromium/net/quic/crypto/proof_source_chromium.cc4
-rw-r--r--chromium/net/quic/crypto/proof_test_chromium.cc20
-rw-r--r--chromium/net/quic/crypto/proof_verifier_chromium.cc4
-rw-r--r--chromium/net/quic/crypto/proof_verifier_chromium_test.cc72
-rw-r--r--chromium/net/quic/crypto_test_utils_chromium.cc3
-rw-r--r--chromium/net/quic/dedicated_web_transport_http3_client.cc16
-rw-r--r--chromium/net/quic/dedicated_web_transport_http3_client.h3
-rw-r--r--chromium/net/quic/dedicated_web_transport_http3_client_test.cc10
-rw-r--r--chromium/net/quic/mock_crypto_client_stream.cc2
-rw-r--r--chromium/net/quic/mock_crypto_client_stream.h6
-rw-r--r--chromium/net/quic/mock_crypto_client_stream_factory.cc21
-rw-r--r--chromium/net/quic/mock_crypto_client_stream_factory.h10
-rw-r--r--chromium/net/quic/mock_decrypter.h2
-rw-r--r--chromium/net/quic/mock_encrypter.h2
-rw-r--r--chromium/net/quic/mock_quic_data.cc22
-rw-r--r--chromium/net/quic/mock_quic_data.h6
-rw-r--r--chromium/net/quic/network_connection_unittest.cc6
-rw-r--r--chromium/net/quic/platform/impl/quic_chromium_clock_test.cc6
-rw-r--r--chromium/net/quic/properties_based_quic_server_info.cc2
-rw-r--r--chromium/net/quic/properties_based_quic_server_info_test.cc6
-rw-r--r--chromium/net/quic/quic_address_mismatch_test.cc6
-rw-r--r--chromium/net/quic/quic_chromium_alarm_factory.cc2
-rw-r--r--chromium/net/quic/quic_chromium_alarm_factory_test.cc8
-rw-r--r--chromium/net/quic/quic_chromium_client_session.cc160
-rw-r--r--chromium/net/quic/quic_chromium_client_session.h76
-rw-r--r--chromium/net/quic/quic_chromium_client_session_peer.cc6
-rw-r--r--chromium/net/quic/quic_chromium_client_session_test.cc115
-rw-r--r--chromium/net/quic/quic_chromium_client_stream.cc17
-rw-r--r--chromium/net/quic/quic_chromium_client_stream.h8
-rw-r--r--chromium/net/quic/quic_chromium_client_stream_test.cc8
-rw-r--r--chromium/net/quic/quic_chromium_connection_helper.cc2
-rw-r--r--chromium/net/quic/quic_chromium_connection_helper_test.cc6
-rw-r--r--chromium/net/quic/quic_chromium_packet_reader.cc2
-rw-r--r--chromium/net/quic/quic_chromium_packet_reader.h2
-rw-r--r--chromium/net/quic/quic_chromium_packet_writer.cc4
-rw-r--r--chromium/net/quic/quic_clock_skew_detector_test.cc6
-rw-r--r--chromium/net/quic/quic_connectivity_monitor.cc22
-rw-r--r--chromium/net/quic/quic_connectivity_monitor.h60
-rw-r--r--chromium/net/quic/quic_context.cc8
-rw-r--r--chromium/net/quic/quic_context.h3
-rw-r--r--chromium/net/quic/quic_crypto_client_stream_factory.cc9
-rw-r--r--chromium/net/quic/quic_crypto_client_stream_factory.h5
-rw-r--r--chromium/net/quic/quic_end_to_end_unittest.cc12
-rw-r--r--chromium/net/quic/quic_http3_logger.cc2
-rw-r--r--chromium/net/quic/quic_http_stream.cc4
-rw-r--r--chromium/net/quic/quic_http_stream_test.cc28
-rw-r--r--chromium/net/quic/quic_http_utils.h2
-rw-r--r--chromium/net/quic/quic_http_utils_test.cc6
-rw-r--r--chromium/net/quic/quic_network_transaction_unittest.cc107
-rw-r--r--chromium/net/quic/quic_proxy_client_socket.cc4
-rw-r--r--chromium/net/quic/quic_proxy_client_socket.h2
-rw-r--r--chromium/net/quic/quic_proxy_client_socket_unittest.cc38
-rw-r--r--chromium/net/quic/quic_server_info.cc10
-rw-r--r--chromium/net/quic/quic_stream_factory.cc116
-rw-r--r--chromium/net/quic/quic_stream_factory.h43
-rw-r--r--chromium/net/quic/quic_stream_factory_peer.cc16
-rw-r--r--chromium/net/quic/quic_stream_factory_test.cc297
-rw-r--r--chromium/net/quic/quic_test_packet_maker.cc37
-rw-r--r--chromium/net/quic/quic_test_packet_maker.h9
-rw-r--r--chromium/net/quic/test_quic_crypto_client_config_handle.h3
-rw-r--r--chromium/net/quic/test_task_runner.cc12
-rw-r--r--chromium/net/quic/test_task_runner.h8
-rw-r--r--chromium/net/reporting/reporting_cache_impl.cc8
-rw-r--r--chromium/net/reporting/reporting_cache_impl.h2
-rw-r--r--chromium/net/reporting/reporting_delegate.cc2
-rw-r--r--chromium/net/reporting/reporting_delivery_agent.cc5
-rw-r--r--chromium/net/reporting/reporting_delivery_agent_unittest.cc73
-rw-r--r--chromium/net/reporting/reporting_endpoint_manager.cc3
-rw-r--r--chromium/net/reporting/reporting_garbage_collector.cc2
-rw-r--r--chromium/net/reporting/reporting_network_change_observer.cc2
-rw-r--r--chromium/net/reporting/reporting_service.h2
-rw-r--r--chromium/net/reporting/reporting_service_unittest.cc7
-rw-r--r--chromium/net/reporting/reporting_test_util.cc13
-rw-r--r--chromium/net/reporting/reporting_uploader.cc3
-rw-r--r--chromium/net/server/http_connection.cc4
-rw-r--r--chromium/net/server/http_server.h2
-rw-r--r--chromium/net/server/http_server_unittest.cc17
-rw-r--r--chromium/net/socket/client_socket_factory.cc7
-rw-r--r--chromium/net/socket/client_socket_factory.h2
-rw-r--r--chromium/net/socket/client_socket_pool.h8
-rw-r--r--chromium/net/socket/client_socket_pool_base_unittest.cc38
-rw-r--r--chromium/net/socket/client_socket_pool_unittest.cc2
-rw-r--r--chromium/net/socket/connect_job.h4
-rw-r--r--chromium/net/socket/connect_job_unittest.cc4
-rw-r--r--chromium/net/socket/datagram_client_socket.h86
-rw-r--r--chromium/net/socket/datagram_server_socket.h2
-rw-r--r--chromium/net/socket/datagram_socket.h2
-rw-r--r--chromium/net/socket/fuzzed_datagram_client_socket.cc35
-rw-r--r--chromium/net/socket/fuzzed_datagram_client_socket.h22
-rw-r--r--chromium/net/socket/fuzzed_socket_factory.cc3
-rw-r--r--chromium/net/socket/network_binding_client_socket_factory.cc2
-rw-r--r--chromium/net/socket/network_binding_client_socket_factory.h7
-rw-r--r--chromium/net/socket/socket_bio_adapter.h2
-rw-r--r--chromium/net/socket/socket_performance_watcher.h2
-rw-r--r--chromium/net/socket/socket_performance_watcher_factory.h4
-rw-r--r--chromium/net/socket/socket_posix.cc2
-rw-r--r--chromium/net/socket/socket_tag.h2
-rw-r--r--chromium/net/socket/socket_test_util.cc114
-rw-r--r--chromium/net/socket/socket_test_util.h38
-rw-r--r--chromium/net/socket/socks5_client_socket_fuzzer.cc4
-rw-r--r--chromium/net/socket/socks5_client_socket_unittest.cc19
-rw-r--r--chromium/net/socket/socks_client_socket.cc1
-rw-r--r--chromium/net/socket/socks_client_socket_fuzzer.cc4
-rw-r--r--chromium/net/socket/socks_client_socket_unittest.cc22
-rw-r--r--chromium/net/socket/socks_connect_job.cc5
-rw-r--r--chromium/net/socket/socks_connect_job_unittest.cc2
-rw-r--r--chromium/net/socket/ssl_client_socket.cc7
-rw-r--r--chromium/net/socket/ssl_client_socket.h4
-rw-r--r--chromium/net/socket/ssl_client_socket_impl.cc12
-rw-r--r--chromium/net/socket/ssl_client_socket_unittest.cc234
-rw-r--r--chromium/net/socket/ssl_connect_job.cc20
-rw-r--r--chromium/net/socket/ssl_connect_job_unittest.cc90
-rw-r--r--chromium/net/socket/ssl_server_socket.h4
-rw-r--r--chromium/net/socket/ssl_server_socket_unittest.cc19
-rw-r--r--chromium/net/socket/ssl_socket.h22
-rw-r--r--chromium/net/socket/stream_socket.h2
-rw-r--r--chromium/net/socket/tcp_client_socket.cc25
-rw-r--r--chromium/net/socket/tcp_client_socket.h15
-rw-r--r--chromium/net/socket/tcp_client_socket_unittest.cc3
-rw-r--r--chromium/net/socket/tcp_socket_posix.cc13
-rw-r--r--chromium/net/socket/tcp_socket_posix.h9
-rw-r--r--chromium/net/socket/tcp_socket_unittest.cc10
-rw-r--r--chromium/net/socket/tcp_socket_win.cc37
-rw-r--r--chromium/net/socket/tcp_socket_win.h9
-rw-r--r--chromium/net/socket/transport_client_socket.cc6
-rw-r--r--chromium/net/socket/transport_client_socket.h6
-rw-r--r--chromium/net/socket/transport_client_socket_pool.cc27
-rw-r--r--chromium/net/socket/transport_client_socket_pool.h1
-rw-r--r--chromium/net/socket/transport_client_socket_pool_unittest.cc67
-rw-r--r--chromium/net/socket/transport_connect_job_unittest.cc50
-rw-r--r--chromium/net/socket/udp_client_socket.cc63
-rw-r--r--chromium/net/socket/udp_client_socket.h36
-rw-r--r--chromium/net/socket/udp_net_log_parameters.cc12
-rw-r--r--chromium/net/socket/udp_net_log_parameters.h7
-rw-r--r--chromium/net/socket/udp_socket_perftest.cc7
-rw-r--r--chromium/net/socket/udp_socket_posix.cc362
-rw-r--r--chromium/net/socket/udp_socket_posix.h198
-rw-r--r--chromium/net/socket/udp_socket_posix_unittest.cc726
-rw-r--r--chromium/net/socket/udp_socket_unittest.cc38
-rw-r--r--chromium/net/socket/udp_socket_win.cc51
-rw-r--r--chromium/net/socket/udp_socket_win.h22
-rw-r--r--chromium/net/socket/unix_domain_client_socket_posix_unittest.cc2
-rw-r--r--chromium/net/socket/unix_domain_server_socket_posix.cc2
-rw-r--r--chromium/net/socket/websocket_transport_client_socket_pool.cc13
-rw-r--r--chromium/net/socket/websocket_transport_client_socket_pool.h1
-rw-r--r--chromium/net/socket/websocket_transport_client_socket_pool_unittest.cc2
-rw-r--r--chromium/net/spdy/bidirectional_stream_spdy_impl.cc2
-rw-r--r--chromium/net/spdy/bidirectional_stream_spdy_impl.h2
-rw-r--r--chromium/net/spdy/buffered_spdy_framer.cc4
-rw-r--r--chromium/net/spdy/buffered_spdy_framer.h14
-rw-r--r--chromium/net/spdy/buffered_spdy_framer_unittest.cc2
-rw-r--r--chromium/net/spdy/header_coalescer.h2
-rw-r--r--chromium/net/spdy/header_coalescer_test.cc7
-rw-r--r--chromium/net/spdy/http2_push_promise_index.h4
-rw-r--r--chromium/net/spdy/http2_push_promise_index_test.cc8
-rw-r--r--chromium/net/spdy/multiplexed_http_stream.cc4
-rw-r--r--chromium/net/spdy/multiplexed_http_stream.h4
-rw-r--r--chromium/net/spdy/multiplexed_session.h2
-rw-r--r--chromium/net/spdy/server_push_delegate.h4
-rw-r--r--chromium/net/spdy/spdy_buffer.cc4
-rw-r--r--chromium/net/spdy/spdy_http_stream.cc4
-rw-r--r--chromium/net/spdy/spdy_http_stream_unittest.cc8
-rw-r--r--chromium/net/spdy/spdy_http_utils.cc2
-rw-r--r--chromium/net/spdy/spdy_http_utils.h2
-rw-r--r--chromium/net/spdy/spdy_log_util.h2
-rw-r--r--chromium/net/spdy/spdy_network_transaction_unittest.cc177
-rw-r--r--chromium/net/spdy/spdy_proxy_client_socket.cc4
-rw-r--r--chromium/net/spdy/spdy_proxy_client_socket.h2
-rw-r--r--chromium/net/spdy/spdy_proxy_client_socket_unittest.cc2
-rw-r--r--chromium/net/spdy/spdy_read_queue_unittest.cc6
-rw-r--r--chromium/net/spdy/spdy_session.cc12
-rw-r--r--chromium/net/spdy/spdy_session.h4
-rw-r--r--chromium/net/spdy/spdy_session_pool.cc25
-rw-r--r--chromium/net/spdy/spdy_session_pool.h2
-rw-r--r--chromium/net/spdy/spdy_session_pool_unittest.cc45
-rw-r--r--chromium/net/spdy/spdy_session_unittest.cc38
-rw-r--r--chromium/net/spdy/spdy_stream.h6
-rw-r--r--chromium/net/spdy/spdy_stream_test_util.cc8
-rw-r--r--chromium/net/spdy/spdy_stream_test_util.h8
-rw-r--r--chromium/net/spdy/spdy_stream_unittest.cc46
-rw-r--r--chromium/net/spdy/spdy_test_util_common.cc13
-rw-r--r--chromium/net/spdy/spdy_write_queue.cc5
-rw-r--r--chromium/net/ssl/client_cert_store.h4
-rw-r--r--chromium/net/ssl/client_cert_store_mac.cc60
-rw-r--r--chromium/net/ssl/client_cert_store_mac_unittest.cc4
-rw-r--r--chromium/net/ssl/client_cert_store_nss.h7
-rw-r--r--chromium/net/ssl/client_cert_store_nss_unittest.cc22
-rw-r--r--chromium/net/ssl/ssl_cipher_suite_names_unittest.cc4
-rw-r--r--chromium/net/ssl/ssl_client_auth_cache.cc4
-rw-r--r--chromium/net/ssl/ssl_config_service.cc6
-rw-r--r--chromium/net/ssl/ssl_config_service.h6
-rw-r--r--chromium/net/ssl/ssl_info.h3
-rw-r--r--chromium/net/ssl/ssl_key_logger.h2
-rw-r--r--chromium/net/ssl/ssl_legacy_crypto_fallback.h7
-rw-r--r--chromium/net/ssl/ssl_platform_key_android.cc2
-rw-r--r--chromium/net/ssl/ssl_platform_key_mac.cc2
-rw-r--r--chromium/net/ssl/ssl_platform_key_nss.cc57
-rw-r--r--chromium/net/ssl/ssl_platform_key_win_unittest.cc51
-rw-r--r--chromium/net/ssl/ssl_private_key.h4
-rw-r--r--chromium/net/ssl/ssl_server_config.h3
-rw-r--r--chromium/net/ssl/threaded_ssl_private_key.cc30
-rw-r--r--chromium/net/ssl/threaded_ssl_private_key.h4
-rw-r--r--chromium/net/test/android/javatests/src/org/chromium/net/AndroidNetworkLibraryTestUtil.java8
-rw-r--r--chromium/net/test/android/net_test_jni_onload.cc6
-rw-r--r--chromium/net/test/android/net_test_jni_onload.h6
-rw-r--r--chromium/net/test/cert_builder.cc270
-rw-r--r--chromium/net/test/cert_builder.h77
-rw-r--r--chromium/net/test/ct_test_util.cc12
-rw-r--r--chromium/net/test/ct_test_util.h8
-rw-r--r--chromium/net/test/embedded_test_server/DEPS4
-rw-r--r--chromium/net/test/embedded_test_server/android/embedded_test_server_android.cc6
-rw-r--r--chromium/net/test/embedded_test_server/android/embedded_test_server_android.h8
-rw-r--r--chromium/net/test/embedded_test_server/connection_tracker.cc6
-rw-r--r--chromium/net/test/embedded_test_server/connection_tracker.h6
-rw-r--r--chromium/net/test/embedded_test_server/controllable_http_response.cc12
-rw-r--r--chromium/net/test/embedded_test_server/controllable_http_response.h8
-rw-r--r--chromium/net/test/embedded_test_server/default_handlers.cc9
-rw-r--r--chromium/net/test/embedded_test_server/default_handlers.h6
-rw-r--r--chromium/net/test/embedded_test_server/embedded_test_server.cc25
-rw-r--r--chromium/net/test/embedded_test_server/embedded_test_server.h7
-rw-r--r--chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.cc6
-rw-r--r--chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.h4
-rw-r--r--chromium/net/test/embedded_test_server/embedded_test_server_unittest.cc6
-rw-r--r--chromium/net/test/embedded_test_server/http1_connection.cc6
-rw-r--r--chromium/net/test/embedded_test_server/http2_connection.cc4
-rw-r--r--chromium/net/test/embedded_test_server/http2_connection.h6
-rw-r--r--chromium/net/test/embedded_test_server/http_connection.cc6
-rw-r--r--chromium/net/test/embedded_test_server/http_request.cc6
-rw-r--r--chromium/net/test/embedded_test_server/http_request_unittest.cc6
-rw-r--r--chromium/net/test/embedded_test_server/http_response.cc6
-rw-r--r--chromium/net/test/embedded_test_server/http_response.h14
-rw-r--r--chromium/net/test/embedded_test_server/http_response_unittest.cc6
-rw-r--r--chromium/net/test/embedded_test_server/request_handler_util.cc6
-rw-r--r--chromium/net/test/embedded_test_server/request_handler_util.h6
-rw-r--r--chromium/net/test/embedded_test_server/simple_connection_listener.cc6
-rw-r--r--chromium/net/test/gtest_util.h6
-rw-r--r--chromium/net/test/key_util.cc8
-rw-r--r--chromium/net/test/keychain_test_util_mac.cc8
-rw-r--r--chromium/net/test/net_test_suite.cc3
-rw-r--r--chromium/net/test/quic_simple_test_server.cc2
-rw-r--r--chromium/net/test/quic_simple_test_server.h2
-rw-r--r--chromium/net/test/revocation_builder.cc123
-rw-r--r--chromium/net/test/revocation_builder.h27
-rw-r--r--chromium/net/test/scoped_disable_exit_on_dfatal.cc6
-rw-r--r--chromium/net/test/scoped_disable_exit_on_dfatal.h6
-rw-r--r--chromium/net/test/spawned_test_server/base_test_server.cc57
-rw-r--r--chromium/net/test/spawned_test_server/base_test_server.h8
-rw-r--r--chromium/net/test/spawned_test_server/local_test_server_posix.cc7
-rw-r--r--chromium/net/test/spawned_test_server/remote_test_server.cc16
-rw-r--r--chromium/net/test/spawned_test_server/remote_test_server.h8
-rw-r--r--chromium/net/test/spawned_test_server/remote_test_server_spawner_request.cc7
-rw-r--r--chromium/net/test/ssl_test_util.cc8
-rw-r--r--chromium/net/test/ssl_test_util.h4
-rw-r--r--chromium/net/test/url_request/ssl_certificate_error_job.cc5
-rw-r--r--chromium/net/test/url_request/url_request_failed_job.cc13
-rw-r--r--chromium/net/test/url_request/url_request_mock_http_job.cc8
-rw-r--r--chromium/net/test/url_request/url_request_test_job_backed_by_file.cc19
-rw-r--r--chromium/net/test/url_request/url_request_test_job_backed_by_file.h6
-rw-r--r--chromium/net/third_party/nss/OWNERS2
-rw-r--r--chromium/net/third_party/nss/ssl/cmpcert.cc2
-rw-r--r--chromium/net/third_party/quiche/BUILD.gn42
-rw-r--r--chromium/net/third_party/quiche/overrides/quiche_platform_impl/quic_flags_impl.cc29
-rw-r--r--chromium/net/third_party/quiche/overrides/quiche_platform_impl/quic_flags_impl.h17
-rw-r--r--chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_helpers_impl.cc6
-rw-r--r--chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.cc6
-rw-r--r--chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.h6
-rw-r--r--chromium/net/third_party/quiche/src/CONTRIBUTING.md3
-rw-r--r--chromium/net/third_party/quiche/src/build/source_list.bzl63
-rw-r--r--chromium/net/third_party/quiche/src/build/source_list.gni63
-rw-r--r--chromium/net/third_party/quiche/src/build/source_list.json63
-rw-r--r--chromium/net/third_party/quiche/src/quiche/BUILD.bazel1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.cc9
-rw-r--r--chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.h11
-rw-r--r--chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc91
-rw-r--r--chromium/net/third_party/quiche/src/quiche/balsa/balsa_headers.h75
-rw-r--r--chromium/net/third_party/quiche/src/quiche/balsa/balsa_visitor_interface.h8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/balsa/noop_balsa_visitor.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_event_loop.h27
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_flags.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_mem_slice.h10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.cc29
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.h17
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_event_loop_impl.h27
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.cc28
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.h14
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.cc88
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.h19
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.cc153
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.h40
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer_test.cc410
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/quiche_endian.h14
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/quiche_protocol_flags_list.h15
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/structured_headers.cc24
-rw-r--r--chromium/net/third_party/quiche/src/quiche/common/structured_headers.h10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc15
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder_test.cc9
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter_test.cc163
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_test.cc288
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc158
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.h36
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.cc4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util_test.cc10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/test_frame_sequence.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.cc4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc25
-rw-r--r--chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent.cc236
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent.h155
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent_test.cc68
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/chlo_extractor_test.cc5
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc20
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.h5
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc11
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc24
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_test.cc16
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/connection_id_generator.h31
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h7
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc13
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc73
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.h37
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator_test.cc122
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/end_to_end_test.cc337
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.cc1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder_test.cc59
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc130
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.h49
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder_test.cc119
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/http_frames.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.cc13
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.h17
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info_test.cc8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.cc4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h9
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index_test.cc2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_header_list.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream_test.cc11
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream_test.cc43
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc27
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.cc2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.h3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc17
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base_test.cc2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc16
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.h5
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_test.cc11
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.h11
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream_test.cc6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc15
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc14
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h9
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session_test.cc107
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc134
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h37
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_test.cc129
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.cc10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.h8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils_test.cc12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.cc10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.h14
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils_test.cc50
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_socket_factory.cc36
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_socket_factory.h41
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket.cc610
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket.h103
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket_test.cc523
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_all_event_loops_test.cc423
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_default_event_loop.cc43
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_default_event_loop.h26
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_event_loop.h97
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.cc266
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.h165
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop_test.cc342
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/socket.h172
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_factory.h34
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_posix.cc514
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_test.cc197
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/io/stream_client_socket.h62
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_test.cc12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.h12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_test.cc12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc33
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc5
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_bandwidth.h22
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc59
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.h14
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store_test.cc20
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_chaos_protector_test.cc5
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_config.cc4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.cc238
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.h30
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc39
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.h8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager_test.cc107
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_test.cc386
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_constants.h194
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager.cc10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc21
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.cc88
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.h23
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.cc153
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.h38
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer_test.cc404
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_clock.cc31
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_clock.h34
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_connection_helper.h49
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc348
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.h47
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher_test.cc107
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc14
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h69
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_flags_list.h38
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.cc35
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.h6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc80
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector_test.cc8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc54
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.h17
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator_test.cc172
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.cc25
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.h51
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc26
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.h17
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator_test.cc24
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_protocol_flags_list.h7
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc24
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h9
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager_test.cc6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.cc19
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.h16
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_session_test.cc73
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream.cc16
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream_test.cc8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_time.h32
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.cc18
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.h18
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket.h31
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket_posix.cc257
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.h16
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor_test.cc67
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc16
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.h5
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/web_transport_interface.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config.cc6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config_test.cc12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_decoder_test.cc14
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_encoder_test.cc30
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_server_id.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.cc1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_tools.cc1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.cc8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.h6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/masque/masque_epoll_server.cc10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_backend.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.cc74
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.h24
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address.cc15
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address_family.cc47
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address_family.h3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_socket_address.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller.cc12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller_test.cc23
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/mock_netlink.h3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.cc31
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.h6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_interface.h5
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_test.cc40
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_client_test.cc22
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.cc12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.cc30
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.h15
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_client_promised_info.h3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_session_visitor.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.cc17
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h43
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.cc6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.cc2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.h3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.cc2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc159
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.h88
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc21
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.h9
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc54
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h123
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.cc12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.h3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.cc8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.h3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.h6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/test_harness.cc35
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/test_harness.h83
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.cc2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_test_tools.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/connect_server_backend.cc133
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/connect_server_backend.h60
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel.cc342
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel.h102
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel_test.cc342
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.cc3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.h8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc13
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.h16
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc234
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.h116
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_epoll_network_helper.cc12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_interop_test_bin.cc5
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc102
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.h87
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client_test.cc147
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc11
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.h7
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.cc84
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.h35
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_bin.cc6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc (renamed from chromium/net/third_party/quiche/src/quiche/quic/tools/quic_epoll_server_factory.cc)4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.h (renamed from chromium/net/third_party/quiche/src/quiche/quic/tools/quic_epoll_server_factory.h)12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_test.cc62
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_backend.h8
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc44
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.h9
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream_test.cc105
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.h1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.cc9
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_server.cc1
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/tools/web_transport_test_visitors.h3
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.cc4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.h14
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter_test.cc68
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc11
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.h7
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder_test.cc46
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_round_trip_test.cc17
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.cc13
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.h21
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block.cc (renamed from chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.cc)10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h (renamed from chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h)21
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block_hpack_listener.h10
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block_test.cc (renamed from chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_block_test.cc)2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_storage.cc (renamed from chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_storage.cc)12
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_storage.h (renamed from chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_storage.h)22
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_storage_test.cc (renamed from chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_storage_test.cc)2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.cc54
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.h39
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension_test.cc122
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/recording_headers_handler.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.cc4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer_test.cc23
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_no_op_visitor.h4
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h2
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/test_tools/mock_spdy_framer_visitor.h6
-rw-r--r--chromium/net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h2
-rw-r--r--chromium/net/third_party/uri_template/OWNERS1
-rw-r--r--chromium/net/tools/cache_transparency/generate_checksums.py122
-rw-r--r--chromium/net/tools/cache_transparency/sample_pervasive_payloads_list.csv100
-rw-r--r--chromium/net/tools/cachetool/cachetool.cc15
-rw-r--r--chromium/net/tools/cert_verify_tool/verify_using_cert_verify_proc.cc8
-rw-r--r--chromium/net/tools/cert_verify_tool/verify_using_path_builder.cc14
-rw-r--r--chromium/net/tools/content_decoder_tool/content_decoder_tool_unittest.cc2
-rw-r--r--chromium/net/tools/crash_cache/crash_cache.cc8
-rw-r--r--chromium/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc39
-rw-r--r--chromium/net/tools/dump_cache/dump_files.cc14
-rw-r--r--chromium/net/tools/huffman_trie/bit_writer.cc8
-rw-r--r--chromium/net/tools/huffman_trie/bit_writer.h8
-rw-r--r--chromium/net/tools/huffman_trie/bit_writer_unittest.cc8
-rw-r--r--chromium/net/tools/huffman_trie/huffman/huffman_builder.cc12
-rw-r--r--chromium/net/tools/huffman_trie/huffman/huffman_builder.h8
-rw-r--r--chromium/net/tools/huffman_trie/huffman/huffman_builder_unittest.cc8
-rw-r--r--chromium/net/tools/huffman_trie/trie/trie_bit_buffer.cc8
-rw-r--r--chromium/net/tools/huffman_trie/trie/trie_bit_buffer.h8
-rw-r--r--chromium/net/tools/huffman_trie/trie/trie_bit_buffer_unittest.cc8
-rw-r--r--chromium/net/tools/huffman_trie/trie/trie_writer.cc16
-rw-r--r--chromium/net/tools/huffman_trie/trie/trie_writer.h8
-rw-r--r--chromium/net/tools/huffman_trie/trie_entry.cc8
-rw-r--r--chromium/net/tools/huffman_trie/trie_entry.h8
-rw-r--r--chromium/net/tools/net_watcher/net_watcher.cc8
-rw-r--r--chromium/net/tools/quic/crypto_message_printer_bin.cc2
-rw-r--r--chromium/net/tools/quic/quic_client_message_loop_network_helper.cc2
-rw-r--r--chromium/net/tools/quic/quic_simple_client.cc5
-rw-r--r--chromium/net/tools/quic/quic_simple_client_bin.cc2
-rw-r--r--chromium/net/tools/quic/quic_simple_client_test.cc6
-rw-r--r--chromium/net/tools/quic/quic_simple_server.cc4
-rw-r--r--chromium/net/tools/quic/quic_simple_server_test.cc11
-rw-r--r--chromium/net/tools/stress_cache/stress_cache.cc8
-rw-r--r--chromium/net/tools/tld_cleanup/tld_cleanup_util.cc17
-rw-r--r--chromium/net/tools/tld_cleanup/tld_cleanup_util.h6
-rw-r--r--chromium/net/tools/tld_cleanup/tld_cleanup_util_unittest.cc6
-rw-r--r--chromium/net/tools/transport_security_state_generator/cert_util.h8
-rw-r--r--chromium/net/tools/transport_security_state_generator/cert_util_unittest.cc8
-rw-r--r--chromium/net/tools/transport_security_state_generator/input_file_parsers.cc13
-rw-r--r--chromium/net/tools/transport_security_state_generator/input_file_parsers.h8
-rw-r--r--chromium/net/tools/transport_security_state_generator/input_file_parsers_unittest.cc8
-rw-r--r--chromium/net/tools/transport_security_state_generator/pinset.cc8
-rw-r--r--chromium/net/tools/transport_security_state_generator/pinset.h8
-rw-r--r--chromium/net/tools/transport_security_state_generator/pinsets.cc8
-rw-r--r--chromium/net/tools/transport_security_state_generator/pinsets.h8
-rw-r--r--chromium/net/tools/transport_security_state_generator/preloaded_state_generator.cc13
-rw-r--r--chromium/net/tools/transport_security_state_generator/preloaded_state_generator.h8
-rw-r--r--chromium/net/tools/transport_security_state_generator/spki_hash.cc8
-rw-r--r--chromium/net/tools/transport_security_state_generator/spki_hash.h8
-rw-r--r--chromium/net/tools/transport_security_state_generator/spki_hash_unittest.cc8
-rw-r--r--chromium/net/tools/transport_security_state_generator/transport_security_state_entry.cc10
-rw-r--r--chromium/net/tools/transport_security_state_generator/transport_security_state_entry.h8
-rw-r--r--chromium/net/traffic_annotation/network_traffic_annotation.h10
-rw-r--r--chromium/net/url_request/http_with_dns_over_https_unittest.cc66
-rw-r--r--chromium/net/url_request/report_sender.cc3
-rw-r--r--chromium/net/url_request/report_sender_unittest.cc9
-rw-r--r--chromium/net/url_request/test_url_fetcher_factory.cc397
-rw-r--r--chromium/net/url_request/test_url_fetcher_factory.h429
-rw-r--r--chromium/net/url_request/url_fetcher.cc71
-rw-r--r--chromium/net/url_request/url_fetcher.h401
-rw-r--r--chromium/net/url_request/url_fetcher_core.cc932
-rw-r--r--chromium/net/url_request/url_fetcher_core.h373
-rw-r--r--chromium/net/url_request/url_fetcher_delegate.cc21
-rw-r--r--chromium/net/url_request/url_fetcher_delegate.h46
-rw-r--r--chromium/net/url_request/url_fetcher_factory.h30
-rw-r--r--chromium/net/url_request/url_fetcher_impl.cc240
-rw-r--r--chromium/net/url_request/url_fetcher_impl.h140
-rw-r--r--chromium/net/url_request/url_fetcher_impl_unittest.cc1637
-rw-r--r--chromium/net/url_request/url_fetcher_response_writer.cc202
-rw-r--r--chromium/net/url_request/url_fetcher_response_writer.h154
-rw-r--r--chromium/net/url_request/url_fetcher_response_writer_unittest.cc258
-rw-r--r--chromium/net/url_request/url_request.cc40
-rw-r--r--chromium/net/url_request/url_request.h19
-rw-r--r--chromium/net/url_request/url_request_context.cc2
-rw-r--r--chromium/net/url_request/url_request_context.h54
-rw-r--r--chromium/net/url_request/url_request_context_builder.cc27
-rw-r--r--chromium/net/url_request/url_request_context_builder.h36
-rw-r--r--chromium/net/url_request/url_request_context_builder_unittest.cc34
-rw-r--r--chromium/net/url_request/url_request_context_getter_observer.h4
-rw-r--r--chromium/net/url_request/url_request_filter.cc7
-rw-r--r--chromium/net/url_request/url_request_filter.h3
-rw-r--r--chromium/net/url_request/url_request_filter_unittest.cc26
-rw-r--r--chromium/net/url_request/url_request_http_job.cc79
-rw-r--r--chromium/net/url_request/url_request_http_job.h7
-rw-r--r--chromium/net/url_request/url_request_http_job_unittest.cc130
-rw-r--r--chromium/net/url_request/url_request_job.cc14
-rw-r--r--chromium/net/url_request/url_request_netlog_params.cc34
-rw-r--r--chromium/net/url_request/url_request_quic_perftest.cc7
-rw-r--r--chromium/net/url_request/url_request_quic_unittest.cc34
-rw-r--r--chromium/net/url_request/url_request_test_util.cc38
-rw-r--r--chromium/net/url_request/url_request_test_util.h12
-rw-r--r--chromium/net/url_request/url_request_throttler_entry.cc12
-rw-r--r--chromium/net/url_request/url_request_throttler_entry_interface.h4
-rw-r--r--chromium/net/url_request/url_request_throttler_manager.cc6
-rw-r--r--chromium/net/url_request/url_request_throttler_manager.h3
-rw-r--r--chromium/net/url_request/url_request_throttler_simulation_unittest.cc53
-rw-r--r--chromium/net/url_request/url_request_throttler_unittest.cc9
-rw-r--r--chromium/net/url_request/url_request_unittest.cc433
-rw-r--r--chromium/net/websockets/websocket_basic_handshake_stream.cc18
-rw-r--r--chromium/net/websockets/websocket_basic_handshake_stream.h2
-rw-r--r--chromium/net/websockets/websocket_basic_stream.cc25
-rw-r--r--chromium/net/websockets/websocket_basic_stream_adapters.cc3
-rw-r--r--chromium/net/websockets/websocket_basic_stream_adapters_test.cc8
-rw-r--r--chromium/net/websockets/websocket_basic_stream_test.cc4
-rw-r--r--chromium/net/websockets/websocket_channel.cc20
-rw-r--r--chromium/net/websockets/websocket_channel_test.cc15
-rw-r--r--chromium/net/websockets/websocket_deflate_predictor.h2
-rw-r--r--chromium/net/websockets/websocket_deflate_predictor_impl.h2
-rw-r--r--chromium/net/websockets/websocket_deflate_stream.cc9
-rw-r--r--chromium/net/websockets/websocket_deflate_stream_test.cc21
-rw-r--r--chromium/net/websockets/websocket_deflater_test.cc4
-rw-r--r--chromium/net/websockets/websocket_end_to_end_test.cc27
-rw-r--r--chromium/net/websockets/websocket_event_interface.h6
-rw-r--r--chromium/net/websockets/websocket_extension_parser_test.cc4
-rw-r--r--chromium/net/websockets/websocket_frame_parser_test.cc108
-rw-r--r--chromium/net/websockets/websocket_frame_test.cc202
-rw-r--r--chromium/net/websockets/websocket_handshake_constants.cc6
-rw-r--r--chromium/net/websockets/websocket_handshake_constants.h6
-rw-r--r--chromium/net/websockets/websocket_handshake_stream_base.h2
-rw-r--r--chromium/net/websockets/websocket_http2_handshake_stream.cc5
-rw-r--r--chromium/net/websockets/websocket_http2_handshake_stream.h4
-rw-r--r--chromium/net/websockets/websocket_inflater_test.cc4
-rw-r--r--chromium/net/websockets/websocket_stream_create_test_base.cc4
-rw-r--r--chromium/net/websockets/websocket_stream_test.cc30
-rw-r--r--chromium/net/websockets/websocket_test_util.cc15
-rw-r--r--chromium/net/websockets/websocket_test_util.h2
1486 files changed, 67177 insertions, 59544 deletions
diff --git a/chromium/net/BUILD.gn b/chromium/net/BUILD.gn
index c61a518dafa..52f286fde3e 100644
--- a/chromium/net/BUILD.gn
+++ b/chromium/net/BUILD.gn
@@ -200,6 +200,8 @@ component("net") {
"base/net_string_util.h",
"base/network_activity_monitor.cc",
"base/network_activity_monitor.h",
+ "base/network_anonymization_key.cc",
+ "base/network_anonymization_key.h",
"base/network_change_notifier.cc",
"base/network_change_notifier.h",
"base/network_change_notifier_factory.h",
@@ -207,6 +209,7 @@ component("net") {
"base/network_delegate.h",
"base/network_delegate_impl.cc",
"base/network_delegate_impl.h",
+ "base/network_handle.h",
"base/network_interfaces.cc",
"base/network_interfaces.h",
"base/network_isolation_key.cc",
@@ -303,61 +306,12 @@ component("net") {
"cert/do_nothing_ct_verifier.h",
"cert/ev_root_ca_metadata.cc",
"cert/ev_root_ca_metadata.h",
- "cert/internal/cert_error_id.cc",
- "cert/internal/cert_error_id.h",
- "cert/internal/cert_error_params.cc",
- "cert/internal/cert_error_params.h",
- "cert/internal/cert_errors.cc",
- "cert/internal/cert_errors.h",
- "cert/internal/cert_issuer_source.h",
"cert/internal/cert_issuer_source_aia.cc",
"cert/internal/cert_issuer_source_aia.h",
- "cert/internal/cert_issuer_source_static.cc",
- "cert/internal/cert_issuer_source_static.h",
- "cert/internal/certificate_policies.cc",
- "cert/internal/certificate_policies.h",
- "cert/internal/common_cert_errors.cc",
- "cert/internal/common_cert_errors.h",
- "cert/internal/crl.cc",
- "cert/internal/crl.h",
- "cert/internal/extended_key_usage.cc",
- "cert/internal/extended_key_usage.h",
- "cert/internal/general_names.cc",
- "cert/internal/general_names.h",
- "cert/internal/name_constraints.cc",
- "cert/internal/name_constraints.h",
- "cert/internal/ocsp.cc",
- "cert/internal/ocsp.h",
- "cert/internal/parse_certificate.cc",
- "cert/internal/parse_certificate.h",
- "cert/internal/parse_name.cc",
- "cert/internal/parse_name.h",
- "cert/internal/parsed_certificate.cc",
- "cert/internal/parsed_certificate.h",
- "cert/internal/path_builder.cc",
- "cert/internal/path_builder.h",
"cert/internal/revocation_checker.cc",
"cert/internal/revocation_checker.h",
- "cert/internal/revocation_util.cc",
- "cert/internal/revocation_util.h",
- "cert/internal/signature_algorithm.cc",
- "cert/internal/signature_algorithm.h",
- "cert/internal/simple_path_builder_delegate.cc",
- "cert/internal/simple_path_builder_delegate.h",
"cert/internal/system_trust_store.cc",
"cert/internal/system_trust_store.h",
- "cert/internal/trust_store.cc",
- "cert/internal/trust_store.h",
- "cert/internal/trust_store_collection.cc",
- "cert/internal/trust_store_collection.h",
- "cert/internal/trust_store_in_memory.cc",
- "cert/internal/trust_store_in_memory.h",
- "cert/internal/verify_certificate_chain.cc",
- "cert/internal/verify_certificate_chain.h",
- "cert/internal/verify_name_match.cc",
- "cert/internal/verify_name_match.h",
- "cert/internal/verify_signed_data.cc",
- "cert/internal/verify_signed_data.h",
"cert/known_roots.cc",
"cert/known_roots.h",
"cert/merkle_audit_proof.cc",
@@ -375,6 +329,55 @@ component("net") {
"cert/ocsp_verify_result.h",
"cert/pem.cc",
"cert/pem.h",
+ "cert/pki/cert_error_id.cc",
+ "cert/pki/cert_error_id.h",
+ "cert/pki/cert_error_params.cc",
+ "cert/pki/cert_error_params.h",
+ "cert/pki/cert_errors.cc",
+ "cert/pki/cert_errors.h",
+ "cert/pki/cert_issuer_source.h",
+ "cert/pki/cert_issuer_source_static.cc",
+ "cert/pki/cert_issuer_source_static.h",
+ "cert/pki/certificate_policies.cc",
+ "cert/pki/certificate_policies.h",
+ "cert/pki/common_cert_errors.cc",
+ "cert/pki/common_cert_errors.h",
+ "cert/pki/crl.cc",
+ "cert/pki/crl.h",
+ "cert/pki/extended_key_usage.cc",
+ "cert/pki/extended_key_usage.h",
+ "cert/pki/general_names.cc",
+ "cert/pki/general_names.h",
+ "cert/pki/name_constraints.cc",
+ "cert/pki/name_constraints.h",
+ "cert/pki/ocsp.cc",
+ "cert/pki/ocsp.h",
+ "cert/pki/parse_certificate.cc",
+ "cert/pki/parse_certificate.h",
+ "cert/pki/parse_name.cc",
+ "cert/pki/parse_name.h",
+ "cert/pki/parsed_certificate.cc",
+ "cert/pki/parsed_certificate.h",
+ "cert/pki/path_builder.cc",
+ "cert/pki/path_builder.h",
+ "cert/pki/revocation_util.cc",
+ "cert/pki/revocation_util.h",
+ "cert/pki/signature_algorithm.cc",
+ "cert/pki/signature_algorithm.h",
+ "cert/pki/simple_path_builder_delegate.cc",
+ "cert/pki/simple_path_builder_delegate.h",
+ "cert/pki/trust_store.cc",
+ "cert/pki/trust_store.h",
+ "cert/pki/trust_store_collection.cc",
+ "cert/pki/trust_store_collection.h",
+ "cert/pki/trust_store_in_memory.cc",
+ "cert/pki/trust_store_in_memory.h",
+ "cert/pki/verify_certificate_chain.cc",
+ "cert/pki/verify_certificate_chain.h",
+ "cert/pki/verify_name_match.cc",
+ "cert/pki/verify_name_match.h",
+ "cert/pki/verify_signed_data.cc",
+ "cert/pki/verify_signed_data.h",
"cert/root_cert_list_generated.h",
"cert/sct_auditing_delegate.h",
"cert/sct_status_flags.cc",
@@ -431,8 +434,12 @@ component("net") {
"cookies/cookie_store.h",
"cookies/cookie_util.cc",
"cookies/cookie_util.h",
+ "cookies/first_party_set_entry.cc",
+ "cookies/first_party_set_entry.h",
"cookies/first_party_set_metadata.cc",
"cookies/first_party_set_metadata.h",
+ "cookies/first_party_sets_context_config.cc",
+ "cookies/first_party_sets_context_config.h",
"cookies/parsed_cookie.cc",
"cookies/parsed_cookie.h",
"cookies/same_party_context.cc",
@@ -747,6 +754,7 @@ component("net") {
"proxy_resolution/proxy_bypass_rules.h",
"proxy_resolution/proxy_config.cc",
"proxy_resolution/proxy_config.h",
+ "proxy_resolution/proxy_config_service.cc",
"proxy_resolution/proxy_config_service.h",
"proxy_resolution/proxy_config_service_fixed.cc",
"proxy_resolution/proxy_config_service_fixed.h",
@@ -999,17 +1007,6 @@ component("net") {
"url_request/report_sender.h",
"url_request/static_http_user_agent_settings.cc",
"url_request/static_http_user_agent_settings.h",
- "url_request/url_fetcher.cc",
- "url_request/url_fetcher.h",
- "url_request/url_fetcher_core.cc",
- "url_request/url_fetcher_core.h",
- "url_request/url_fetcher_delegate.cc",
- "url_request/url_fetcher_delegate.h",
- "url_request/url_fetcher_factory.h",
- "url_request/url_fetcher_impl.cc",
- "url_request/url_fetcher_impl.h",
- "url_request/url_fetcher_response_writer.cc",
- "url_request/url_fetcher_response_writer.h",
"url_request/url_request.cc",
"url_request/url_request.h",
"url_request/url_request_context.cc",
@@ -1182,6 +1179,8 @@ component("net") {
if (is_linux || is_chromeos_lacros) {
sources += [
+ # TODO(crbug.com/1331211): Remove network_change_notifier_linux for Lacros
+ # when BindNertworkChangeManager is supported by default.
"base/network_change_notifier_linux.cc",
"base/network_change_notifier_linux.h",
"proxy_resolution/proxy_config_service_linux.cc",
@@ -1331,7 +1330,7 @@ component("net") {
}
}
- if (is_android || is_chromeos_ash) {
+ if (is_android || is_chromeos) {
sources += [
"base/network_change_notifier_posix.cc",
"base/network_change_notifier_posix.h",
@@ -2185,8 +2184,6 @@ static_library("test_support") {
"test/url_request/url_request_hanging_read_job.h",
"test/url_request/url_request_mock_data_job.cc",
"test/url_request/url_request_mock_data_job.h",
- "url_request/test_url_fetcher_factory.cc",
- "url_request/test_url_fetcher_factory.h",
"url_request/url_request_test_job.cc",
"url_request/url_request_test_job.h",
"url_request/url_request_test_util.cc",
@@ -4042,6 +4039,7 @@ test("net_unittests") {
"base/net_errors_unittest.cc",
"base/net_string_util_unittest.cc",
"base/network_activity_monitor_unittest.cc",
+ "base/network_anonymization_key_unittest.cc",
"base/network_change_notifier_unittest.cc",
"base/network_delegate_unittest.cc",
"base/network_interfaces_unittest.cc",
@@ -4076,42 +4074,42 @@ test("net_unittests") {
"cert/ct_serialization_unittest.cc",
"cert/ev_root_ca_metadata_unittest.cc",
"cert/internal/cert_issuer_source_aia_unittest.cc",
- "cert/internal/cert_issuer_source_static_unittest.cc",
"cert/internal/cert_issuer_source_sync_unittest.cc",
- "cert/internal/cert_issuer_source_sync_unittest.h",
- "cert/internal/certificate_policies_unittest.cc",
"cert/internal/crl_unittest.cc",
- "cert/internal/extended_key_usage_unittest.cc",
"cert/internal/general_names_unittest.cc",
- "cert/internal/name_constraints_unittest.cc",
- "cert/internal/nist_pkits_unittest.cc",
- "cert/internal/nist_pkits_unittest.h",
- "cert/internal/ocsp_unittest.cc",
- "cert/internal/parse_certificate_unittest.cc",
- "cert/internal/parse_name_unittest.cc",
- "cert/internal/parsed_certificate_unittest.cc",
- "cert/internal/path_builder_pkits_unittest.cc",
- "cert/internal/path_builder_unittest.cc",
- "cert/internal/path_builder_verify_certificate_chain_unittest.cc",
"cert/internal/revocation_checker_unittest.cc",
"cert/internal/revocation_util_unittest.cc",
- "cert/internal/signature_algorithm_unittest.cc",
- "cert/internal/simple_path_builder_delegate_unittest.cc",
"cert/internal/system_trust_store_unittest.cc",
- "cert/internal/test_helpers.cc",
- "cert/internal/test_helpers.h",
- "cert/internal/trust_store_collection_unittest.cc",
- "cert/internal/verify_certificate_chain_pkits_unittest.cc",
- "cert/internal/verify_certificate_chain_typed_unittest.h",
- "cert/internal/verify_certificate_chain_unittest.cc",
- "cert/internal/verify_name_match_unittest.cc",
- "cert/internal/verify_signed_data_unittest.cc",
"cert/known_roots_unittest.cc",
"cert/merkle_audit_proof_unittest.cc",
"cert/merkle_tree_leaf_unittest.cc",
"cert/multi_log_ct_verifier_unittest.cc",
"cert/multi_threaded_cert_verifier_unittest.cc",
"cert/pem_unittest.cc",
+ "cert/pki/cert_issuer_source_static_unittest.cc",
+ "cert/pki/cert_issuer_source_sync_unittest.h",
+ "cert/pki/certificate_policies_unittest.cc",
+ "cert/pki/extended_key_usage_unittest.cc",
+ "cert/pki/name_constraints_unittest.cc",
+ "cert/pki/nist_pkits_unittest.cc",
+ "cert/pki/nist_pkits_unittest.h",
+ "cert/pki/ocsp_unittest.cc",
+ "cert/pki/parse_certificate_unittest.cc",
+ "cert/pki/parse_name_unittest.cc",
+ "cert/pki/parsed_certificate_unittest.cc",
+ "cert/pki/path_builder_pkits_unittest.cc",
+ "cert/pki/path_builder_unittest.cc",
+ "cert/pki/path_builder_verify_certificate_chain_unittest.cc",
+ "cert/pki/signature_algorithm_unittest.cc",
+ "cert/pki/simple_path_builder_delegate_unittest.cc",
+ "cert/pki/test_helpers.cc",
+ "cert/pki/test_helpers.h",
+ "cert/pki/trust_store_collection_unittest.cc",
+ "cert/pki/verify_certificate_chain_pkits_unittest.cc",
+ "cert/pki/verify_certificate_chain_typed_unittest.h",
+ "cert/pki/verify_certificate_chain_unittest.cc",
+ "cert/pki/verify_name_match_unittest.cc",
+ "cert/pki/verify_signed_data_unittest.cc",
"cert/signed_certificate_timestamp_unittest.cc",
"cert/symantec_certs_unittest.cc",
"cert/test_root_certs_unittest.cc",
@@ -4335,8 +4333,6 @@ test("net_unittests") {
"url_request/redirect_info_unittest.cc",
"url_request/redirect_util_unittest.cc",
"url_request/report_sender_unittest.cc",
- "url_request/url_fetcher_impl_unittest.cc",
- "url_request/url_fetcher_response_writer_unittest.cc",
"url_request/url_request_context_builder_unittest.cc",
"url_request/url_request_filter_unittest.cc",
"url_request/url_request_http_job_unittest.cc",
@@ -4455,10 +4451,6 @@ test("net_unittests") {
sources += [ "base/sockaddr_util_posix_unittest.cc" ]
}
- if (is_posix || is_fuchsia) {
- sources += [ "socket/udp_socket_posix_unittest.cc" ]
- }
-
if (is_android || is_chromeos_ash) {
sources += [ "base/network_change_notifier_posix_unittest.cc" ]
}
@@ -4500,7 +4492,6 @@ test("net_unittests") {
"data/spdy_tests/",
"data/test.html",
"data/trial_comparison_cert_verifier_unittest/",
- "data/url_fetcher_impl_unittest/",
"data/verify_certificate_chain_unittest/",
"data/verify_name_match_unittest/",
"data/verify_signed_data_unittest/",
@@ -4553,9 +4544,9 @@ test("net_unittests") {
"//third_party/fuchsia-sdk/sdk/pkg/fidl_cpp",
]
sources += [ "base/network_change_notifier_fuchsia_unittest.cc" ]
- use_cfv2 = false
+ use_cfv1 = false
additional_manifest_fragments =
- [ "//build/config/fuchsia/test/network_capabilities.test-cmx" ]
+ [ "//build/config/fuchsia/test/network.shard.test-cml" ]
}
if (use_nss_certs) {
@@ -4646,7 +4637,6 @@ test("net_unittests") {
"cert_net/cert_net_fetcher_url_request_unittest.cc",
"proxy_resolution/pac_file_fetcher_impl_unittest.cc",
"socket/ssl_client_socket_unittest.cc",
- "url_request/url_fetcher_impl_unittest.cc",
"url_request/url_request_context_builder_unittest.cc",
]
@@ -4977,7 +4967,7 @@ fuzzer_test("net_cert_ct_decode_signed_certificate_timestamp_fuzzer") {
}
fuzzer_test("net_cert_verify_name_match_fuzzer") {
- sources = [ "cert/internal/verify_name_match_fuzzer.cc" ]
+ sources = [ "cert/pki/verify_name_match_fuzzer.cc" ]
deps = [
":net_fuzzer_test_support",
"//base",
@@ -4986,7 +4976,7 @@ fuzzer_test("net_cert_verify_name_match_fuzzer") {
}
fuzzer_test("net_cert_normalize_name_fuzzer") {
- sources = [ "cert/internal/verify_name_match_normalizename_fuzzer.cc" ]
+ sources = [ "cert/pki/verify_name_match_normalizename_fuzzer.cc" ]
deps = [
"//base",
"//net",
@@ -4994,7 +4984,7 @@ fuzzer_test("net_cert_normalize_name_fuzzer") {
}
fuzzer_test("net_cert_verify_name_in_subtree_fuzzer") {
- sources = [ "cert/internal/verify_name_match_verifynameinsubtree_fuzzer.cc" ]
+ sources = [ "cert/pki/verify_name_match_verifynameinsubtree_fuzzer.cc" ]
deps = [
":net_fuzzer_test_support",
"//base",
@@ -5039,7 +5029,7 @@ fuzzer_test("net_cert_crl_getcrlstatusforcert_fuzzer") {
}
fuzzer_test("net_cert_ocsp_parse_ocsp_cert_id_fuzzer") {
- sources = [ "cert/internal/ocsp_parse_ocsp_cert_id_fuzzer.cc" ]
+ sources = [ "cert/pki/ocsp_parse_ocsp_cert_id_fuzzer.cc" ]
seed_corpus = "data/fuzzer_data/parse_ocsp_cert_id_fuzzer"
deps = [
"//base",
@@ -5048,7 +5038,7 @@ fuzzer_test("net_cert_ocsp_parse_ocsp_cert_id_fuzzer") {
}
fuzzer_test("net_cert_ocsp_parse_ocsp_single_response_fuzzer") {
- sources = [ "cert/internal/ocsp_parse_ocsp_single_response_fuzzer.cc" ]
+ sources = [ "cert/pki/ocsp_parse_ocsp_single_response_fuzzer.cc" ]
seed_corpus = "data/fuzzer_data/parse_ocsp_single_response_fuzzer"
deps = [
"//base",
@@ -5057,7 +5047,7 @@ fuzzer_test("net_cert_ocsp_parse_ocsp_single_response_fuzzer") {
}
fuzzer_test("net_cert_ocsp_parse_ocsp_response_data_fuzzer") {
- sources = [ "cert/internal/ocsp_parse_ocsp_response_data_fuzzer.cc" ]
+ sources = [ "cert/pki/ocsp_parse_ocsp_response_data_fuzzer.cc" ]
seed_corpus = "data/fuzzer_data/parse_ocsp_response_data_fuzzer"
deps = [
"//base",
@@ -5066,7 +5056,7 @@ fuzzer_test("net_cert_ocsp_parse_ocsp_response_data_fuzzer") {
}
fuzzer_test("net_cert_ocsp_parse_ocsp_response_fuzzer") {
- sources = [ "cert/internal/ocsp_parse_ocsp_response_fuzzer.cc" ]
+ sources = [ "cert/pki/ocsp_parse_ocsp_response_fuzzer.cc" ]
seed_corpus = "data/fuzzer_data/parse_ocsp_response_fuzzer"
deps = [
"//base",
@@ -5084,7 +5074,7 @@ fuzzer_test("net_cert_parse_authority_key_identifier_fuzzer") {
}
fuzzer_test("net_cert_parse_certificate_fuzzer") {
- sources = [ "cert/internal/parse_certificate_fuzzer.cc" ]
+ sources = [ "cert/pki/parse_certificate_fuzzer.cc" ]
deps = [
"//base",
"//net",
diff --git a/chromium/net/android/BUILD.gn b/chromium/net/android/BUILD.gn
index 39ef519438b..771d681e868 100644
--- a/chromium/net/android/BUILD.gn
+++ b/chromium/net/android/BUILD.gn
@@ -223,7 +223,7 @@ java_cpp_enum("net_android_java_enums_srcjar") {
]
}
-junit_binary("net_junit_tests") {
+robolectric_binary("net_junit_tests") {
sources = [
"junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java",
"junit/src/org/chromium/net/NetworkTrafficAnnotationTagTest.java",
diff --git a/chromium/net/android/cert_verify_result_android.cc b/chromium/net/android/cert_verify_result_android.cc
index 39655b60571..b1c2336b7f1 100644
--- a/chromium/net/android/cert_verify_result_android.cc
+++ b/chromium/net/android/cert_verify_result_android.cc
@@ -13,8 +13,7 @@ using base::android::JavaArrayOfByteArrayToStringVector;
using base::android::JavaRef;
using base::android::ScopedJavaLocalRef;
-namespace net {
-namespace android {
+namespace net::android {
void ExtractCertVerifyResult(const JavaRef<jobject>& result,
CertVerifyStatusAndroid* status,
@@ -33,5 +32,4 @@ void ExtractCertVerifyResult(const JavaRef<jobject>& result,
JavaArrayOfByteArrayToStringVector(env, chain_byte_array, verified_chain);
}
-} // namespace android
-} // namespace net
+} // namespace net::android
diff --git a/chromium/net/android/cert_verify_result_android.h b/chromium/net/android/cert_verify_result_android.h
index 96c61e44864..bed863a0c16 100644
--- a/chromium/net/android/cert_verify_result_android.h
+++ b/chromium/net/android/cert_verify_result_android.h
@@ -12,9 +12,7 @@
#include "base/android/scoped_java_ref.h"
-namespace net {
-
-namespace android {
+namespace net::android {
// The list of certificate verification results returned from Java side to the
// C++ side.
@@ -46,8 +44,6 @@ void ExtractCertVerifyResult(const base::android::JavaRef<jobject>& result,
bool* is_issued_by_known_root,
std::vector<std::string>* verified_chain);
-} // namespace android
-
-} // namespace net
+} // namespace net::android
#endif // NET_ANDROID_CERT_VERIFY_RESULT_ANDROID_H_
diff --git a/chromium/net/android/dummy_spnego_authenticator.cc b/chromium/net/android/dummy_spnego_authenticator.cc
index f69edc5602f..8a13e7d1e40 100644
--- a/chromium/net/android/dummy_spnego_authenticator.cc
+++ b/chromium/net/android/dummy_spnego_authenticator.cc
@@ -133,8 +133,8 @@ DummySpnegoAuthenticator::SecurityContextQuery::SecurityContextQuery()
DummySpnegoAuthenticator::SecurityContextQuery::SecurityContextQuery(
const SecurityContextQuery& other) = default;
-DummySpnegoAuthenticator::SecurityContextQuery::~SecurityContextQuery() {
-}
+DummySpnegoAuthenticator::SecurityContextQuery::~SecurityContextQuery() =
+ default;
base::android::ScopedJavaLocalRef<jstring>
DummySpnegoAuthenticator::SecurityContextQuery::GetTokenToReturn(
@@ -158,11 +158,9 @@ void DummySpnegoAuthenticator::SecurityContextQuery::CheckGetTokenArguments(
}
// Needed to satisfy "complex class" clang requirements.
-DummySpnegoAuthenticator::DummySpnegoAuthenticator() {
-}
+DummySpnegoAuthenticator::DummySpnegoAuthenticator() = default;
-DummySpnegoAuthenticator::~DummySpnegoAuthenticator() {
-}
+DummySpnegoAuthenticator::~DummySpnegoAuthenticator() = default;
void DummySpnegoAuthenticator::EnsureTestAccountExists() {
Java_DummySpnegoAuthenticator_ensureTestAccountExists(
diff --git a/chromium/net/android/http_auth_negotiate_android.cc b/chromium/net/android/http_auth_negotiate_android.cc
index f4a7abd3511..0f63e5bfe7c 100644
--- a/chromium/net/android/http_auth_negotiate_android.cc
+++ b/chromium/net/android/http_auth_negotiate_android.cc
@@ -26,8 +26,7 @@ using base::android::ConvertJavaStringToUTF8;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
-namespace net {
-namespace android {
+namespace net::android {
JavaNegotiateResultWrapper::JavaNegotiateResultWrapper(
const scoped_refptr<base::TaskRunner>& callback_task_runner,
@@ -35,8 +34,7 @@ JavaNegotiateResultWrapper::JavaNegotiateResultWrapper(
: callback_task_runner_(callback_task_runner),
thread_safe_callback_(std::move(thread_safe_callback)) {}
-JavaNegotiateResultWrapper::~JavaNegotiateResultWrapper() {
-}
+JavaNegotiateResultWrapper::~JavaNegotiateResultWrapper() = default;
void JavaNegotiateResultWrapper::SetResult(JNIEnv* env,
const JavaParamRef<jobject>& obj,
@@ -68,8 +66,7 @@ HttpAuthNegotiateAndroid::HttpAuthNegotiateAndroid(
env, ConvertUTF8ToJavaString(env, GetAuthAndroidNegotiateAccountType())));
}
-HttpAuthNegotiateAndroid::~HttpAuthNegotiateAndroid() {
-}
+HttpAuthNegotiateAndroid::~HttpAuthNegotiateAndroid() = default;
bool HttpAuthNegotiateAndroid::Init(const NetLogWithSource& net_log) {
return true;
@@ -170,5 +167,4 @@ void HttpAuthNegotiateAndroid::SetResultInternal(int result,
std::move(completion_callback_).Run(result);
}
-} // namespace android
-} // namespace net
+} // namespace net::android
diff --git a/chromium/net/android/http_auth_negotiate_android_unittest.cc b/chromium/net/android/http_auth_negotiate_android_unittest.cc
index cbe4c793791..9dfaf88d120 100644
--- a/chromium/net/android/http_auth_negotiate_android_unittest.cc
+++ b/chromium/net/android/http_auth_negotiate_android_unittest.cc
@@ -14,8 +14,7 @@
#include "net/log/net_log_with_source.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace android {
+namespace net::android {
TEST(HttpAuthNegotiateAndroidTest, GenerateAuthToken) {
base::test::TaskEnvironment task_environment;
@@ -112,5 +111,4 @@ TEST(HttpAuthNegotiateAndroidTest, ParseChallenge_MissingTokenSecondRound) {
auth.ParseChallenge(&second_challenge));
}
-} // namespace android
-} // namespace net
+} // namespace net::android
diff --git a/chromium/net/android/keystore.cc b/chromium/net/android/keystore.cc
index b6f2722a9ac..4ec8c2a5728 100644
--- a/chromium/net/android/keystore.cc
+++ b/chromium/net/android/keystore.cc
@@ -21,8 +21,7 @@ using base::android::JavaRef;
using base::android::ScopedJavaLocalRef;
using base::android::ToJavaByteArray;
-namespace net {
-namespace android {
+namespace net::android {
std::string GetPrivateKeyClassName(const JavaRef<jobject>& key) {
JNIEnv* env = AttachCurrentThread();
@@ -111,5 +110,4 @@ bool EncryptWithPrivateKey(const JavaRef<jobject>& private_key_ref,
return true;
}
-} // namespace android
-} // namespace net
+} // namespace net::android
diff --git a/chromium/net/android/keystore.h b/chromium/net/android/keystore.h
index c8eb34bed91..471cc2feaee 100644
--- a/chromium/net/android/keystore.h
+++ b/chromium/net/android/keystore.h
@@ -18,8 +18,7 @@
// Misc functions to access the Android platform KeyStore.
-namespace net {
-namespace android {
+namespace net::android {
// Define a list of constants describing private key types. The
// values are shared with Java through org.chromium.net.PrivateKeyType.
@@ -72,7 +71,6 @@ bool EncryptWithPrivateKey(const base::android::JavaRef<jobject>& private_key,
base::span<const uint8_t> input,
std::vector<uint8_t>* ciphertext);
-} // namespace android
-} // namespace net
+} // namespace net::android
#endif // NET_ANDROID_KEYSTORE_H_
diff --git a/chromium/net/android/network_change_notifier_android.cc b/chromium/net/android/network_change_notifier_android.cc
index 0ae446dfa73..b21eab661a8 100644
--- a/chromium/net/android/network_change_notifier_android.cc
+++ b/chromium/net/android/network_change_notifier_android.cc
@@ -74,13 +74,14 @@
namespace net {
-// Expose kInvalidNetworkHandle out to Java as NetId.INVALID. The notion of
-// a NetID is an Android framework one, see android.net.Network.netId.
-// NetworkChangeNotifierAndroid implements NetworkHandle to simply be the NetID.
+// Expose handles::kInvalidNetworkHandle out to Java as NetId.INVALID. The
+// notion of a NetID is an Android framework one, see android.net.Network.netId.
+// NetworkChangeNotifierAndroid implements handles::NetworkHandle to simply be
+// the NetID.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net
enum NetId {
- // Cannot use |kInvalidNetworkHandle| here as the Java generator fails,
- // instead enforce their equality with CHECK in
+ // Cannot use |handles::kInvalidNetworkHandle| here as the Java generator
+ // fails, instead enforce their equality with CHECK in
// NetworkChangeNotifierAndroid().
INVALID = -1
};
@@ -145,8 +146,8 @@ void NetworkChangeNotifierAndroid::ForceNetworkHandlesSupportedForTesting() {
}
bool NetworkChangeNotifierAndroid::AreNetworkHandlesCurrentlySupported() const {
- // Notifications for API using NetworkHandles and querying using
- // NetworkHandles only implemented for Android versions >= L.
+ // Notifications for API using handles::NetworkHandles and querying using
+ // handles::NetworkHandles only implemented for Android versions >= L.
return force_network_handles_supported_for_testing_ ||
(base::android::BuildInfo::GetInstance()->sdk_int() >=
base::android::SDK_VERSION_LOLLIPOP &&
@@ -160,12 +161,12 @@ void NetworkChangeNotifierAndroid::GetCurrentConnectedNetworks(
NetworkChangeNotifier::ConnectionType
NetworkChangeNotifierAndroid::GetCurrentNetworkConnectionType(
- NetworkHandle network) const {
+ handles::NetworkHandle network) const {
return delegate_->GetNetworkConnectionType(network);
}
-NetworkChangeNotifier::NetworkHandle
-NetworkChangeNotifierAndroid::GetCurrentDefaultNetwork() const {
+handles::NetworkHandle NetworkChangeNotifierAndroid::GetCurrentDefaultNetwork()
+ const {
return delegate_->GetCurrentDefaultNetwork();
}
@@ -184,24 +185,26 @@ void NetworkChangeNotifierAndroid::OnMaxBandwidthChanged(
type);
}
-void NetworkChangeNotifierAndroid::OnNetworkConnected(NetworkHandle network) {
+void NetworkChangeNotifierAndroid::OnNetworkConnected(
+ handles::NetworkHandle network) {
NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
NetworkChangeType::kConnected, network);
}
void NetworkChangeNotifierAndroid::OnNetworkSoonToDisconnect(
- NetworkHandle network) {
+ handles::NetworkHandle network) {
NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
NetworkChangeType::kSoonToDisconnect, network);
}
void NetworkChangeNotifierAndroid::OnNetworkDisconnected(
- NetworkHandle network) {
+ handles::NetworkHandle network) {
NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
NetworkChangeType::kDisconnected, network);
}
-void NetworkChangeNotifierAndroid::OnNetworkMadeDefault(NetworkHandle network) {
+void NetworkChangeNotifierAndroid::OnNetworkMadeDefault(
+ handles::NetworkHandle network) {
NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
NetworkChangeType::kMadeDefault, network);
}
@@ -215,8 +218,8 @@ NetworkChangeNotifierAndroid::NetworkChangeNotifierAndroid(
: NetworkChangeNotifier(NetworkChangeCalculatorParamsAndroid()),
delegate_(delegate),
blocking_thread_objects_(nullptr, base::OnTaskRunnerDeleter(nullptr)) {
- CHECK_EQ(NetId::INVALID, NetworkChangeNotifier::kInvalidNetworkHandle)
- << "kInvalidNetworkHandle doesn't match NetId::INVALID";
+ CHECK_EQ(NetId::INVALID, handles::kInvalidNetworkHandle)
+ << "handles::kInvalidNetworkHandle doesn't match NetId::INVALID";
delegate_->RegisterObserver(this);
// Since Android P, ConnectivityManager's signals include VPNs so we don't
// need to use AddressTrackerLinux.
diff --git a/chromium/net/android/network_change_notifier_android.h b/chromium/net/android/network_change_notifier_android.h
index 1911af31dbb..f899cea7916 100644
--- a/chromium/net/android/network_change_notifier_android.h
+++ b/chromium/net/android/network_change_notifier_android.h
@@ -14,6 +14,7 @@
#include "net/android/network_change_notifier_delegate_android.h"
#include "net/base/net_export.h"
#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
namespace base {
struct OnTaskRunnerDeleter;
@@ -72,10 +73,10 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierAndroid
bool AreNetworkHandlesCurrentlySupported() const override;
void GetCurrentConnectedNetworks(NetworkList* network_list) const override;
ConnectionType GetCurrentNetworkConnectionType(
- NetworkHandle network) const override;
+ handles::NetworkHandle network) const override;
NetworkChangeNotifier::ConnectionSubtype GetCurrentConnectionSubtype()
const override;
- NetworkHandle GetCurrentDefaultNetwork() const override;
+ handles::NetworkHandle GetCurrentDefaultNetwork() const override;
bool IsDefaultNetworkActiveInternal() override;
// NetworkChangeNotifierDelegateAndroid::Observer:
@@ -83,10 +84,10 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierAndroid
void OnConnectionCostChanged() override;
void OnMaxBandwidthChanged(double max_bandwidth_mbps,
ConnectionType type) override;
- void OnNetworkConnected(NetworkHandle network) override;
- void OnNetworkSoonToDisconnect(NetworkHandle network) override;
- void OnNetworkDisconnected(NetworkHandle network) override;
- void OnNetworkMadeDefault(NetworkHandle network) override;
+ void OnNetworkConnected(handles::NetworkHandle network) override;
+ void OnNetworkSoonToDisconnect(handles::NetworkHandle network) override;
+ void OnNetworkDisconnected(handles::NetworkHandle network) override;
+ void OnNetworkMadeDefault(handles::NetworkHandle network) override;
void OnDefaultNetworkActive() override;
// Promote GetMaxBandwidthMbpsForConnectionSubtype to public for the Android
@@ -104,7 +105,7 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierAndroid
class BlockingThreadObjects;
- // Enable NetworkHandles support for tests.
+ // Enable handles::NetworkHandles support for tests.
void ForceNetworkHandlesSupportedForTesting();
explicit NetworkChangeNotifierAndroid(
diff --git a/chromium/net/android/network_change_notifier_android_unittest.cc b/chromium/net/android/network_change_notifier_android_unittest.cc
index b3c5a8e0f69..06a3bd23e7c 100644
--- a/chromium/net/android/network_change_notifier_android_unittest.cc
+++ b/chromium/net/android/network_change_notifier_android_unittest.cc
@@ -37,7 +37,6 @@ class NetworkChangeNotifierDelegateAndroidObserver
public:
typedef NetworkChangeNotifier::ConnectionCost ConnectionCost;
typedef NetworkChangeNotifier::ConnectionType ConnectionType;
- typedef NetworkChangeNotifier::NetworkHandle NetworkHandle;
typedef NetworkChangeNotifier::NetworkList NetworkList;
NetworkChangeNotifierDelegateAndroidObserver() = default;
@@ -53,13 +52,13 @@ class NetworkChangeNotifierDelegateAndroidObserver
max_bandwidth_notifications_count_++;
}
- void OnNetworkConnected(NetworkHandle network) override {}
+ void OnNetworkConnected(handles::NetworkHandle network) override {}
- void OnNetworkSoonToDisconnect(NetworkHandle network) override {}
+ void OnNetworkSoonToDisconnect(handles::NetworkHandle network) override {}
- void OnNetworkDisconnected(NetworkHandle network) override {}
+ void OnNetworkDisconnected(handles::NetworkHandle network) override {}
- void OnNetworkMadeDefault(NetworkHandle network) override {}
+ void OnNetworkMadeDefault(handles::NetworkHandle network) override {}
void OnDefaultNetworkActive() override {
default_network_active_notifications_count_++;
@@ -136,8 +135,7 @@ class TestNetworkObserver : public NetworkChangeNotifier::NetworkObserver {
public:
TestNetworkObserver() { Clear(); }
- void ExpectChange(ChangeType change,
- NetworkChangeNotifier::NetworkHandle network) {
+ void ExpectChange(ChangeType change, handles::NetworkHandle network) {
EXPECT_EQ(last_change_type_, change);
EXPECT_EQ(last_network_changed_, network);
Clear();
@@ -146,30 +144,26 @@ class TestNetworkObserver : public NetworkChangeNotifier::NetworkObserver {
private:
void Clear() {
last_change_type_ = NONE;
- last_network_changed_ = NetworkChangeNotifier::kInvalidNetworkHandle;
+ last_network_changed_ = handles::kInvalidNetworkHandle;
}
// NetworkChangeNotifier::NetworkObserver implementation:
- void OnNetworkConnected(
- NetworkChangeNotifier::NetworkHandle network) override {
- ExpectChange(NONE, NetworkChangeNotifier::kInvalidNetworkHandle);
+ void OnNetworkConnected(handles::NetworkHandle network) override {
+ ExpectChange(NONE, handles::kInvalidNetworkHandle);
last_change_type_ = CONNECTED;
last_network_changed_ = network;
}
- void OnNetworkSoonToDisconnect(
- NetworkChangeNotifier::NetworkHandle network) override {
- ExpectChange(NONE, NetworkChangeNotifier::kInvalidNetworkHandle);
+ void OnNetworkSoonToDisconnect(handles::NetworkHandle network) override {
+ ExpectChange(NONE, handles::kInvalidNetworkHandle);
last_change_type_ = SOON_TO_DISCONNECT;
last_network_changed_ = network;
}
- void OnNetworkDisconnected(
- NetworkChangeNotifier::NetworkHandle network) override {
- ExpectChange(NONE, NetworkChangeNotifier::kInvalidNetworkHandle);
+ void OnNetworkDisconnected(handles::NetworkHandle network) override {
+ ExpectChange(NONE, handles::kInvalidNetworkHandle);
last_change_type_ = DISCONNECTED;
last_network_changed_ = network;
}
- void OnNetworkMadeDefault(
- NetworkChangeNotifier::NetworkHandle network) override {
+ void OnNetworkMadeDefault(handles::NetworkHandle network) override {
// Cannot test for Clear()ed state as we receive CONNECTED immediately prior
// to MADE_DEFAULT.
last_change_type_ = MADE_DEFAULT;
@@ -177,7 +171,7 @@ class TestNetworkObserver : public NetworkChangeNotifier::NetworkObserver {
}
ChangeType last_change_type_;
- NetworkChangeNotifier::NetworkHandle last_network_changed_;
+ handles::NetworkHandle last_network_changed_;
};
} // namespace
@@ -188,7 +182,7 @@ class BaseNetworkChangeNotifierAndroidTest : public TestWithTaskEnvironment {
typedef NetworkChangeNotifier::ConnectionCost ConnectionCost;
typedef NetworkChangeNotifier::ConnectionSubtype ConnectionSubtype;
- ~BaseNetworkChangeNotifierAndroidTest() override {}
+ ~BaseNetworkChangeNotifierAndroidTest() override = default;
void RunTest(
const base::RepeatingCallback<int(void)>& notifications_count_getter,
@@ -246,7 +240,7 @@ class BaseNetworkChangeNotifierAndroidTest : public TestWithTaskEnvironment {
}
void FakeNetworkChange(ChangeType change,
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
ConnectionType type) {
switch (change) {
case CONNECTED:
@@ -301,8 +295,8 @@ TEST_F(BaseNetworkChangeNotifierAndroidTest,
delegate_.GetCurrentConnectionType());
// Instantiate another delegate to validate that it uses the actual
// connection type at construction.
- std::unique_ptr<NetworkChangeNotifierDelegateAndroid> other_delegate(
- new NetworkChangeNotifierDelegateAndroid());
+ auto other_delegate =
+ std::make_unique<NetworkChangeNotifierDelegateAndroid>();
EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE,
other_delegate->GetCurrentConnectionType());
@@ -469,7 +463,7 @@ TEST_F(NetworkChangeNotifierAndroidTest, NetworkCallbacks) {
NetworkChangeNotifier::AddNetworkObserver(&network_observer);
// Test empty values
- EXPECT_EQ(NetworkChangeNotifier::kInvalidNetworkHandle,
+ EXPECT_EQ(handles::kInvalidNetworkHandle,
NetworkChangeNotifier::GetDefaultNetwork());
EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN,
NetworkChangeNotifier::GetNetworkConnectionType(100));
@@ -479,7 +473,7 @@ TEST_F(NetworkChangeNotifierAndroidTest, NetworkCallbacks) {
// Test connecting network
FakeNetworkChange(CONNECTED, 100, NetworkChangeNotifier::CONNECTION_WIFI);
network_observer.ExpectChange(CONNECTED, 100);
- EXPECT_EQ(NetworkChangeNotifier::kInvalidNetworkHandle,
+ EXPECT_EQ(handles::kInvalidNetworkHandle,
NetworkChangeNotifier::GetDefaultNetwork());
// Test GetConnectedNetworks()
NetworkChangeNotifier::GetConnectedNetworks(&network_list);
@@ -490,8 +484,7 @@ TEST_F(NetworkChangeNotifierAndroidTest, NetworkCallbacks) {
NetworkChangeNotifier::GetNetworkConnectionType(100));
// Test deduplication of connecting signal
FakeNetworkChange(CONNECTED, 100, NetworkChangeNotifier::CONNECTION_WIFI);
- network_observer.ExpectChange(NONE,
- NetworkChangeNotifier::kInvalidNetworkHandle);
+ network_observer.ExpectChange(NONE, handles::kInvalidNetworkHandle);
// Test connecting another network
FakeNetworkChange(CONNECTED, 101, NetworkChangeNotifier::CONNECTION_3G);
network_observer.ExpectChange(CONNECTED, 101);
@@ -519,12 +512,10 @@ TEST_F(NetworkChangeNotifierAndroidTest, NetworkCallbacks) {
EXPECT_EQ(101, network_list[0]);
// Test deduplication of disconnecting signal
FakeNetworkChange(DISCONNECTED, 100, NetworkChangeNotifier::CONNECTION_WIFI);
- network_observer.ExpectChange(NONE,
- NetworkChangeNotifier::kInvalidNetworkHandle);
+ network_observer.ExpectChange(NONE, handles::kInvalidNetworkHandle);
// Test delay of default network signal until connect signal
FakeNetworkChange(MADE_DEFAULT, 100, NetworkChangeNotifier::CONNECTION_WIFI);
- network_observer.ExpectChange(NONE,
- NetworkChangeNotifier::kInvalidNetworkHandle);
+ network_observer.ExpectChange(NONE, handles::kInvalidNetworkHandle);
FakeNetworkChange(CONNECTED, 100, NetworkChangeNotifier::CONNECTION_WIFI);
network_observer.ExpectChange(MADE_DEFAULT, 100);
EXPECT_EQ(100, NetworkChangeNotifier::GetDefaultNetwork());
@@ -534,12 +525,10 @@ TEST_F(NetworkChangeNotifierAndroidTest, NetworkCallbacks) {
EXPECT_EQ(101, NetworkChangeNotifier::GetDefaultNetwork());
// Test deduplication default signal
FakeNetworkChange(MADE_DEFAULT, 101, NetworkChangeNotifier::CONNECTION_3G);
- network_observer.ExpectChange(NONE,
- NetworkChangeNotifier::kInvalidNetworkHandle);
+ network_observer.ExpectChange(NONE, handles::kInvalidNetworkHandle);
// Test that networks can change type
FakeNetworkChange(CONNECTED, 101, NetworkChangeNotifier::CONNECTION_4G);
- network_observer.ExpectChange(NONE,
- NetworkChangeNotifier::kInvalidNetworkHandle);
+ network_observer.ExpectChange(NONE, handles::kInvalidNetworkHandle);
EXPECT_EQ(NetworkChangeNotifier::CONNECTION_4G,
NetworkChangeNotifier::GetNetworkConnectionType(101));
// Test purging the network list
@@ -553,7 +542,7 @@ TEST_F(NetworkChangeNotifierAndroidTest, NetworkCallbacks) {
NetworkChangeNotifier::GetConnectedNetworks(&network_list);
EXPECT_EQ(1u, network_list.size());
EXPECT_EQ(100, network_list[0]);
- EXPECT_EQ(NetworkChangeNotifier::kInvalidNetworkHandle,
+ EXPECT_EQ(handles::kInvalidNetworkHandle,
NetworkChangeNotifier::GetDefaultNetwork());
NetworkChangeNotifier::RemoveNetworkObserver(&network_observer);
diff --git a/chromium/net/android/network_change_notifier_delegate_android.cc b/chromium/net/android/network_change_notifier_delegate_android.cc
index f971b5753aa..7c2f8c41968 100644
--- a/chromium/net/android/network_change_notifier_delegate_android.cc
+++ b/chromium/net/android/network_change_notifier_delegate_android.cc
@@ -78,7 +78,7 @@ void NetworkChangeNotifierDelegateAndroid::JavaLongArrayToNetworkMap(
base::android::JavaLongArrayToInt64Vector(env, long_array, &int64_list);
network_map->clear();
for (auto i = int64_list.begin(); i != int64_list.end(); ++i) {
- NetworkChangeNotifier::NetworkHandle network_handle = *i;
+ handles::NetworkHandle network_handle = *i;
CHECK(++i != int64_list.end());
(*network_map)[network_handle] = static_cast<ConnectionType>(*i);
}
@@ -163,7 +163,7 @@ void NetworkChangeNotifierDelegateAndroid::
NetworkChangeNotifier::ConnectionType
NetworkChangeNotifierDelegateAndroid::GetNetworkConnectionType(
- NetworkChangeNotifier::NetworkHandle network) const {
+ handles::NetworkHandle network) const {
base::AutoLock auto_lock(connection_lock_);
auto network_entry = network_map_.find(network);
if (network_entry == network_map_.end())
@@ -171,7 +171,7 @@ NetworkChangeNotifierDelegateAndroid::GetNetworkConnectionType(
return network_entry->second;
}
-NetworkChangeNotifier::NetworkHandle
+handles::NetworkHandle
NetworkChangeNotifierDelegateAndroid::GetCurrentDefaultNetwork() const {
base::AutoLock auto_lock(connection_lock_);
return default_network_;
@@ -217,7 +217,7 @@ void NetworkChangeNotifierDelegateAndroid::NotifyConnectionTypeChanged(
const ConnectionType actual_connection_type = ConvertConnectionType(
new_connection_type);
SetCurrentConnectionType(actual_connection_type);
- NetworkHandle default_network = default_netid;
+ handles::NetworkHandle default_network = default_netid;
if (default_network != GetCurrentDefaultNetwork()) {
SetCurrentDefaultNetwork(default_network);
bool default_exists;
@@ -278,7 +278,7 @@ void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkConnect(
jlong net_id,
jint connection_type) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- NetworkHandle network = net_id;
+ handles::NetworkHandle network = net_id;
bool already_exists;
bool is_default_network;
{
@@ -305,7 +305,7 @@ void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkSoonToDisconnect(
const JavaParamRef<jobject>& obj,
jlong net_id) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- NetworkHandle network = net_id;
+ handles::NetworkHandle network = net_id;
{
base::AutoLock auto_lock(connection_lock_);
if (network_map_.find(network) == network_map_.end())
@@ -321,11 +321,11 @@ void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkDisconnect(
const JavaParamRef<jobject>& obj,
jlong net_id) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- NetworkHandle network = net_id;
+ handles::NetworkHandle network = net_id;
{
base::AutoLock auto_lock(connection_lock_);
if (network == default_network_)
- default_network_ = NetworkChangeNotifier::kInvalidNetworkHandle;
+ default_network_ = handles::kInvalidNetworkHandle;
if (network_map_.erase(network) == 0)
return;
}
@@ -435,7 +435,7 @@ void NetworkChangeNotifierDelegateAndroid::SetCurrentMaxBandwidth(
}
void NetworkChangeNotifierDelegateAndroid::SetCurrentDefaultNetwork(
- NetworkHandle default_network) {
+ handles::NetworkHandle default_network) {
base::AutoLock auto_lock(connection_lock_);
default_network_ = default_network;
}
@@ -457,20 +457,20 @@ void NetworkChangeNotifierDelegateAndroid::SetOffline() {
}
void NetworkChangeNotifierDelegateAndroid::FakeNetworkConnected(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
ConnectionType type) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_NetworkChangeNotifier_fakeNetworkConnected(env, network, type);
}
void NetworkChangeNotifierDelegateAndroid::FakeNetworkSoonToBeDisconnected(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_NetworkChangeNotifier_fakeNetworkSoonToBeDisconnected(env, network);
}
void NetworkChangeNotifierDelegateAndroid::FakeNetworkDisconnected(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_NetworkChangeNotifier_fakeNetworkDisconnected(env, network);
}
@@ -483,7 +483,7 @@ void NetworkChangeNotifierDelegateAndroid::FakePurgeActiveNetworkList(
}
void NetworkChangeNotifierDelegateAndroid::FakeDefaultNetwork(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
ConnectionType type) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_NetworkChangeNotifier_fakeDefaultNetwork(env, network, type);
diff --git a/chromium/net/android/network_change_notifier_delegate_android.h b/chromium/net/android/network_change_notifier_delegate_android.h
index 228db92fb87..66d8c929e4b 100644
--- a/chromium/net/android/network_change_notifier_delegate_android.h
+++ b/chromium/net/android/network_change_notifier_delegate_android.h
@@ -16,6 +16,7 @@
#include "base/threading/thread_checker.h"
#include "net/base/net_export.h"
#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
namespace net {
@@ -29,7 +30,6 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierDelegateAndroid {
typedef NetworkChangeNotifier::ConnectionCost ConnectionCost;
typedef NetworkChangeNotifier::ConnectionType ConnectionType;
typedef NetworkChangeNotifier::ConnectionSubtype ConnectionSubtype;
- typedef NetworkChangeNotifier::NetworkHandle NetworkHandle;
typedef NetworkChangeNotifier::NetworkList NetworkList;
// Observer interface implemented by NetworkChangeNotifierAndroid which
@@ -37,7 +37,7 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierDelegateAndroid {
// initiated by the Java side).
class Observer : public NetworkChangeNotifier::NetworkObserver {
public:
- ~Observer() override {}
+ ~Observer() override = default;
// Updates the current connection type.
virtual void OnConnectionTypeChanged() = 0;
@@ -151,8 +151,8 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierDelegateAndroid {
void GetCurrentMaxBandwidthAndConnectionType(
double* max_bandwidth_mbps,
ConnectionType* connection_type) const;
- ConnectionType GetNetworkConnectionType(NetworkHandle network) const;
- NetworkHandle GetCurrentDefaultNetwork() const;
+ ConnectionType GetNetworkConnectionType(handles::NetworkHandle network) const;
+ handles::NetworkHandle GetCurrentDefaultNetwork() const;
void GetCurrentlyConnectedNetworks(NetworkList* network_list) const;
bool IsDefaultNetworkActive();
@@ -171,10 +171,10 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierDelegateAndroid {
friend class BaseNetworkChangeNotifierAndroidTest;
// Map of active connected networks and their connection type.
- typedef std::map<NetworkHandle, ConnectionType> NetworkMap;
+ typedef std::map<handles::NetworkHandle, ConnectionType> NetworkMap;
// Converts a Java long[] into a NetworkMap. Expects long[] to contain
- // repeated instances of: NetworkHandle, ConnectionType
+ // repeated instances of: handles::NetworkHandle, ConnectionType
static void JavaLongArrayToNetworkMap(
JNIEnv* env,
const base::android::JavaRef<jlongArray>& long_array,
@@ -189,17 +189,18 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierDelegateAndroid {
void SetCurrentConnectionCost(ConnectionCost connection_cost);
void SetCurrentConnectionType(ConnectionType connection_type);
void SetCurrentMaxBandwidth(double max_bandwidth);
- void SetCurrentDefaultNetwork(NetworkHandle default_network);
+ void SetCurrentDefaultNetwork(handles::NetworkHandle default_network);
void SetCurrentNetworksAndTypes(NetworkMap network_map);
// Methods calling the Java side exposed for testing.
void SetOnline();
void SetOffline();
- void FakeNetworkConnected(NetworkHandle network, ConnectionType type);
- void FakeNetworkSoonToBeDisconnected(NetworkHandle network);
- void FakeNetworkDisconnected(NetworkHandle network);
+ void FakeNetworkConnected(handles::NetworkHandle network,
+ ConnectionType type);
+ void FakeNetworkSoonToBeDisconnected(handles::NetworkHandle network);
+ void FakeNetworkDisconnected(handles::NetworkHandle network);
void FakePurgeActiveNetworkList(NetworkList networks);
- void FakeDefaultNetwork(NetworkHandle network, ConnectionType type);
+ void FakeDefaultNetwork(handles::NetworkHandle network, ConnectionType type);
void FakeConnectionCostChanged(ConnectionCost cost);
void FakeConnectionSubtypeChanged(ConnectionSubtype subtype);
void FakeDefaultNetworkActive();
@@ -223,7 +224,7 @@ class NET_EXPORT_PRIVATE NetworkChangeNotifierDelegateAndroid {
ConnectionType connection_type_;
ConnectionCost connection_cost_;
double connection_max_bandwidth_;
- NetworkHandle default_network_;
+ handles::NetworkHandle default_network_;
NetworkMap network_map_;
// Used to enable/disable default network active notifications on the Java
diff --git a/chromium/net/android/network_change_notifier_factory_android.cc b/chromium/net/android/network_change_notifier_factory_android.cc
index 71269a83785..35e9ce72b60 100644
--- a/chromium/net/android/network_change_notifier_factory_android.cc
+++ b/chromium/net/android/network_change_notifier_factory_android.cc
@@ -10,9 +10,11 @@
namespace net {
-NetworkChangeNotifierFactoryAndroid::NetworkChangeNotifierFactoryAndroid() {}
+NetworkChangeNotifierFactoryAndroid::NetworkChangeNotifierFactoryAndroid() =
+ default;
-NetworkChangeNotifierFactoryAndroid::~NetworkChangeNotifierFactoryAndroid() {}
+NetworkChangeNotifierFactoryAndroid::~NetworkChangeNotifierFactoryAndroid() =
+ default;
std::unique_ptr<NetworkChangeNotifier>
NetworkChangeNotifierFactoryAndroid::CreateInstance() {
diff --git a/chromium/net/android/network_library.cc b/chromium/net/android/network_library.cc
index 4faba2716a5..aee7aff8f5d 100644
--- a/chromium/net/android/network_library.cc
+++ b/chromium/net/android/network_library.cc
@@ -30,8 +30,7 @@ using base::android::ScopedJavaLocalRef;
using base::android::ToJavaArrayOfByteArray;
using base::android::ToJavaByteArray;
-namespace net {
-namespace android {
+namespace net::android {
void VerifyX509CertChain(const std::vector<std::string>& cert_chain,
base::StringPiece auth_type,
@@ -193,7 +192,7 @@ bool GetDnsServersForNetwork(std::vector<IPEndPoint>* dns_servers,
bool* dns_over_tls_active,
std::string* dns_over_tls_hostname,
std::vector<std::string>* search_suffixes,
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
DCHECK_GE(base::android::BuildInfo::GetInstance()->sdk_int(),
base::android::SDK_VERSION_P);
@@ -248,10 +247,9 @@ LollipopSetNetworkForSocket GetLollipopSetNetworkForSocket() {
} // namespace
-int BindToNetwork(SocketDescriptor socket,
- NetworkChangeNotifier::NetworkHandle network) {
+int BindToNetwork(SocketDescriptor socket, handles::NetworkHandle network) {
DCHECK_NE(socket, kInvalidSocket);
- if (network == NetworkChangeNotifier::kInvalidNetworkHandle)
+ if (network == handles::kInvalidNetworkHandle)
return ERR_INVALID_ARGUMENT;
// Android prior to Lollipop didn't have support for binding sockets to
@@ -307,13 +305,12 @@ MarshmallowGetAddrInfoForNetwork GetMarshmallowGetAddrInfoForNetwork() {
} // namespace
-NET_EXPORT_PRIVATE int GetAddrInfoForNetwork(
- NetworkChangeNotifier::NetworkHandle network,
- const char* node,
- const char* service,
- const struct addrinfo* hints,
- struct addrinfo** res) {
- if (network == NetworkChangeNotifier::kInvalidNetworkHandle) {
+NET_EXPORT_PRIVATE int GetAddrInfoForNetwork(handles::NetworkHandle network,
+ const char* node,
+ const char* service,
+ const struct addrinfo* hints,
+ struct addrinfo** res) {
+ if (network == handles::kInvalidNetworkHandle) {
errno = EINVAL;
return EAI_SYSTEM;
}
@@ -333,5 +330,4 @@ NET_EXPORT_PRIVATE int GetAddrInfoForNetwork(
return get_addrinfo_for_network(network, node, service, hints, res);
}
-} // namespace android
-} // namespace net
+} // namespace net::android
diff --git a/chromium/net/android/network_library.h b/chromium/net/android/network_library.h
index f1ada464f99..9597e9f1e1a 100644
--- a/chromium/net/android/network_library.h
+++ b/chromium/net/android/network_library.h
@@ -20,12 +20,11 @@
#include "net/base/ip_endpoint.h"
#include "net/base/mime_util.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/socket/socket_descriptor.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
-namespace net {
-namespace android {
+namespace net::android {
// |cert_chain| is DER encoded chain of certificates, with the server's own
// certificate listed first.
@@ -116,7 +115,7 @@ NET_EXPORT_PRIVATE bool GetDnsServersForNetwork(
bool* dns_over_tls_active,
std::string* dns_over_tls_hostname,
std::vector<std::string>* search_suffixes,
- NetworkChangeNotifier::NetworkHandle network);
+ handles::NetworkHandle network);
// Reports to the framework that the current default network appears to have
// connectivity issues. This may serve as a signal for the OS to consider
@@ -135,22 +134,19 @@ NET_EXPORT_PRIVATE void TagSocket(SocketDescriptor socket,
// disconnected. Communication using this socket will fail if `network`
// disconnects.
// Returns a net error code.
-NET_EXPORT_PRIVATE int BindToNetwork(
- SocketDescriptor socket,
- NetworkChangeNotifier::NetworkHandle network);
+NET_EXPORT_PRIVATE int BindToNetwork(SocketDescriptor socket,
+ handles::NetworkHandle network);
// Perform hostname resolution via the DNS servers associated with `network`.
// All arguments are used identically as those passed to Android NDK API
// android_getaddrinfofornetwork:
// https://developer.android.com/ndk/reference/group/networking#group___networking_1ga0ae9e15612e6411855e295476a98ceee
-NET_EXPORT_PRIVATE int GetAddrInfoForNetwork(
- NetworkChangeNotifier::NetworkHandle network,
- const char* node,
- const char* service,
- const struct addrinfo* hints,
- struct addrinfo** res);
-
-} // namespace android
-} // namespace net
+NET_EXPORT_PRIVATE int GetAddrInfoForNetwork(handles::NetworkHandle network,
+ const char* node,
+ const char* service,
+ const struct addrinfo* hints,
+ struct addrinfo** res);
+
+} // namespace net::android
#endif // NET_ANDROID_NETWORK_LIBRARY_H_
diff --git a/chromium/net/android/network_library_unittest.cc b/chromium/net/android/network_library_unittest.cc
index e7b47416d8c..d1ce81449e4 100644
--- a/chromium/net/android/network_library_unittest.cc
+++ b/chromium/net/android/network_library_unittest.cc
@@ -17,9 +17,7 @@
#include "net/socket/udp_socket.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace android {
+namespace net::android {
TEST(NetworkLibraryTest, CaptivePortal) {
EXPECT_FALSE(android::GetIsCaptivePortal());
@@ -68,7 +66,7 @@ TEST(NetworkLibraryTest, GetDnsSearchDomainsForNetwork) {
EXPECT_TRUE(NetworkChangeNotifier::AreNetworkHandlesSupported());
auto default_network_handle = NetworkChangeNotifier::GetDefaultNetwork();
- if (default_network_handle == NetworkChangeNotifier::kInvalidNetworkHandle)
+ if (default_network_handle == handles::kInvalidNetworkHandle)
GTEST_SKIP() << "Could not retrieve a working active network handle.";
std::vector<IPEndPoint> dns_servers;
@@ -113,20 +111,18 @@ TEST(NetworkLibraryTest, BindToNetwork) {
base::android::SDK_VERSION_LOLLIPOP) {
EXPECT_TRUE(NetworkChangeNotifier::AreNetworkHandlesSupported());
// Test successful binding.
- NetworkChangeNotifier::NetworkHandle existing_network_handle =
+ handles::NetworkHandle existing_network_handle =
NetworkChangeNotifier::GetDefaultNetwork();
- if (existing_network_handle !=
- NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (existing_network_handle != handles::kInvalidNetworkHandle) {
EXPECT_EQ(OK, BindToNetwork(socket, existing_network_handle));
}
// Test invalid binding.
- EXPECT_EQ(
- ERR_INVALID_ARGUMENT,
- BindToNetwork(socket, NetworkChangeNotifier::kInvalidNetworkHandle));
+ EXPECT_EQ(ERR_INVALID_ARGUMENT,
+ BindToNetwork(socket, handles::kInvalidNetworkHandle));
}
- // Attempt to bind to a not existing NetworkHandle.
- constexpr NetworkChangeNotifier::NetworkHandle wrong_network_handle = 65536;
+ // Attempt to bind to a not existing handles::NetworkHandle.
+ constexpr handles::NetworkHandle wrong_network_handle = 65536;
int rv = BindToNetwork(socket, wrong_network_handle);
if (base::android::BuildInfo::GetInstance()->sdk_int() <
base::android::SDK_VERSION_LOLLIPOP) {
@@ -135,22 +131,20 @@ TEST(NetworkLibraryTest, BindToNetwork) {
base::android::SDK_VERSION_LOLLIPOP &&
base::android::BuildInfo::GetInstance()->sdk_int() <
base::android::SDK_VERSION_MARSHMALLOW) {
- // On Lollipop, we assume if the user has a NetworkHandle that they must
- // have gotten it from a legitimate source, so if binding to the network
- // fails it's assumed to be because the network went away so
+ // On Lollipop, we assume if the user has a handles::NetworkHandle that
+ // they must have gotten it from a legitimate source, so if binding to the
+ // network fails it's assumed to be because the network went away so
// ERR_NETWORK_CHANGED is returned. In this test the network never existed
// anyhow. ConnectivityService.MAX_NET_ID is 65535, so 65536 won't be
// used.
EXPECT_EQ(ERR_NETWORK_CHANGED, rv);
} else if (base::android::BuildInfo::GetInstance()->sdk_int() >=
base::android::SDK_VERSION_MARSHMALLOW) {
- // On Marshmallow and newer releases, the NetworkHandle is munged by
- // Network.getNetworkHandle() and 65536 isn't munged so it's rejected.
+ // On Marshmallow and newer releases, the handles::NetworkHandle is munged
+ // by Network.getNetworkHandle() and 65536 isn't munged so it's rejected.
EXPECT_EQ(ERR_INVALID_ARGUMENT, rv);
}
}
}
-} // namespace android
-
-} // namespace net
+} // namespace net::android
diff --git a/chromium/net/android/radio_activity_tracker.cc b/chromium/net/android/radio_activity_tracker.cc
index 0fe85a85bd4..10c2e71a53c 100644
--- a/chromium/net/android/radio_activity_tracker.cc
+++ b/chromium/net/android/radio_activity_tracker.cc
@@ -10,8 +10,7 @@
#include "net/base/features.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
-namespace net {
-namespace android {
+namespace net::android {
namespace {
@@ -109,5 +108,4 @@ void MaybeRecordUDPWriteForWakeupTrigger(
traffic_annotation.unique_id_hash_code);
}
-} // namespace android
-} // namespace net
+} // namespace net::android
diff --git a/chromium/net/android/traffic_stats.cc b/chromium/net/android/traffic_stats.cc
index 48cdcd25751..0aa647f749a 100644
--- a/chromium/net/android/traffic_stats.cc
+++ b/chromium/net/android/traffic_stats.cc
@@ -6,11 +6,7 @@
#include "net/net_jni_headers/AndroidTrafficStats_jni.h"
-namespace net {
-
-namespace android {
-
-namespace traffic_stats {
+namespace net::android::traffic_stats {
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net
enum TrafficStatsError {
@@ -43,8 +39,4 @@ bool GetCurrentUidRxBytes(int64_t* bytes) {
return *bytes != ERROR_NOT_SUPPORTED;
}
-} // namespace traffic_stats
-
-} // namespace android
-
-} // namespace net
+} // namespace net::android::traffic_stats
diff --git a/chromium/net/android/traffic_stats.h b/chromium/net/android/traffic_stats.h
index 866e6b7ae46..baa062de45e 100644
--- a/chromium/net/android/traffic_stats.h
+++ b/chromium/net/android/traffic_stats.h
@@ -13,11 +13,7 @@
#include "net/base/net_export.h"
-namespace net {
-
-namespace android {
-
-namespace traffic_stats {
+namespace net::android::traffic_stats {
// Returns true if the number of bytes transmitted since device boot is
// available and sets |*bytes| to that value. Counts packets across all network
@@ -47,10 +43,6 @@ NET_EXPORT bool GetCurrentUidTxBytes(int64_t* bytes);
// and UDP usage. |bytes| must not be nullptr.
NET_EXPORT bool GetCurrentUidRxBytes(int64_t* bytes);
-} // namespace traffic_stats
-
-} // namespace android
-
-} // namespace net
+} // namespace net::android::traffic_stats
#endif // NET_ANDROID_TRAFFIC_STATS_H_
diff --git a/chromium/net/base/address_family.cc b/chromium/net/base/address_family.cc
index 6e0bc676252..dbc72262327 100644
--- a/chromium/net/base/address_family.cc
+++ b/chromium/net/base/address_family.cc
@@ -33,4 +33,17 @@ int ConvertAddressFamily(AddressFamily address_family) {
return AF_UNSPEC;
}
+AddressFamily ToAddressFamily(int family) {
+ switch (family) {
+ case AF_INET:
+ return ADDRESS_FAMILY_IPV4;
+ case AF_INET6:
+ return ADDRESS_FAMILY_IPV6;
+ case AF_UNSPEC:
+ return ADDRESS_FAMILY_UNSPECIFIED;
+ }
+ NOTREACHED();
+ return ADDRESS_FAMILY_UNSPECIFIED;
+}
+
} // namespace net
diff --git a/chromium/net/base/address_family.h b/chromium/net/base/address_family.h
index 38223ce4f33..856792caa85 100644
--- a/chromium/net/base/address_family.h
+++ b/chromium/net/base/address_family.h
@@ -41,6 +41,9 @@ NET_EXPORT AddressFamily GetAddressFamily(const IPAddress& address);
// Maps the given AddressFamily to either AF_INET, AF_INET6 or AF_UNSPEC.
NET_EXPORT int ConvertAddressFamily(AddressFamily address_family);
+// Maps AF_INET, AF_INET6 or AF_UNSPEC to an AddressFamily.
+NET_EXPORT AddressFamily ToAddressFamily(int family);
+
} // namespace net
#endif // NET_BASE_ADDRESS_FAMILY_H_
diff --git a/chromium/net/base/address_family_unittest.cc b/chromium/net/base/address_family_unittest.cc
index 9efb76874a2..8248c87a34e 100644
--- a/chromium/net/base/address_family_unittest.cc
+++ b/chromium/net/base/address_family_unittest.cc
@@ -5,6 +5,7 @@
#include "net/base/address_family.h"
#include "net/base/ip_address.h"
+#include "net/base/sys_addrinfo.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
@@ -19,5 +20,11 @@ TEST(AddressFamilyTest, GetAddressFamily) {
EXPECT_EQ(ADDRESS_FAMILY_IPV6, GetAddressFamily(address));
}
+TEST(AddressFamilyTest, ToAddressFamily) {
+ EXPECT_EQ(ADDRESS_FAMILY_IPV4, ToAddressFamily(AF_INET));
+ EXPECT_EQ(ADDRESS_FAMILY_IPV6, ToAddressFamily(AF_INET6));
+ EXPECT_EQ(ADDRESS_FAMILY_UNSPECIFIED, ToAddressFamily(AF_UNSPEC));
+}
+
} // namespace
} // namespace net
diff --git a/chromium/net/base/address_list.cc b/chromium/net/base/address_list.cc
index 121bdc4c4f7..95304b0dfec 100644
--- a/chromium/net/base/address_list.cc
+++ b/chromium/net/base/address_list.cc
@@ -52,8 +52,8 @@ AddressList AddressList::CreateFromIPAddressList(
const IPAddressList& addresses,
std::vector<std::string> aliases) {
AddressList list;
- for (auto iter = addresses.begin(); iter != addresses.end(); ++iter) {
- list.push_back(IPEndPoint(*iter, 0));
+ for (const auto& address : addresses) {
+ list.push_back(IPEndPoint(address, 0));
}
list.SetDnsAliases(std::move(aliases));
return list;
diff --git a/chromium/net/base/address_tracker_linux.cc b/chromium/net/base/address_tracker_linux.cc
index 2b8d6fdd557..d1a77c6d3ed 100644
--- a/chromium/net/base/address_tracker_linux.cc
+++ b/chromium/net/base/address_tracker_linux.cc
@@ -25,8 +25,7 @@
#include "base/android/build_info.h"
#endif
-namespace net {
-namespace internal {
+namespace net::internal {
namespace {
@@ -74,8 +73,8 @@ bool GetAddress(const struct nlmsghdr* header,
// getaddrinfo in glibc (check_pf.c). Judging from kernel implementation of
// NETLINK, IPv4 addresses have only the IFA_ADDRESS attribute, while IPv6
// have the IFA_LOCAL attribute.
- uint8_t* address = NULL;
- uint8_t* local = NULL;
+ uint8_t* address = nullptr;
+ uint8_t* local = nullptr;
int length = IFA_PAYLOAD(header);
if (length > header_length) {
LOG(ERROR) << "ifaddrmsg length exceeds bounds";
@@ -396,7 +395,7 @@ void AddressTrackerLinux::HandleMessage(const char* buffer,
// prefix which can cause the linux kernel to frequently output two
// back-to-back messages, one without the deprecated flag and one with
// the deprecated flag but both with preferred lifetimes of 0. Avoid
- // interpretting this as an actual change by canonicalizing the two
+ // interpreting this as an actual change by canonicalizing the two
// messages by setting the deprecated flag based on the preferred
// lifetime also. http://crbug.com/268042
if (really_deprecated)
@@ -550,5 +549,4 @@ AddressTrackerLinux::AddressTrackerAutoLock::~AddressTrackerAutoLock() {
}
}
-} // namespace internal
-} // namespace net
+} // namespace net::internal
diff --git a/chromium/net/base/address_tracker_linux.h b/chromium/net/base/address_tracker_linux.h
index db564af774f..c2d4ea8c7ce 100644
--- a/chromium/net/base/address_tracker_linux.h
+++ b/chromium/net/base/address_tracker_linux.h
@@ -29,8 +29,7 @@
#include "net/base/net_export.h"
#include "net/base/network_change_notifier.h"
-namespace net {
-namespace internal {
+namespace net::internal {
// Keeps track of network interface addresses using rtnetlink. Used by
// NetworkChangeNotifier to provide signals to registered IPAddressObservers.
@@ -70,7 +69,7 @@ class NET_EXPORT_PRIVATE AddressTrackerLinux {
AddressMap GetAddressMap() const;
- // Returns set of interface indicies for online interfaces.
+ // Returns set of interface indices for online interfaces.
std::unordered_set<int> GetOnlineLinks() const;
// Implementation of NetworkChangeNotifierLinux::GetCurrentConnectionType().
@@ -191,7 +190,6 @@ class NET_EXPORT_PRIVATE AddressTrackerLinux {
base::ThreadChecker thread_checker_;
};
-} // namespace internal
-} // namespace net
+} // namespace net::internal
#endif // NET_BASE_ADDRESS_TRACKER_LINUX_H_
diff --git a/chromium/net/base/address_tracker_linux_unittest.cc b/chromium/net/base/address_tracker_linux_unittest.cc
index 2d21097f468..83f8051b063 100644
--- a/chromium/net/base/address_tracker_linux_unittest.cc
+++ b/chromium/net/base/address_tracker_linux_unittest.cc
@@ -36,8 +36,7 @@
#define IFA_F_HOMEADDRESS 0x10
#endif
-namespace net {
-namespace internal {
+namespace net::internal {
namespace {
const int kTestInterfaceEth = 1;
@@ -672,7 +671,7 @@ TEST_F(AddressTrackerLinuxTest, GetInterfaceName) {
for (int i = 0; i < 10; i++) {
char buf[IFNAMSIZ] = {0};
- EXPECT_NE((const char*)NULL, original_get_interface_name_(i, buf));
+ EXPECT_NE((const char*)nullptr, original_get_interface_name_(i, buf));
}
}
@@ -939,5 +938,4 @@ MULTIPROCESS_TEST_MAIN(ChildProcessInitializeTrackerForTesting) {
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
#endif // defined(CLONE_NEWUSER) && defined(CLONE_NEWPID)
-} // namespace internal
-} // namespace net
+} // namespace net::internal
diff --git a/chromium/net/base/backoff_entry_serializer.cc b/chromium/net/base/backoff_entry_serializer.cc
index 76015d296d1..2a65462e551 100644
--- a/chromium/net/base/backoff_entry_serializer.cc
+++ b/chromium/net/base/backoff_entry_serializer.cc
@@ -71,27 +71,23 @@ base::Value BackoffEntrySerializer::SerializeToValue(const BackoffEntry& entry,
return base::Value(std::move(serialized));
}
-std::unique_ptr<BackoffEntry> BackoffEntrySerializer::DeserializeFromValue(
- const base::Value& serialized,
+std::unique_ptr<BackoffEntry> BackoffEntrySerializer::DeserializeFromList(
+ const base::Value::List& serialized,
const BackoffEntry::Policy* policy,
const base::TickClock* tick_clock,
base::Time time_now) {
- if (!serialized.is_list())
+ if (serialized.size() != 4)
return nullptr;
- const base::Value::List& list = serialized.GetList();
- if (list.size() != 4)
+ if (!serialized[0].is_int())
return nullptr;
-
- if (!list[0].is_int())
- return nullptr;
- int version_number = list[0].GetInt();
+ int version_number = serialized[0].GetInt();
if (version_number != kVersion1 && version_number != kVersion2)
return nullptr;
- if (!list[1].is_int())
+ if (!serialized[1].is_int())
return nullptr;
- int failure_count = list[1].GetInt();
+ int failure_count = serialized[1].GetInt();
if (failure_count < 0) {
return nullptr;
}
@@ -100,17 +96,17 @@ std::unique_ptr<BackoffEntry> BackoffEntrySerializer::DeserializeFromValue(
base::TimeDelta original_backoff_duration;
switch (version_number) {
case kVersion1: {
- if (!list[2].is_double())
+ if (!serialized[2].is_double())
return nullptr;
- double original_backoff_duration_double = list[2].GetDouble();
+ double original_backoff_duration_double = serialized[2].GetDouble();
original_backoff_duration =
base::Seconds(original_backoff_duration_double);
break;
}
case kVersion2: {
- if (!list[2].is_string())
+ if (!serialized[2].is_string())
return nullptr;
- std::string original_backoff_duration_string = list[2].GetString();
+ std::string original_backoff_duration_string = serialized[2].GetString();
int64_t original_backoff_duration_us;
if (!base::StringToInt64(original_backoff_duration_string,
&original_backoff_duration_us)) {
@@ -124,9 +120,9 @@ std::unique_ptr<BackoffEntry> BackoffEntrySerializer::DeserializeFromValue(
NOTREACHED() << "Unexpected version_number: " << version_number;
}
- if (!list[3].is_string())
+ if (!serialized[3].is_string())
return nullptr;
- std::string absolute_release_time_string = list[3].GetString();
+ std::string absolute_release_time_string = serialized[3].GetString();
int64_t absolute_release_time_us;
if (!base::StringToInt64(absolute_release_time_string,
@@ -134,7 +130,7 @@ std::unique_ptr<BackoffEntry> BackoffEntrySerializer::DeserializeFromValue(
return nullptr;
}
- std::unique_ptr<BackoffEntry> entry(new BackoffEntry(policy, tick_clock));
+ auto entry = std::make_unique<BackoffEntry>(policy, tick_clock);
for (int n = 0; n < failure_count; n++)
entry->InformOfRequest(false);
@@ -175,4 +171,15 @@ std::unique_ptr<BackoffEntry> BackoffEntrySerializer::DeserializeFromValue(
return entry;
}
+std::unique_ptr<BackoffEntry> BackoffEntrySerializer::DeserializeFromValue(
+ const base::Value& serialized,
+ const BackoffEntry::Policy* policy,
+ const base::TickClock* tick_clock,
+ base::Time time_now) {
+ if (!serialized.is_list())
+ return nullptr;
+ return DeserializeFromList(serialized.GetList(), policy, tick_clock,
+ time_now);
+}
+
} // namespace net
diff --git a/chromium/net/base/backoff_entry_serializer.h b/chromium/net/base/backoff_entry_serializer.h
index 42c47b75027..6a35545981c 100644
--- a/chromium/net/base/backoff_entry_serializer.h
+++ b/chromium/net/base/backoff_entry_serializer.h
@@ -8,11 +8,11 @@
#include <memory>
#include "base/time/time.h"
+#include "base/values.h"
#include "net/base/backoff_entry.h"
#include "net/base/net_export.h"
namespace base {
-class Value;
class TickClock;
}
@@ -35,7 +35,7 @@ class NET_EXPORT BackoffEntrySerializer {
// later be passed to Deserialize to re-create the given BackoffEntry. It
// always serializes using the latest format version. The Policy is not
// serialized, instead callers must pass an identical Policy* when
- // deserializing. |time_now| should be base::Time::Now(), except for tests
+ // deserializing. `time_now` should be `base::Time::Now()`, except for tests
// that want to simulate time changes. The release time TimeTicks will be
// converted to an absolute timestamp, thus the time will continue counting
// down even whilst the device is powered off, and will be partially
@@ -43,14 +43,24 @@ class NET_EXPORT BackoffEntrySerializer {
static base::Value SerializeToValue(const BackoffEntry& entry,
base::Time time_now);
- // Deserializes a Value back to a BackoffEntry. It supports all
- // serialization format versions. |policy| MUST be the same Policy as the
- // serialized entry had. |clock| may be NULL. Both |policy| and |clock| (if
- // not NULL) must enclose lifetime of the returned BackoffEntry. |time_now|
- // should be base::Time::Now(), except for tests that want to simulate time
+ // Deserializes a `list` back to a BackoffEntry. It supports all
+ // serialization format versions. `policy` MUST be the same Policy as the
+ // serialized entry had. `clock` may be NULL. Both `policy` and `clock` (if
+ // not NULL) must enclose lifetime of the returned BackoffEntry. `time_now`
+ // should be `base::Time::Now()`, except for tests that want to simulate time
// changes. The absolute timestamp that was serialized will be converted back
// to TimeTicks as best as possible. Returns NULL if deserialization was
// unsuccessful.
+ static std::unique_ptr<BackoffEntry> DeserializeFromList(
+ const base::Value::List& serialized,
+ const BackoffEntry::Policy* policy,
+ const base::TickClock* clock,
+ base::Time time_now);
+
+ // Same as `DeserializeFromList` if `serialized` is a list.
+ // Returns `nullptr` otherwise.
+ // TODO(https://crbug.com/1352136) migrated call sites to
+ // DeserializeFromList and remove DeserializeFromValue.
static std::unique_ptr<BackoffEntry> DeserializeFromValue(
const base::Value& serialized,
const BackoffEntry::Policy* policy,
diff --git a/chromium/net/base/backoff_entry_serializer_unittest.cc b/chromium/net/base/backoff_entry_serializer_unittest.cc
index 02e515a4e4f..5bcb3ebea5b 100644
--- a/chromium/net/base/backoff_entry_serializer_unittest.cc
+++ b/chromium/net/base/backoff_entry_serializer_unittest.cc
@@ -205,13 +205,11 @@ TEST(BackoffEntrySerializerTest, SerializeNoFailures) {
// Test that deserialization fails instead of producing an entry with an
// infinite release time. (Regression test for https://crbug.com/1293904)
TEST(BackoffEntrySerializerTest, DeserializeNeverInfiniteReleaseTime) {
- const base::Value kSerialized[] = {
- base::Value(2),
- base::Value(2),
- base::Value("-9223372036854775807"),
- base::Value("2"),
- };
- base::Value serialized(base::make_span(kSerialized));
+ base::Value::List serialized;
+ serialized.Append(2);
+ serialized.Append(2);
+ serialized.Append("-9223372036854775807");
+ serialized.Append("2");
TestTickClock original_ticks;
original_ticks.set_now(base::TimeTicks() + base::Microseconds(-1));
@@ -220,8 +218,9 @@ TEST(BackoffEntrySerializerTest, DeserializeNeverInfiniteReleaseTime) {
base::Time::FromDeltaSinceWindowsEpoch(base::Microseconds(-1));
std::unique_ptr<BackoffEntry> entry =
- BackoffEntrySerializer::DeserializeFromValue(serialized, &base_policy,
- &original_ticks, time_now);
+ BackoffEntrySerializer::DeserializeFromValue(
+ base::Value(std::move(serialized)), &base_policy, &original_ticks,
+ time_now);
ASSERT_FALSE(entry);
}
diff --git a/chromium/net/base/chunked_upload_data_stream.cc b/chromium/net/base/chunked_upload_data_stream.cc
index 9e812f379d9..fac1432a7e0 100644
--- a/chromium/net/base/chunked_upload_data_stream.cc
+++ b/chromium/net/base/chunked_upload_data_stream.cc
@@ -26,8 +26,9 @@ ChunkedUploadDataStream::Writer::Writer(
base::WeakPtr<ChunkedUploadDataStream> upload_data_stream)
: upload_data_stream_(upload_data_stream) {}
-ChunkedUploadDataStream::ChunkedUploadDataStream(int64_t identifier)
- : UploadDataStream(true, identifier) {}
+ChunkedUploadDataStream::ChunkedUploadDataStream(int64_t identifier,
+ bool has_null_source)
+ : UploadDataStream(/*is_chunked=*/true, has_null_source, identifier) {}
ChunkedUploadDataStream::~ChunkedUploadDataStream() = default;
diff --git a/chromium/net/base/chunked_upload_data_stream.h b/chromium/net/base/chunked_upload_data_stream.h
index 117765d5370..a8564f9bded 100644
--- a/chromium/net/base/chunked_upload_data_stream.h
+++ b/chromium/net/base/chunked_upload_data_stream.h
@@ -56,7 +56,8 @@ class NET_EXPORT ChunkedUploadDataStream : public UploadDataStream {
const base::WeakPtr<ChunkedUploadDataStream> upload_data_stream_;
};
- explicit ChunkedUploadDataStream(int64_t identifier);
+ explicit ChunkedUploadDataStream(int64_t identifier,
+ bool has_null_source = false);
ChunkedUploadDataStream(const ChunkedUploadDataStream&) = delete;
ChunkedUploadDataStream& operator=(const ChunkedUploadDataStream&) = delete;
diff --git a/chromium/net/base/chunked_upload_data_stream_unittest.cc b/chromium/net/base/chunked_upload_data_stream_unittest.cc
index 85a53523c53..37e8f3edf26 100644
--- a/chromium/net/base/chunked_upload_data_stream_unittest.cc
+++ b/chromium/net/base/chunked_upload_data_stream_unittest.cc
@@ -339,8 +339,7 @@ TEST(ChunkedUploadDataStreamTest, RewindWhileReading) {
// Check the behavior of ChunkedUploadDataStream::Writer.
TEST(ChunkedUploadDataStreamTest, ChunkedUploadDataStreamWriter) {
- std::unique_ptr<ChunkedUploadDataStream> stream(
- new ChunkedUploadDataStream(0));
+ auto stream = std::make_unique<ChunkedUploadDataStream>(0);
std::unique_ptr<ChunkedUploadDataStream::Writer> writer(
stream->CreateWriter());
diff --git a/chromium/net/base/connection_endpoint_metadata.cc b/chromium/net/base/connection_endpoint_metadata.cc
index 842c0e53a94..1bdf66a4812 100644
--- a/chromium/net/base/connection_endpoint_metadata.cc
+++ b/chromium/net/base/connection_endpoint_metadata.cc
@@ -17,6 +17,7 @@ namespace net {
namespace {
const char kSupportedProtocolAlpnsKey[] = "supported_protocol_alpns";
const char kEchConfigListKey[] = "ech_config_list";
+const char kTargetNameKey[] = "target_name";
} // namespace
ConnectionEndpointMetadata::ConnectionEndpointMetadata() = default;
@@ -37,6 +38,10 @@ base::Value ConnectionEndpointMetadata::ToValue() const {
dict.Set(kEchConfigListKey, base::Base64Encode(ech_config_list));
+ if (!target_name.empty()) {
+ dict.Set(kTargetNameKey, target_name);
+ }
+
return base::Value(std::move(dict));
}
@@ -51,6 +56,7 @@ ConnectionEndpointMetadata::FromValue(const base::Value& value) {
dict->FindList(kSupportedProtocolAlpnsKey);
const std::string* ech_config_list_value =
dict->FindString(kEchConfigListKey);
+ const std::string* target_name_value = dict->FindString(kTargetNameKey);
if (!alpns_list || !ech_config_list_value)
return absl::nullopt;
@@ -58,10 +64,10 @@ ConnectionEndpointMetadata::FromValue(const base::Value& value) {
ConnectionEndpointMetadata metadata;
std::vector<std::string> alpns;
- for (const base::Value& value : *alpns_list) {
- if (!value.is_string())
+ for (const base::Value& alpn : *alpns_list) {
+ if (!alpn.is_string())
return absl::nullopt;
- metadata.supported_protocol_alpns.push_back(value.GetString());
+ metadata.supported_protocol_alpns.push_back(alpn.GetString());
}
absl::optional<std::vector<uint8_t>> decoded =
@@ -70,6 +76,10 @@ ConnectionEndpointMetadata::FromValue(const base::Value& value) {
return absl::nullopt;
metadata.ech_config_list = std::move(*decoded);
+ if (target_name_value) {
+ metadata.target_name = *target_name_value;
+ }
+
return metadata;
}
diff --git a/chromium/net/base/connection_endpoint_metadata.h b/chromium/net/base/connection_endpoint_metadata.h
index 04655377e88..56f9c6be09e 100644
--- a/chromium/net/base/connection_endpoint_metadata.h
+++ b/chromium/net/base/connection_endpoint_metadata.h
@@ -34,8 +34,9 @@ struct NET_EXPORT_PRIVATE ConnectionEndpointMetadata {
ConnectionEndpointMetadata& operator=(ConnectionEndpointMetadata&&) = default;
bool operator==(const ConnectionEndpointMetadata& other) const {
- return std::tie(supported_protocol_alpns, ech_config_list) ==
- std::tie(other.supported_protocol_alpns, other.ech_config_list);
+ return std::tie(supported_protocol_alpns, ech_config_list, target_name) ==
+ std::tie(other.supported_protocol_alpns, other.ech_config_list,
+ target_name);
}
base::Value ToValue() const;
@@ -48,6 +49,9 @@ struct NET_EXPORT_PRIVATE ConnectionEndpointMetadata {
// If not empty, TLS Encrypted Client Hello config for the service.
EchConfigList ech_config_list;
+
+ // The target domain name of this metadata.
+ std::string target_name;
};
} // namespace net
diff --git a/chromium/net/base/connection_endpoint_metadata_test_util.cc b/chromium/net/base/connection_endpoint_metadata_test_util.cc
index 03a547dc840..837a430c737 100644
--- a/chromium/net/base/connection_endpoint_metadata_test_util.cc
+++ b/chromium/net/base/connection_endpoint_metadata_test_util.cc
@@ -25,10 +25,12 @@ class EndpointMetadataMatcher
EndpointMetadataMatcher(
testing::Matcher<std::vector<std::string>>
supported_protocol_alpns_matcher,
- testing::Matcher<EchConfigList> ech_config_list_matcher)
+ testing::Matcher<EchConfigList> ech_config_list_matcher,
+ testing::Matcher<std::string> target_name_matcher)
: supported_protocol_alpns_matcher_(
std::move(supported_protocol_alpns_matcher)),
- ech_config_list_matcher_(std::move(ech_config_list_matcher)) {}
+ ech_config_list_matcher_(std::move(ech_config_list_matcher)),
+ target_name_matcher_(std::move(target_name_matcher)) {}
~EndpointMetadataMatcher() override = default;
@@ -50,6 +52,11 @@ class EndpointMetadataMatcher
testing::Field("ech_config_list",
&ConnectionEndpointMetadata::ech_config_list,
ech_config_list_matcher_),
+ metadata, result_listener) &&
+ ExplainMatchResult(
+ testing::Field("target_name",
+ &ConnectionEndpointMetadata::target_name,
+ target_name_matcher_),
metadata, result_listener);
}
@@ -68,11 +75,14 @@ class EndpointMetadataMatcher
os << "ConnectionEndpoint {\nsupported_protocol_alpns: "
<< testing::PrintToString(supported_protocol_alpns_matcher_)
<< "\nech_config_list: "
- << testing::PrintToString(ech_config_list_matcher_) << "\n}";
+ << testing::PrintToString(ech_config_list_matcher_)
+ << "\ntarget_name: " << testing::PrintToString(target_name_matcher_)
+ << "\n}";
}
testing::Matcher<std::vector<std::string>> supported_protocol_alpns_matcher_;
testing::Matcher<EchConfigList> ech_config_list_matcher_;
+ testing::Matcher<std::string> target_name_matcher_;
};
} // namespace
@@ -80,10 +90,11 @@ class EndpointMetadataMatcher
testing::Matcher<const ConnectionEndpointMetadata&>
ExpectConnectionEndpointMetadata(
testing::Matcher<std::vector<std::string>> supported_protocol_alpns_matcher,
- testing::Matcher<EchConfigList> ech_config_list_matcher) {
- return testing::MakeMatcher(
- new EndpointMetadataMatcher(std::move(supported_protocol_alpns_matcher),
- std::move(ech_config_list_matcher)));
+ testing::Matcher<EchConfigList> ech_config_list_matcher,
+ testing::Matcher<std::string> target_name_matcher) {
+ return testing::MakeMatcher(new EndpointMetadataMatcher(
+ std::move(supported_protocol_alpns_matcher),
+ std::move(ech_config_list_matcher), std::move(target_name_matcher)));
}
std::ostream& operator<<(
@@ -95,6 +106,8 @@ std::ostream& operator<<(
<< "\nech_config_list: "
<< testing::PrintToString(
connection_endpoint_metadata.ech_config_list)
+ << "\ntarget_name: "
+ << testing::PrintToString(connection_endpoint_metadata.target_name)
<< "\n}";
}
diff --git a/chromium/net/base/connection_endpoint_metadata_test_util.h b/chromium/net/base/connection_endpoint_metadata_test_util.h
index d7599ccc602..4ec01b4d349 100644
--- a/chromium/net/base/connection_endpoint_metadata_test_util.h
+++ b/chromium/net/base/connection_endpoint_metadata_test_util.h
@@ -20,7 +20,8 @@ ExpectConnectionEndpointMetadata(
testing::Matcher<std::vector<std::string>>
supported_protocol_alpns_matcher = testing::IsEmpty(),
testing::Matcher<ConnectionEndpointMetadata::EchConfigList>
- ech_config_list_matcher = testing::IsEmpty());
+ ech_config_list_matcher = testing::IsEmpty(),
+ testing::Matcher<std::string> target_name_matcher = testing::IsEmpty());
std::ostream& operator<<(
std::ostream& os,
diff --git a/chromium/net/base/datagram_buffer.cc b/chromium/net/base/datagram_buffer.cc
index 7f3798ead04..255fabbcd53 100644
--- a/chromium/net/base/datagram_buffer.cc
+++ b/chromium/net/base/datagram_buffer.cc
@@ -13,7 +13,7 @@ namespace net {
DatagramBufferPool::DatagramBufferPool(size_t max_buffer_size)
: max_buffer_size_(max_buffer_size) {}
-DatagramBufferPool::~DatagramBufferPool() {}
+DatagramBufferPool::~DatagramBufferPool() = default;
void DatagramBufferPool::Enqueue(const char* buffer,
size_t buf_len,
@@ -38,9 +38,9 @@ void DatagramBufferPool::Dequeue(DatagramBuffers* buffers) {
}
DatagramBuffer::DatagramBuffer(size_t max_buffer_size)
- : data_(new char[max_buffer_size]) {}
+ : data_(std::make_unique<char[]>(max_buffer_size)) {}
-DatagramBuffer::~DatagramBuffer() {}
+DatagramBuffer::~DatagramBuffer() = default;
void DatagramBuffer::Set(const char* buffer, size_t buf_len) {
length_ = buf_len;
diff --git a/chromium/net/base/datagram_buffer.h b/chromium/net/base/datagram_buffer.h
index bb45dd1efea..b272722b486 100644
--- a/chromium/net/base/datagram_buffer.h
+++ b/chromium/net/base/datagram_buffer.h
@@ -44,7 +44,7 @@ class NET_EXPORT_PRIVATE DatagramBufferPool {
public:
// |max_buffer_size| must be >= largest |buf_len| provided to
// ||New()|.
- DatagramBufferPool(size_t max_buffer_size);
+ explicit DatagramBufferPool(size_t max_buffer_size);
DatagramBufferPool(const DatagramBufferPool&) = delete;
DatagramBufferPool& operator=(const DatagramBufferPool&) = delete;
virtual ~DatagramBufferPool();
@@ -86,7 +86,7 @@ class NET_EXPORT_PRIVATE DatagramBuffer {
size_t length() const;
protected:
- DatagramBuffer(size_t max_packet_size);
+ explicit DatagramBuffer(size_t max_packet_size);
private:
friend class DatagramBufferPool;
diff --git a/chromium/net/base/datagram_buffer_unittest.cc b/chromium/net/base/datagram_buffer_unittest.cc
index 0f65ffd669c..d62f7b3989f 100644
--- a/chromium/net/base/datagram_buffer_unittest.cc
+++ b/chromium/net/base/datagram_buffer_unittest.cc
@@ -5,9 +5,7 @@
#include "net/base/datagram_buffer.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace test {
+namespace net::test {
const size_t kMaxBufferSize = 1024;
@@ -49,6 +47,4 @@ TEST_F(DatagramBufferTest, DatgramBufferPoolRecycles) {
EXPECT_EQ(buffer2_ptr, buffers.back().get());
}
-} // namespace test
-
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/base/directory_lister.cc b/chromium/net/base/directory_lister.cc
index 0882163ce87..b606f7d114f 100644
--- a/chromium/net/base/directory_lister.cc
+++ b/chromium/net/base/directory_lister.cc
@@ -71,7 +71,7 @@ DirectoryLister::DirectoryLister(const base::FilePath& dir,
ListingType type,
DirectoryListerDelegate* delegate)
: delegate_(delegate) {
- core_ = new Core(dir, type, this);
+ core_ = base::MakeRefCounted<Core>(dir, type, this);
DCHECK(delegate_);
DCHECK(!dir.value().empty());
}
@@ -114,7 +114,7 @@ void DirectoryLister::Core::CancelOnOriginSequence() {
}
void DirectoryLister::Core::Start() {
- std::unique_ptr<DirectoryList> directory_list(new DirectoryList());
+ auto directory_list = std::make_unique<DirectoryList>();
if (!base::DirectoryExists(dir_)) {
origin_task_runner_->PostTask(
diff --git a/chromium/net/base/directory_lister_unittest.cc b/chromium/net/base/directory_lister_unittest.cc
index d97dd7c5870..ec25e3b1e8c 100644
--- a/chromium/net/base/directory_lister_unittest.cc
+++ b/chromium/net/base/directory_lister_unittest.cc
@@ -135,7 +135,7 @@ class DirectoryListerTest : public PlatformTest, public WithTaskEnvironment {
// directory.
std::list<std::pair<base::FilePath, int> > directories;
ASSERT_TRUE(temp_root_dir_.CreateUniqueTempDir());
- directories.push_back(std::make_pair(temp_root_dir_.GetPath(), 0));
+ directories.emplace_back(temp_root_dir_.GetPath(), 0);
while (!directories.empty()) {
std::pair<base::FilePath, int> dir_data = directories.front();
directories.pop_front();
@@ -157,7 +157,7 @@ class DirectoryListerTest : public PlatformTest, public WithTaskEnvironment {
++total_created_file_system_objects_in_temp_root_dir_;
if (dir_data.first == temp_root_dir_.GetPath())
++created_file_system_objects_in_temp_root_dir_;
- directories.push_back(std::make_pair(dir_path, dir_data.second + 1));
+ directories.emplace_back(dir_path, dir_data.second + 1);
}
}
}
@@ -229,8 +229,7 @@ TEST_F(DirectoryListerTest, EmptyDirTest) {
// regression.
TEST_F(DirectoryListerTest, BasicCancelTest) {
ListerDelegate delegate(DirectoryLister::ALPHA_DIRS_FIRST);
- std::unique_ptr<DirectoryLister> lister(
- new DirectoryLister(root_path(), &delegate));
+ auto lister = std::make_unique<DirectoryLister>(root_path(), &delegate);
lister->Start();
lister->Cancel();
base::RunLoop().RunUntilIdle();
diff --git a/chromium/net/base/elements_upload_data_stream.cc b/chromium/net/base/elements_upload_data_stream.cc
index 1f5d616b5ef..6d91c8beac7 100644
--- a/chromium/net/base/elements_upload_data_stream.cc
+++ b/chromium/net/base/elements_upload_data_stream.cc
@@ -28,8 +28,8 @@ std::unique_ptr<UploadDataStream> ElementsUploadDataStream::CreateWithReader(
int64_t identifier) {
std::vector<std::unique_ptr<UploadElementReader>> readers;
readers.push_back(std::move(reader));
- return std::unique_ptr<UploadDataStream>(
- new ElementsUploadDataStream(std::move(readers), identifier));
+ return std::make_unique<ElementsUploadDataStream>(std::move(readers),
+ identifier);
}
int ElementsUploadDataStream::InitInternal(const NetLogWithSource& net_log) {
diff --git a/chromium/net/base/elements_upload_data_stream_unittest.cc b/chromium/net/base/elements_upload_data_stream_unittest.cc
index b586bf0499b..6516c288eda 100644
--- a/chromium/net/base/elements_upload_data_stream_unittest.cc
+++ b/chromium/net/base/elements_upload_data_stream_unittest.cc
@@ -162,7 +162,8 @@ class ElementsUploadDataStreamTest : public PlatformTest,
TEST_F(ElementsUploadDataStreamTest, EmptyUploadData) {
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
ASSERT_THAT(stream->Init(CompletionOnceCallback(), NetLogWithSource()),
IsOk());
EXPECT_TRUE(stream->IsInMemory());
@@ -175,7 +176,8 @@ TEST_F(ElementsUploadDataStreamTest, ConsumeAllBytes) {
element_readers_.push_back(
std::make_unique<UploadBytesElementReader>(kTestData, kTestDataSize));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
ASSERT_THAT(stream->Init(CompletionOnceCallback(), NetLogWithSource()),
IsOk());
EXPECT_TRUE(stream->IsInMemory());
@@ -205,7 +207,8 @@ TEST_F(ElementsUploadDataStreamTest, File) {
TestCompletionCallback init_callback;
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
ASSERT_THAT(stream->Init(init_callback.callback(), NetLogWithSource()),
IsError(ERR_IO_PENDING));
ASSERT_THAT(init_callback.WaitForResult(), IsOk());
@@ -242,7 +245,8 @@ TEST_F(ElementsUploadDataStreamTest, FileSmallerThanLength) {
TestCompletionCallback init_callback;
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
ASSERT_THAT(stream->Init(init_callback.callback(), NetLogWithSource()),
IsError(ERR_IO_PENDING));
ASSERT_THAT(init_callback.WaitForResult(), IsOk());
@@ -271,8 +275,7 @@ TEST_F(ElementsUploadDataStreamTest, FileSmallerThanLength) {
TEST_F(ElementsUploadDataStreamTest, ReadErrorSync) {
// This element cannot be read.
- std::unique_ptr<MockUploadElementReader> reader(
- new MockUploadElementReader(kTestDataSize, true));
+ auto reader = std::make_unique<MockUploadElementReader>(kTestDataSize, true);
EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
reader->SetReadExpectation(ERR_FAILED);
element_readers_.push_back(std::move(reader));
@@ -282,7 +285,8 @@ TEST_F(ElementsUploadDataStreamTest, ReadErrorSync) {
std::make_unique<UploadBytesElementReader>(kTestData, kTestDataSize));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
// Run Init().
ASSERT_THAT(stream->Init(CompletionOnceCallback(), NetLogWithSource()),
@@ -307,8 +311,7 @@ TEST_F(ElementsUploadDataStreamTest, ReadErrorSync) {
TEST_F(ElementsUploadDataStreamTest, ReadErrorAsync) {
// This element cannot be read.
- std::unique_ptr<MockUploadElementReader> reader(
- new MockUploadElementReader(kTestDataSize, false));
+ auto reader = std::make_unique<MockUploadElementReader>(kTestDataSize, false);
reader->SetAsyncInitExpectation(OK);
reader->SetReadExpectation(ERR_FAILED);
element_readers_.push_back(std::move(reader));
@@ -318,7 +321,8 @@ TEST_F(ElementsUploadDataStreamTest, ReadErrorAsync) {
std::make_unique<UploadBytesElementReader>(kTestData, kTestDataSize));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
// Run Init().
TestCompletionCallback init_callback;
@@ -364,7 +368,8 @@ TEST_F(ElementsUploadDataStreamTest, FileAndBytes) {
const uint64_t kStreamSize = kTestDataSize + kFileRangeLength;
TestCompletionCallback init_callback;
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
ASSERT_THAT(stream->Init(init_callback.callback(), NetLogWithSource()),
IsError(ERR_IO_PENDING));
ASSERT_THAT(init_callback.WaitForResult(), IsOk());
@@ -388,33 +393,31 @@ TEST_F(ElementsUploadDataStreamTest, FileAndBytes) {
// Init() with on-memory and not-on-memory readers.
TEST_F(ElementsUploadDataStreamTest, InitAsync) {
// Create UploadDataStream with mock readers.
- std::unique_ptr<MockUploadElementReader> reader(
- new MockUploadElementReader(kTestDataSize, true));
+ auto reader = std::make_unique<MockUploadElementReader>(kTestDataSize, true);
EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
element_readers_.push_back(std::move(reader));
- std::unique_ptr<MockUploadElementReader> reader2(
- new MockUploadElementReader(kTestDataSize, true));
+ auto reader2 = std::make_unique<MockUploadElementReader>(kTestDataSize, true);
EXPECT_CALL(*reader2, Init(_)).WillOnce(Return(OK));
element_readers_.push_back(std::move(reader2));
- std::unique_ptr<MockUploadElementReader> reader3(
- new MockUploadElementReader(kTestDataSize, false));
+ auto reader3 =
+ std::make_unique<MockUploadElementReader>(kTestDataSize, false);
reader3->SetAsyncInitExpectation(OK);
element_readers_.push_back(std::move(reader3));
- std::unique_ptr<MockUploadElementReader> reader4(
- new MockUploadElementReader(kTestDataSize, false));
+ auto reader4 =
+ std::make_unique<MockUploadElementReader>(kTestDataSize, false);
reader4->SetAsyncInitExpectation(OK);
element_readers_.push_back(std::move(reader4));
- std::unique_ptr<MockUploadElementReader> reader5(
- new MockUploadElementReader(kTestDataSize, true));
+ auto reader5 = std::make_unique<MockUploadElementReader>(kTestDataSize, true);
EXPECT_CALL(*reader5, Init(_)).WillOnce(Return(OK));
element_readers_.push_back(std::move(reader5));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
// Run Init().
TestCompletionCallback callback;
@@ -426,13 +429,13 @@ TEST_F(ElementsUploadDataStreamTest, InitAsync) {
// Init() of a reader fails asynchronously.
TEST_F(ElementsUploadDataStreamTest, InitAsyncFailureAsync) {
// Create UploadDataStream with a mock reader.
- std::unique_ptr<MockUploadElementReader> reader(
- new MockUploadElementReader(kTestDataSize, false));
+ auto reader = std::make_unique<MockUploadElementReader>(kTestDataSize, false);
reader->SetAsyncInitExpectation(ERR_FAILED);
element_readers_.push_back(std::move(reader));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
// Run Init().
TestCompletionCallback callback;
@@ -444,18 +447,17 @@ TEST_F(ElementsUploadDataStreamTest, InitAsyncFailureAsync) {
// Init() of a reader fails synchronously.
TEST_F(ElementsUploadDataStreamTest, InitAsyncFailureSync) {
// Create UploadDataStream with mock readers.
- std::unique_ptr<MockUploadElementReader> reader(
- new MockUploadElementReader(kTestDataSize, false));
+ auto reader = std::make_unique<MockUploadElementReader>(kTestDataSize, false);
reader->SetAsyncInitExpectation(OK);
element_readers_.push_back(std::move(reader));
- std::unique_ptr<MockUploadElementReader> reader2(
- new MockUploadElementReader(kTestDataSize, true));
+ auto reader2 = std::make_unique<MockUploadElementReader>(kTestDataSize, true);
EXPECT_CALL(*reader2, Init(_)).WillOnce(Return(ERR_FAILED));
element_readers_.push_back(std::move(reader2));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
// Run Init().
TestCompletionCallback callback;
@@ -469,7 +471,8 @@ TEST_F(ElementsUploadDataStreamTest, ReadAsyncWithExactSizeBuffer) {
element_readers_.push_back(
std::make_unique<UploadBytesElementReader>(kTestData, kTestDataSize));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
ASSERT_THAT(stream->Init(CompletionOnceCallback(), NetLogWithSource()),
IsOk());
@@ -488,32 +491,31 @@ TEST_F(ElementsUploadDataStreamTest, ReadAsyncWithExactSizeBuffer) {
// Async Read() with on-memory and not-on-memory readers.
TEST_F(ElementsUploadDataStreamTest, ReadAsync) {
// Create UploadDataStream with mock readers.
- std::unique_ptr<MockUploadElementReader> reader(
- new MockUploadElementReader(kTestDataSize, true));
+ auto reader = std::make_unique<MockUploadElementReader>(kTestDataSize, true);
EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
reader->SetReadExpectation(kTestDataSize);
element_readers_.push_back(std::move(reader));
- std::unique_ptr<MockUploadElementReader> reader2(
- new MockUploadElementReader(kTestDataSize, false));
+ auto reader2 =
+ std::make_unique<MockUploadElementReader>(kTestDataSize, false);
reader2->SetAsyncInitExpectation(OK);
reader2->SetReadExpectation(kTestDataSize);
element_readers_.push_back(std::move(reader2));
- std::unique_ptr<MockUploadElementReader> reader3(
- new MockUploadElementReader(kTestDataSize, true));
+ auto reader3 = std::make_unique<MockUploadElementReader>(kTestDataSize, true);
EXPECT_CALL(*reader3, Init(_)).WillOnce(Return(OK));
reader3->SetReadExpectation(kTestDataSize);
element_readers_.push_back(std::move(reader3));
- std::unique_ptr<MockUploadElementReader> reader4(
- new MockUploadElementReader(kTestDataSize, false));
+ auto reader4 =
+ std::make_unique<MockUploadElementReader>(kTestDataSize, false);
reader4->SetAsyncInitExpectation(OK);
reader4->SetReadExpectation(kTestDataSize);
element_readers_.push_back(std::move(reader4));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
// Run Init().
TestCompletionCallback init_callback;
@@ -556,7 +558,8 @@ void ElementsUploadDataStreamTest::FileChangedHelper(
TestCompletionCallback init_callback;
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers),
+ 0));
ASSERT_THAT(stream->Init(init_callback.callback(), NetLogWithSource()),
IsError(ERR_IO_PENDING));
int error_code = init_callback.WaitForResult();
@@ -598,7 +601,8 @@ TEST_F(ElementsUploadDataStreamTest, MultipleInit) {
base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0,
std::numeric_limits<uint64_t>::max(), base::Time()));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
std::string expected_data(kTestData, kTestData + kTestDataSize);
expected_data += expected_data;
@@ -643,7 +647,8 @@ TEST_F(ElementsUploadDataStreamTest, MultipleInitAsync) {
base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0,
std::numeric_limits<uint64_t>::max(), base::Time()));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
std::string expected_data(kTestData, kTestData + kTestDataSize);
expected_data += expected_data;
@@ -685,7 +690,8 @@ TEST_F(ElementsUploadDataStreamTest, InitToReset) {
base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0,
std::numeric_limits<uint64_t>::max(), base::Time()));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
std::vector<char> expected_data(kTestData, kTestData + kTestDataSize);
expected_data.insert(expected_data.end(), kTestData,
@@ -745,7 +751,8 @@ TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncInit) {
base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0,
std::numeric_limits<uint64_t>::max(), base::Time()));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
std::vector<char> expected_data(kTestData, kTestData + kTestDataSize);
expected_data.insert(expected_data.end(), kTestData,
@@ -794,7 +801,8 @@ TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncRead) {
base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0,
std::numeric_limits<uint64_t>::max(), base::Time()));
std::unique_ptr<UploadDataStream> stream(
- new ElementsUploadDataStream(std::move(element_readers_), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers_),
+ 0));
std::vector<char> expected_data(kTestData, kTestData + kTestDataSize);
expected_data.insert(expected_data.end(), kTestData,
diff --git a/chromium/net/base/expiring_cache.h b/chromium/net/base/expiring_cache.h
index 95d5fb2da58..f466ab55a1b 100644
--- a/chromium/net/base/expiring_cache.h
+++ b/chromium/net/base/expiring_cache.h
@@ -120,7 +120,7 @@ class ExpiringCache {
// Constructs an ExpiringCache that stores up to |max_entries|.
explicit ExpiringCache(size_t max_entries) : max_entries_(max_entries) {}
- ~ExpiringCache() {}
+ ~ExpiringCache() = default;
// Returns the value matching |key|, which must be valid at the time |now|.
// Returns NULL if the item is not found or has expired. If the item has
diff --git a/chromium/net/base/expiring_cache_unittest.cc b/chromium/net/base/expiring_cache_unittest.cc
index 640ddc23f47..275bc340594 100644
--- a/chromium/net/base/expiring_cache_unittest.cc
+++ b/chromium/net/base/expiring_cache_unittest.cc
@@ -21,8 +21,8 @@ namespace net {
namespace {
const int kMaxCacheEntries = 10;
-typedef ExpiringCache<std::string, std::string, base::TimeTicks,
- std::less<base::TimeTicks> > Cache;
+typedef ExpiringCache<std::string, std::string, base::TimeTicks, std::less<>>
+ Cache;
struct TestFunctor {
bool operator()(const std::string& now,
diff --git a/chromium/net/base/features.cc b/chromium/net/base/features.cc
index e8e0fc60ade..a43cca47a57 100644
--- a/chromium/net/base/features.cc
+++ b/chromium/net/base/features.cc
@@ -9,11 +9,7 @@
#include "base/feature_list.h"
#include "build/build_config.h"
-namespace net {
-namespace features {
-
-const base::Feature kAcceptLanguageHeader{"AcceptLanguageHeader",
- base::FEATURE_ENABLED_BY_DEFAULT};
+namespace net::features {
const base::Feature kAlpsForHttp2{"AlpsForHttp2",
base::FEATURE_ENABLED_BY_DEFAULT};
@@ -24,9 +20,6 @@ const base::Feature kAvoidH2Reprioritization{"AvoidH2Reprioritization",
const base::Feature kCapReferrerToOriginOnCrossOrigin{
"CapReferrerToOriginOnCrossOrigin", base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kCookieDomainAttributeEmptyString{
- "CookieDomainAttributeEmptyString", base::FEATURE_ENABLED_BY_DEFAULT};
-
const base::Feature kDnsTransactionDynamicTimeouts{
"DnsTransactionDynamicTimeouts", base::FEATURE_DISABLED_BY_DEFAULT};
@@ -109,6 +102,9 @@ const base::FeatureParam<base::TimeDelta> kUseDnsHttpsSvcbExtraTimeAbsolute{
const base::FeatureParam<int> kUseDnsHttpsSvcbExtraTimePercent{
&kUseDnsHttpsSvcb, "UseDnsHttpsSvcbExtraTimePercent", 0};
+const base::Feature kUseDnsHttpsSvcbAlpn{"UseDnsHttpsSvcbAlpn",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
const base::Feature kEnableTLS13EarlyData{"EnableTLS13EarlyData",
base::FEATURE_DISABLED_BY_DEFAULT};
@@ -151,6 +147,14 @@ const base::Feature kPartitionNelAndReportingByNetworkIsolationKey{
"PartitionNelAndReportingByNetworkIsolationKey",
base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kEnableDoubleKeyNetworkAnonymizationKey{
+ "EnableDoubleKeyNetworkAnonymizationKey",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kEnableCrossSiteFlagNetworkAnonymizationKey{
+ "EnableCrossSiteFlagNetworkAnonymizationKey",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
const base::Feature kExpectCTPruning{"ExpectCTPruning",
base::FEATURE_ENABLED_BY_DEFAULT};
@@ -213,6 +217,11 @@ const base::FeatureParam<int> kCertDualVerificationTrialImpl{
const base::FeatureParam<int> kCertDualVerificationTrialCacheSize{
&kCertDualVerificationTrialFeature, "cachesize", 0};
#endif /* BUILDFLAG(IS_MAC) */
+#if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED) && \
+ BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
+const base::FeatureParam<bool> kCertDualVerificationTrialUseCrs{
+ &kCertDualVerificationTrialFeature, "use_crs", false};
+#endif
#endif
#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
@@ -277,8 +286,8 @@ const base::Feature kPartitionedCookies{"PartitionedCookies",
const base::Feature kPartitionedCookiesBypassOriginTrial{
"PartitionedCookiesBypassOriginTrial", base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kNoncedPartitionedCookies{
- "NoncedPartitionedCookies", base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kNoncedPartitionedCookies{"NoncedPartitionedCookies",
+ base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kExtraCookieValidityChecks{
"ExtraCookieValidityChecks", base::FEATURE_ENABLED_BY_DEFAULT};
@@ -292,15 +301,14 @@ const base::Feature kClampCookieExpiryTo400Days(
const base::Feature kStaticKeyPinningEnforcement(
"StaticKeyPinningEnforcement",
-#if BUILDFLAG(IS_ANDROID)
- base::FEATURE_DISABLED_BY_DEFAULT);
-#else
base::FEATURE_ENABLED_BY_DEFAULT);
-#endif
const base::Feature kCookieDomainRejectNonASCII{
"CookieDomainRejectNonASCII", base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kBlockSetCookieHeader{"BlockSetCookieHeader",
+ base::FEATURE_ENABLED_BY_DEFAULT};
+
// Read as much of the net::URLRequest as there is space in the Mojo data pipe.
const base::Feature kOptimizeNetworkBuffers{"OptimizeNetworkBuffers2",
base::FEATURE_DISABLED_BY_DEFAULT};
@@ -318,5 +326,22 @@ const base::FeatureParam<int>
&kOptimizeNetworkBuffers, "filter_source_stream_buffer_size",
32 * 1024};
-} // namespace features
-} // namespace net
+const base::FeatureParam<bool> kOptimizeNetworkBuffersInputStreamCheckAvailable{
+ &kOptimizeNetworkBuffers, "input_stream_check_available", true};
+
+const base::Feature kStorageAccessAPI{"StorageAccessAPI",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+constexpr int kStorageAccessAPIDefaultImplicitGrantLimit = 5;
+const base::FeatureParam<int> kStorageAccessAPIImplicitGrantLimit{
+ &kStorageAccessAPI, "storage-access-api-implicit-grant-limit",
+ kStorageAccessAPIDefaultImplicitGrantLimit};
+const base::FeatureParam<bool> kStorageAccessAPIGrantsUnpartitionedStorage(
+ &kStorageAccessAPI,
+ "storage-access-api-grants-unpartitioned-storage",
+ false);
+
+// Enables partitioning of third party storage (IndexedDB, CacheStorage, etc.)
+// by the top level site to reduce fingerprinting.
+const base::Feature kThirdPartyStoragePartitioning{
+ "ThirdPartyStoragePartitioning", base::FEATURE_DISABLED_BY_DEFAULT};
+} // namespace net::features
diff --git a/chromium/net/base/features.h b/chromium/net/base/features.h
index 856006c03a1..6729475a475 100644
--- a/chromium/net/base/features.h
+++ b/chromium/net/base/features.h
@@ -15,12 +15,7 @@
#include "net/base/net_export.h"
#include "net/net_buildflags.h"
-namespace net {
-namespace features {
-
-// Toggles the `Accept-Language` HTTP request header, which
-// https://github.com/WICG/lang-client-hint proposes that we deprecate.
-NET_EXPORT extern const base::Feature kAcceptLanguageHeader;
+namespace net::features {
// Enables ALPS extension of TLS 1.3 for HTTP/2, see
// https://vasilvv.github.io/tls-alps/draft-vvv-tls-alps.html and
@@ -34,9 +29,6 @@ NET_EXPORT extern const base::Feature kAvoidH2Reprioritization;
// origin requests are restricted to contain at most the source origin.
NET_EXPORT extern const base::Feature kCapReferrerToOriginOnCrossOrigin;
-// Enables the ParsedCookie domain attribute to be the empty string.
-NET_EXPORT extern const base::Feature kCookieDomainAttributeEmptyString;
-
// Support for altering the parameters used for DNS transaction timeout. See
// ResolveContext::SecureTransactionTimeout().
NET_EXPORT extern const base::Feature kDnsTransactionDynamicTimeouts;
@@ -170,6 +162,9 @@ NET_EXPORT extern const base::FeatureParam<base::TimeDelta>
NET_EXPORT extern const base::FeatureParam<int>
kUseDnsHttpsSvcbExtraTimePercent;
+// Update protocol using ALPN information in HTTPS DNS records.
+NET_EXPORT extern const base::Feature kUseDnsHttpsSvcbAlpn;
+
// Enables TLS 1.3 early data.
NET_EXPORT extern const base::Feature kEnableTLS13EarlyData;
@@ -239,6 +234,24 @@ NET_EXPORT extern const base::Feature
NET_EXPORT extern const base::Feature
kPartitionNelAndReportingByNetworkIsolationKey;
+// Creates a <double key + is_cross_site> NetworkAnonymizationKey which is used
+// to partition the network state. This double key will have the following
+// properties: `top_frame_site` -> the schemeful site of the top level page.
+// `frame_site ` -> nullopt
+// `is_cross_site` -> true if the `top_frame_site` is cross site when compared
+// to the frame site. The frame site will not be stored in this key so the value
+// of is_cross_site will be computed at key construction. This feature overrides
+// `kEnableDoubleKeyNetworkAnonymizationKey` if both are enabled.
+NET_EXPORT extern const base::Feature
+ kEnableCrossSiteFlagNetworkAnonymizationKey;
+
+// Creates a double keyed NetworkAnonymizationKey which is used to partition the
+// network state. This double key will have the following properties:
+// `top_frame_site` -> the schemeful site of the top level page.
+// `frame_site ` -> nullopt
+// `is_cross_site` -> nullopt
+NET_EXPORT extern const base::Feature kEnableDoubleKeyNetworkAnonymizationKey;
+
// Enables limiting the size of Expect-CT table.
NET_EXPORT extern const base::Feature kExpectCTPruning;
@@ -315,6 +328,14 @@ NET_EXPORT extern const base::FeatureParam<int> kCertDualVerificationTrialImpl;
NET_EXPORT extern const base::FeatureParam<int>
kCertDualVerificationTrialCacheSize;
#endif /* BUILDFLAG(IS_MAC) */
+#if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED) && \
+ BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
+// If both builtin verifier+system roots and builtin verifier+CRS flags are
+// supported in the same build, this param can be used to choose which to test
+// in the trial.
+NET_EXPORT extern const base::FeatureParam<bool>
+ kCertDualVerificationTrialUseCrs;
+#endif
#endif /* BUILDFLAG(TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED) */
#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
@@ -432,6 +453,9 @@ NET_EXPORT extern const base::Feature kStaticKeyPinningEnforcement;
// When enabled, cookies with a non-ASCII domain attribute will be rejected.
NET_EXPORT extern const base::Feature kCookieDomainRejectNonASCII;
+// Blocks the 'Set-Cookie' request header on outbound fetch requests.
+NET_EXPORT extern const base::Feature kBlockSetCookieHeader;
+
NET_EXPORT extern const base::Feature kOptimizeNetworkBuffers;
NET_EXPORT
@@ -443,7 +467,26 @@ NET_EXPORT extern const base::FeatureParam<int>
NET_EXPORT extern const base::FeatureParam<int>
kOptimizeNetworkBuffersFilterSourceStreamBufferSize;
-} // namespace features
-} // namespace net
+NET_EXPORT extern const base::FeatureParam<bool>
+ kOptimizeNetworkBuffersInputStreamCheckAvailable;
+
+// Enable the Storage Access API. https://crbug.com/989663.
+NET_EXPORT extern const base::Feature kStorageAccessAPI;
+
+// Set the default number of "automatic" implicit storage access grants per
+// third party origin that can be granted. This can be overridden via
+// experimentation to allow for field trials to validate the default setting.
+NET_EXPORT extern const int kStorageAccessAPIDefaultImplicitGrantLimit;
+NET_EXPORT extern const base::FeatureParam<int>
+ kStorageAccessAPIImplicitGrantLimit;
+// Whether the Storage Access API can grant access to storage (even if it is
+// unpartitioned). When this feature is disabled, access to storage is only
+// granted if the storage is partitioned.
+NET_EXPORT extern const base::FeatureParam<bool>
+ kStorageAccessAPIGrantsUnpartitionedStorage;
+
+NET_EXPORT extern const base::Feature kThirdPartyStoragePartitioning;
+
+} // namespace net::features
#endif // NET_BASE_FEATURES_H_
diff --git a/chromium/net/base/file_stream_context_win.cc b/chromium/net/base/file_stream_context_win.cc
index 6b596e11e3c..0b1a516375b 100644
--- a/chromium/net/base/file_stream_context_win.cc
+++ b/chromium/net/base/file_stream_context_win.cc
@@ -52,8 +52,7 @@ FileStream::Context::Context(base::File file,
}
}
-FileStream::Context::~Context() {
-}
+FileStream::Context::~Context() = default;
int FileStream::Context::Read(IOBuffer* buf,
int buf_len,
diff --git a/chromium/net/base/file_stream_unittest.cc b/chromium/net/base/file_stream_unittest.cc
index 59194e81486..11b672ce80d 100644
--- a/chromium/net/base/file_stream_unittest.cc
+++ b/chromium/net/base/file_stream_unittest.cc
@@ -98,8 +98,8 @@ TEST_F(FileStreamTest, OpenExplicitClose) {
TEST_F(FileStreamTest, OpenExplicitCloseOrphaned) {
TestCompletionCallback callback;
- std::unique_ptr<FileStream> stream(
- new FileStream(base::ThreadTaskRunnerHandle::Get()));
+ auto stream =
+ std::make_unique<FileStream>(base::ThreadTaskRunnerHandle::Get());
int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_ASYNC;
int rv = stream->Open(temp_file_path(), flags, callback.callback());
@@ -124,11 +124,11 @@ TEST_F(FileStreamTest, UseFileHandle) {
base::WriteFile(temp_file_path(), kTestData, kTestDataSize));
int flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
base::File::FLAG_ASYNC;
- base::File file(temp_file_path(), flags);
+ base::File file1(temp_file_path(), flags);
// Seek to the beginning of the file and read.
- std::unique_ptr<FileStream> read_stream(
- new FileStream(std::move(file), base::ThreadTaskRunnerHandle::Get()));
+ auto read_stream = std::make_unique<FileStream>(
+ std::move(file1), base::ThreadTaskRunnerHandle::Get());
ASSERT_THAT(read_stream->Seek(0, callback64.callback()),
IsError(ERR_IO_PENDING));
ASSERT_EQ(0, callback64.WaitForResult());
@@ -144,10 +144,10 @@ TEST_F(FileStreamTest, UseFileHandle) {
base::DeleteFile(temp_file_path());
flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_WRITE |
base::File::FLAG_ASYNC;
- file.Initialize(temp_file_path(), flags);
+ base::File file2(temp_file_path(), flags);
- std::unique_ptr<FileStream> write_stream(
- new FileStream(std::move(file), base::ThreadTaskRunnerHandle::Get()));
+ auto write_stream = std::make_unique<FileStream>(
+ std::move(file2), base::ThreadTaskRunnerHandle::Get());
ASSERT_THAT(write_stream->Seek(0, callback64.callback()),
IsError(ERR_IO_PENDING));
ASSERT_EQ(0, callback64.WaitForResult());
@@ -217,8 +217,8 @@ TEST_F(FileStreamTest, Read_EarlyDelete) {
int64_t file_size;
EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
- std::unique_ptr<FileStream> stream(
- new FileStream(base::ThreadTaskRunnerHandle::Get()));
+ auto stream =
+ std::make_unique<FileStream>(base::ThreadTaskRunnerHandle::Get());
int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_ASYNC;
TestCompletionCallback callback;
@@ -304,8 +304,8 @@ TEST_F(FileStreamTest, Write) {
}
TEST_F(FileStreamTest, Write_EarlyDelete) {
- std::unique_ptr<FileStream> stream(
- new FileStream(base::ThreadTaskRunnerHandle::Get()));
+ auto stream =
+ std::make_unique<FileStream>(base::ThreadTaskRunnerHandle::Get());
int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE |
base::File::FLAG_ASYNC;
TestCompletionCallback callback;
@@ -375,8 +375,8 @@ TEST_F(FileStreamTest, BasicReadWrite) {
int64_t file_size;
EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
- std::unique_ptr<FileStream> stream(
- new FileStream(base::ThreadTaskRunnerHandle::Get()));
+ auto stream =
+ std::make_unique<FileStream>(base::ThreadTaskRunnerHandle::Get());
int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
TestCompletionCallback callback;
@@ -430,8 +430,8 @@ TEST_F(FileStreamTest, BasicWriteRead) {
int64_t file_size;
EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
- std::unique_ptr<FileStream> stream(
- new FileStream(base::ThreadTaskRunnerHandle::Get()));
+ auto stream =
+ std::make_unique<FileStream>(base::ThreadTaskRunnerHandle::Get());
int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
TestCompletionCallback callback;
@@ -599,8 +599,8 @@ TEST_F(FileStreamTest, WriteRead) {
int64_t file_size;
EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
- std::unique_ptr<FileStream> stream(
- new FileStream(base::ThreadTaskRunnerHandle::Get()));
+ auto stream =
+ std::make_unique<FileStream>(base::ThreadTaskRunnerHandle::Get());
int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
TestCompletionCallback open_callback;
@@ -705,8 +705,8 @@ TEST_F(FileStreamTest, WriteClose) {
int64_t file_size;
EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
- std::unique_ptr<FileStream> stream(
- new FileStream(base::ThreadTaskRunnerHandle::Get()));
+ auto stream =
+ std::make_unique<FileStream>(base::ThreadTaskRunnerHandle::Get());
int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
TestCompletionCallback open_callback;
@@ -740,8 +740,7 @@ TEST_F(FileStreamTest, OpenAndDelete) {
ASSERT_TRUE(worker_thread.Start());
base::ScopedDisallowBlocking disallow_blocking;
- std::unique_ptr<FileStream> stream(
- new FileStream(worker_thread.task_runner()));
+ auto stream = std::make_unique<FileStream>(worker_thread.task_runner());
int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
base::File::FLAG_ASYNC;
TestCompletionCallback open_callback;
@@ -753,8 +752,7 @@ TEST_F(FileStreamTest, OpenAndDelete) {
stream.reset();
// Force an operation through the worker.
- std::unique_ptr<FileStream> stream2(
- new FileStream(worker_thread.task_runner()));
+ auto stream2 = std::make_unique<FileStream>(worker_thread.task_runner());
TestCompletionCallback open_callback2;
rv = stream2->Open(temp_file_path(), flags, open_callback2.callback());
EXPECT_THAT(open_callback2.GetResult(rv), IsOk());
@@ -774,8 +772,8 @@ TEST_F(FileStreamTest, WriteError) {
base::File file(temp_file_path(), flags);
ASSERT_TRUE(file.IsValid());
- std::unique_ptr<FileStream> stream(
- new FileStream(std::move(file), base::ThreadTaskRunnerHandle::Get()));
+ auto stream = std::make_unique<FileStream>(
+ std::move(file), base::ThreadTaskRunnerHandle::Get());
scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(1);
buf->data()[0] = 0;
@@ -799,8 +797,8 @@ TEST_F(FileStreamTest, ReadError) {
base::File file(temp_file_path(), flags);
ASSERT_TRUE(file.IsValid());
- std::unique_ptr<FileStream> stream(
- new FileStream(std::move(file), base::ThreadTaskRunnerHandle::Get()));
+ auto stream = std::make_unique<FileStream>(
+ std::move(file), base::ThreadTaskRunnerHandle::Get());
scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(1);
TestCompletionCallback callback;
diff --git a/chromium/net/base/filename_util_unittest.cc b/chromium/net/base/filename_util_unittest.cc
index bce27858911..239c758053d 100644
--- a/chromium/net/base/filename_util_unittest.cc
+++ b/chromium/net/base/filename_util_unittest.cc
@@ -65,7 +65,7 @@ std::string GetLocaleWarningString() {
// Note: some platforms (MACOSX, Chromecast) don't have this problem:
// setlocale returns "c" but it functions as utf8. And Android doesn't
// have setlocale at all.
- std::string locale = setlocale(LC_CTYPE, NULL);
+ std::string locale = setlocale(LC_CTYPE, nullptr);
return " this test may have failed because the current LC_CTYPE locale is "
"not utf8 (currently set to " +
locale + ")";
diff --git a/chromium/net/base/interval_test.cc b/chromium/net/base/interval_test.cc
index c24350da1bb..a0a61170119 100644
--- a/chromium/net/base/interval_test.cc
+++ b/chromium/net/base/interval_test.cc
@@ -16,8 +16,7 @@
using std::string;
-namespace net {
-namespace test {
+namespace net::test {
namespace {
class IntervalTest : public ::testing::Test {
@@ -275,5 +274,4 @@ TEST_F(IntervalTest, IntervalOfTypeWithNoOperatorMinus) {
}
} // unnamed namespace
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/base/io_buffer.cc b/chromium/net/base/io_buffer.cc
index 26e0e022773..b61780cbe1b 100644
--- a/chromium/net/base/io_buffer.cc
+++ b/chromium/net/base/io_buffer.cc
@@ -106,8 +106,11 @@ GrowableIOBuffer::GrowableIOBuffer() = default;
void GrowableIOBuffer::SetCapacity(int capacity) {
DCHECK_GE(capacity, 0);
+ // this will get reset in `set_offset`.
+ data_ = nullptr;
// realloc will crash if it fails.
real_data_.reset(static_cast<char*>(realloc(real_data_.release(), capacity)));
+
capacity_ = capacity;
if (offset_ > capacity)
set_offset(capacity);
diff --git a/chromium/net/base/ip_address.h b/chromium/net/base/ip_address.h
index 6769e7e4214..b6a5657eedb 100644
--- a/chromium/net/base/ip_address.h
+++ b/chromium/net/base/ip_address.h
@@ -110,8 +110,7 @@ class NET_EXPORT IPAddress {
// Copies the input address to |ip_address_|. The input is expected to be in
// network byte order.
template <size_t N>
- IPAddress(const uint8_t(&address)[N])
- : IPAddress(address, N) {}
+ explicit IPAddress(const uint8_t (&address)[N]) : IPAddress(address, N) {}
// Copies the input address to |ip_address_| taking an additional length
// parameter. The input is expected to be in network byte order.
diff --git a/chromium/net/base/isolation_info.cc b/chromium/net/base/isolation_info.cc
index ab34588e8f6..3380ec1dd8c 100644
--- a/chromium/net/base/isolation_info.cc
+++ b/chromium/net/base/isolation_info.cc
@@ -4,8 +4,11 @@
#include "net/base/isolation_info.h"
+#include <cstddef>
+
#include "base/check_op.h"
#include "base/unguessable_token.h"
+#include "isolation_info.h"
#include "net/base/features.h"
#include "net/base/isolation_info.pb.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -52,45 +55,42 @@ bool IsConsistent(IsolationInfo::RequestType request_type,
!party_context;
}
- // if `kForceIsolationInfoFrameOriginToTopLevelFrame` is enabled the
- // `top_frame_origin` should be equal to the `frame_origin`.
- if (base::FeatureList::IsEnabled(
- net::features::kForceIsolationInfoFrameOriginToTopLevelFrame) &&
- top_frame_origin != frame_origin) {
- return false;
- }
-
- // |frame_origin| may only be nullopt if |top_frame_origin| is as well.
- if (!frame_origin)
- return false;
-
// As long as there is a |top_frame_origin|, |site_for_cookies| must be
// consistent with the |top_frame_origin|.
if (!ValidateSameSite(*top_frame_origin, site_for_cookies))
return false;
- switch (request_type) {
- case IsolationInfo::RequestType::kMainFrame:
- // TODO(https://crbug.com/1056706): Check that |top_frame_origin| and
- // |frame_origin| are the same, once the ViewSource code creates a
- // consistent IsolationInfo object.
- //
- // TODO(https://crbug.com/1060631): Once CreatePartial() is removed, check
- // if SiteForCookies is non-null if the scheme is HTTP or HTTPS.
- //
- // TODO(https://crbug.com/1151947): Once CreatePartial() is removed, check
- // if party_context is non-null and empty.
- return true;
- case IsolationInfo::RequestType::kSubFrame:
- // For subframe navigations, the subframe's origin may not be consistent
- // with the SiteForCookies, so SameSite cookies may be sent if there's a
- // redirect to main frames site.
- return true;
- case IsolationInfo::RequestType::kOther:
- // SiteForCookies must consistent with the frame origin as well for
- // subresources.
- return ValidateSameSite(*frame_origin, site_for_cookies);
+ // Validate frame `frame_origin`
+ if (IsolationInfo::IsFrameSiteEnabled()) {
+ // IsolationInfo must have a `frame_origin` when frame origins are enabled
+ // and the IsolationInfo is not default-constructed.
+ if (!frame_origin) {
+ return false;
+ }
+ switch (request_type) {
+ case IsolationInfo::RequestType::kMainFrame:
+ // TODO(https://crbug.com/1056706): Check that |top_frame_origin| and
+ // |frame_origin| are the same, once the ViewSource code creates a
+ // consistent IsolationInfo object.
+ //
+ // TODO(https://crbug.com/1060631): Once CreatePartial() is removed,
+ // check if SiteForCookies is non-null if the scheme is HTTP or HTTPS.
+ //
+ // TODO(https://crbug.com/1151947): Once CreatePartial() is removed,
+ // check if party_context is non-null and empty.
+ break;
+ case IsolationInfo::RequestType::kSubFrame:
+ // For subframe navigations, the subframe's origin may not be consistent
+ // with the SiteForCookies, so SameSite cookies may be sent if there's a
+ // redirect to main frames site.
+ break;
+ case IsolationInfo::RequestType::kOther:
+ // SiteForCookies must consistent with the frame origin as well for
+ // subresources.
+ return ValidateSameSite(*frame_origin, site_for_cookies);
+ }
}
+ return true;
}
} // namespace
@@ -153,6 +153,18 @@ absl::optional<IsolationInfo> IsolationInfo::Deserialize(
std::move(party_context), nullptr);
}
+IsolationInfo IsolationInfo::CreateDoubleKey(
+ RequestType request_type,
+ const url::Origin& top_frame_origin,
+ const SiteForCookies& site_for_cookies,
+ absl::optional<std::set<SchemefulSite>> party_context,
+ const base::UnguessableToken* nonce) {
+ // This should only be used when the frame site is disabled for double keying.
+ DCHECK(!IsFrameSiteEnabled());
+ return IsolationInfo(request_type, top_frame_origin, absl::nullopt,
+ site_for_cookies, nonce, std::move(party_context));
+}
+
IsolationInfo IsolationInfo::Create(
RequestType request_type,
const url::Origin& top_frame_origin,
@@ -174,8 +186,7 @@ IsolationInfo IsolationInfo::CreatePartial(
url::Origin top_frame_origin =
network_isolation_key.GetTopFrameSite()->site_as_origin_;
url::Origin frame_origin;
- if (!base::FeatureList::IsEnabled(
- net::features::kForceIsolationInfoFrameOriginToTopLevelFrame) &&
+ if (IsFrameSiteEnabled() &&
network_isolation_key.GetFrameSite().has_value()) {
frame_origin = network_isolation_key.GetFrameSite()->site_as_origin_;
} else if (request_type == RequestType::kMainFrame) {
@@ -279,6 +290,11 @@ std::string IsolationInfo::Serialize() const {
return info.SerializeAsString();
}
+bool IsolationInfo::IsFrameSiteEnabled() {
+ return !base::FeatureList::IsEnabled(
+ net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
+}
+
IsolationInfo::IsolationInfo(
RequestType request_type,
const absl::optional<url::Origin>& top_frame_origin,
@@ -288,16 +304,14 @@ IsolationInfo::IsolationInfo(
absl::optional<std::set<SchemefulSite>> party_context)
: request_type_(request_type),
top_frame_origin_(top_frame_origin),
- frame_origin_(
- base::FeatureList::IsEnabled(
- net::features::kForceIsolationInfoFrameOriginToTopLevelFrame)
- ? top_frame_origin
- : frame_origin),
+ frame_origin_(IsFrameSiteEnabled() ? frame_origin : absl::nullopt),
network_isolation_key_(
!top_frame_origin
? NetworkIsolationKey()
: NetworkIsolationKey(SchemefulSite(*top_frame_origin),
- SchemefulSite(*frame_origin),
+ IsFrameSiteEnabled()
+ ? SchemefulSite(*frame_origin)
+ : SchemefulSite(),
nonce)),
site_for_cookies_(site_for_cookies),
nonce_(nonce ? absl::make_optional(*nonce) : absl::nullopt),
diff --git a/chromium/net/base/isolation_info.h b/chromium/net/base/isolation_info.h
index 63eba128035..2a5e3946e49 100644
--- a/chromium/net/base/isolation_info.h
+++ b/chromium/net/base/isolation_info.h
@@ -15,11 +15,9 @@
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "url/origin.h"
-namespace network {
-namespace mojom {
+namespace network::mojom {
class IsolationInfoDataView;
-} // namespace mojom
-} // namespace network
+} // namespace network::mojom
namespace mojo {
template <typename DataViewType, typename T>
@@ -122,6 +120,16 @@ class NET_EXPORT IsolationInfo {
absl::optional<std::set<SchemefulSite>> party_context = absl::nullopt,
const base::UnguessableToken* nonce = nullptr);
+ // Create and IsolationInfo from the context of a double key. This should only
+ // be used when we don't have access to the frame_origin because the
+ // IsolationInfo is being created from an existing double keyed IsolationInfo.
+ static IsolationInfo CreateDoubleKey(
+ RequestType request_type,
+ const url::Origin& top_frame_origin,
+ const SiteForCookies& site_for_cookies,
+ absl::optional<std::set<SchemefulSite>> party_context = absl::nullopt,
+ const base::UnguessableToken* nonce = nullptr);
+
// Create an IsolationInfos that may not be fully correct - in particular,
// the SiteForCookies will always set to null, and if the NetworkIsolationKey
// only has a top frame origin, the frame origin will either be set to the top
@@ -204,6 +212,10 @@ class NET_EXPORT IsolationInfo {
// an empty string.
std::string Serialize() const;
+ // Returns true if the IsolationInfo has a triple keyed scheme. This
+ // means both `frame_site_` and `top_frame_site_` are populated.
+ static bool IsFrameSiteEnabled();
+
private:
IsolationInfo(RequestType request_type,
const absl::optional<url::Origin>& top_frame_origin,
diff --git a/chromium/net/base/isolation_info_unittest.cc b/chromium/net/base/isolation_info_unittest.cc
index f4ce4236ab9..43c1b718a5c 100644
--- a/chromium/net/base/isolation_info_unittest.cc
+++ b/chromium/net/base/isolation_info_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "net/base/isolation_info.h"
+#include <optional>
#include "base/test/scoped_feature_list.h"
#include "base/unguessable_token.h"
@@ -75,7 +76,7 @@ void DuplicateAndCompare(const IsolationInfo& isolation_info) {
isolation_info.request_type(), isolation_info.top_frame_origin(),
IsolationInfoTest::
ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()
- ? isolation_info.top_frame_origin()
+ ? absl::nullopt
: isolation_info.frame_origin(),
isolation_info.site_for_cookies(), isolation_info.party_context(),
isolation_info.nonce().has_value() ? &isolation_info.nonce().value()
@@ -85,6 +86,58 @@ void DuplicateAndCompare(const IsolationInfo& isolation_info) {
EXPECT_TRUE(isolation_info.IsEqualForTesting(*duplicate_isolation_info));
}
+TEST_P(IsolationInfoTest, IsFrameSiteEnabled) {
+ if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
+ EXPECT_FALSE(IsolationInfo::IsFrameSiteEnabled());
+ } else {
+ EXPECT_TRUE(IsolationInfo::IsFrameSiteEnabled());
+ }
+}
+
+TEST_P(IsolationInfoTest, CreateDoubleKey) {
+ IsolationInfo isolation_info = IsolationInfo::Create(
+ IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
+ SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
+
+ if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
+ IsolationInfo double_key_isolation_info = IsolationInfo::CreateDoubleKey(
+ IsolationInfo::RequestType::kMainFrame, kOrigin1,
+ SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
+
+ EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
+ double_key_isolation_info.request_type());
+ EXPECT_EQ(kOrigin1, double_key_isolation_info.top_frame_origin());
+ EXPECT_EQ(absl::nullopt, double_key_isolation_info.frame_origin());
+ EXPECT_EQ(
+ "https://foo.test https://foo.test",
+ double_key_isolation_info.network_isolation_key().ToCacheKeyString());
+ EXPECT_EQ(kPartyContextEmpty, double_key_isolation_info.party_context());
+ EXPECT_FALSE(double_key_isolation_info.nonce().has_value());
+
+ // When double keying is enabled Create and CreateDoubleKey should
+ // create the same key.
+ EXPECT_EQ(isolation_info.frame_origin(),
+ double_key_isolation_info.frame_origin());
+ EXPECT_EQ(isolation_info.top_frame_origin(),
+ double_key_isolation_info.top_frame_origin());
+ EXPECT_EQ(isolation_info.request_type(),
+ double_key_isolation_info.request_type());
+ EXPECT_EQ(isolation_info.network_isolation_key(),
+ double_key_isolation_info.network_isolation_key());
+ EXPECT_EQ(isolation_info.party_context(),
+ double_key_isolation_info.party_context());
+ EXPECT_EQ(isolation_info.nonce(), double_key_isolation_info.nonce());
+ } else {
+ // Creating double keyed IsolationInfos is not allowed when frame site is
+ // enabled.
+ EXPECT_DEATH_IF_SUPPORTED(
+ IsolationInfo::CreateDoubleKey(
+ IsolationInfo::RequestType::kMainFrame, kOrigin1,
+ SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty),
+ "");
+ }
+}
+
TEST_P(IsolationInfoTest, RequestTypeMainFrame) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
@@ -94,14 +147,17 @@ TEST_P(IsolationInfoTest, RequestTypeMainFrame) {
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
+ EXPECT_EQ("https://foo.test https://foo.test",
+ isolation_info.network_isolation_key().ToCacheKeyString());
+
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ("https://foo.test https://foo.test",
+ isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
- EXPECT_EQ("https://foo.test https://foo.test",
- isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
@@ -115,15 +171,22 @@ TEST_P(IsolationInfoTest, RequestTypeMainFrame) {
redirected_isolation_info.request_type());
EXPECT_EQ(kOrigin3, redirected_isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
} else {
EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
}
EXPECT_TRUE(
redirected_isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(redirected_isolation_info.network_isolation_key().IsTransient());
- EXPECT_EQ("https://baz.test https://baz.test",
- redirected_isolation_info.network_isolation_key().ToString());
+ if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
+ EXPECT_EQ(
+ "https://baz.test https://baz.test",
+ redirected_isolation_info.network_isolation_key().ToCacheKeyString());
+ } else {
+ EXPECT_EQ(
+ "https://baz.test https://baz.test",
+ redirected_isolation_info.network_isolation_key().ToCacheKeyString());
+ }
EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
kOrigin3.GetURL()));
EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
@@ -138,13 +201,13 @@ TEST_P(IsolationInfoTest, RequestTypeSubFrame) {
isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
EXPECT_EQ("https://foo.test https://foo.test",
- isolation_info.network_isolation_key().ToString());
+ isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
EXPECT_EQ("https://foo.test https://bar.test",
- isolation_info.network_isolation_key().ToString());
+ isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
@@ -162,13 +225,15 @@ TEST_P(IsolationInfoTest, RequestTypeSubFrame) {
EXPECT_EQ(kOrigin1, redirected_isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin1, redirected_isolation_info.frame_origin());
- EXPECT_EQ("https://foo.test https://foo.test",
- redirected_isolation_info.network_isolation_key().ToString());
+ EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
+ EXPECT_EQ(
+ "https://foo.test https://foo.test",
+ redirected_isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
- EXPECT_EQ("https://foo.test https://baz.test",
- redirected_isolation_info.network_isolation_key().ToString());
+ EXPECT_EQ(
+ "https://foo.test https://baz.test",
+ redirected_isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(
redirected_isolation_info.network_isolation_key().IsFullyPopulated());
@@ -187,13 +252,14 @@ TEST_P(IsolationInfoTest, RequestTypeMainFrameWithNonce) {
isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
- EXPECT_EQ("", isolation_info.network_isolation_key().ToString());
+ EXPECT_EQ(absl::nullopt,
+ isolation_info.network_isolation_key().ToCacheKeyString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
@@ -207,14 +273,16 @@ TEST_P(IsolationInfoTest, RequestTypeMainFrameWithNonce) {
redirected_isolation_info.request_type());
EXPECT_EQ(kOrigin3, redirected_isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
} else {
EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
}
EXPECT_TRUE(
redirected_isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
- EXPECT_EQ("", redirected_isolation_info.network_isolation_key().ToString());
+ EXPECT_EQ(
+ absl::nullopt,
+ redirected_isolation_info.network_isolation_key().ToCacheKeyString());
EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
kOrigin3.GetURL()));
EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
@@ -229,13 +297,14 @@ TEST_P(IsolationInfoTest, RequestTypeSubFrameWithNonce) {
isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
} else {
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
- EXPECT_EQ("", isolation_info.network_isolation_key().ToString());
+ EXPECT_EQ(absl::nullopt,
+ isolation_info.network_isolation_key().ToCacheKeyString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContext1, isolation_info.party_context());
@@ -249,14 +318,16 @@ TEST_P(IsolationInfoTest, RequestTypeSubFrameWithNonce) {
redirected_isolation_info.request_type());
EXPECT_EQ(kOrigin1, redirected_isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin1, redirected_isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
} else {
EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
}
EXPECT_TRUE(
redirected_isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
- EXPECT_EQ("", redirected_isolation_info.network_isolation_key().ToString());
+ EXPECT_EQ(
+ absl::nullopt,
+ redirected_isolation_info.network_isolation_key().ToCacheKeyString());
EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
kOrigin1.GetURL()));
EXPECT_EQ(kPartyContext1, redirected_isolation_info.party_context());
@@ -291,14 +362,16 @@ TEST_P(IsolationInfoTest, RequestTypeOtherWithSiteForCookies) {
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
+ EXPECT_EQ("https://foo.test https://foo.test",
+ isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ("https://foo.test https://foo.test",
+ isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
- EXPECT_EQ("https://foo.test https://foo.test",
- isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
@@ -320,13 +393,13 @@ TEST_P(IsolationInfoTest, RequestTypeOtherWithEmptySiteForCookies) {
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
EXPECT_EQ("https://foo.test https://foo.test",
- isolation_info.network_isolation_key().ToString());
+ isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
EXPECT_EQ("https://foo.test https://bar.test",
- isolation_info.network_isolation_key().ToString());
+ isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
@@ -346,7 +419,7 @@ TEST_P(IsolationInfoTest, CreateTransient) {
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_TRUE(isolation_info.top_frame_origin()->opaque());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_TRUE(isolation_info.frame_origin()->opaque());
+ EXPECT_FALSE(isolation_info.frame_origin().has_value());
} else {
EXPECT_TRUE(isolation_info.frame_origin()->opaque());
}
@@ -369,14 +442,16 @@ TEST_P(IsolationInfoTest, CreateForInternalRequest) {
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
+ EXPECT_EQ("https://foo.test https://foo.test",
+ isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
+ EXPECT_EQ("https://foo.test https://foo.test",
+ isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
- EXPECT_EQ("https://foo.test https://foo.test",
- isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
@@ -398,7 +473,7 @@ TEST_P(IsolationInfoTest, CreatePartialUpdateTopFrame) {
isolation_info.request_type());
EXPECT_EQ(kSite1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kSite1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
} else {
EXPECT_EQ(kSite1, isolation_info.frame_origin());
}
@@ -419,7 +494,7 @@ TEST_P(IsolationInfoTest, CreatePartialUpdateFrameOnly) {
isolation_info.request_type());
EXPECT_EQ(kSite1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kSite1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
} else {
EXPECT_EQ(kSite2, isolation_info.frame_origin());
}
@@ -439,7 +514,7 @@ TEST_P(IsolationInfoTest, CreatePartialUpdateNothing) {
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kSite1, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kSite1, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
} else {
EXPECT_EQ(kSite2, isolation_info.frame_origin());
}
@@ -459,8 +534,7 @@ TEST_P(IsolationInfoTest, CreatePartialTransient) {
EXPECT_EQ(kNIK.GetTopFrameSite(),
SchemefulSite(*isolation_info.top_frame_origin()));
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kNIK.GetFrameSite(),
- SchemefulSite(*isolation_info.frame_origin()));
+ EXPECT_EQ(kNIK.GetFrameSite(), absl::nullopt);
} else {
EXPECT_EQ(kNIK.GetFrameSite(),
SchemefulSite(*isolation_info.frame_origin()));
@@ -508,13 +582,13 @@ TEST_P(IsolationInfoTest, CustomSchemeRequestTypeOther) {
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kCustomOrigin, isolation_info.top_frame_origin());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kCustomOrigin, isolation_info.frame_origin());
+ EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
EXPECT_EQ("foo://a.foo.com foo://a.foo.com",
- isolation_info.network_isolation_key().ToString());
+ isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_EQ("foo://a.foo.com https://foo.test",
- isolation_info.network_isolation_key().ToString());
+ isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
@@ -548,9 +622,6 @@ TEST_P(IsolationInfoTest, CreateIfConsistentFails) {
// Sub resources with inconsistent SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2,
- SiteForCookies::FromOrigin(kOrigin1)));
- EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
- IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin2)));
// Correctly have empty/non-empty origins:
@@ -563,20 +634,34 @@ TEST_P(IsolationInfoTest, CreateIfConsistentFails) {
IsolationInfo::RequestType::kOther, absl::nullopt, kOrigin1,
SiteForCookies()));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
- IsolationInfo::RequestType::kOther, kOrigin1, absl::nullopt,
- SiteForCookies()));
- EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
- IsolationInfo::RequestType::kMainFrame, absl::nullopt, kOrigin1,
- SiteForCookies::FromOrigin(kOrigin1)));
- EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
- IsolationInfo::RequestType::kMainFrame, kOrigin1, absl::nullopt,
- SiteForCookies::FromOrigin(kOrigin1)));
- EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kSubFrame, absl::nullopt, kOrigin2,
SiteForCookies()));
- EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
- IsolationInfo::RequestType::kSubFrame, kOrigin1, absl::nullopt,
- SiteForCookies()));
+ // Empty frame origins are ok when double keying is enabled but incorrect when
+ // triple key is enabled.
+ if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
+ EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
+ IsolationInfo::RequestType::kOther, kOrigin1, absl::nullopt,
+ SiteForCookies()));
+ EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
+ IsolationInfo::RequestType::kSubFrame, kOrigin1, absl::nullopt,
+ SiteForCookies()));
+ EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
+ IsolationInfo::RequestType::kMainFrame, kOrigin1, absl::nullopt,
+ SiteForCookies::FromOrigin(kOrigin1)));
+ } else {
+ EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
+ IsolationInfo::RequestType::kOther, kOrigin1, absl::nullopt,
+ SiteForCookies()));
+ EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
+ IsolationInfo::RequestType::kSubFrame, kOrigin1, absl::nullopt,
+ SiteForCookies()));
+ EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
+ IsolationInfo::RequestType::kMainFrame, kOrigin1, absl::nullopt,
+ SiteForCookies::FromOrigin(kOrigin1)));
+ EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
+ IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2,
+ SiteForCookies::FromOrigin(kOrigin1)));
+ }
// No origins with non-null SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
diff --git a/chromium/net/base/load_flags_list.h b/chromium/net/base/load_flags_list.h
index 6466deac267..96d1a51ec10 100644
--- a/chromium/net/base/load_flags_list.h
+++ b/chromium/net/base/load_flags_list.h
@@ -101,12 +101,3 @@ LOAD_FLAG(RESTRICTED_PREFETCH, 1 << 15)
// is considered privileged, and therefore this flag must only be set from a
// trusted process.
LOAD_FLAG(CAN_USE_RESTRICTED_PREFETCH, 1 << 16)
-
-// True if the request should attempt to use the single-keyed cache to satisfy
-// the request. The single-keyed cache will only be used if the "unusable" flag
-// on the cache entry is not true. Otherwise it will fall back to the
-// partitioned cache. This flag also enables checksumming of the response to set
-// the "unusable" flag if necessary.
-//
-// Cannot be used together with BYPASS_CACHE, ONLY_FROM_CACHE, or DISABLE_CACHE.
-LOAD_FLAG(USE_SINGLE_KEYED_CACHE, 1 << 17)
diff --git a/chromium/net/base/logging_network_change_observer.cc b/chromium/net/base/logging_network_change_observer.cc
index 11beacd83e6..0c83a0bc3f5 100644
--- a/chromium/net/base/logging_network_change_observer.cc
+++ b/chromium/net/base/logging_network_change_observer.cc
@@ -22,8 +22,8 @@ namespace net {
namespace {
-// Returns a human readable integer from a NetworkHandle.
-int HumanReadableNetworkHandle(NetworkChangeNotifier::NetworkHandle network) {
+// Returns a human readable integer from a handles::NetworkHandle.
+int HumanReadableNetworkHandle(handles::NetworkHandle network) {
#if BUILDFLAG(IS_ANDROID)
// On Marshmallow, demunge the NetID to undo munging done in java
// Network.getNetworkHandle() by shifting away 0xfacade from
@@ -39,8 +39,7 @@ int HumanReadableNetworkHandle(NetworkChangeNotifier::NetworkHandle network) {
// Return a dictionary of values that provide information about a
// network-specific change. This also includes relevant current state
// like the default network, and the types of active networks.
-base::Value NetworkSpecificNetLogParams(
- NetworkChangeNotifier::NetworkHandle network) {
+base::Value NetworkSpecificNetLogParams(handles::NetworkHandle network) {
base::Value::Dict dict;
dict.Set("changed_network_handle", HumanReadableNetworkHandle(network));
dict.Set("changed_network_type",
@@ -51,7 +50,7 @@ base::Value NetworkSpecificNetLogParams(
HumanReadableNetworkHandle(NetworkChangeNotifier::GetDefaultNetwork()));
NetworkChangeNotifier::NetworkList networks;
NetworkChangeNotifier::GetConnectedNetworks(&networks);
- for (NetworkChangeNotifier::NetworkHandle active_network : networks) {
+ for (handles::NetworkHandle active_network : networks) {
dict.Set(
"current_active_networks." +
base::NumberToString(HumanReadableNetworkHandle(active_network)),
@@ -63,7 +62,7 @@ base::Value NetworkSpecificNetLogParams(
void NetLogNetworkSpecific(NetLog* net_log,
NetLogEventType type,
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
if (!net_log)
return;
@@ -121,7 +120,7 @@ void LoggingNetworkChangeObserver::OnNetworkChanged(
}
void LoggingNetworkChangeObserver::OnNetworkConnected(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
VLOG(1) << "Observed network " << network << " connect";
NetLogNetworkSpecific(net_log_, NetLogEventType::SPECIFIC_NETWORK_CONNECTED,
@@ -129,7 +128,7 @@ void LoggingNetworkChangeObserver::OnNetworkConnected(
}
void LoggingNetworkChangeObserver::OnNetworkDisconnected(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
VLOG(1) << "Observed network " << network << " disconnect";
NetLogNetworkSpecific(
@@ -137,7 +136,7 @@ void LoggingNetworkChangeObserver::OnNetworkDisconnected(
}
void LoggingNetworkChangeObserver::OnNetworkSoonToDisconnect(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
VLOG(1) << "Observed network " << network << " soon to disconnect";
NetLogNetworkSpecific(
@@ -145,7 +144,7 @@ void LoggingNetworkChangeObserver::OnNetworkSoonToDisconnect(
}
void LoggingNetworkChangeObserver::OnNetworkMadeDefault(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
VLOG(1) << "Observed network " << network << " made the default network";
NetLogNetworkSpecific(
diff --git a/chromium/net/base/logging_network_change_observer.h b/chromium/net/base/logging_network_change_observer.h
index 715ab796dc1..999354a3841 100644
--- a/chromium/net/base/logging_network_change_observer.h
+++ b/chromium/net/base/logging_network_change_observer.h
@@ -8,6 +8,7 @@
#include "base/memory/raw_ptr.h"
#include "net/base/net_export.h"
#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
namespace net {
@@ -41,14 +42,10 @@ class NET_EXPORT LoggingNetworkChangeObserver
void OnNetworkChanged(NetworkChangeNotifier::ConnectionType type) override;
// NetworkChangeNotifier::NetworkObserver implementation.
- void OnNetworkConnected(
- NetworkChangeNotifier::NetworkHandle network) override;
- void OnNetworkDisconnected(
- NetworkChangeNotifier::NetworkHandle network) override;
- void OnNetworkSoonToDisconnect(
- NetworkChangeNotifier::NetworkHandle network) override;
- void OnNetworkMadeDefault(
- NetworkChangeNotifier::NetworkHandle network) override;
+ void OnNetworkConnected(handles::NetworkHandle network) override;
+ void OnNetworkDisconnected(handles::NetworkHandle network) override;
+ void OnNetworkSoonToDisconnect(handles::NetworkHandle network) override;
+ void OnNetworkMadeDefault(handles::NetworkHandle network) override;
raw_ptr<NetLog> net_log_;
};
diff --git a/chromium/net/base/mime_sniffer.cc b/chromium/net/base/mime_sniffer.cc
index d778094f17e..aa6ebbcd6ff 100644
--- a/chromium/net/base/mime_sniffer.cc
+++ b/chromium/net/base/mime_sniffer.cc
@@ -828,8 +828,8 @@ bool LooksLikeBinary(base::StringPiece content) {
// represents byte 0x1F.
const uint32_t kBinaryBits =
~(1u << '\t' | 1u << '\n' | 1u << '\r' | 1u << '\f' | 1u << '\x1b');
- for (size_t i = 0; i < content.length(); ++i) {
- uint8_t byte = static_cast<uint8_t>(content[i]);
+ for (char c : content) {
+ uint8_t byte = static_cast<uint8_t>(c);
if (byte < 0x20 && (kBinaryBits & (1u << byte)))
return true;
}
diff --git a/chromium/net/base/mime_util.cc b/chromium/net/base/mime_util.cc
index 39df945b162..1779ec4f965 100644
--- a/chromium/net/base/mime_util.cc
+++ b/chromium/net/base/mime_util.cc
@@ -43,10 +43,10 @@ class MimeUtil : public PlatformMimeUtil {
const std::string& mime_type,
base::FilePath::StringType* extension) const;
- bool MatchesMimeType(const std::string &mime_type_pattern,
- const std::string &mime_type) const;
+ bool MatchesMimeType(const std::string& mime_type_pattern,
+ const std::string& mime_type) const;
- bool ParseMimeTypeWithoutParameter(const std::string& type_string,
+ bool ParseMimeTypeWithoutParameter(base::StringPiece type_string,
std::string* top_level_type,
std::string* subtype) const;
@@ -573,23 +573,24 @@ bool ParseMimeType(const std::string& type_str,
return true;
}
-bool MimeUtil::ParseMimeTypeWithoutParameter(
- const std::string& type_string,
- std::string* top_level_type,
- std::string* subtype) const {
- std::vector<std::string> components = base::SplitString(
+bool MimeUtil::ParseMimeTypeWithoutParameter(base::StringPiece type_string,
+ std::string* top_level_type,
+ std::string* subtype) const {
+ std::vector<base::StringPiece> components = base::SplitStringPiece(
type_string, "/", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
if (components.size() != 2)
return false;
- TrimWhitespaceASCII(components[0], base::TRIM_LEADING, &components[0]);
- TrimWhitespaceASCII(components[1], base::TRIM_TRAILING, &components[1]);
+ components[0] = TrimWhitespaceASCII(components[0], base::TRIM_LEADING);
+ components[1] = TrimWhitespaceASCII(components[1], base::TRIM_TRAILING);
if (!HttpUtil::IsToken(components[0]) || !HttpUtil::IsToken(components[1]))
return false;
if (top_level_type)
- *top_level_type = components[0];
+ top_level_type->assign(std::string(components[0]));
+
if (subtype)
- *subtype = components[1];
+ subtype->assign(std::string(components[1]));
+
return true;
}
@@ -641,7 +642,7 @@ bool MatchesMimeType(const std::string& mime_type_pattern,
return g_mime_util.Get().MatchesMimeType(mime_type_pattern, mime_type);
}
-bool ParseMimeTypeWithoutParameter(const std::string& type_string,
+bool ParseMimeTypeWithoutParameter(base::StringPiece type_string,
std::string* top_level_type,
std::string* subtype) {
return g_mime_util.Get().ParseMimeTypeWithoutParameter(
diff --git a/chromium/net/base/mime_util.h b/chromium/net/base/mime_util.h
index 7d662fedd2b..55c93426b98 100644
--- a/chromium/net/base/mime_util.h
+++ b/chromium/net/base/mime_util.h
@@ -23,6 +23,7 @@
#include <vector>
#include "base/files/file_path.h"
+#include "base/strings/string_piece.h"
#include "base/strings/string_split.h"
#include "net/base/net_export.h"
@@ -82,7 +83,7 @@ NET_EXPORT bool ParseMimeType(const std::string& type_str,
//
// This function strips leading and trailing whitespace from the MIME type.
// TODO: investigate if we should strip strictly HTTP whitespace.
-NET_EXPORT bool ParseMimeTypeWithoutParameter(const std::string& type_string,
+NET_EXPORT bool ParseMimeTypeWithoutParameter(base::StringPiece type_string,
std::string* top_level_type,
std::string* subtype);
diff --git a/chromium/net/base/mock_file_stream.cc b/chromium/net/base/mock_file_stream.cc
index 97b1e519399..ba538639226 100644
--- a/chromium/net/base/mock_file_stream.cc
+++ b/chromium/net/base/mock_file_stream.cc
@@ -11,9 +11,7 @@
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
-namespace net {
-
-namespace testing {
+namespace net::testing {
MockFileStream::MockFileStream(
const scoped_refptr<base::TaskRunner>& task_runner)
@@ -126,6 +124,4 @@ int64_t MockFileStream::ErrorCallback64(Int64CompletionOnceCallback callback) {
return ret;
}
-} // namespace testing
-
-} // namespace net
+} // namespace net::testing
diff --git a/chromium/net/base/mock_network_change_notifier.cc b/chromium/net/base/mock_network_change_notifier.cc
index 427bf4fa186..af3944b48b5 100644
--- a/chromium/net/base/mock_network_change_notifier.cc
+++ b/chromium/net/base/mock_network_change_notifier.cc
@@ -11,8 +11,7 @@
#include "net/dns/dns_config_service.h"
#include "net/dns/system_dns_config_change_notifier.h"
-namespace net {
-namespace test {
+namespace net::test {
// static
std::unique_ptr<MockNetworkChangeNotifier> MockNetworkChangeNotifier::Create() {
@@ -52,33 +51,33 @@ void MockNetworkChangeNotifier::GetCurrentConnectedNetworks(
}
void MockNetworkChangeNotifier::NotifyNetworkMadeDefault(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
QueueNetworkMadeDefault(network);
// Spin the message loop so the notification is delivered.
base::RunLoop().RunUntilIdle();
}
void MockNetworkChangeNotifier::QueueNetworkMadeDefault(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
NetworkChangeNotifier::NetworkChangeType::kMadeDefault, network);
}
void MockNetworkChangeNotifier::NotifyNetworkDisconnected(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
QueueNetworkDisconnected(network);
// Spin the message loop so the notification is delivered.
base::RunLoop().RunUntilIdle();
}
void MockNetworkChangeNotifier::QueueNetworkDisconnected(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
NetworkChangeNotifier::NetworkChangeType::kDisconnected, network);
}
void MockNetworkChangeNotifier::NotifyNetworkConnected(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
NetworkChangeNotifier::NetworkChangeType::kConnected, network);
// Spin the message loop so the notification is delivered.
@@ -108,7 +107,7 @@ MockNetworkChangeNotifier::MockNetworkChangeNotifier(
ScopedMockNetworkChangeNotifier::ScopedMockNetworkChangeNotifier()
: disable_network_change_notifier_for_tests_(
- new NetworkChangeNotifier::DisableForTest()),
+ std::make_unique<NetworkChangeNotifier::DisableForTest>()),
mock_network_change_notifier_(MockNetworkChangeNotifier::Create()) {}
ScopedMockNetworkChangeNotifier::~ScopedMockNetworkChangeNotifier() = default;
@@ -118,5 +117,4 @@ ScopedMockNetworkChangeNotifier::mock_network_change_notifier() {
return mock_network_change_notifier_.get();
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/base/mock_network_change_notifier.h b/chromium/net/base/mock_network_change_notifier.h
index 67295ce216a..60b14a94d1a 100644
--- a/chromium/net/base/mock_network_change_notifier.h
+++ b/chromium/net/base/mock_network_change_notifier.h
@@ -8,6 +8,7 @@
#include <memory>
#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
namespace net {
@@ -35,21 +36,21 @@ class MockNetworkChangeNotifier : public NetworkChangeNotifier {
void GetCurrentConnectedNetworks(NetworkList* network_list) const override;
// Delivers a MADE_DEFAULT notification to observers.
- void NotifyNetworkMadeDefault(NetworkChangeNotifier::NetworkHandle network);
+ void NotifyNetworkMadeDefault(handles::NetworkHandle network);
// Queues a MADE_DEFAULT notification to be delivered to observers
// but does not spin the message loop to actually deliver it.
- void QueueNetworkMadeDefault(NetworkChangeNotifier::NetworkHandle network);
+ void QueueNetworkMadeDefault(handles::NetworkHandle network);
// Delivers a DISCONNECTED notification to observers.
- void NotifyNetworkDisconnected(NetworkChangeNotifier::NetworkHandle network);
+ void NotifyNetworkDisconnected(handles::NetworkHandle network);
// Queues a DISCONNECTED notification to be delivered to observers
// but does not spin the message loop to actually deliver it.
- void QueueNetworkDisconnected(NetworkChangeNotifier::NetworkHandle network);
+ void QueueNetworkDisconnected(handles::NetworkHandle network);
// Delivers a CONNECTED notification to observers.
- void NotifyNetworkConnected(NetworkChangeNotifier::NetworkHandle network);
+ void NotifyNetworkConnected(handles::NetworkHandle network);
void SetConnectionTypeAndNotifyObservers(ConnectionType connection_type);
@@ -79,7 +80,7 @@ class MockNetworkChangeNotifier : public NetworkChangeNotifier {
private:
// Create using MockNetworkChangeNotifier::Create().
- MockNetworkChangeNotifier(
+ explicit MockNetworkChangeNotifier(
std::unique_ptr<SystemDnsConfigChangeNotifier> dns_config_notifier);
bool force_network_handles_supported_ = false;
diff --git a/chromium/net/base/net_error_details.h b/chromium/net/base/net_error_details.h
index 04067605480..bdc9b66f6f6 100644
--- a/chromium/net/base/net_error_details.h
+++ b/chromium/net/base/net_error_details.h
@@ -33,6 +33,8 @@ struct NET_EXPORT NetErrorDetails {
// True if receives a GoAway frame from the server due to connection
// migration with port change.
bool quic_port_migration_detected = false;
+ bool quic_connection_migration_attempted = false;
+ bool quic_connection_migration_successful = false;
};
} // namespace net
diff --git a/chromium/net/base/net_error_list.h b/chromium/net/base/net_error_list.h
index 35f53172b76..c7837efec56 100644
--- a/chromium/net/base/net_error_list.h
+++ b/chromium/net/base/net_error_list.h
@@ -524,7 +524,7 @@ NET_ERROR(CERT_INVALID, -207)
// signature algorithm.
NET_ERROR(CERT_WEAK_SIGNATURE_ALGORITHM, -208)
-// -209 is availible: was CERT_NOT_IN_DNS.
+// -209 is available: was CERT_NOT_IN_DNS.
// The host name specified in the certificate is not unique.
NET_ERROR(CERT_NON_UNIQUE_NAME, -210)
@@ -718,7 +718,7 @@ NET_ERROR(QUIC_PROTOCOL_ERROR, -356)
// The HTTP headers were truncated by an EOF.
NET_ERROR(RESPONSE_HEADERS_TRUNCATED, -357)
-// The QUIC crytpo handshake failed. This means that the server was unable
+// The QUIC crypto handshake failed. This means that the server was unable
// to read any requests sent, so they may be resent.
NET_ERROR(QUIC_HANDSHAKE_FAILED, -358)
@@ -814,6 +814,11 @@ NET_ERROR(TOO_MANY_ACCEPT_CH_RESTARTS, -382)
// request should be invalidated.
NET_ERROR(INCONSISTENT_IP_ADDRESS_SPACE, -383)
+// The IP address space of the cached remote endpoint is blocked by private
+// network access check.
+NET_ERROR(CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_PRIVATE_NETWORK_ACCESS_POLICY,
+ -384)
+
// The cache does not have the requested entry.
NET_ERROR(CACHE_MISS, -400)
@@ -857,7 +862,7 @@ NET_ERROR(CACHE_LOCK_TIMEOUT, -409)
NET_ERROR(CACHE_AUTH_FAILURE_AFTER_READ, -410)
// Internal not-quite error code for the HTTP cache. In-memory hints suggest
-// that the cache entry would not have been useable with the transaction's
+// that the cache entry would not have been usable with the transaction's
// current configuration (e.g. load flags, mode, etc.)
NET_ERROR(CACHE_ENTRY_NOT_SUITABLE, -411)
diff --git a/chromium/net/base/net_string_util_icu_alternatives_ios.mm b/chromium/net/base/net_string_util_icu_alternatives_ios.mm
index 3e77fcdabb4..bdc7c71395d 100644
--- a/chromium/net/base/net_string_util_icu_alternatives_ios.mm
+++ b/chromium/net/base/net_string_util_icu_alternatives_ios.mm
@@ -78,7 +78,7 @@ bool ToUpper(base::StringPiece16 str, std::u16string* output) {
base::ScopedCFTypeRef<CFStringRef> cfstring(base::SysUTF16ToCFStringRef(str));
base::ScopedCFTypeRef<CFMutableStringRef> mutable_cfstring(
CFStringCreateMutableCopy(kCFAllocatorDefault, 0, cfstring.get()));
- CFStringUppercase(mutable_cfstring.get(), NULL);
+ CFStringUppercase(mutable_cfstring.get(), nullptr);
*output = base::SysCFStringRefToUTF16(mutable_cfstring.get());
return true;
}
diff --git a/chromium/net/base/network_activity_monitor.cc b/chromium/net/base/network_activity_monitor.cc
index 1ad94b71680..e4ce7f08c9c 100644
--- a/chromium/net/base/network_activity_monitor.cc
+++ b/chromium/net/base/network_activity_monitor.cc
@@ -9,8 +9,7 @@
#include "third_party/abseil-cpp/absl/base/attributes.h"
-namespace net {
-namespace activity_monitor {
+namespace net::activity_monitor {
namespace {
@@ -33,5 +32,4 @@ void ResetBytesReceivedForTesting() {
g_bytes_received = 0;
}
-} // namespace activity_monitor
-} // namespace net
+} // namespace net::activity_monitor
diff --git a/chromium/net/base/network_activity_monitor.h b/chromium/net/base/network_activity_monitor.h
index 537a135235e..6b24f306295 100644
--- a/chromium/net/base/network_activity_monitor.h
+++ b/chromium/net/base/network_activity_monitor.h
@@ -9,8 +9,7 @@
#include "net/base/net_export.h"
-namespace net {
-namespace activity_monitor {
+namespace net::activity_monitor {
// These functions are used to track bytes received from the network across all
// sockets. They are thread-safe.
@@ -27,7 +26,6 @@ void NET_EXPORT_PRIVATE IncrementBytesReceived(uint64_t bytes_received);
uint64_t NET_EXPORT_PRIVATE GetBytesReceived();
void NET_EXPORT_PRIVATE ResetBytesReceivedForTesting();
-} // namespace activity_monitor
-} // namespace net
+} // namespace net::activity_monitor
#endif // NET_BASE_NETWORK_ACTIVITY_MONITOR_H_
diff --git a/chromium/net/base/network_activity_monitor_unittest.cc b/chromium/net/base/network_activity_monitor_unittest.cc
index ae13296b29a..e28250d204b 100644
--- a/chromium/net/base/network_activity_monitor_unittest.cc
+++ b/chromium/net/base/network_activity_monitor_unittest.cc
@@ -14,9 +14,7 @@
#include "base/threading/thread.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace test {
+namespace net::test {
class NetworkActivityMontiorTest : public testing::Test {
public:
@@ -66,6 +64,4 @@ TEST_F(NetworkActivityMontiorTest, Threading) {
activity_monitor::GetBytesReceived());
}
-} // namespace test
-
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/base/network_anonymization_key.cc b/chromium/net/base/network_anonymization_key.cc
new file mode 100644
index 00000000000..254cd00430e
--- /dev/null
+++ b/chromium/net/base/network_anonymization_key.cc
@@ -0,0 +1,107 @@
+// Copyright 2022 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.
+#include "net/base/network_anonymization_key.h"
+#include "base/feature_list.h"
+#include "base/unguessable_token.h"
+#include "net/base/features.h"
+#include "net/base/net_export.h"
+#include "net/base/schemeful_site.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace net {
+
+NetworkAnonymizationKey::NetworkAnonymizationKey(
+ const SchemefulSite& top_frame_site,
+ const absl::optional<SchemefulSite>& frame_site,
+ const absl::optional<bool> is_cross_site,
+ const absl::optional<base::UnguessableToken> nonce)
+ : top_frame_site_(top_frame_site),
+ frame_site_(!IsFrameSiteEnabled() ? absl::nullopt : frame_site),
+ is_cross_site_(IsCrossSiteFlagSchemeEnabled() ? is_cross_site
+ : absl::nullopt),
+ nonce_(nonce) {}
+
+NetworkAnonymizationKey::NetworkAnonymizationKey() = default;
+
+NetworkAnonymizationKey::NetworkAnonymizationKey(
+ const NetworkAnonymizationKey& network_anonymization_key) = default;
+
+NetworkAnonymizationKey::~NetworkAnonymizationKey() = default;
+
+NetworkAnonymizationKey& NetworkAnonymizationKey::operator=(
+ const NetworkAnonymizationKey& network_anonymization_key) = default;
+
+NetworkAnonymizationKey& NetworkAnonymizationKey::operator=(
+ NetworkAnonymizationKey&& network_anonymization_key) = default;
+
+std::string NetworkAnonymizationKey::ToDebugString() const {
+ std::string str = GetSiteDebugString(top_frame_site_);
+ str += " " + GetSiteDebugString(frame_site_);
+ std::string cross_site_str =
+ IsCrossSiteFlagSchemeEnabled()
+ ? (GetIsCrossSite() ? " cross_site" : " same_site")
+ : "";
+ str += cross_site_str;
+
+ // Currently, if the NAK has a nonce it will be marked transient. For debug
+ // purposes we will print the value but if called via
+ // `NetworkAnonymizationKey::ToString` we will have already returned "".
+ if (nonce_.has_value()) {
+ str += " (with nonce " + nonce_->ToString() + ")";
+ }
+
+ return str;
+}
+
+bool NetworkAnonymizationKey::IsEmpty() const {
+ return !top_frame_site_.has_value();
+}
+
+bool NetworkAnonymizationKey::IsFullyPopulated() const {
+ return top_frame_site_.has_value() &&
+ (!IsFrameSiteEnabled() || frame_site_.has_value()) &&
+ (!IsCrossSiteFlagSchemeEnabled() || is_cross_site_.has_value());
+}
+
+bool NetworkAnonymizationKey::IsTransient() const {
+ if (!IsFullyPopulated())
+ return true;
+
+ return top_frame_site_->opaque() ||
+ (IsFrameSiteEnabled() && frame_site_->opaque()) || nonce_.has_value();
+}
+
+bool NetworkAnonymizationKey::GetIsCrossSite() const {
+ DCHECK(IsCrossSiteFlagSchemeEnabled() && is_cross_site_.has_value());
+ return is_cross_site_.value();
+}
+
+bool NetworkAnonymizationKey::IsFrameSiteEnabled() {
+ return !base::FeatureList::IsEnabled(
+ net::features::kEnableDoubleKeyNetworkAnonymizationKey) &&
+ !base::FeatureList::IsEnabled(
+ net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
+}
+
+bool NetworkAnonymizationKey::IsDoubleKeySchemeEnabled() {
+ // There's no reason both of these will be enabled simultaneously but if
+ // someone manually enables both flags, double key with cross site flag scheme
+ // should take precedence.
+ return base::FeatureList::IsEnabled(
+ net::features::kEnableDoubleKeyNetworkAnonymizationKey) &&
+ !base::FeatureList::IsEnabled(
+ net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
+}
+
+bool NetworkAnonymizationKey::IsCrossSiteFlagSchemeEnabled() {
+ return base::FeatureList::IsEnabled(
+ net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
+}
+
+std::string NetworkAnonymizationKey::GetSiteDebugString(
+ const absl::optional<SchemefulSite>& site) const {
+ return site ? site->GetDebugString() : "null";
+}
+
+} // namespace net
diff --git a/chromium/net/base/network_anonymization_key.h b/chromium/net/base/network_anonymization_key.h
new file mode 100644
index 00000000000..1a783562124
--- /dev/null
+++ b/chromium/net/base/network_anonymization_key.h
@@ -0,0 +1,172 @@
+// Copyright 2022 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.
+
+#ifndef NET_BASE_NETWORK_ANONYMIZATION_KEY_H_
+#define NET_BASE_NETWORK_ANONYMIZATION_KEY_H_
+
+#include <string>
+#include <tuple>
+
+#include "base/unguessable_token.h"
+#include "net/base/net_export.h"
+#include "net/base/schemeful_site.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace net {
+
+// NetworkAnonymizationKey will be used to partition shared network state based
+// on the context on which they were made. This class is an expiremental key
+// that contains properties that will be changed via feature flags.
+
+// NetworkAnonymizationKey contains the following properties:
+
+// `top_frame_site` represents the SchemefulSite of the pages top level frame.
+// In order to separate first and third party context from each other this field
+// will always be populated.
+
+// `frame_site` represents the SchemefulSite of the requestor frame. This will
+// be empty when kEnableDoubleKeyNetworkAnonymizationKey is enabled.
+
+//`is_cross_site` is an expiremental boolean that will be used with the
+//`top_frame_site` to create a partition key that separates the
+//`top_frame_site`s first party partition from any cross-site iframes. This will
+// be used only when `kEnableCrossSiteFlagNetworkAnonymizationKey` is enabled.
+// When `kEnableCrossSiteFlagNetworkAnonymizationKey` is disabled,
+// `is_cross_site_` will be an empty optional.
+
+// The following show how the `is_cross_site` boolean is populated for the
+// innermost frame in the chain.
+// a->a => is_cross_site = true
+// a->b => is_cross_site = false
+// a->b->a => is_cross_site = false
+// a->(sandboxed a [has nonce]) => is_cross_site = true
+
+// The `nonce` value creates a key for anonymous iframes by giving them a
+// temporary `nonce` value which changes per top level navigation. For now, any
+// NetworkAnonymizationKey with a nonce will be considered transient. This is
+// being considered to possibly change in the future in an effort to allow
+// anonymous iframes with the same partition key access to shared resources.
+// The nonce value will be empty except for anonymous iframes.
+
+// TODO @brgoldstein, add link to public documentation of key scheme naming
+// conventions.
+
+class NET_EXPORT NetworkAnonymizationKey {
+ public:
+ NetworkAnonymizationKey(
+ const SchemefulSite& top_frame_site,
+ const absl::optional<SchemefulSite>& frame_site,
+ const absl::optional<bool> is_cross_site = absl::nullopt,
+ const absl::optional<base::UnguessableToken> nonce = absl::nullopt);
+
+ // Construct an empty key.
+ NetworkAnonymizationKey();
+
+ NetworkAnonymizationKey(
+ const NetworkAnonymizationKey& network_anonymization_key);
+ NetworkAnonymizationKey(NetworkAnonymizationKey&& network_anonymization_key);
+
+ ~NetworkAnonymizationKey();
+
+ NetworkAnonymizationKey& operator=(
+ const NetworkAnonymizationKey& network_anonymization_key);
+ NetworkAnonymizationKey& operator=(
+ NetworkAnonymizationKey&& network_anonymization_key);
+
+ // Compare keys for equality, true if all enabled fields are equal.
+ bool operator==(const NetworkAnonymizationKey& other) const {
+ return std::tie(top_frame_site_, frame_site_, is_cross_site_, nonce_) ==
+ std::tie(other.top_frame_site_, other.frame_site_,
+ other.is_cross_site_, other.nonce_);
+ }
+
+ // Compare keys for inequality, true if any enabled field varies.
+ bool operator!=(const NetworkAnonymizationKey& other) const {
+ return !(*this == other);
+ }
+
+ // Provide an ordering for keys based on all enabled fields.
+ bool operator<(const NetworkAnonymizationKey& other) const {
+ return std::tie(top_frame_site_, frame_site_, is_cross_site_, nonce_) <
+ std::tie(other.top_frame_site_, other.frame_site_,
+ other.is_cross_site_, other.nonce_);
+ }
+
+ // Returns the string representation of the key.
+ std::string ToDebugString() const;
+
+ // Returns true if all parts of the key are empty.
+ bool IsEmpty() const;
+
+ // Returns true if `top_frame_site_` and `frame_site_` of the key are
+ // non-empty.
+ bool IsFullyPopulated() const;
+
+ // Returns true if this key's lifetime is short-lived. It may not make sense
+ // to persist state to disk related to it (e.g., disk cache).
+ // A NetworkAnonymizationKey will be considered transient if either
+ // `top_frame_site_` or `frame_site_` are empty or opaque or if the key has a
+ // `nonce_`.
+ bool IsTransient() const;
+
+ // Getters for the top frame, frame site, nonce and is cross site flag.
+ // TODO @brgoldstein: create feature flags to wrap these properties so that
+ // the key can be modified for experimentation.
+ const absl::optional<SchemefulSite>& GetTopFrameSite() const {
+ return top_frame_site_;
+ }
+
+ const absl::optional<SchemefulSite>& GetFrameSite() const {
+ return frame_site_;
+ }
+
+ bool GetIsCrossSite() const;
+
+ const absl::optional<base::UnguessableToken>& GetNonce() const {
+ return nonce_;
+ }
+
+ // Returns true if the NetworkAnonymizationKey has a triple keyed scheme. This
+ // means the values of the NetworkAnonymizationKey are as follows:
+ // `top_frame_site` -> the schemeful site of the top level page.
+ // `frame_site ` -> the schemeful site of the requestor frame
+ // `is_cross_site` -> nullopt
+ static bool IsFrameSiteEnabled();
+
+ // Returns true if the NetworkAnonymizationKey has a double keyed scheme. This
+ // means the values of the NetworkAnonymizationKey are as follows:
+ // `top_frame_site` -> the schemeful site of the top level page.
+ // `frame_site ` -> nullopt
+ // `is_cross_site` -> nullopt
+ static bool IsDoubleKeySchemeEnabled();
+
+ // Returns true if the NetworkAnonymizationKey has a <double keyed +
+ // is_cross_site> scheme. This means the values of the NetworkAnonymizationKey
+ // are as follows:
+ // `top_frame_site` -> the schemeful site of the top level page.
+ // `frame_site ` -> nullopt
+ // `is_cross_site` -> a boolean indicating if the requestor frame site is
+ // cross site from the top level site.
+ static bool IsCrossSiteFlagSchemeEnabled();
+
+ private:
+ std::string GetSiteDebugString(
+ const absl::optional<SchemefulSite>& site) const;
+ // The origin/etld+1 of the top frame of the page making the request. This
+ // will always be populated unless all other fields are also nullopt.
+ absl::optional<SchemefulSite> top_frame_site_;
+
+ // The origin/etld+1 of the frame that initiates the request.
+ absl::optional<SchemefulSite> frame_site_;
+
+ // True if the frame site is cross site when compared to the top frame site.
+ absl::optional<bool> is_cross_site_;
+
+ // for non-opaque origins.
+ absl::optional<base::UnguessableToken> nonce_;
+};
+
+} // namespace net
+
+#endif // NET_BASE_NETWORK_ANONYMIZATION_KEY_H_ \ No newline at end of file
diff --git a/chromium/net/base/network_anonymization_key_unittest.cc b/chromium/net/base/network_anonymization_key_unittest.cc
new file mode 100644
index 00000000000..14e8883ba59
--- /dev/null
+++ b/chromium/net/base/network_anonymization_key_unittest.cc
@@ -0,0 +1,333 @@
+// Copyright 2022 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.
+
+#include "net/base/network_anonymization_key.h"
+
+#include "base/test/scoped_feature_list.h"
+#include "base/unguessable_token.h"
+#include "base/values.h"
+#include "net/base/features.h"
+#include "net/base/schemeful_site.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
+#include "url/url_util.h"
+
+namespace net {
+
+struct EnabledFeatureFlagsTestingParam {
+ bool enableDoubleKeyNetworkAnonymizationKeyEnabled;
+ bool enableCrossSiteFlagNetworkAnonymizationKey;
+};
+
+const EnabledFeatureFlagsTestingParam kFlagsParam[] = {
+ {/*enableDoubleKeyNetworkAnonymizationKeyEnabled=*/false,
+ /*enableCrossSiteFlagNetworkAnonymizationKey=*/false},
+ {/*enableDoubleKeyNetworkAnonymizationKeyEnabled=*/false,
+ /*enableCrossSiteFlagNetworkAnonymizationKey=*/true},
+ {/*enableDoubleKeyNetworkAnonymizationKeyEnabled=*/true,
+ /*enableCrossSiteFlagNetworkAnonymizationKey=*/false},
+ {/*enableDoubleKeyNetworkAnonymizationKeyEnabled=*/true,
+ /*enableCrossSiteFlagNetworkAnonymizationKe=y*/ true},
+};
+
+class NetworkAnonymizationKeyTest
+ : public testing::Test,
+ public testing::WithParamInterface<EnabledFeatureFlagsTestingParam> {
+ public:
+ void SetUp() override {
+ std::vector<base::Feature> enabled_features = {};
+ std::vector<base::Feature> disabled_features = {};
+
+ if (IsDoubleKeyEnabled()) {
+ enabled_features.push_back(
+ net::features::kEnableDoubleKeyNetworkAnonymizationKey);
+ } else {
+ disabled_features.push_back(
+ net::features::kEnableDoubleKeyNetworkAnonymizationKey);
+ }
+
+ if (IsCrossSiteFlagEnabled()) {
+ enabled_features.push_back(
+ net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
+ } else {
+ disabled_features.push_back(
+ net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
+ }
+
+ scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features);
+ }
+
+ bool IsDoubleKeyEnabled() {
+ return GetParam().enableDoubleKeyNetworkAnonymizationKeyEnabled;
+ }
+ bool IsCrossSiteFlagEnabled() {
+ return GetParam().enableCrossSiteFlagNetworkAnonymizationKey;
+ }
+
+ protected:
+ const SchemefulSite kTestSiteA = SchemefulSite(GURL("http://a.test/"));
+ const SchemefulSite kTestSiteB = SchemefulSite(GURL("http://b.test/"));
+ const SchemefulSite kDataSite = SchemefulSite(GURL("data:foo"));
+ const base::UnguessableToken kNonce = base::UnguessableToken::Create();
+
+ private:
+ base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+INSTANTIATE_TEST_SUITE_P(
+ All,
+ NetworkAnonymizationKeyTest,
+ /*kEnableDoubleKeyNetworkAnonymizationKey*/ testing::ValuesIn(kFlagsParam));
+
+TEST_P(NetworkAnonymizationKeyTest, IsDoubleKeyingEnabled) {
+ if (IsDoubleKeyEnabled() || IsCrossSiteFlagEnabled()) {
+ EXPECT_FALSE(NetworkAnonymizationKey::IsFrameSiteEnabled());
+ } else {
+ EXPECT_TRUE(NetworkAnonymizationKey::IsFrameSiteEnabled());
+ }
+}
+
+TEST_P(NetworkAnonymizationKeyTest, IsDoubleKeySchemeEnabled) {
+ // Double key scheme is enabled only when
+ // `kEnableDoubleKeyNetworkAnonymizationKeyEnabled` is enabled but
+ // `kEnableCrossSiteFlagNetworkAnonymizationKey` is not.
+ if (IsDoubleKeyEnabled() && !IsCrossSiteFlagEnabled()) {
+ EXPECT_TRUE(NetworkAnonymizationKey::IsDoubleKeySchemeEnabled());
+ } else {
+ EXPECT_FALSE(NetworkAnonymizationKey::IsDoubleKeySchemeEnabled());
+ }
+}
+
+TEST_P(NetworkAnonymizationKeyTest, IsCrossSiteFlagSchemeEnabled) {
+ // Double key with cross site flag scheme is enabled whenever
+ // `kEnableCrossSiteFlagNetworkAnonymizationKey` is enabled
+ // regardless of the value of
+ // `kEnableDoubleKeyNetworkAnonymizationKeyEnabled`.
+ if (IsCrossSiteFlagEnabled()) {
+ EXPECT_TRUE(NetworkAnonymizationKey::IsCrossSiteFlagSchemeEnabled());
+ } else {
+ EXPECT_FALSE(NetworkAnonymizationKey::IsCrossSiteFlagSchemeEnabled());
+ }
+}
+
+TEST_P(NetworkAnonymizationKeyTest, IsEmpty) {
+ NetworkAnonymizationKey empty_key;
+ NetworkAnonymizationKey populated_key(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/false,
+ /*nonce=*/absl::nullopt);
+
+ EXPECT_TRUE(empty_key.IsEmpty());
+ EXPECT_FALSE(populated_key.IsEmpty());
+}
+
+TEST_P(NetworkAnonymizationKeyTest, IsTransient) {
+ NetworkAnonymizationKey empty_key;
+ NetworkAnonymizationKey populated_key(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/false,
+ /*nonce=*/absl::nullopt);
+ NetworkAnonymizationKey data_top_frame_key(/*top_frame_site=*/kDataSite,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/false,
+ /*nonce=*/absl::nullopt);
+ NetworkAnonymizationKey populated_key_with_nonce(
+ /*top_frame_site=*/kTestSiteA, /*frame_site=*/kTestSiteB,
+ /*is_cross_site*/ false, base::UnguessableToken::Create());
+ NetworkAnonymizationKey data_frame_key(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kDataSite,
+ /*is_cross_site=*/false,
+ /*nonce=*/absl::nullopt);
+ NetworkAnonymizationKey populated_double_key(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/absl::nullopt,
+ /*is_cross_site=*/false,
+ /*nonce=*/absl::nullopt);
+
+ EXPECT_TRUE(empty_key.IsTransient());
+ EXPECT_FALSE(populated_key.IsTransient());
+ EXPECT_TRUE(data_top_frame_key.IsTransient());
+ EXPECT_TRUE(data_top_frame_key.IsTransient());
+ EXPECT_TRUE(populated_key_with_nonce.IsTransient());
+
+ if (IsDoubleKeyEnabled() || IsCrossSiteFlagEnabled()) {
+ EXPECT_FALSE(data_frame_key.IsTransient());
+ EXPECT_FALSE(populated_double_key.IsTransient());
+ } else {
+ EXPECT_TRUE(data_frame_key.IsTransient());
+ EXPECT_TRUE(populated_double_key.IsTransient());
+ }
+}
+
+TEST_P(NetworkAnonymizationKeyTest, IsFullyPopulated) {
+ NetworkAnonymizationKey empty_key;
+ NetworkAnonymizationKey populated_key(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/false,
+ /*nonce=*/absl::nullopt);
+ NetworkAnonymizationKey empty_frame_site_key(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/absl::nullopt,
+ /*is_cross_site=*/false,
+ /*nonce=*/absl::nullopt);
+ NetworkAnonymizationKey empty_cross_site_flag_key(
+ /*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/absl::nullopt,
+ /*nonce=*/absl::nullopt);
+ EXPECT_TRUE(populated_key.IsFullyPopulated());
+ EXPECT_FALSE(empty_key.IsFullyPopulated());
+ if (IsDoubleKeyEnabled() || IsCrossSiteFlagEnabled()) {
+ EXPECT_TRUE(empty_frame_site_key.IsFullyPopulated());
+ } else {
+ EXPECT_FALSE(empty_frame_site_key.IsFullyPopulated());
+ }
+
+ // is_cross_site is required when
+ // `kEnableCrossSiteFlagNetworkAnonymizationKey` is enabled.
+ if (IsCrossSiteFlagEnabled()) {
+ EXPECT_FALSE(empty_cross_site_flag_key.IsFullyPopulated());
+ } else {
+ EXPECT_TRUE(empty_cross_site_flag_key.IsFullyPopulated());
+ }
+}
+
+TEST_P(NetworkAnonymizationKeyTest, Getters) {
+ NetworkAnonymizationKey key(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/true, kNonce);
+
+ EXPECT_EQ(key.GetTopFrameSite(), kTestSiteA);
+ EXPECT_EQ(key.GetNonce(), kNonce);
+
+ // frame_site should be empty if any double key scheme is enabled. This
+ // includes when `kEnableCrossSiteFlagNetworkAnonymizationKey` or
+ // `kEnableDoubleKeyNetworkAnonymizationKey` are enabled.
+ if (IsDoubleKeyEnabled() || IsCrossSiteFlagEnabled()) {
+ EXPECT_EQ(key.GetFrameSite(), absl::nullopt);
+ } else {
+ EXPECT_EQ(key.GetFrameSite(), kTestSiteB);
+ }
+
+ // is_cross_site should only be true when
+ // `kEnableCrossSiteFlagNetworkAnonymizationKey` is enabled.
+ if (IsCrossSiteFlagEnabled()) {
+ EXPECT_TRUE(key.GetIsCrossSite());
+ } else {
+ EXPECT_DEATH_IF_SUPPORTED(key.GetIsCrossSite(), "");
+ }
+}
+
+TEST_P(NetworkAnonymizationKeyTest, ToDebugString) {
+ NetworkAnonymizationKey key(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/true, kNonce);
+ NetworkAnonymizationKey empty_key;
+
+ if (IsDoubleKeyEnabled() && !IsCrossSiteFlagEnabled()) {
+ // When double key scheme is enabled, the `is_cross_site` flag is always
+ // forced to false.
+ std::string double_key_expected_string_value = kTestSiteA.GetDebugString() +
+ " null" + " (with nonce " +
+ kNonce.ToString() + ")";
+ EXPECT_EQ(key.ToDebugString(), double_key_expected_string_value);
+ EXPECT_EQ(empty_key.ToDebugString(), "null null");
+ } else if (IsCrossSiteFlagEnabled()) {
+ // When double key + cross site flag scheme is enabled frame site is null,
+ // but `is_cross_site` holds the value the key is created with.
+ std::string double_key_with_cross_site_flag_expected_string_value =
+ kTestSiteA.GetDebugString() + " null" + " cross_site (with nonce " +
+ kNonce.ToString() + ")";
+ EXPECT_EQ(key.ToDebugString(),
+ double_key_with_cross_site_flag_expected_string_value);
+ // is_cross_site_ must be populated if
+ // `kEnableCrossSiteFlagNetworkAnonymizationKey` is enabled.
+ EXPECT_DEATH_IF_SUPPORTED(empty_key.ToDebugString(), "");
+ } else {
+ // When neither `kEnableDoubleKeyNetworkAnonymizationKey` or
+ // `kEnableCrossSiteFlagNetworkAnonymizationKey` is enabled,
+ // the NAK is a triple key and the `is_cross_site` flag is always forced
+ // to false.
+ std::string key_expected_string_value =
+ kTestSiteA.GetDebugString() + " " + kTestSiteB.GetDebugString() +
+ " (with nonce " + kNonce.ToString() + ")";
+ EXPECT_EQ(key.ToDebugString(), key_expected_string_value);
+ EXPECT_EQ(empty_key.ToDebugString(), "null null");
+ }
+}
+
+TEST_P(NetworkAnonymizationKeyTest, Equality) {
+ NetworkAnonymizationKey key(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/false, kNonce);
+ NetworkAnonymizationKey key_duplicate(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/false, kNonce);
+ EXPECT_TRUE(key == key_duplicate);
+ EXPECT_FALSE(key != key_duplicate);
+ EXPECT_FALSE(key < key_duplicate);
+
+ NetworkAnonymizationKey key_cross_site(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/true, kNonce);
+
+ // The `is_cross_site` flag only changes the NAK when
+ // `kEnableCrossSiteFlagNetworkAnonymizationKey` is enabled.
+ if (IsCrossSiteFlagEnabled()) {
+ EXPECT_FALSE(key == key_cross_site);
+ EXPECT_TRUE(key != key_cross_site);
+ EXPECT_TRUE(key < key_cross_site);
+ } else {
+ EXPECT_TRUE(key == key_cross_site);
+ EXPECT_FALSE(key != key_cross_site);
+ EXPECT_FALSE(key < key_cross_site);
+ }
+
+ NetworkAnonymizationKey key_no_nonce(/*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/false,
+ /*nonce=*/absl::nullopt);
+ EXPECT_FALSE(key == key_no_nonce);
+ EXPECT_TRUE(key != key_no_nonce);
+ EXPECT_FALSE(key < key_no_nonce);
+
+ NetworkAnonymizationKey key_different_nonce(
+ /*top_frame_site=*/kTestSiteA,
+ /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/false,
+ /*nonce=*/base::UnguessableToken::Create());
+ EXPECT_FALSE(key == key_different_nonce);
+ EXPECT_TRUE(key != key_different_nonce);
+
+ NetworkAnonymizationKey key_different_frame_site(
+ /*top_frame_site=*/kTestSiteA, /*frame_site=*/kTestSiteA,
+ /*is_cross_site=*/false, kNonce);
+
+ if (IsDoubleKeyEnabled() || IsCrossSiteFlagEnabled()) {
+ EXPECT_TRUE(key == key_different_frame_site);
+ EXPECT_FALSE(key != key_different_frame_site);
+ } else {
+ EXPECT_FALSE(key == key_different_frame_site);
+ EXPECT_TRUE(key != key_different_frame_site);
+ }
+ EXPECT_FALSE(key < key_different_frame_site);
+
+ NetworkAnonymizationKey key_different_top_level_site(
+ /*top_frame_site=*/kTestSiteB, /*frame_site=*/kTestSiteB,
+ /*is_cross_site=*/false, kNonce);
+ EXPECT_FALSE(key == key_different_top_level_site);
+ EXPECT_TRUE(key != key_different_top_level_site);
+ EXPECT_TRUE(key < key_different_top_level_site);
+
+ NetworkAnonymizationKey empty_key;
+ NetworkAnonymizationKey empty_key_duplicate;
+ EXPECT_TRUE(empty_key == empty_key_duplicate);
+ EXPECT_FALSE(empty_key != empty_key_duplicate);
+ EXPECT_FALSE(empty_key < empty_key_duplicate);
+
+ EXPECT_FALSE(empty_key == key);
+ EXPECT_TRUE(empty_key != key);
+ EXPECT_TRUE(empty_key < key);
+}
+
+} // namespace net \ No newline at end of file
diff --git a/chromium/net/base/network_change_notifier.cc b/chromium/net/base/network_change_notifier.cc
index 387c83430fa..1a993852691 100644
--- a/chromium/net/base/network_change_notifier.cc
+++ b/chromium/net/base/network_change_notifier.cc
@@ -33,13 +33,11 @@
#if BUILDFLAG(IS_WIN)
#include "net/base/network_change_notifier_win.h"
-// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#elif BUILDFLAG(IS_LINUX)
#include "net/base/network_change_notifier_linux.h"
#elif BUILDFLAG(IS_APPLE)
#include "net/base/network_change_notifier_mac.h"
-#elif BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID)
+#elif BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
#include "net/base/network_change_notifier_posix.h"
#elif BUILDFLAG(IS_FUCHSIA)
#include "net/base/network_change_notifier_fuchsia.h"
@@ -68,7 +66,7 @@ base::Lock& NetworkChangeNotifierCreationLock() {
class MockNetworkChangeNotifier : public NetworkChangeNotifier {
public:
- MockNetworkChangeNotifier(
+ explicit MockNetworkChangeNotifier(
std::unique_ptr<SystemDnsConfigChangeNotifier> dns_config_notifier)
: NetworkChangeNotifier(
NetworkChangeCalculatorParams(),
@@ -92,9 +90,6 @@ class MockNetworkChangeNotifier : public NetworkChangeNotifier {
// static
bool NetworkChangeNotifier::test_notifications_only_ = false;
-// static
-const NetworkChangeNotifier::NetworkHandle
- NetworkChangeNotifier::kInvalidNetworkHandle = -1;
NetworkChangeNotifier::NetworkChangeCalculatorParams::
NetworkChangeCalculatorParams() = default;
@@ -192,33 +187,37 @@ class NetworkChangeNotifier::NetworkChangeCalculator
class NetworkChangeNotifier::ObserverList {
public:
ObserverList()
- : ip_address_observer_list_(new base::ObserverListThreadSafe<
- NetworkChangeNotifier::IPAddressObserver>(
- base::ObserverListPolicy::EXISTING_ONLY)),
+ : ip_address_observer_list_(
+ base::MakeRefCounted<base::ObserverListThreadSafe<
+ NetworkChangeNotifier::IPAddressObserver>>(
+ base::ObserverListPolicy::EXISTING_ONLY)),
connection_type_observer_list_(
- new base::ObserverListThreadSafe<
- NetworkChangeNotifier::ConnectionTypeObserver>(
+ base::MakeRefCounted<base::ObserverListThreadSafe<
+ NetworkChangeNotifier::ConnectionTypeObserver>>(
+ base::ObserverListPolicy::EXISTING_ONLY)),
+ resolver_state_observer_list_(
+ base::MakeRefCounted<base::ObserverListThreadSafe<
+ NetworkChangeNotifier::DNSObserver>>(
base::ObserverListPolicy::EXISTING_ONLY)),
- resolver_state_observer_list_(new base::ObserverListThreadSafe<
- NetworkChangeNotifier::DNSObserver>(
- base::ObserverListPolicy::EXISTING_ONLY)),
network_change_observer_list_(
- new base::ObserverListThreadSafe<
- NetworkChangeNotifier::NetworkChangeObserver>(
+ base::MakeRefCounted<base::ObserverListThreadSafe<
+ NetworkChangeNotifier::NetworkChangeObserver>>(
base::ObserverListPolicy::EXISTING_ONLY)),
max_bandwidth_observer_list_(
- new base::ObserverListThreadSafe<
- NetworkChangeNotifier::MaxBandwidthObserver>(
+ base::MakeRefCounted<base::ObserverListThreadSafe<
+ NetworkChangeNotifier::MaxBandwidthObserver>>(
+ base::ObserverListPolicy::EXISTING_ONLY)),
+ network_observer_list_(
+ base::MakeRefCounted<base::ObserverListThreadSafe<
+ NetworkChangeNotifier::NetworkObserver>>(
base::ObserverListPolicy::EXISTING_ONLY)),
- network_observer_list_(new base::ObserverListThreadSafe<
- NetworkChangeNotifier::NetworkObserver>(
- base::ObserverListPolicy::EXISTING_ONLY)),
connection_cost_observer_list_(
- new base::ObserverListThreadSafe<
- NetworkChangeNotifier::ConnectionCostObserver>(
+ base::MakeRefCounted<base::ObserverListThreadSafe<
+ NetworkChangeNotifier::ConnectionCostObserver>>(
base::ObserverListPolicy::EXISTING_ONLY)),
default_network_active_observer_list_(
- new base::ObserverListThreadSafe<DefaultNetworkActiveObserver>(
+ base::MakeRefCounted<
+ base::ObserverListThreadSafe<DefaultNetworkActiveObserver>>(
base::ObserverListPolicy::EXISTING_ONLY)) {}
ObserverList(const ObserverList&) = delete;
@@ -316,10 +315,10 @@ std::unique_ptr<NetworkChangeNotifier> NetworkChangeNotifier::CreateIfNeeded(
// service in a separate process.
return std::make_unique<NetworkChangeNotifierPosix>(initial_type,
initial_subtype);
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#elif BUILDFLAG(IS_CHROMEOS)
return std::make_unique<NetworkChangeNotifierPosix>(initial_type,
initial_subtype);
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#elif BUILDFLAG(IS_LINUX)
return std::make_unique<NetworkChangeNotifierLinux>(
std::unordered_set<std::string>());
#elif BUILDFLAG(IS_APPLE)
@@ -329,7 +328,7 @@ std::unique_ptr<NetworkChangeNotifier> NetworkChangeNotifier::CreateIfNeeded(
/*require_wlan=*/false);
#else
NOTIMPLEMENTED();
- return NULL;
+ return nullptr;
#endif
}
@@ -467,7 +466,8 @@ void NetworkChangeNotifier::GetConnectedNetworks(NetworkList* network_list) {
// static
NetworkChangeNotifier::ConnectionType
-NetworkChangeNotifier::GetNetworkConnectionType(NetworkHandle network) {
+NetworkChangeNotifier::GetNetworkConnectionType(
+ handles::NetworkHandle network) {
DCHECK(AreNetworkHandlesSupported());
return g_network_change_notifier
? g_network_change_notifier->GetCurrentNetworkConnectionType(
@@ -476,12 +476,11 @@ NetworkChangeNotifier::GetNetworkConnectionType(NetworkHandle network) {
}
// static
-NetworkChangeNotifier::NetworkHandle
-NetworkChangeNotifier::GetDefaultNetwork() {
+handles::NetworkHandle NetworkChangeNotifier::GetDefaultNetwork() {
DCHECK(AreNetworkHandlesSupported());
return g_network_change_notifier
? g_network_change_notifier->GetCurrentDefaultNetwork()
- : kInvalidNetworkHandle;
+ : handles::kInvalidNetworkHandle;
}
// static
@@ -522,8 +521,9 @@ const char* NetworkChangeNotifier::ConnectionTypeToString(
// static
const internal::AddressTrackerLinux*
NetworkChangeNotifier::GetAddressTracker() {
- return g_network_change_notifier ?
- g_network_change_notifier->GetAddressTrackerInternal() : NULL;
+ return g_network_change_notifier
+ ? g_network_change_notifier->GetAddressTrackerInternal()
+ : nullptr;
}
#endif
@@ -568,29 +568,29 @@ NetworkChangeNotifier::ConnectionTypeFromInterfaceList(
const NetworkInterfaceList& interfaces) {
bool first = true;
ConnectionType result = CONNECTION_NONE;
- for (size_t i = 0; i < interfaces.size(); ++i) {
+ for (const auto& network_interface : interfaces) {
#if BUILDFLAG(IS_WIN)
- if (interfaces[i].friendly_name == "Teredo Tunneling Pseudo-Interface")
+ if (network_interface.friendly_name == "Teredo Tunneling Pseudo-Interface")
continue;
#endif
#if BUILDFLAG(IS_APPLE)
// Ignore link-local addresses as they aren't globally routable.
// Mac assigns these to disconnected interfaces like tunnel interfaces
// ("utun"), airdrop interfaces ("awdl"), and ethernet ports ("en").
- if (interfaces[i].address.IsLinkLocal())
+ if (network_interface.address.IsLinkLocal())
continue;
#endif
// Remove VMware network interfaces as they're internal and should not be
// used to determine the network connection type.
- if (base::ToLowerASCII(interfaces[i].friendly_name).find("vmnet") !=
+ if (base::ToLowerASCII(network_interface.friendly_name).find("vmnet") !=
std::string::npos) {
continue;
}
if (first) {
first = false;
- result = interfaces[i].type;
- } else if (result != interfaces[i].type) {
+ result = network_interface.type;
+ } else if (result != network_interface.type) {
return CONNECTION_UNKNOWN;
}
}
@@ -865,7 +865,7 @@ NetworkChangeNotifier::NetworkChangeNotifier(
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
const internal::AddressTrackerLinux*
NetworkChangeNotifier::GetAddressTrackerInternal() const {
- return NULL;
+ return nullptr;
}
#endif
@@ -908,13 +908,12 @@ void NetworkChangeNotifier::GetCurrentConnectedNetworks(
NetworkChangeNotifier::ConnectionType
NetworkChangeNotifier::GetCurrentNetworkConnectionType(
- NetworkHandle network) const {
+ handles::NetworkHandle network) const {
return CONNECTION_UNKNOWN;
}
-NetworkChangeNotifier::NetworkHandle
-NetworkChangeNotifier::GetCurrentDefaultNetwork() const {
- return kInvalidNetworkHandle;
+handles::NetworkHandle NetworkChangeNotifier::GetCurrentDefaultNetwork() const {
+ return handles::kInvalidNetworkHandle;
}
SystemDnsConfigChangeNotifier*
@@ -975,7 +974,7 @@ void NetworkChangeNotifier::NotifyObserversOfDNSChange() {
// static
void NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChange(
NetworkChangeType type,
- NetworkHandle network) {
+ handles::NetworkHandle network) {
if (g_network_change_notifier &&
!NetworkChangeNotifier::test_notifications_only_) {
g_network_change_notifier->NotifyObserversOfSpecificNetworkChangeImpl(
@@ -1042,7 +1041,7 @@ void NetworkChangeNotifier::NotifyObserversOfMaxBandwidthChangeImpl(
void NetworkChangeNotifier::NotifyObserversOfSpecificNetworkChangeImpl(
NetworkChangeType type,
- NetworkHandle network) {
+ handles::NetworkHandle network) {
switch (type) {
case NetworkChangeType::kConnected:
GetObserverList().network_observer_list_->Notify(
diff --git a/chromium/net/base/network_change_notifier.h b/chromium/net/base/network_change_notifier.h
index 7f5ee34c99f..b04f7deb7ab 100644
--- a/chromium/net/base/network_change_notifier.h
+++ b/chromium/net/base/network_change_notifier.h
@@ -16,6 +16,7 @@
#include "base/time/time.h"
#include "build/build_config.h"
#include "net/base/net_export.h"
+#include "net/base/network_handle.h"
namespace net {
@@ -269,18 +270,8 @@ class NET_EXPORT NetworkChangeNotifier {
observer_list_;
};
- // Opaque handle for device-wide connection to a particular network. For
- // example an association with a particular WiFi network with a particular
- // SSID or a connection to particular cellular network.
- // The meaning of this handle is target-dependent. On Android NetworkHandles
- // are equivalent to:
- // On Lollipop, the framework's concept of NetIDs (e.g. Network.netId), and
- // On Marshmallow and newer releases, network handles
- // (e.g. Network.getNetworkHandle()).
- typedef int64_t NetworkHandle;
-
// A list of networks.
- typedef std::vector<NetworkHandle> NetworkList;
+ typedef std::vector<handles::NetworkHandle> NetworkList;
// An interface that when implemented and added via AddNetworkObserver(),
// provides notifications when networks come and go.
@@ -294,17 +285,17 @@ class NET_EXPORT NetworkChangeNotifier {
// Called when device connects to |network|. For example device associates
// with a WiFi access point. This does not imply the network has Internet
// access as it may well be behind a captive portal.
- virtual void OnNetworkConnected(NetworkHandle network) = 0;
+ virtual void OnNetworkConnected(handles::NetworkHandle network) = 0;
// Called when device disconnects from |network|.
- virtual void OnNetworkDisconnected(NetworkHandle network) = 0;
+ virtual void OnNetworkDisconnected(handles::NetworkHandle network) = 0;
// Called when device determines the connection to |network| is no longer
// preferred, for example when a device transitions from cellular to WiFi
// it might deem the cellular connection no longer preferred. The device
// will disconnect from |network| in a period of time (30s on Android),
// allowing network communications via |network| to wrap up.
- virtual void OnNetworkSoonToDisconnect(NetworkHandle network) = 0;
+ virtual void OnNetworkSoonToDisconnect(handles::NetworkHandle network) = 0;
// Called when |network| is made the default network for communication.
- virtual void OnNetworkMadeDefault(NetworkHandle network) = 0;
+ virtual void OnNetworkMadeDefault(handles::NetworkHandle network) = 0;
protected:
NetworkObserver();
@@ -339,9 +330,6 @@ class NET_EXPORT NetworkChangeNotifier {
observer_list_;
};
- // An invalid NetworkHandle.
- static const NetworkHandle kInvalidNetworkHandle;
-
NetworkChangeNotifier(const NetworkChangeNotifier&) = delete;
NetworkChangeNotifier& operator=(const NetworkChangeNotifier&) = delete;
virtual ~NetworkChangeNotifier();
@@ -362,8 +350,16 @@ class NET_EXPORT NetworkChangeNotifier {
// must do so before any other threads try to access the API below, and it
// must outlive all other threads which might try to use it.
static std::unique_ptr<NetworkChangeNotifier> CreateIfNeeded(
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ // TODO(crbug.com/1347382): Remove this section and align the behavior
+ // with other platforms or confirm that Lacros needs to be separated.
+ NetworkChangeNotifier::ConnectionType initial_type = CONNECTION_UNKNOWN,
+ NetworkChangeNotifier::ConnectionSubtype initial_subtype =
+ SUBTYPE_UNKNOWN);
+#else
NetworkChangeNotifier::ConnectionType initial_type = CONNECTION_NONE,
NetworkChangeNotifier::ConnectionSubtype initial_subtype = SUBTYPE_NONE);
+#endif
// Returns the most likely cost attribute for the default network connection.
// The value does not indicate with absolute certainty if using the connection
@@ -409,15 +405,16 @@ class NET_EXPORT NetworkChangeNotifier {
static double GetMaxBandwidthMbpsForConnectionSubtype(
ConnectionSubtype subtype);
- // Returns true if the platform supports use of APIs based on NetworkHandles.
- // Public methods that use NetworkHandles are GetNetworkConnectionType(),
- // GetNetworkConnectionType(), GetDefaultNetwork(), AddNetworkObserver(),
- // RemoveNetworkObserver(), and all public NetworkObserver methods.
+ // Returns true if the platform supports use of APIs based on
+ // handles::NetworkHandles. Public methods that use handles::NetworkHandles
+ // are GetNetworkConnectionType(), GetNetworkConnectionType(),
+ // GetDefaultNetwork(), AddNetworkObserver(), RemoveNetworkObserver(), and all
+ // public NetworkObserver methods.
static bool AreNetworkHandlesSupported();
// Sets |network_list| to a list of all networks that are currently connected.
// Only implemented for Android (Lollipop and newer), leaves |network_list|
- // empty when unimplemented. Requires NetworkHandles support, see
+ // empty when unimplemented. Requires handles::NetworkHandles support, see
// AreNetworkHandlesSupported().
static void GetConnectedNetworks(NetworkList* network_list);
@@ -425,9 +422,10 @@ class NET_EXPORT NetworkChangeNotifier {
// slightly over time (e.g. CONNECTION_2G to CONNECTION_3G). If |network|
// is no longer connected, it will return CONNECTION_UNKNOWN.
// Only implemented for Android (Lollipop and newer), returns
- // CONNECTION_UNKNOWN when unimplemented. Requires NetworkHandles support,
- // see AreNetworkHandlesSupported().
- static ConnectionType GetNetworkConnectionType(NetworkHandle network);
+ // CONNECTION_UNKNOWN when unimplemented. Requires handles::NetworkHandles
+ // support, see AreNetworkHandlesSupported().
+ static ConnectionType GetNetworkConnectionType(
+ handles::NetworkHandle network);
// Returns the device's current default network connection. This is the
// network used for newly created socket communication for sockets that are
@@ -436,8 +434,8 @@ class NET_EXPORT NetworkChangeNotifier {
// there is no default connected network.
// Only implemented for Android (Lollipop and newer), returns
// |kInvalidNetworkHandle| when unimplemented.
- // Requires NetworkHandles support, see AreNetworkHandlesSupported().
- static NetworkHandle GetDefaultNetwork();
+ // Requires handles::NetworkHandles support, see AreNetworkHandlesSupported().
+ static handles::NetworkHandle GetDefaultNetwork();
// Get the underlying SystemDnsConfigChangeNotifier, or null if there is none.
// Only intended for code building HostResolverManagers. Other code intending
@@ -533,7 +531,7 @@ class NET_EXPORT NetworkChangeNotifier {
// Called to signify a non-system DNS config change.
static void TriggerNonSystemDnsChange();
- // Allow unit tests to trigger notifications.
+ // Allows unit tests to trigger notifications.
static void NotifyObserversOfIPAddressChangeForTests();
static void NotifyObserversOfConnectionTypeChangeForTests(
ConnectionType type);
@@ -546,13 +544,16 @@ class NET_EXPORT NetworkChangeNotifier {
ConnectionCost cost);
static void NotifyObserversOfDefaultNetworkActiveForTests();
- // Enable or disable notifications from the host. After setting to true, be
+ // Enables or disables notifications from the host. After setting to true, be
// sure to pump the RunLoop until idle to finish any preexisting
// notifications. To use this, it must must be called before a
// NetworkChangeNotifier is created.
static void SetTestNotificationsOnly(bool test_only);
- // Return a string equivalent to |type|.
+ // Returns true if `test_notifications_only_` is set to true.
+ static bool IsTestNotificationsOnly() { return test_notifications_only_; }
+
+ // Returns a string equivalent to |type|.
static const char* ConnectionTypeToString(ConnectionType type);
// Allows a second NetworkChangeNotifier to be created for unit testing, so
@@ -636,8 +637,8 @@ class NET_EXPORT NetworkChangeNotifier {
virtual bool AreNetworkHandlesCurrentlySupported() const;
virtual void GetCurrentConnectedNetworks(NetworkList* network_list) const;
virtual ConnectionType GetCurrentNetworkConnectionType(
- NetworkHandle network) const;
- virtual NetworkHandle GetCurrentDefaultNetwork() const;
+ handles::NetworkHandle network) const;
+ virtual handles::NetworkHandle GetCurrentDefaultNetwork() const;
virtual SystemDnsConfigChangeNotifier* GetCurrentSystemDnsConfigNotifier();
virtual bool IsDefaultNetworkActiveInternal();
@@ -651,8 +652,9 @@ class NET_EXPORT NetworkChangeNotifier {
static void NotifyObserversOfNetworkChange(ConnectionType type);
static void NotifyObserversOfMaxBandwidthChange(double max_bandwidth_mbps,
ConnectionType type);
- static void NotifyObserversOfSpecificNetworkChange(NetworkChangeType type,
- NetworkHandle network);
+ static void NotifyObserversOfSpecificNetworkChange(
+ NetworkChangeType type,
+ handles::NetworkHandle network);
static void NotifyObserversOfConnectionCostChange();
static void NotifyObserversOfDefaultNetworkActive();
@@ -700,8 +702,9 @@ class NET_EXPORT NetworkChangeNotifier {
void NotifyObserversOfNetworkChangeImpl(ConnectionType type);
void NotifyObserversOfMaxBandwidthChangeImpl(double max_bandwidth_mbps,
ConnectionType type);
- void NotifyObserversOfSpecificNetworkChangeImpl(NetworkChangeType type,
- NetworkHandle network);
+ void NotifyObserversOfSpecificNetworkChangeImpl(
+ NetworkChangeType type,
+ handles::NetworkHandle network);
void NotifyObserversOfConnectionCostChangeImpl(ConnectionCost cost);
void NotifyObserversOfDefaultNetworkActiveImpl();
diff --git a/chromium/net/base/network_change_notifier_factory.h b/chromium/net/base/network_change_notifier_factory.h
index 203e9972528..96bd6a2fbdc 100644
--- a/chromium/net/base/network_change_notifier_factory.h
+++ b/chromium/net/base/network_change_notifier_factory.h
@@ -16,8 +16,8 @@ class NetworkChangeNotifier;
// instance creation process of NetworkChangeNotifier.
class NET_EXPORT NetworkChangeNotifierFactory {
public:
- NetworkChangeNotifierFactory() {}
- virtual ~NetworkChangeNotifierFactory() {}
+ NetworkChangeNotifierFactory() = default;
+ virtual ~NetworkChangeNotifierFactory() = default;
virtual std::unique_ptr<NetworkChangeNotifier> CreateInstance() = 0;
};
diff --git a/chromium/net/base/network_change_notifier_fuchsia_unittest.cc b/chromium/net/base/network_change_notifier_fuchsia_unittest.cc
index 893bfa74836..da00416653c 100644
--- a/chromium/net/base/network_change_notifier_fuchsia_unittest.cc
+++ b/chromium/net/base/network_change_notifier_fuchsia_unittest.cc
@@ -350,7 +350,7 @@ class NetworkChangeNotifierFuchsiaTest : public testing::Test {
// Use a noop DNS notifier.
dns_config_notifier_ = std::make_unique<SystemDnsConfigChangeNotifier>(
nullptr /* task_runner */, nullptr /* dns_config_service */);
- notifier_.reset(new NetworkChangeNotifierFuchsia(
+ notifier_ = base::WrapUnique(new NetworkChangeNotifierFuchsia(
std::move(watcher_handle_), requires_wlan, dns_config_notifier_.get()));
type_observer_ = std::make_unique<FakeConnectionTypeObserver>();
diff --git a/chromium/net/base/network_change_notifier_mac.h b/chromium/net/base/network_change_notifier_mac.h
index 117f77195fc..dc69ac9af7a 100644
--- a/chromium/net/base/network_change_notifier_mac.h
+++ b/chromium/net/base/network_change_notifier_mac.h
@@ -11,6 +11,7 @@
#include "base/compiler_specific.h"
#include "base/mac/scoped_cftyperef.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/synchronization/condition_variable.h"
#include "base/synchronization/lock.h"
@@ -46,7 +47,7 @@ class NetworkChangeNotifierMac: public NetworkChangeNotifier {
void OnNetworkConfigChange(CFArrayRef changed_keys) override;
private:
- NetworkChangeNotifierMac* const net_config_watcher_;
+ const raw_ptr<NetworkChangeNotifierMac> net_config_watcher_;
};
private:
diff --git a/chromium/net/base/network_change_notifier_mac.mm b/chromium/net/base/network_change_notifier_mac.mm
index 20baff33fe9..ece759f667b 100644
--- a/chromium/net/base/network_change_notifier_mac.mm
+++ b/chromium/net/base/network_change_notifier_mac.mm
@@ -239,11 +239,11 @@ void NetworkChangeNotifierMac::StartReachabilityNotifications() {
DCHECK(reachability_);
SCNetworkReachabilityContext reachability_context = {
- 0, // version
- this, // user data
- NULL, // retain
- NULL, // release
- NULL // description
+ 0, // version
+ this, // user data
+ nullptr, // retain
+ nullptr, // release
+ nullptr // description
};
if (!SCNetworkReachabilitySetCallback(
reachability_, &NetworkChangeNotifierMac::ReachabilityCallback,
@@ -267,18 +267,18 @@ void NetworkChangeNotifierMac::SetDynamicStoreNotificationKeys(
CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
base::ScopedCFTypeRef<CFStringRef> key(
SCDynamicStoreKeyCreateNetworkGlobalEntity(
- NULL, kSCDynamicStoreDomainState, kSCEntNetInterface));
+ nullptr, kSCDynamicStoreDomainState, kSCEntNetInterface));
CFArrayAppendValue(notification_keys.get(), key.get());
key.reset(SCDynamicStoreKeyCreateNetworkGlobalEntity(
- NULL, kSCDynamicStoreDomainState, kSCEntNetIPv4));
+ nullptr, kSCDynamicStoreDomainState, kSCEntNetIPv4));
CFArrayAppendValue(notification_keys.get(), key.get());
key.reset(SCDynamicStoreKeyCreateNetworkGlobalEntity(
- NULL, kSCDynamicStoreDomainState, kSCEntNetIPv6));
+ nullptr, kSCDynamicStoreDomainState, kSCEntNetIPv6));
CFArrayAppendValue(notification_keys.get(), key.get());
// Set the notification keys. This starts us receiving notifications.
- bool ret =
- SCDynamicStoreSetNotificationKeys(store, notification_keys.get(), NULL);
+ bool ret = SCDynamicStoreSetNotificationKeys(store, notification_keys.get(),
+ nullptr);
// TODO(willchan): Figure out a proper way to handle this rather than crash.
CHECK(ret);
#endif // BUILDFLAG(IS_IOS)
diff --git a/chromium/net/base/network_change_notifier_posix.cc b/chromium/net/base/network_change_notifier_posix.cc
index 7718c570ca8..6bc215cf893 100644
--- a/chromium/net/base/network_change_notifier_posix.cc
+++ b/chromium/net/base/network_change_notifier_posix.cc
@@ -92,7 +92,7 @@ void NetworkChangeNotifierPosix::GetCurrentMaxBandwidthAndConnectionType(
NetworkChangeNotifier::NetworkChangeCalculatorParams
NetworkChangeNotifierPosix::NetworkChangeCalculatorParamsPosix() {
NetworkChangeCalculatorParams params;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
// Delay values arrived at by simple experimentation and adjusted so as to
// produce a single signal when switching between network connections.
params.ip_address_offline_delay_ = base::Milliseconds(4000);
diff --git a/chromium/net/base/network_change_notifier_posix_unittest.cc b/chromium/net/base/network_change_notifier_posix_unittest.cc
index 408985a8148..2649ecf64fc 100644
--- a/chromium/net/base/network_change_notifier_posix_unittest.cc
+++ b/chromium/net/base/network_change_notifier_posix_unittest.cc
@@ -27,7 +27,7 @@ class NetworkChangeNotifierPosixTest : public testing::Test {
// hold a TaskRunner handle to |task_environment_| and crash if any
// subsequent tests use it.
dns_config_notifier_ = std::make_unique<SystemDnsConfigChangeNotifier>();
- notifier_.reset(new NetworkChangeNotifierPosix(
+ notifier_ = base::WrapUnique(new NetworkChangeNotifierPosix(
NetworkChangeNotifier::CONNECTION_UNKNOWN,
NetworkChangeNotifier::SUBTYPE_UNKNOWN, dns_config_notifier_.get()));
auto dns_config_service = std::make_unique<TestDnsConfigService>();
@@ -131,13 +131,13 @@ TEST_F(NetworkChangeNotifierPosixTest, OnDNSChanged) {
FastForwardUntilIdle();
EXPECT_EQ(1, observer.dns_changes());
- config.nameservers.push_back(IPEndPoint(IPAddress(2, 3, 4, 5), 234));
+ config.nameservers.emplace_back(IPAddress(2, 3, 4, 5), 234);
dns_config_service()->SetConfigForRefresh(config);
notifier()->OnDNSChanged();
FastForwardUntilIdle();
EXPECT_EQ(2, observer.dns_changes());
- config.nameservers.push_back(IPEndPoint(IPAddress(3, 4, 5, 6), 235));
+ config.nameservers.emplace_back(IPAddress(3, 4, 5, 6), 235);
dns_config_service()->SetConfigForRefresh(config);
notifier()->OnDNSChanged();
FastForwardUntilIdle();
diff --git a/chromium/net/base/network_change_notifier_win.cc b/chromium/net/base/network_change_notifier_win.cc
index d84e6e1d79f..2a1563eeaca 100644
--- a/chromium/net/base/network_change_notifier_win.cc
+++ b/chromium/net/base/network_change_notifier_win.cc
@@ -70,7 +70,7 @@ class NetworkCostManagerEventSink
NetworkCostManagerEventSink(INetworkCostManager* cost_manager,
const CostChangedCallback& callback)
: network_cost_manager_(cost_manager), cost_changed_callback_(callback) {}
- ~NetworkCostManagerEventSink() override {}
+ ~NetworkCostManagerEventSink() override = default;
// INetworkCostManagerEvents members
IFACEMETHODIMP CostChanged(_In_ DWORD cost,
diff --git a/chromium/net/base/network_config_watcher_mac.cc b/chromium/net/base/network_config_watcher_mac.cc
index fbaf0eda3ef..efa7481dd5f 100644
--- a/chromium/net/base/network_config_watcher_mac.cc
+++ b/chromium/net/base/network_config_watcher_mac.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/compiler_specific.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_pump_type.h"
#include "base/metrics/histogram_macros.h"
@@ -140,7 +141,7 @@ class NetworkConfigWatcherMacThread : public base::Thread {
bool InitNotificationsHelper();
base::ScopedCFTypeRef<CFRunLoopSourceRef> run_loop_source_;
- NetworkConfigWatcherMac::Delegate* const delegate_;
+ const raw_ptr<NetworkConfigWatcherMac::Delegate> delegate_;
#if !BUILDFLAG(IS_IOS)
int num_retry_ = 0;
#endif // !BUILDFLAG(IS_IOS)
@@ -217,14 +218,14 @@ bool NetworkConfigWatcherMacThread::InitNotificationsHelper() {
// SCDynamicStore API does not exist on iOS.
// Add a run loop source for a dynamic store to the current run loop.
SCDynamicStoreContext context = {
- 0, // Version 0.
- delegate_, // User data.
- NULL, // This is not reference counted. No retain function.
- NULL, // This is not reference counted. No release function.
- NULL, // No description for this.
+ 0, // Version 0.
+ delegate_, // User data.
+ nullptr, // This is not reference counted. No retain function.
+ nullptr, // This is not reference counted. No release function.
+ nullptr, // No description for this.
};
base::ScopedCFTypeRef<SCDynamicStoreRef> store(SCDynamicStoreCreate(
- NULL, CFSTR("org.chromium"), DynamicStoreCallback, &context));
+ nullptr, CFSTR("org.chromium"), DynamicStoreCallback, &context));
if (!store) {
int error = SCError();
LOG(ERROR) << "SCDynamicStoreCreate failed with Error: " << error << " - "
@@ -234,8 +235,8 @@ bool NetworkConfigWatcherMacThread::InitNotificationsHelper() {
ConvertToSCStatusCode(error), SCStatusCode::SC_COUNT);
return false;
}
- run_loop_source_.reset(SCDynamicStoreCreateRunLoopSource(
- NULL, store.get(), 0));
+ run_loop_source_.reset(
+ SCDynamicStoreCreateRunLoopSource(nullptr, store.get(), 0));
if (!run_loop_source_) {
int error = SCError();
LOG(ERROR) << "SCDynamicStoreCreateRunLoopSource failed with Error: "
@@ -258,7 +259,8 @@ bool NetworkConfigWatcherMacThread::InitNotificationsHelper() {
}
NetworkConfigWatcherMac::NetworkConfigWatcherMac(Delegate* delegate)
- : notifier_thread_(new NetworkConfigWatcherMacThread(delegate)) {
+ : notifier_thread_(
+ std::make_unique<NetworkConfigWatcherMacThread>(delegate)) {
// We create this notifier thread because the notification implementation
// needs a thread with a CFRunLoop, and there's no guarantee that
// CurrentThread::Get() meets that criterion.
@@ -266,6 +268,6 @@ NetworkConfigWatcherMac::NetworkConfigWatcherMac(Delegate* delegate)
notifier_thread_->StartWithOptions(std::move(thread_options));
}
-NetworkConfigWatcherMac::~NetworkConfigWatcherMac() {}
+NetworkConfigWatcherMac::~NetworkConfigWatcherMac() = default;
} // namespace net
diff --git a/chromium/net/base/network_delegate.cc b/chromium/net/base/network_delegate.cc
index cac13fadfc7..6a5a4e253dc 100644
--- a/chromium/net/base/network_delegate.cc
+++ b/chromium/net/base/network_delegate.cc
@@ -104,11 +104,10 @@ void NetworkDelegate::NotifyPACScriptError(int line_number,
bool NetworkDelegate::AnnotateAndMoveUserBlockedCookies(
const URLRequest& request,
net::CookieAccessResultList& maybe_included_cookies,
- net::CookieAccessResultList& excluded_cookies,
- bool allowed_from_caller) {
+ net::CookieAccessResultList& excluded_cookies) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
bool allowed = OnAnnotateAndMoveUserBlockedCookies(
- request, maybe_included_cookies, excluded_cookies, allowed_from_caller);
+ request, maybe_included_cookies, excluded_cookies);
cookie_util::DCheckIncludedAndExcludedCookieLists(maybe_included_cookies,
excluded_cookies);
return allowed;
@@ -116,11 +115,10 @@ bool NetworkDelegate::AnnotateAndMoveUserBlockedCookies(
bool NetworkDelegate::CanSetCookie(const URLRequest& request,
const CanonicalCookie& cookie,
- CookieOptions* options,
- bool allowed_from_caller) {
+ CookieOptions* options) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!(request.load_flags() & LOAD_DO_NOT_SAVE_COOKIES));
- return OnCanSetCookie(request, cookie, options, allowed_from_caller);
+ return OnCanSetCookie(request, cookie, options);
}
NetworkDelegate::PrivacySetting NetworkDelegate::ForcePrivacyMode(
diff --git a/chromium/net/base/network_delegate.h b/chromium/net/base/network_delegate.h
index b9919cd841d..3297b067cfd 100644
--- a/chromium/net/base/network_delegate.h
+++ b/chromium/net/base/network_delegate.h
@@ -79,12 +79,10 @@ class NET_EXPORT NetworkDelegate {
bool AnnotateAndMoveUserBlockedCookies(
const URLRequest& request,
CookieAccessResultList& maybe_included_cookies,
- CookieAccessResultList& excluded_cookies,
- bool allowed_from_caller);
+ CookieAccessResultList& excluded_cookies);
bool CanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie,
- CookieOptions* options,
- bool allowed_from_caller);
+ CookieOptions* options);
// PrivacySetting is kStateDisallowed iff the given |url| has to be
// requested over connection that is not tracked by the server.
@@ -249,19 +247,14 @@ class NET_EXPORT NetworkDelegate {
virtual bool OnAnnotateAndMoveUserBlockedCookies(
const URLRequest& request,
net::CookieAccessResultList& maybe_included_cookies,
- net::CookieAccessResultList& excluded_cookies,
- bool allowed_from_caller) = 0;
+ net::CookieAccessResultList& excluded_cookies) = 0;
// Called when a cookie is set to allow the network delegate to block access
// to the cookie. This method will never be invoked when
// LOAD_DO_NOT_SAVE_COOKIES is specified.
- // The |allowed_from_caller| param is used to pass whether this operation is
- // allowed from any higher level delegates (for example, in a
- // LayeredNetworkDelegate). Any custom logic should be ANDed with this bool.
virtual bool OnCanSetCookie(const URLRequest& request,
const CanonicalCookie& cookie,
- CookieOptions* options,
- bool allowed_from_caller) = 0;
+ CookieOptions* options) = 0;
virtual PrivacySetting OnForcePrivacyMode(
const GURL& url,
diff --git a/chromium/net/base/network_delegate_impl.cc b/chromium/net/base/network_delegate_impl.cc
index a47dbb0f018..e460c9d7fa7 100644
--- a/chromium/net/base/network_delegate_impl.cc
+++ b/chromium/net/base/network_delegate_impl.cc
@@ -51,19 +51,14 @@ void NetworkDelegateImpl::OnPACScriptError(int line_number,
bool NetworkDelegateImpl::OnAnnotateAndMoveUserBlockedCookies(
const URLRequest& request,
net::CookieAccessResultList& maybe_included_cookies,
- net::CookieAccessResultList& excluded_cookies,
- bool allowed_from_caller) {
- if (!allowed_from_caller)
- ExcludeAllCookies(CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
- maybe_included_cookies, excluded_cookies);
- return allowed_from_caller;
+ net::CookieAccessResultList& excluded_cookies) {
+ return true;
}
bool NetworkDelegateImpl::OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie,
- CookieOptions* options,
- bool allowed_from_caller) {
- return allowed_from_caller;
+ CookieOptions* options) {
+ return true;
}
NetworkDelegate::PrivacySetting NetworkDelegateImpl::OnForcePrivacyMode(
diff --git a/chromium/net/base/network_delegate_impl.h b/chromium/net/base/network_delegate_impl.h
index b4dacd82c5a..7a796545e16 100644
--- a/chromium/net/base/network_delegate_impl.h
+++ b/chromium/net/base/network_delegate_impl.h
@@ -69,13 +69,11 @@ class NET_EXPORT NetworkDelegateImpl : public NetworkDelegate {
bool OnAnnotateAndMoveUserBlockedCookies(
const URLRequest& request,
net::CookieAccessResultList& maybe_included_cookies,
- net::CookieAccessResultList& excluded_cookies,
- bool allowed_from_caller) override;
+ net::CookieAccessResultList& excluded_cookies) override;
bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie,
- CookieOptions* options,
- bool allowed_from_caller) override;
+ CookieOptions* options) override;
NetworkDelegate::PrivacySetting OnForcePrivacyMode(
const GURL& url,
diff --git a/chromium/net/base/network_handle.h b/chromium/net/base/network_handle.h
new file mode 100644
index 00000000000..40a6364eb59
--- /dev/null
+++ b/chromium/net/base/network_handle.h
@@ -0,0 +1,27 @@
+// Copyright (c) 2022 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.
+
+#ifndef NET_BASE_NETWORK_HANDLE_H_
+#define NET_BASE_NETWORK_HANDLE_H_
+
+#include <stdint.h>
+
+namespace net::handles {
+
+// Opaque handle for device-wide connection to a particular network. For
+// example an association with a particular WiFi network with a particular
+// SSID or a connection to particular cellular network.
+// The meaning of this handle is target-dependent. On Android
+// handles::NetworkHandles are equivalent to:
+// On Lollipop, the framework's concept of NetIDs (e.g. Network.netId), and
+// On Marshmallow and newer releases, network handles
+// (e.g. Network.getNetworkHandle()).
+typedef int64_t NetworkHandle;
+
+// An invalid NetworkHandle.
+inline constexpr NetworkHandle kInvalidNetworkHandle{-1};
+
+} // namespace net::handles
+
+#endif // NET_BASE_NETWORK_HANDLE_H_
diff --git a/chromium/net/base/network_interfaces_getifaddrs.cc b/chromium/net/base/network_interfaces_getifaddrs.cc
index c2bc5f111cc..e4260e4cd57 100644
--- a/chromium/net/base/network_interfaces_getifaddrs.cc
+++ b/chromium/net/base/network_interfaces_getifaddrs.cc
@@ -138,7 +138,7 @@ bool IfaddrsToNetworkInterfaceList(int policy,
IPAttributesGetter* ip_attributes_getter,
NetworkInterfaceList* networks) {
// Enumerate the addresses assigned to network interfaces which are up.
- for (const ifaddrs* interface = interfaces; interface != NULL;
+ for (const ifaddrs* interface = interfaces; interface != nullptr;
interface = interface->ifa_next) {
// Skip loopback interfaces, and ones which are down.
if (!(IFF_RUNNING & interface->ifa_flags))
@@ -235,7 +235,7 @@ bool GetNetworkListUsingGetifaddrs(NetworkInterfaceList* networks,
bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
constexpr bool use_alternative_getifaddrs = false;
#endif
- if (networks == NULL)
+ if (networks == nullptr)
return false;
// getifaddrs() may require IO operations.
diff --git a/chromium/net/base/network_interfaces_getifaddrs.h b/chromium/net/base/network_interfaces_getifaddrs.h
index 75f869b6a5a..668dc2503da 100644
--- a/chromium/net/base/network_interfaces_getifaddrs.h
+++ b/chromium/net/base/network_interfaces_getifaddrs.h
@@ -19,8 +19,7 @@
struct ifaddrs;
-namespace net {
-namespace internal {
+namespace net::internal {
class NET_EXPORT_PRIVATE IPAttributesGetter {
public:
@@ -60,7 +59,6 @@ bool GetNetworkListUsingGetifaddrs(NetworkInterfaceList* networks,
bool use_alternative_getifaddrs);
#endif
-} // namespace internal
-} // namespace net
+} // namespace net::internal
#endif // NET_BASE_NETWORK_INTERFACES_GETIFADDRS_H_
diff --git a/chromium/net/base/network_interfaces_getifaddrs_android.cc b/chromium/net/base/network_interfaces_getifaddrs_android.cc
index edf271736bd..983865c003a 100644
--- a/chromium/net/base/network_interfaces_getifaddrs_android.cc
+++ b/chromium/net/base/network_interfaces_getifaddrs_android.cc
@@ -26,8 +26,7 @@
#include "base/scoped_generic.h"
-namespace net {
-namespace internal {
+namespace net::internal {
namespace {
@@ -238,7 +237,6 @@ void Freeifaddrs(struct ifaddrs* addrs) {
}
}
-} // namespace internal
-} // namespace net
+} // namespace net::internal
#endif // BUILDFLAG(IS_ANDROID)
diff --git a/chromium/net/base/network_interfaces_getifaddrs_android.h b/chromium/net/base/network_interfaces_getifaddrs_android.h
index c803afc4869..022f2aae1e7 100644
--- a/chromium/net/base/network_interfaces_getifaddrs_android.h
+++ b/chromium/net/base/network_interfaces_getifaddrs_android.h
@@ -11,8 +11,7 @@
#include <ifaddrs.h>
-namespace net {
-namespace internal {
+namespace net::internal {
// Implementation of getifaddrs for Android.
// Fills out a list of ifaddr structs (see below) which contain information
@@ -24,8 +23,7 @@ namespace internal {
int Getifaddrs(struct ifaddrs** result);
void Freeifaddrs(struct ifaddrs* addrs);
-} // namespace internal
-} // namespace net
+} // namespace net::internal
#endif // BUILDFLAG(IS_ANDROID)
diff --git a/chromium/net/base/network_interfaces_getifaddrs_unittest.cc b/chromium/net/base/network_interfaces_getifaddrs_unittest.cc
index 2721c9df6e5..fd31375a767 100644
--- a/chromium/net/base/network_interfaces_getifaddrs_unittest.cc
+++ b/chromium/net/base/network_interfaces_getifaddrs_unittest.cc
@@ -19,7 +19,7 @@ namespace {
class IPAttributesGetterTest : public internal::IPAttributesGetter {
public:
- IPAttributesGetterTest() {}
+ IPAttributesGetterTest() = default;
// internal::IPAttributesGetter interface.
bool IsInitialized() const override { return true; }
diff --git a/chromium/net/base/network_interfaces_linux.cc b/chromium/net/base/network_interfaces_linux.cc
index b7b2a03bdd7..aa28e7a6bb2 100644
--- a/chromium/net/base/network_interfaces_linux.cc
+++ b/chromium/net/base/network_interfaces_linux.cc
@@ -128,16 +128,16 @@ bool GetNetworkListImpl(
GetInterfaceNameFunction get_interface_name) {
std::map<int, std::string> ifnames;
- for (auto it = address_map.begin(); it != address_map.end(); ++it) {
+ for (const auto& it : address_map) {
// Ignore addresses whose links are not online.
- if (online_links.find(it->second.ifa_index) == online_links.end())
+ if (online_links.find(it.second.ifa_index) == online_links.end())
continue;
sockaddr_storage sock_addr;
socklen_t sock_len = sizeof(sockaddr_storage);
// Convert to sockaddr for next check.
- if (!IPEndPoint(it->first, 0)
+ if (!IPEndPoint(it.first, 0)
.ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addr), &sock_len)) {
continue;
}
@@ -148,25 +148,25 @@ bool GetNetworkListImpl(
int ip_attributes = IP_ADDRESS_ATTRIBUTE_NONE;
- if (it->second.ifa_family == AF_INET6) {
+ if (it.second.ifa_family == AF_INET6) {
// Ignore addresses whose attributes are not actionable by
// the application layer.
- if (!TryConvertNativeToNetIPAttributes(it->second.ifa_flags,
+ if (!TryConvertNativeToNetIPAttributes(it.second.ifa_flags,
&ip_attributes))
continue;
}
// Find the name of this link.
std::map<int, std::string>::const_iterator itname =
- ifnames.find(it->second.ifa_index);
+ ifnames.find(it.second.ifa_index);
std::string ifname;
if (itname == ifnames.end()) {
char buffer[IFNAMSIZ] = {0};
- ifname.assign(get_interface_name(it->second.ifa_index, buffer));
+ ifname.assign(get_interface_name(it.second.ifa_index, buffer));
// Ignore addresses whose interface name can't be retrieved.
if (ifname.empty())
continue;
- ifnames[it->second.ifa_index] = ifname;
+ ifnames[it.second.ifa_index] = ifname;
} else {
ifname = itname->second;
}
@@ -180,8 +180,8 @@ bool GetNetworkListImpl(
GetInterfaceConnectionType(ifname);
networks->push_back(
- NetworkInterface(ifname, ifname, it->second.ifa_index, type, it->first,
- it->second.ifa_prefixlen, ip_attributes));
+ NetworkInterface(ifname, ifname, it.second.ifa_index, type, it.first,
+ it.second.ifa_prefixlen, ip_attributes));
}
return true;
@@ -214,7 +214,7 @@ base::ScopedFD GetSocketForIoctl() {
} // namespace internal
bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
- if (networks == NULL)
+ if (networks == nullptr)
return false;
#if BUILDFLAG(IS_ANDROID)
diff --git a/chromium/net/base/network_interfaces_linux.h b/chromium/net/base/network_interfaces_linux.h
index 45ad11e9846..abb9d383fb3 100644
--- a/chromium/net/base/network_interfaces_linux.h
+++ b/chromium/net/base/network_interfaces_linux.h
@@ -16,8 +16,7 @@
#include "net/base/net_export.h"
#include "net/base/network_interfaces.h"
-namespace net {
-namespace internal {
+namespace net::internal {
typedef char* (*GetInterfaceNameFunction)(int interface_index, char* ifname);
@@ -42,7 +41,6 @@ NET_EXPORT std::string GetWifiSSIDFromInterfaceListInternal(
// Returns a socket useful for performing ioctl()s.
base::ScopedFD GetSocketForIoctl();
-} // namespace internal
-} // namespace net
+} // namespace net::internal
#endif // NET_BASE_NETWORK_INTERFACES_LINUX_H_
diff --git a/chromium/net/base/network_interfaces_posix.h b/chromium/net/base/network_interfaces_posix.h
index 9a2bc400199..a3074f7ee8b 100644
--- a/chromium/net/base/network_interfaces_posix.h
+++ b/chromium/net/base/network_interfaces_posix.h
@@ -12,13 +12,11 @@
struct sockaddr;
-namespace net {
-namespace internal {
+namespace net::internal {
bool ShouldIgnoreInterface(const std::string& name, int policy);
bool IsLoopbackOrUnspecifiedAddress(const sockaddr* addr);
-} // namespace internal
-} // namespace net
+} // namespace net::internal
#endif // NET_BASE_NETWORK_INTERFACES_POSIX_H_
diff --git a/chromium/net/base/network_interfaces_win.cc b/chromium/net/base/network_interfaces_win.cc
index badc56561e3..68f4458599d 100644
--- a/chromium/net/base/network_interfaces_win.cc
+++ b/chromium/net/base/network_interfaces_win.cc
@@ -230,7 +230,7 @@ bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
for (int tries = 1; result == ERROR_BUFFER_OVERFLOW &&
tries < MAX_GETADAPTERSADDRESSES_TRIES;
++tries) {
- buf.reset(new char[len]);
+ buf = std::make_unique<char[]>(len);
adapters = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(buf.get());
result = GetAdaptersAddresses(AF_UNSPEC, flags, nullptr, adapters, &len);
}
@@ -326,7 +326,7 @@ class WifiOptionSetter : public ScopedWifiOptions {
};
std::unique_ptr<ScopedWifiOptions> SetWifiOptions(int options) {
- return std::unique_ptr<ScopedWifiOptions>(new WifiOptionSetter(options));
+ return std::make_unique<WifiOptionSetter>(options);
}
std::string GetWifiSSID() {
diff --git a/chromium/net/base/network_interfaces_win.h b/chromium/net/base/network_interfaces_win.h
index 54386d3fc1d..c2619d74455 100644
--- a/chromium/net/base/network_interfaces_win.h
+++ b/chromium/net/base/network_interfaces_win.h
@@ -16,8 +16,7 @@
#include "net/base/net_export.h"
#include "net/base/network_interfaces.h"
-namespace net {
-namespace internal {
+namespace net::internal {
struct NET_EXPORT WlanApi {
typedef DWORD (WINAPI *WlanOpenHandleFunc)(
@@ -85,8 +84,6 @@ NET_EXPORT bool GetNetworkListImpl(
int policy,
const IP_ADAPTER_ADDRESSES* ip_adapter_addresses);
-} // namespace internal
-
-} // namespace net
+} // namespace net::internal
#endif // NET_BASE_NETWORK_INTERFACES_WIN_H_
diff --git a/chromium/net/base/network_isolation_key.cc b/chromium/net/base/network_isolation_key.cc
index 4ee3e9e05a5..9c68715db79 100644
--- a/chromium/net/base/network_isolation_key.cc
+++ b/chromium/net/base/network_isolation_key.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <cstddef>
#include <string>
#include "base/unguessable_token.h"
@@ -9,6 +10,7 @@
#include "net/base/features.h"
#include "net/base/network_isolation_key.h"
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+#include "schemeful_site.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "url/gurl.h"
#include "url/origin.h"
@@ -35,11 +37,9 @@ NetworkIsolationKey::NetworkIsolationKey(SchemefulSite&& top_frame_site,
SchemefulSite&& frame_site,
const base::UnguessableToken* nonce)
: top_frame_site_(std::move(top_frame_site)),
- frame_site_(
- base::FeatureList::IsEnabled(
- net::features::kForceIsolationInfoFrameOriginToTopLevelFrame)
- ? top_frame_site_
- : std::move(frame_site)),
+ frame_site_(IsFrameSiteEnabled()
+ ? absl::make_optional(std::move(frame_site))
+ : absl::nullopt),
nonce_(nonce ? absl::make_optional(*nonce) : absl::nullopt) {
DCHECK(!nonce || !nonce->is_empty());
}
@@ -79,11 +79,14 @@ NetworkIsolationKey NetworkIsolationKey::CreateWithNewFrameSite(
return key;
}
-std::string NetworkIsolationKey::ToString() const {
+absl::optional<std::string> NetworkIsolationKey::ToCacheKeyString() const {
if (IsTransient())
- return "";
+ return absl::nullopt;
- return top_frame_site_->Serialize() + " " + frame_site_->Serialize();
+ std::string frame_site_str =
+ " " + (IsFrameSiteEnabled() ? frame_site_->Serialize()
+ : top_frame_site_->Serialize());
+ return top_frame_site_->Serialize() + frame_site_str;
}
std::string NetworkIsolationKey::ToDebugString() const {
@@ -100,7 +103,8 @@ std::string NetworkIsolationKey::ToDebugString() const {
}
bool NetworkIsolationKey::IsFullyPopulated() const {
- return top_frame_site_.has_value() && frame_site_.has_value();
+ return top_frame_site_.has_value() &&
+ (!IsFrameSiteEnabled() || frame_site_.has_value());
}
bool NetworkIsolationKey::IsTransient() const {
@@ -130,11 +134,18 @@ bool NetworkIsolationKey::ToValue(base::Value* out_value) const {
list.Append(std::move(top_frame_value).value());
absl::optional<std::string> frame_value =
- SerializeSiteWithNonce(*frame_site_);
- if (!frame_value)
+ IsFrameSiteEnabled() ? SerializeSiteWithNonce(*frame_site_)
+ : absl::nullopt;
+
+ if (frame_value.has_value()) {
+ // If there is a frame value, append it.
+ list.Append(std::move(frame_value).value());
+ } else if (IsFrameSiteEnabled()) {
+ // If there is supposed to be a frame value but there isn't return false.
return false;
- list.Append(std::move(frame_value).value());
+ }
+ // List will have size 1 when frame site is disabled.
*out_value = base::Value(std::move(list));
return true;
}
@@ -151,8 +162,22 @@ bool NetworkIsolationKey::FromValue(
return true;
}
- if (list.size() != 2 || !list[0].is_string() || !list[1].is_string())
- return false;
+ // When frame site is enabled list must be of size 2 and both values must be
+ // strings.
+
+ // When frame site is disabled for double key `list` can be either be of size
+ // 2 or of size 1. For backwards compatibility, frame site is allowed to be of
+ // size 2 when frame site is disabled because a previous expirement set frame
+ // site equal to a copy of top frame site rather than setting it empty.
+ if (IsFrameSiteEnabled()) {
+ if (list.size() != 2 || !list[0].is_string() || !list[1].is_string()) {
+ return false;
+ }
+ } else {
+ if (list.size() < 0 || list.size() > 2 || !list[0].is_string()) {
+ return false;
+ }
+ }
absl::optional<SchemefulSite> top_frame_site =
SchemefulSite::DeserializeWithNonce(list[0].GetString());
@@ -160,18 +185,20 @@ bool NetworkIsolationKey::FromValue(
if (!top_frame_site || top_frame_site->opaque())
return false;
+ if (list.size() == 1) {
+ // The value of the frame_site parameter doesn't matter because the
+ // constructor will default it to nullopt.
+ *network_isolation_key =
+ NetworkIsolationKey(std::move(*top_frame_site), net::SchemefulSite());
+ return true;
+ }
+
absl::optional<SchemefulSite> frame_site =
SchemefulSite::DeserializeWithNonce(list[1].GetString());
// Opaque origins are currently never serialized to disk, but they used to be.
if (!frame_site || frame_site->opaque())
return false;
- if (base::FeatureList::IsEnabled(
- net::features::kForceIsolationInfoFrameOriginToTopLevelFrame) &&
- frame_site != top_frame_site) {
- return false;
- }
-
*network_isolation_key =
NetworkIsolationKey(std::move(*top_frame_site), std::move(*frame_site));
return true;
@@ -187,9 +214,14 @@ bool NetworkIsolationKey::IsEmpty() const {
return !top_frame_site_.has_value() && !frame_site_.has_value();
}
+bool NetworkIsolationKey::IsFrameSiteEnabled() {
+ return !base::FeatureList::IsEnabled(
+ net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
+}
+
bool NetworkIsolationKey::IsOpaque() const {
- return top_frame_site_->opaque() || frame_site_->opaque() ||
- nonce_.has_value();
+ return top_frame_site_->opaque() ||
+ (IsFrameSiteEnabled() && frame_site_->opaque()) || nonce_.has_value();
}
absl::optional<std::string> NetworkIsolationKey::SerializeSiteWithNonce(
diff --git a/chromium/net/base/network_isolation_key.h b/chromium/net/base/network_isolation_key.h
index d0076edb96e..be4f992f2f7 100644
--- a/chromium/net/base/network_isolation_key.h
+++ b/chromium/net/base/network_isolation_key.h
@@ -94,9 +94,11 @@ class NET_EXPORT NetworkIsolationKey {
std::tie(other.top_frame_site_, other.frame_site_, other.nonce_);
}
- // Returns the string representation of the key, which is the string
- // representation of each piece of the key separated by spaces.
- std::string ToString() const;
+ // Returns the string representation of the key for use in string-keyed disk
+ // cache. This is the string representation of each piece of the key separated
+ // by spaces. Returns nullopt if the network isolation key is transient, in
+ // which case, nothing should typically be saved to disk using the key.
+ absl::optional<std::string> ToCacheKeyString() const;
// Returns string for debugging. Difference from ToString() is that transient
// entries may be distinguishable from each other.
@@ -126,6 +128,10 @@ class NET_EXPORT NetworkIsolationKey {
// Returns true if all parts of the key are empty.
bool IsEmpty() const;
+ // Returns true if the NetworkIsolationKey has a triple keyed scheme. This
+ // means both `frame_site_` and `top_frame_site_` are populated.
+ static bool IsFrameSiteEnabled();
+
// Returns a representation of |this| as a base::Value. Returns false on
// failure. Succeeds if either IsEmpty() or !IsTransient().
[[nodiscard]] bool ToValue(base::Value* out_value) const;
diff --git a/chromium/net/base/network_isolation_key_unittest.cc b/chromium/net/base/network_isolation_key_unittest.cc
index a2320dd22cd..9fbd0a39510 100644
--- a/chromium/net/base/network_isolation_key_unittest.cc
+++ b/chromium/net/base/network_isolation_key_unittest.cc
@@ -10,6 +10,7 @@
#include "net/base/features.h"
#include "net/base/schemeful_site.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "url/gurl.h"
#include "url/url_util.h"
@@ -43,10 +44,18 @@ INSTANTIATE_TEST_SUITE_P(
NetworkIsolationKeyTest,
/*force_isolation_info_frame_origin_to_top_level_frame*/ testing::Bool());
+TEST_P(NetworkIsolationKeyTest, IsFrameSiteEnabled) {
+ if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
+ EXPECT_FALSE(NetworkIsolationKey::IsFrameSiteEnabled());
+ } else {
+ EXPECT_TRUE(NetworkIsolationKey::IsFrameSiteEnabled());
+ }
+}
+
TEST_P(NetworkIsolationKeyTest, EmptyKey) {
NetworkIsolationKey key;
EXPECT_FALSE(key.IsFullyPopulated());
- EXPECT_EQ(std::string(), key.ToString());
+ EXPECT_EQ(absl::nullopt, key.ToCacheKeyString());
EXPECT_TRUE(key.IsTransient());
EXPECT_EQ("null null", key.ToDebugString());
}
@@ -57,11 +66,12 @@ TEST_P(NetworkIsolationKeyTest, NonEmptyKey) {
NetworkIsolationKey key(site1, site2);
EXPECT_TRUE(key.IsFullyPopulated());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(site1.Serialize() + " " + site1.Serialize(), key.ToString());
- EXPECT_EQ(site1.GetDebugString() + " " + site1.GetDebugString(),
- key.ToDebugString());
+ EXPECT_EQ(site1.Serialize() + " " + site1.Serialize(),
+ key.ToCacheKeyString());
+ EXPECT_EQ(site1.GetDebugString() + " null", key.ToDebugString());
} else {
- EXPECT_EQ(site1.Serialize() + " " + site2.Serialize(), key.ToString());
+ EXPECT_EQ(site1.Serialize() + " " + site2.Serialize(),
+ key.ToCacheKeyString());
EXPECT_EQ(site1.GetDebugString() + " " + site2.GetDebugString(),
key.ToDebugString());
}
@@ -74,11 +84,11 @@ TEST_P(NetworkIsolationKeyTest, KeyWithNonce) {
base::UnguessableToken nonce = base::UnguessableToken::Create();
NetworkIsolationKey key(site1, site2, &nonce);
EXPECT_TRUE(key.IsFullyPopulated());
- EXPECT_EQ("", key.ToString());
+ EXPECT_EQ(absl::nullopt, key.ToCacheKeyString());
EXPECT_TRUE(key.IsTransient());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(site1.GetDebugString() + " " + site1.GetDebugString() +
- " (with nonce " + nonce.ToString() + ")",
+ EXPECT_EQ(site1.GetDebugString() + " null" + " (with nonce " +
+ nonce.ToString() + ")",
key.ToDebugString());
} else {
EXPECT_EQ(site1.GetDebugString() + " " + site2.GetDebugString() +
@@ -103,7 +113,7 @@ TEST_P(NetworkIsolationKeyTest, OpaqueOriginKey) {
SchemefulSite site_data = SchemefulSite(GURL(kDataUrl));
NetworkIsolationKey key(site_data, site_data);
EXPECT_TRUE(key.IsFullyPopulated());
- EXPECT_EQ(std::string(), key.ToString());
+ EXPECT_EQ(absl::nullopt, key.ToCacheKeyString());
EXPECT_TRUE(key.IsTransient());
// Create another site with an opaque origin, and make sure it's different and
@@ -196,13 +206,12 @@ TEST_P(NetworkIsolationKeyTest, KeyWithOneOpaqueOrigin) {
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
EXPECT_FALSE(key1.IsTransient());
EXPECT_EQ(site.GetDebugString() + " " + site.GetDebugString(),
- key1.ToString());
+ key1.ToCacheKeyString());
- EXPECT_EQ(site.GetDebugString() + " " + site.GetDebugString(),
- key1.ToDebugString());
+ EXPECT_EQ(site.GetDebugString() + " null", key1.ToDebugString());
} else {
EXPECT_TRUE(key1.IsTransient());
- EXPECT_EQ("", key1.ToString());
+ EXPECT_EQ(absl::nullopt, key1.ToCacheKeyString());
EXPECT_EQ(site.GetDebugString() + " " + opaque_site.GetDebugString(),
key1.ToDebugString());
}
@@ -210,10 +219,9 @@ TEST_P(NetworkIsolationKeyTest, KeyWithOneOpaqueOrigin) {
NetworkIsolationKey key2(opaque_site, site);
EXPECT_TRUE(key2.IsFullyPopulated());
EXPECT_TRUE(key2.IsTransient());
- EXPECT_EQ("", key2.ToString());
+ EXPECT_EQ(absl::nullopt, key2.ToCacheKeyString());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(opaque_site.GetDebugString() + " " + opaque_site.GetDebugString(),
- key2.ToDebugString());
+ EXPECT_EQ(opaque_site.GetDebugString() + " null", key2.ToDebugString());
} else {
EXPECT_EQ(opaque_site.GetDebugString() + " " + site.GetDebugString(),
key2.ToDebugString());
@@ -305,10 +313,10 @@ TEST_P(NetworkIsolationKeyTest, WithFrameSite) {
EXPECT_TRUE(key.IsFullyPopulated());
EXPECT_FALSE(key.IsTransient());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ("http://b.test http://b.test", key.ToString());
- EXPECT_EQ("http://b.test http://b.test", key.ToDebugString());
+ EXPECT_EQ("http://b.test http://b.test", key.ToCacheKeyString());
+ EXPECT_EQ("http://b.test null", key.ToDebugString());
} else {
- EXPECT_EQ("http://b.test http://a.test", key.ToString());
+ EXPECT_EQ("http://b.test http://a.test", key.ToCacheKeyString());
EXPECT_EQ("http://b.test http://a.test", key.ToDebugString());
}
EXPECT_TRUE(key == key);
@@ -327,12 +335,12 @@ TEST_P(NetworkIsolationKeyTest, OpaqueSiteKey) {
EXPECT_FALSE(key1.IsTransient());
EXPECT_EQ(NetworkIsolationKey(site_a, site_data2), key1);
- EXPECT_EQ("http://a.test http://a.test", key1.ToString());
- EXPECT_EQ("http://a.test http://a.test", key1.ToDebugString());
+ EXPECT_EQ("http://a.test http://a.test", key1.ToCacheKeyString());
+ EXPECT_EQ("http://a.test null", key1.ToDebugString());
} else {
EXPECT_TRUE(key1.IsTransient());
- EXPECT_EQ("", key1.ToString());
+ EXPECT_EQ(absl::nullopt, key1.ToCacheKeyString());
EXPECT_EQ("http://a.test " + site_data.GetDebugString(),
key1.ToDebugString());
EXPECT_NE(NetworkIsolationKey(site_a, site_data2), key1);
@@ -341,10 +349,9 @@ TEST_P(NetworkIsolationKeyTest, OpaqueSiteKey) {
NetworkIsolationKey key2(site_data, site_a);
EXPECT_TRUE(key2.IsFullyPopulated());
EXPECT_TRUE(key2.IsTransient());
- EXPECT_EQ("", key2.ToString());
+ EXPECT_EQ(absl::nullopt, key2.ToCacheKeyString());
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(site_data.GetDebugString() + " " + site_data.GetDebugString(),
- key2.ToDebugString());
+ EXPECT_EQ(site_data.GetDebugString() + " null", key2.ToDebugString());
} else {
EXPECT_EQ(site_data.GetDebugString() + " http://a.test",
key2.ToDebugString());
@@ -385,9 +392,9 @@ TEST_P(NetworkIsolationKeyTest, OpaqueSiteKeyBoth) {
// Test the ToString and ToDebugString
EXPECT_EQ(key1.ToDebugString(), key2.ToDebugString());
- EXPECT_EQ("", key1.ToString());
- EXPECT_EQ("", key2.ToString());
- EXPECT_EQ("", key3.ToString());
+ EXPECT_EQ(absl::nullopt, key1.ToCacheKeyString());
+ EXPECT_EQ(absl::nullopt, key2.ToCacheKeyString());
+ EXPECT_EQ(absl::nullopt, key3.ToCacheKeyString());
}
// Make sure that the logic to extract the registerable domain from an origin
@@ -401,7 +408,7 @@ TEST_P(NetworkIsolationKeyTest, NonStandardScheme) {
SchemefulSite site = SchemefulSite(GURL("foo://a.foo.com"));
net::NetworkIsolationKey key(site, site);
EXPECT_FALSE(key.GetTopFrameSite()->opaque());
- EXPECT_EQ("foo://a.foo.com foo://a.foo.com", key.ToString());
+ EXPECT_EQ("foo://a.foo.com foo://a.foo.com", key.ToCacheKeyString());
}
TEST_P(NetworkIsolationKeyTest, CreateWithNewFrameSite) {
@@ -412,7 +419,7 @@ TEST_P(NetworkIsolationKeyTest, CreateWithNewFrameSite) {
net::NetworkIsolationKey key(site_a, site_b);
NetworkIsolationKey key_c = key.CreateWithNewFrameSite(site_c);
if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(site_a, key_c.GetFrameSite());
+ EXPECT_EQ(absl::nullopt, key_c.GetFrameSite());
} else {
EXPECT_EQ(site_c, key_c.GetFrameSite());
}
@@ -436,6 +443,69 @@ TEST_P(NetworkIsolationKeyTest, CreateTransient) {
}
}
+TEST(NetworkIsolationKeyFeatureShiftTest, ValueRoundTripDoubleToTriple) {
+ base::test::ScopedFeatureList scoped_feature_list_;
+ const SchemefulSite kJunkSite = SchemefulSite(GURL("data:text/html,junk"));
+
+ // Turn double keying off.
+ scoped_feature_list_.InitAndDisableFeature(
+ net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
+ // Create a triple key.
+ NetworkIsolationKey created_triple_key(
+ SchemefulSite(GURL("https://foo.test/")),
+ SchemefulSite(GURL("https://bar.test/")));
+
+ // Assert round trip of triple key succeeds and key is a correctly formed
+ // triple key.
+ base::Value created_triple_key_value;
+ ASSERT_TRUE(created_triple_key.ToValue(&created_triple_key_value));
+ // Fill initial value with junk data, to make sure it's overwritten.
+ NetworkIsolationKey created_triple_key2(kJunkSite, kJunkSite);
+ EXPECT_TRUE(NetworkIsolationKey::FromValue(created_triple_key_value,
+ &created_triple_key2));
+ EXPECT_EQ(created_triple_key, created_triple_key2);
+
+ // Serialize a triple key value with frame site enabled.
+ base::Value created_triple_key_value2;
+ ASSERT_TRUE(created_triple_key.ToValue(&created_triple_key_value2));
+
+ // Turn double keying on.
+ scoped_feature_list_.Reset();
+ scoped_feature_list_.InitAndEnableFeature(
+ net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
+
+ // Create a key and confirm the frame site is correctly set to nullopt rather
+ // than https://bar.test/.
+ NetworkIsolationKey created_double_key(
+ SchemefulSite(GURL("https://foo.test/")),
+ SchemefulSite(GURL("https://bar.test/")));
+ EXPECT_EQ(absl::nullopt, created_double_key.GetFrameSite());
+
+ // Assert the triple key still has the frame_site it was created with when
+ // frame site was enabled.
+ EXPECT_EQ(SchemefulSite(GURL("https://bar.test/")),
+ created_triple_key.GetFrameSite());
+
+ // Test round trip of key created when frame site was disabled.
+ base::Value created_double_key_value;
+ ASSERT_TRUE(created_double_key.ToValue(&created_double_key_value));
+ // Fill initial value with junk data, to make sure it's overwritten.
+ NetworkIsolationKey created_double_key2(kJunkSite, kJunkSite);
+ EXPECT_TRUE(NetworkIsolationKey::FromValue(created_double_key_value,
+ &created_double_key2));
+ EXPECT_EQ(created_double_key, created_double_key2);
+
+ // Test round trip of key created with frame site enabled is now formed
+ // correctly as a double key. This key was serialized to value when frame site
+ // was enabled and should be able to be created from value without error.
+ NetworkIsolationKey created_triple_key3(kJunkSite, kJunkSite);
+ EXPECT_TRUE(NetworkIsolationKey::FromValue(created_triple_key_value2,
+ &created_triple_key3));
+ // Triple key should be in a double key form with the frame site an empty
+ // optional.
+ EXPECT_EQ(created_double_key, created_triple_key3);
+}
+
} // namespace
} // namespace net
diff --git a/chromium/net/base/prioritized_dispatcher.h b/chromium/net/base/prioritized_dispatcher.h
index 9e286541b41..283c8bc72e3 100644
--- a/chromium/net/base/prioritized_dispatcher.h
+++ b/chromium/net/base/prioritized_dispatcher.h
@@ -56,7 +56,7 @@ class NET_EXPORT_PRIVATE PrioritizedDispatcher {
class Job {
public:
// Note: PrioritizedDispatcher will never delete a Job.
- virtual ~Job() {}
+ virtual ~Job() = default;
// Called when the dispatcher starts the job. Once the job finishes, it must
// call OnJobFinished.
virtual void Start() = 0;
diff --git a/chromium/net/base/prioritized_dispatcher_unittest.cc b/chromium/net/base/prioritized_dispatcher_unittest.cc
index 0f5ba3e0129..419be5da7f8 100644
--- a/chromium/net/base/prioritized_dispatcher_unittest.cc
+++ b/chromium/net/base/prioritized_dispatcher_unittest.cc
@@ -141,15 +141,15 @@ class PrioritizedDispatcherTest : public testing::Test {
}
std::unique_ptr<TestJob> AddJob(char data, Priority priority) {
- std::unique_ptr<TestJob> job(
- new TestJob(dispatcher_.get(), data, priority, &log_));
+ auto job =
+ std::make_unique<TestJob>(dispatcher_.get(), data, priority, &log_);
job->Add(false);
return job;
}
std::unique_ptr<TestJob> AddJobAtHead(char data, Priority priority) {
- std::unique_ptr<TestJob> job(
- new TestJob(dispatcher_.get(), data, priority, &log_));
+ auto job =
+ std::make_unique<TestJob>(dispatcher_.get(), data, priority, &log_);
job->Add(true);
return job;
}
diff --git a/chromium/net/base/prioritized_task_runner.cc b/chromium/net/base/prioritized_task_runner.cc
index 0993b75eabf..5c1e8aff4a5 100644
--- a/chromium/net/base/prioritized_task_runner.cc
+++ b/chromium/net/base/prioritized_task_runner.cc
@@ -24,7 +24,7 @@ PrioritizedTaskRunner::Job::Job(const base::Location& from_here,
priority(priority),
task_count(task_count) {}
-PrioritizedTaskRunner::Job::Job() {}
+PrioritizedTaskRunner::Job::Job() = default;
PrioritizedTaskRunner::Job::~Job() = default;
PrioritizedTaskRunner::Job::Job(Job&& other) = default;
diff --git a/chromium/net/base/proxy_server.h b/chromium/net/base/proxy_server.h
index 178607a52e4..9e4fe232b4d 100644
--- a/chromium/net/base/proxy_server.h
+++ b/chromium/net/base/proxy_server.h
@@ -40,7 +40,7 @@ class NET_EXPORT ProxyServer {
// Default copy-constructor and assignment operator are OK!
// Constructs an invalid ProxyServer.
- ProxyServer() {}
+ ProxyServer() = default;
ProxyServer(Scheme scheme, const HostPortPair& host_port_pair);
diff --git a/chromium/net/base/registry_controlled_domains/effective_tld_names.dat b/chromium/net/base/registry_controlled_domains/effective_tld_names.dat
index 6365ade39e9..cf52263a276 100644
--- a/chromium/net/base/registry_controlled_domains/effective_tld_names.dat
+++ b/chromium/net/base/registry_controlled_domains/effective_tld_names.dat
@@ -26,8 +26,7 @@ org.ac
ad
nom.ad
-// ae : https://en.wikipedia.org/wiki/.ae
-// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php
+// ae : https://tdra.gov.ae/en/aeda/ae-policies
ae
co.ae
net.ae
@@ -1320,7 +1319,9 @@ web.id
ie
gov.ie
-// il : http://www.isoc.org.il/domains/
+// il : http://www.isoc.org.il/domains/
+// see also: https://en.isoc.org.il/il-cctld/registration-rules
+// ISOC-IL (operated by .il Registry)
il
ac.il
co.il
@@ -1330,6 +1331,16 @@ k12.il
muni.il
net.il
org.il
+// xn--4dbrk0ce ("Israel", Hebrew) : IL
+ישראל
+// xn--4dbgdty6c.xn--4dbrk0ce.
+אקדמיה.ישראל
+// xn--5dbhl8d.xn--4dbrk0ce.
+ישוב.ישראל
+// xn--8dbq2a.xn--4dbrk0ce.
+צהל.ישראל
+// xn--hebda8b.xn--4dbrk0ce.
+ממשל.ישראל
// im : https://www.nic.im/
// Submitted by registry <info@nic.im>
@@ -1345,22 +1356,51 @@ tt.im
tv.im
// in : https://en.wikipedia.org/wiki/.in
-// see also: https://registry.in/Policies
+// see also: https://registry.in/policies
// Please note, that nic.in is not an official eTLD, but used by most
// government institutions.
in
+5g.in
+6g.in
+ac.in
+ai.in
+am.in
+bihar.in
+biz.in
+business.in
+ca.in
+cn.in
co.in
+com.in
+coop.in
+cs.in
+delhi.in
+dr.in
+edu.in
+er.in
firm.in
-net.in
-org.in
gen.in
+gov.in
+gujarat.in
ind.in
+info.in
+int.in
+internet.in
+io.in
+me.in
+mil.in
+net.in
nic.in
-ac.in
-edu.in
+org.in
+pg.in
+post.in
+pro.in
res.in
-gov.in
-mil.in
+travel.in
+tv.in
+uk.in
+up.in
+us.in
// info : https://en.wikipedia.org/wiki/.info
info
@@ -7135,7 +7175,7 @@ org.zw
// newGTLDs
-// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-03-22T15:14:59Z
+// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-07-28T15:14:54Z
// This list is auto-generated, don't edit it manually.
// aaa : 2015-02-26 American Automobile Association, Inc.
aaa
@@ -7476,7 +7516,7 @@ bio
// black : 2014-01-16 Afilias Limited
black
-// blackfriday : 2014-01-16 UNR Corp.
+// blackfriday : 2014-01-16 Registry Services, LLC
blackfriday
// blockbuster : 2015-07-30 Dish DBS Corporation
@@ -7692,7 +7732,7 @@ chanel
// channel : 2014-05-08 Charleston Road Registry Inc.
channel
-// charity : 2018-04-11 Binky Moon, LLC
+// charity : 2018-04-11 Public Interest Registry
charity
// chase : 2015-04-30 JPMorgan Chase Bank, National Association
@@ -7839,7 +7879,7 @@ coupon
// coupons : 2015-03-26 Binky Moon, LLC
coupons
-// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD
+// courses : 2014-12-04 Registry Services, LLC
courses
// cpa : 2019-06-10 American Institute of Certified Public Accountants
@@ -8025,7 +8065,7 @@ dvag
// dvr : 2016-05-26 DISH Technologies L.L.C.
dvr
-// earth : 2014-12-04 Interlink Co., Ltd.
+// earth : 2014-12-04 Interlink Systems Innovation Institute K.K.
earth
// eat : 2014-01-23 Charleston Road Registry Inc.
@@ -8232,7 +8272,7 @@ forsale
// forum : 2015-04-02 Fegistry, LLC
forum
-// foundation : 2013-12-05 Binky Moon, LLC
+// foundation : 2013-12-05 Public Interest Registry
foundation
// fox : 2015-09-11 FOX Registry, LLC
@@ -8313,7 +8353,7 @@ gdn
// gea : 2014-12-04 GEA Group Aktiengesellschaft
gea
-// gent : 2014-01-23 COMBELL NV
+// gent : 2014-01-23 Easyhost BV
gent
// genting : 2015-03-12 Resorts World Inc Pte. Ltd.
@@ -8331,7 +8371,7 @@ gift
// gifts : 2014-07-03 Binky Moon, LLC
gifts
-// gives : 2014-03-06 Dog Beach, LLC
+// gives : 2014-03-06 Public Interest Registry
gives
// giving : 2014-11-13 Giving Limited
@@ -8457,7 +8497,7 @@ health
// healthcare : 2014-06-12 Binky Moon, LLC
healthcare
-// help : 2014-06-26 UNR Corp.
+// help : 2014-06-26 Innovation service Limited
help
// helsinki : 2015-02-05 City of Helsinki
@@ -8472,7 +8512,7 @@ hermes
// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc.
hgtv
-// hiphop : 2014-03-06 Dot Hip Hop LLC
+// hiphop : 2014-03-06 Dot Hip Hop, LLC
hiphop
// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc.
@@ -8784,7 +8824,7 @@ lanxess
// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated
lasalle
-// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico
+// lat : 2014-10-16 XYZ.COM LLC
lat
// latino : 2015-07-30 Dish DBS Corporation
@@ -8856,7 +8896,7 @@ lincoln
// linde : 2014-12-04 Linde Aktiengesellschaft
linde
-// link : 2013-11-14 UNR Corp.
+// link : 2013-11-14 Nova Registry Ltd
link
// lipsy : 2015-06-25 Lipsy Ltd
@@ -8871,7 +8911,7 @@ living
// llc : 2017-12-14 Afilias Limited
llc
-// llp : 2019-08-26 UNR Corp.
+// llp : 2019-08-26 Intercap Registry Inc.
llp
// loan : 2014-11-20 dot Loan Limited
@@ -9039,7 +9079,7 @@ mobile
// moda : 2013-11-07 Dog Beach, LLC
moda
-// moe : 2013-11-13 Interlink Co., Ltd.
+// moe : 2013-11-13 Interlink Systems Innovation Institute K.K.
moe
// moi : 2014-12-18 Amazon Registry Services, Inc.
@@ -9312,7 +9352,7 @@ philips
// phone : 2016-06-02 Dish DBS Corporation
phone
-// photo : 2013-11-14 UNR Corp.
+// photo : 2013-11-14 Registry Services, LLC
photo
// photography : 2013-09-20 Binky Moon, LLC
@@ -9555,7 +9595,7 @@ rsvp
// rugby : 2016-12-15 World Rugby Strategic Developments Limited
rugby
-// ruhr : 2013-10-02 regiodot GmbH & Co. KG
+// ruhr : 2013-10-02 dotSaarland GmbH
ruhr
// run : 2015-03-19 Binky Moon, LLC
@@ -9846,7 +9886,7 @@ stream
// studio : 2015-02-11 Dog Beach, LLC
studio
-// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD
+// study : 2014-12-11 Registry Services, LLC
study
// style : 2014-12-04 Binky Moon, LLC
@@ -9906,7 +9946,7 @@ tatamotors
// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic"
tatar
-// tattoo : 2013-08-30 UNR Corp.
+// tattoo : 2013-08-30 Top Level Design, LLC
tattoo
// tax : 2014-03-20 Binky Moon, LLC
@@ -9999,7 +10039,7 @@ toray
// toshiba : 2014-04-10 TOSHIBA Corporation
toshiba
-// total : 2015-08-06 Total SA
+// total : 2015-08-06 TOTAL SE
total
// tours : 2015-01-22 Binky Moon, LLC
@@ -10637,6 +10677,12 @@ hlx3.page
// Submitted by Przemyslaw Plewa <it-admin@domena.pl>
beep.pl
+// Airkit : https://www.airkit.com/
+// Submitted by Grant Cooksey <security@airkit.com>
+airkitapps.com
+airkitapps-au.com
+airkitapps.eu
+
// Aiven: https://aiven.io/
// Submitted by Etienne Stalmans <security@aiven.io>
aivencloud.com
@@ -11667,6 +11713,11 @@ en-root.fr
mytuleap.com
tuleap-partners.com
+// Encoretivity AB: https://encore.dev
+// Submitted by André Eriksson <andre@encore.dev>
+encr.app
+encoreapi.com
+
// ECG Robotics, Inc: https://ecgrobotics.org
// Submitted by <frc1533@ecgrobotics.org>
onred.one
@@ -11928,7 +11979,7 @@ shw.io
// Submitted by Jonathan Rudenberg <jonathan@flynn.io>
flynnhosting.net
-// Forgerock : https://www.forgerock.com
+// Forgerock : https://www.forgerock.com
// Submitted by Roderick Parr <roderick.parr@forgerock.com>
forgeblocks.com
id.forgerock.io
@@ -12105,6 +12156,7 @@ kill.jp
kilo.jp
kuron.jp
littlestar.jp
+lolipopmc.jp
lolitapunk.jp
lomo.jp
lovepop.jp
@@ -12275,6 +12327,10 @@ blogspot.vn
// Submitted by Niels Martignene <hello@goupile.fr>
goupile.fr
+// Government of the Netherlands: https://www.government.nl
+// Submitted by <domeinnaam@minaz.nl>
+gov.nl
+
// Group 53, LLC : https://www.group53.com
// Submitted by Tyler Todd <noc@nova53.net>
awsmppl.com
@@ -12351,7 +12407,6 @@ ltd.ng
ngo.ng
edu.scot
sch.so
-org.yt
// HostyHosting (hostyhosting.com)
hostyhosting.io
@@ -12369,6 +12424,11 @@ moonscale.net
// Submitted by Hannu Aronsson <haa@iki.fi>
iki.fi
+// iliad italia: https://www.iliad.it
+// Submitted by Marios Makassikis <mmakassikis@freebox.fr>
+ibxos.it
+iliadboxos.it
+
// Impertrix Solutions : <https://impertrixcdn.com>
// Submitted by Zhixiang Zhao <csuite@impertrix.com>
impertrixcdn.com
@@ -12449,9 +12509,11 @@ iopsys.se
// Submitted by Matthew Hardeman <mhardeman@ipifony.com>
ipifony.net
-// IServ GmbH : https://iserv.eu
-// Submitted by Kim-Alexander Brodowski <info@iserv.eu>
+// IServ GmbH : https://iserv.de
+// Submitted by Mario Hoberg <info@iserv.de>
+iservschule.de
mein-iserv.de
+schulplattform.de
schulserver.de
test-iserv.de
iserv.dev
@@ -12661,6 +12723,10 @@ ip.linodeusercontent.com
// Submitted by Victor Velchev <admin@liquidnetlimited.com>
we.bs
+// Localcert : https://localcert.dev
+// Submitted by Lann Martin <security@localcert.dev>
+*.user.localcert.dev
+
// localzone.xyz
// Submitted by Kenny Niehage <hello@yahe.sh>
localzone.xyz
@@ -12769,6 +12835,10 @@ hra.health
miniserver.com
memset.net
+// Messerli Informatik AG : https://www.messerli.ch/
+// Submitted by Ruben Schmidmeister <psl-maintainers@messerli.ch>
+messerli.app
+
// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/
// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz>
*.cloud.metacentrum.cz
@@ -12788,12 +12858,13 @@ eu.meteorapp.com
co.pl
// Microsoft Corporation : http://microsoft.com
-// Submitted by Mitch Webster <miwebst@microsoft.com>
+// Submitted by Public Suffix List Admin <msftpsladmin@microsoft.com>
*.azurecontainer.io
azurewebsites.net
azure-mobile.net
cloudapp.net
azurestaticapps.net
+1.azurestaticapps.net
centralus.azurestaticapps.net
eastasia.azurestaticapps.net
eastus2.azurestaticapps.net
@@ -13378,6 +13449,12 @@ rocky.page
спб.рус
я.рус
+// Salesforce.com, Inc. https://salesforce.com/
+// Submitted by Michael Biven <mbiven@salesforce.com>
+*.builder.code.com
+*.dev-builder.code.com
+*.stg-builder.code.com
+
// Sandstorm Development Group, Inc. : https://sandcats.io/
// Submitted by Asheesh Laroia <asheesh@sandstorm.io>
sandcats.io
@@ -13387,6 +13464,34 @@ sandcats.io
logoip.de
logoip.com
+// Scaleway : https://www.scaleway.com/
+// Submitted by Rémy Léone <rleone@scaleway.com>
+fr-par-1.baremetal.scw.cloud
+fr-par-2.baremetal.scw.cloud
+nl-ams-1.baremetal.scw.cloud
+fnc.fr-par.scw.cloud
+functions.fnc.fr-par.scw.cloud
+k8s.fr-par.scw.cloud
+nodes.k8s.fr-par.scw.cloud
+s3.fr-par.scw.cloud
+s3-website.fr-par.scw.cloud
+whm.fr-par.scw.cloud
+priv.instances.scw.cloud
+pub.instances.scw.cloud
+k8s.scw.cloud
+k8s.nl-ams.scw.cloud
+nodes.k8s.nl-ams.scw.cloud
+s3.nl-ams.scw.cloud
+s3-website.nl-ams.scw.cloud
+whm.nl-ams.scw.cloud
+k8s.pl-waw.scw.cloud
+nodes.k8s.pl-waw.scw.cloud
+s3.pl-waw.scw.cloud
+s3-website.pl-waw.scw.cloud
+scalebook.scw.cloud
+smartlabeling.scw.cloud
+dedibox.fr
+
// schokokeks.org GbR : https://schokokeks.org/
// Submitted by Hanno Böck <hanno@schokokeks.org>
schokokeks.net
@@ -13607,19 +13712,20 @@ syncloud.it
// Synology, Inc. : https://www.synology.com/
// Submitted by Rony Weng <ronyweng@synology.com>
-diskstation.me
dscloud.biz
-dscloud.me
-dscloud.mobi
+direct.quickconnect.cn
dsmynas.com
-dsmynas.net
-dsmynas.org
familyds.com
-familyds.net
-familyds.org
+diskstation.me
+dscloud.me
i234.me
myds.me
synology.me
+dscloud.mobi
+dsmynas.net
+familyds.net
+dsmynas.org
+familyds.org
vpnplus.to
direct.quickconnect.to
@@ -13772,6 +13878,15 @@ hk.org
ltd.hk
inc.hk
+// UNIVERSAL DOMAIN REGISTRY : https://www.udr.org.yt/
+// see also: whois -h whois.udr.org.yt help
+// Submitted by Atanunu Igbunuroghene <publicsuffixlist@udr.org.yt>
+name.pm
+sch.tf
+biz.wf
+sch.wf
+org.yt
+
// United Gameserver GmbH : https://united-gameserver.de
// Submitted by Stefan Schwarz <sysadm@united-gameserver.de>
virtualuser.de
diff --git a/chromium/net/base/registry_controlled_domains/effective_tld_names.gperf b/chromium/net/base/registry_controlled_domains/effective_tld_names.gperf
index e2fa64f94b0..490782dff4e 100644
--- a/chromium/net/base/registry_controlled_domains/effective_tld_names.gperf
+++ b/chromium/net/base/registry_controlled_domains/effective_tld_names.gperf
@@ -15,6 +15,7 @@ struct DomainRule {
001www.com, 4
0e.vc, 4
0emm.com, 6
+1.azurestaticapps.net, 4
1.bg, 0
12hp.at, 4
12hp.ch, 4
@@ -37,9 +38,11 @@ struct DomainRule {
4lima.de, 4
4u.com, 4
5.bg, 0
+5g.in, 0
6.bg, 0
611.to, 4
64-b.it, 4
+6g.in, 0
7.bg, 0
8.bg, 0
9.bg, 0
@@ -188,6 +191,7 @@ aguni.okinawa.jp, 0
ah.cn, 0
ah.no, 0
ai, 0
+ai.in, 0
aibetsu.hokkaido.jp, 0
aichi.jp, 0
aid.pl, 0
@@ -203,6 +207,9 @@ airbus, 0
aircraft.aero, 0
airforce, 0
airguard.museum, 0
+airkitapps-au.com, 4
+airkitapps.com, 4
+airkitapps.eu, 4
airline.aero, 0
airport.aero, 0
airtel, 0
@@ -269,6 +276,7 @@ alwaysdata.net, 4
am, 0
am.br, 0
am.gov.br, 0
+am.in, 0
am.leg.br, 4
ama.aichi.jp, 0
ama.shimane.jp, 0
@@ -739,6 +747,7 @@ biella.it, 0
bieszczady.pl, 0
bievat.no, 0
bifuka.hokkaido.jp, 0
+bihar.in, 0
bihoro.hokkaido.jp, 0
bike, 0
bilbao.museum, 0
@@ -767,6 +776,7 @@ biz.et, 0
biz.fj, 0
biz.gl, 4
biz.id, 0
+biz.in, 0
biz.ki, 0
biz.ls, 0
biz.mv, 0
@@ -783,6 +793,7 @@ biz.tr, 0
biz.tt, 0
biz.ua, 4
biz.vn, 0
+biz.wf, 4
biz.zm, 0
bizen.okayama.jp, 0
bj, 0
@@ -988,6 +999,7 @@ budejju.no, 0
bugatti, 0
build, 0
build.run, 6
+builder.code.com, 6
builders, 0
building.museum, 0
builtwithdark.com, 4
@@ -1003,6 +1015,7 @@ bus.museum, 0
busan.kr, 0
bushey.museum, 0
business, 0
+business.in, 0
but.jp, 4
buy, 0
buyshop.jp, 4
@@ -1029,6 +1042,7 @@ c66.me, 4
ca, 0
ca-central-1.elasticbeanstalk.com, 4
ca.eu.org, 4
+ca.in, 0
ca.it, 0
ca.na, 0
ca.reclaim.cloud, 4
@@ -1368,6 +1382,7 @@ cn-north-1.eb.amazonaws.com.cn, 4
cn-northwest-1.eb.amazonaws.com.cn, 4
cn.com, 4
cn.eu.org, 4
+cn.in, 0
cn.it, 0
cn.ua, 0
cn.vu, 4
@@ -1531,6 +1546,7 @@ com.hn, 0
com.hr, 0
com.ht, 0
com.im, 0
+com.in, 0
com.io, 0
com.iq, 0
com.is, 0
@@ -1659,6 +1675,7 @@ coop, 0
coop.ar, 0
coop.br, 0
coop.ht, 0
+coop.in, 0
coop.km, 0
coop.mv, 0
coop.mw, 0
@@ -1709,6 +1726,7 @@ crs, 0
cruise, 0
cruises, 0
cryptonomic.net, 6
+cs.in, 0
cs.it, 0
cs.keliweb.cloud, 4
csx.cc, 4
@@ -1821,12 +1839,14 @@ debian.net, 4
deca.jp, 4
deci.jp, 4
decorativearts.museum, 0
+dedibox.fr, 4
dedyn.io, 4
def.br, 0
definima.io, 4
definima.net, 4
degree, 0
delaware.museum, 0
+delhi.in, 0
delivery, 0
dell, 0
dell-ogliastra.it, 0
@@ -1859,6 +1879,7 @@ deta.app, 4
deta.dev, 4
detroit.museum, 0
dev, 0
+dev-builder.code.com, 6
dev-myqnapcloud.com, 4
dev.adobeaemcloud.com, 6
dev.br, 0
@@ -1883,6 +1904,7 @@ digitaloceanspaces.com, 6
diher.solutions, 6
dinosaur.museum, 0
direct, 0
+direct.quickconnect.cn, 4
direct.quickconnect.to, 4
directory, 0
discordsays.com, 4
@@ -1947,6 +1969,7 @@ dot, 0
dovre.no, 0
download, 0
dp.ua, 0
+dr.in, 0
dr.na, 0
dr.tr, 0
drammen.no, 0
@@ -2238,6 +2261,8 @@ emr.it, 0
en-root.fr, 4
en.it, 0
ena.gifu.jp, 0
+encoreapi.com, 4
+encr.app, 4
encyclopedic.museum, 0
endofinternet.net, 4
endofinternet.org, 4
@@ -2269,6 +2294,7 @@ epson, 0
equipment, 0
equipment.aero, 0
er, 2
+er.in, 0
ericsson, 0
erimo.hokkaido.jp, 0
erni, 0
@@ -2492,6 +2518,7 @@ fm, 0
fm.br, 0
fm.it, 0
fm.no, 0
+fnc.fr-par.scw.cloud, 4
fnd.br, 0
fnwk.site, 4
fo, 0
@@ -2539,6 +2566,8 @@ fox, 0
foz.br, 0
fr, 0
fr-1.paas.massivegrid.net, 4
+fr-par-1.baremetal.scw.cloud, 4
+fr-par-2.baremetal.scw.cloud, 4
fr.eu.org, 4
fr.it, 0
fra1-de.cloudjiffy.net, 4
@@ -2691,6 +2720,7 @@ fun, 0
funabashi.chiba.jp, 0
funagata.yamagata.jp, 0
funahashi.toyama.jp, 0
+functions.fnc.fr-par.scw.cloud, 4
fund, 0
fundacio.museum, 0
fuoisku.no, 0
@@ -3010,6 +3040,7 @@ gov.my, 0
gov.mz, 0
gov.nc.tr, 0
gov.ng, 0
+gov.nl, 4
gov.nr, 0
gov.om, 0
gov.ph, 0
@@ -3130,6 +3161,7 @@ guernsey.museum, 0
guge, 0
guide, 0
guitars, 0
+gujarat.in, 0
gujo.gifu.jp, 0
gulen.no, 0
gunma.jp, 0
@@ -3489,6 +3521,7 @@ ibaraki.osaka.jp, 0
ibestad.no, 0
ibigawa.gifu.jp, 0
ibm, 0
+ibxos.it, 4
ic.gov.pl, 0
icbc, 0
ice, 0
@@ -3549,6 +3582,7 @@ il, 0
il.eu.org, 4
il.us, 0
ilawa.pl, 0
+iliadboxos.it, 4
illustration.museum, 0
ilovecollege.info, 4
im, 0
@@ -3642,6 +3676,7 @@ info.fj, 0
info.gu, 0
info.ht, 0
info.hu, 0
+info.in, 0
info.ke, 0
info.ki, 0
info.la, 0
@@ -3683,6 +3718,7 @@ int.ci, 0
int.co, 0
int.cv, 0
int.eu.org, 4
+int.in, 0
int.is, 0
int.la, 0
int.lk, 0
@@ -3699,12 +3735,14 @@ intelligence.museum, 0
interactive.museum, 0
international, 0
internet-dns.de, 4
+internet.in, 0
intl.tn, 0
intuit, 0
inuyama.aichi.jp, 0
investments, 0
inzai.chiba.jp, 0
io, 0
+io.in, 0
io.kg, 4
iobb.net, 4
iopsys.se, 4
@@ -3810,6 +3848,7 @@ isehara.kanagawa.jp, 0
isen.kagoshima.jp, 0
isernia.it, 0
iserv.dev, 4
+iservschule.de, 4
isesaki.gunma.jp, 0
ishigaki.okinawa.jp, 0
ishikari.hokkaido.jp, 0
@@ -4034,6 +4073,10 @@ k12.vt.us, 0
k12.wa.us, 0
k12.wi.us, 0
k12.wy.us, 0
+k8s.fr-par.scw.cloud, 4
+k8s.nl-ams.scw.cloud, 4
+k8s.pl-waw.scw.cloud, 4
+k8s.scw.cloud, 4
kaas.gg, 4
kadena.okinawa.jp, 0
kadogawa.miyazaki.jp, 0
@@ -4684,6 +4727,7 @@ logoip.de, 4
lohmus.me, 4
lol, 0
lolipop.io, 4
+lolipopmc.jp, 4
lolitapunk.jp, 4
lom.it, 0
lom.no, 0
@@ -4884,6 +4928,7 @@ md.ci, 0
md.us, 0
me, 0
me.eu.org, 4
+me.in, 0
me.it, 0
me.ke, 0
me.so, 0
@@ -4944,6 +4989,7 @@ meraker.no, 0
merckmsd, 0
merseine.nu, 4
mesaverde.museum, 0
+messerli.app, 4
messina.it, 0
messwithdns.com, 4
meteorapp.com, 4
@@ -5454,6 +5500,7 @@ name.mv, 0
name.my, 0
name.na, 0
name.ng, 0
+name.pm, 4
name.pr, 0
name.qa, 0
name.tj, 0
@@ -5780,6 +5827,7 @@ niyodogawa.kochi.jp, 0
nj.us, 0
njs.jelastic.vps-host.net, 4
nl, 0
+nl-ams-1.baremetal.scw.cloud, 4
nl.ca, 0
nl.ci, 4
nl.eu.org, 4
@@ -5802,6 +5850,9 @@ nobushi.jp, 4
noda.chiba.jp, 0
noda.iwate.jp, 0
nodebalancer.linode.com, 6
+nodes.k8s.fr-par.scw.cloud, 4
+nodes.k8s.nl-ams.scw.cloud, 4
+nodes.k8s.pl-waw.scw.cloud, 4
nog.community, 4
nogata.fukuoka.jp, 0
nogi.tochigi.jp, 0
@@ -6446,6 +6497,7 @@ pet, 0
pf, 0
pfizer, 0
pg, 2
+pg.in, 0
pg.it, 0
pgafan.net, 4
pgfog.com, 4
@@ -6563,6 +6615,7 @@ portal.museum, 0
portland.museum, 0
portlligat.museum, 0
post, 0
+post.in, 0
postman-echo.com, 4
posts-and-telecommunications.museum, 0
potager.org, 4
@@ -6603,6 +6656,7 @@ primetel.cloud, 4
principe.st, 0
priv.at, 4
priv.hu, 0
+priv.instances.scw.cloud, 4
priv.me, 0
priv.no, 0
priv.pl, 0
@@ -6614,6 +6668,7 @@ pro.cy, 0
pro.ec, 0
pro.fj, 0
pro.ht, 0
+pro.in, 0
pro.mv, 0
pro.na, 0
pro.om, 0
@@ -6651,6 +6706,7 @@ pt.eu.org, 4
pt.it, 0
pu.it, 0
pub, 0
+pub.instances.scw.cloud, 4
pub.sa, 0
publ.pt, 0
public-inquiry.uk, 4
@@ -6952,6 +7008,9 @@ s3-website.ca-central-1.amazonaws.com, 4
s3-website.eu-central-1.amazonaws.com, 4
s3-website.eu-west-2.amazonaws.com, 4
s3-website.eu-west-3.amazonaws.com, 4
+s3-website.fr-par.scw.cloud, 4
+s3-website.nl-ams.scw.cloud, 4
+s3-website.pl-waw.scw.cloud, 4
s3-website.us-east-2.amazonaws.com, 4
s3.amazonaws.com, 4
s3.ap-northeast-2.amazonaws.com, 4
@@ -6974,6 +7033,9 @@ s3.dualstack.us-east-2.amazonaws.com, 4
s3.eu-central-1.amazonaws.com, 4
s3.eu-west-2.amazonaws.com, 4
s3.eu-west-3.amazonaws.com, 4
+s3.fr-par.scw.cloud, 4
+s3.nl-ams.scw.cloud, 4
+s3.pl-waw.scw.cloud, 4
s3.teckids.org, 4
s3.us-east-2.amazonaws.com, 4
s5y.io, 6
@@ -7117,6 +7179,7 @@ sc.tz, 0
sc.ug, 0
sc.us, 0
sca, 0
+scalebook.scw.cloud, 4
scb, 0
sch.ae, 0
sch.id, 0
@@ -7129,7 +7192,9 @@ sch.qa, 0
sch.sa, 0
sch.so, 4
sch.ss, 0
+sch.tf, 4
sch.uk, 2
+sch.wf, 4
sch.zm, 0
schaeffler, 0
schlesisches.museum, 0
@@ -7146,6 +7211,7 @@ school.za, 0
schoolbus.jp, 4
schools.nsw.edu.au, 0
schule, 0
+schulplattform.de, 4
schulserver.de, 4
schwarz, 0
schweiz.museum, 0
@@ -7462,6 +7528,7 @@ sm, 0
sm.ua, 0
small-web.org, 4
smart, 0
+smartlabeling.scw.cloud, 4
smile, 0
smola.no, 0
smushcdn.com, 4
@@ -7597,6 +7664,7 @@ steam.museum, 0
steiermark.museum, 0
steigen.no, 0
steinkjer.no, 0
+stg-builder.code.com, 6
stg.dev, 6
stgstage.dev, 6
sth.ac.at, 0
@@ -8078,6 +8146,7 @@ transurl.eu, 6
transurl.nl, 6
trapani.it, 0
travel, 0
+travel.in, 0
travel.pl, 0
travel.tt, 0
travelchannel, 0
@@ -8186,6 +8255,7 @@ tv.bb, 0
tv.bo, 0
tv.br, 0
tv.im, 0
+tv.in, 0
tv.it, 0
tv.kg, 4
tv.na, 0
@@ -8244,6 +8314,7 @@ ujitawara.kyoto.jp, 0
uk, 0
uk.com, 4
uk.eu.org, 4
+uk.in, 0
uk.kg, 4
uk.net, 4
uk.oxa.cloud, 4
@@ -8282,6 +8353,7 @@ unzen.nagasaki.jp, 0
uol, 0
uonuma.niigata.jp, 0
uozu.toyama.jp, 0
+up.in, 0
upaas.kazteleport.kz, 4
upli.io, 4
upow.gov.pl, 0
@@ -8317,6 +8389,7 @@ us.ax, 4
us.com, 4
us.eu.org, 4
us.gov.pl, 0
+us.in, 0
us.kg, 4
us.na, 0
us.org, 4
@@ -8330,6 +8403,7 @@ uscountryestate.museum, 0
usculture.museum, 0
usdecorativearts.museum, 0
user.aseinet.ne.jp, 4
+user.localcert.dev, 6
user.party.eus, 4
user.srcf.net, 4
usercontent.goog, 6
@@ -8625,6 +8699,8 @@ westus2.azurestaticapps.net, 4
wf, 0
whaling.museum, 0
whitesnow.jp, 4
+whm.fr-par.scw.cloud, 4
+whm.nl-ams.scw.cloud, 4
whoswho, 0
wi.us, 0
wielun.pl, 0
@@ -8727,6 +8803,8 @@ xn--42c2d9a, 0
xn--45br5cyl, 0
xn--45brj9c, 0
xn--45q11c, 0
+xn--4dbgdty6c.xn--4dbrk0ce, 0
+xn--4dbrk0ce, 0
xn--4gbrim, 0
xn--4it168d.jp, 0
xn--4it797k.jp, 0
@@ -8737,6 +8815,7 @@ xn--55qx5d, 0
xn--55qx5d.cn, 0
xn--55qx5d.hk, 0
xn--55qx5d.xn--j6w193g, 0
+xn--5dbhl8d.xn--4dbrk0ce, 0
xn--5js045d.jp, 0
xn--5rtp49c.jp, 0
xn--5rtq34k.jp, 0
@@ -8754,6 +8833,7 @@ xn--80aqecdr1a, 0
xn--80asehdb, 0
xn--80aswg, 0
xn--80au.xn--90a3ac, 0
+xn--8dbq2a.xn--4dbrk0ce, 0
xn--8ltr62k.jp, 0
xn--8pvr4u.jp, 0
xn--8y0a063a, 0
@@ -8875,6 +8955,7 @@ xn--h2brj9c8c, 0
xn--h3cuzk1di.xn--o3cw4h, 0
xn--hbmer-xqa.no, 0
xn--hcesuolo-7ya35b.no, 0
+xn--hebda8b.xn--4dbrk0ce, 0
xn--hery-ira.nordland.no, 0
xn--hery-ira.xn--mre-og-romsdal-qqb.no, 0
xn--hgebostad-g3a.no, 0
diff --git a/chromium/net/base/registry_controlled_domains/registry_controlled_domain.cc b/chromium/net/base/registry_controlled_domains/registry_controlled_domain.cc
index 20e860518f9..e330feb408f 100644
--- a/chromium/net/base/registry_controlled_domains/registry_controlled_domain.cc
+++ b/chromium/net/base/registry_controlled_domains/registry_controlled_domain.cc
@@ -60,8 +60,7 @@
#include "url/third_party/mozilla/url_parse.h"
#include "url/url_util.h"
-namespace net {
-namespace registry_controlled_domains {
+namespace net::registry_controlled_domains {
namespace {
#include "net/base/registry_controlled_domains/effective_tld_names-reversed-inc.cc"
@@ -220,11 +219,11 @@ base::StringPiece GetDomainAndRegistryAsStringPiece(
// These two functions append the given string as-is to the given output,
// converting to UTF-8 if necessary.
void AppendInvalidString(base::StringPiece str, url::CanonOutput* output) {
- output->Append(str.data(), static_cast<int>(str.length()));
+ output->Append(str.data(), str.length());
}
void AppendInvalidString(base::StringPiece16 str, url::CanonOutput* output) {
std::string utf8 = base::UTF16ToUTF8(str);
- output->Append(utf8.data(), static_cast<int>(utf8.length()));
+ output->Append(utf8.data(), utf8.length());
}
// Backend for PermissiveGetHostRegistryLength that handles both UTF-8 and
@@ -250,7 +249,7 @@ size_t DoPermissiveGetHostRegistryLength(T host,
MappedHostComponent mapping;
mapping.original_begin = begin;
mapping.original_end = current;
- mapping.canonical_begin = static_cast<size_t>(canon_output.length());
+ mapping.canonical_begin = canon_output.length();
// Try to append the canonicalized version of this component.
int current_len = static_cast<int>(current - begin);
@@ -261,7 +260,7 @@ size_t DoPermissiveGetHostRegistryLength(T host,
AppendInvalidString(host.substr(begin, current_len), &canon_output);
}
- mapping.canonical_end = static_cast<size_t>(canon_output.length());
+ mapping.canonical_end = canon_output.length();
components.push_back(mapping);
if (current < host.length())
@@ -469,5 +468,4 @@ void SetFindDomainGraphForTesting(const unsigned char* domains, size_t length) {
g_graph_length = length;
}
-} // namespace registry_controlled_domains
-} // namespace net
+} // namespace net::registry_controlled_domains
diff --git a/chromium/net/base/registry_controlled_domains/registry_controlled_domain.h b/chromium/net/base/registry_controlled_domains/registry_controlled_domain.h
index 2ff442b5db4..ce6a2201ed8 100644
--- a/chromium/net/base/registry_controlled_domains/registry_controlled_domain.h
+++ b/chromium/net/base/registry_controlled_domains/registry_controlled_domain.h
@@ -129,8 +129,7 @@ class Origin;
struct DomainRule;
-namespace net {
-namespace registry_controlled_domains {
+namespace net::registry_controlled_domains {
// This enum is a required parameter to all public methods declared for this
// service. The Public Suffix List (http://publicsuffix.org/) this service
@@ -304,7 +303,6 @@ NET_EXPORT_PRIVATE void SetFindDomainGraphForTesting(
const unsigned char* domains,
size_t length);
-} // namespace registry_controlled_domains
-} // namespace net
+} // namespace net::registry_controlled_domains
#endif // NET_BASE_REGISTRY_CONTROLLED_DOMAINS_REGISTRY_CONTROLLED_DOMAIN_H_
diff --git a/chromium/net/base/registry_controlled_domains/registry_controlled_domain_unittest.cc b/chromium/net/base/registry_controlled_domains/registry_controlled_domain_unittest.cc
index 351776b5f02..9417f839fa4 100644
--- a/chromium/net/base/registry_controlled_domains/registry_controlled_domain_unittest.cc
+++ b/chromium/net/base/registry_controlled_domains/registry_controlled_domain_unittest.cc
@@ -33,8 +33,7 @@ namespace test6 {
} // namespace
-namespace net {
-namespace registry_controlled_domains {
+namespace net::registry_controlled_domains {
namespace {
@@ -644,5 +643,4 @@ TEST_F(RegistryControlledDomainTest, Permissive) {
#endif
}
-} // namespace registry_controlled_domains
-} // namespace net
+} // namespace net::registry_controlled_domains
diff --git a/chromium/net/base/schemeful_site.h b/chromium/net/base/schemeful_site.h
index a7eda6f0be2..dbccfc7f1a3 100644
--- a/chromium/net/base/schemeful_site.h
+++ b/chromium/net/base/schemeful_site.h
@@ -24,11 +24,9 @@ template <class P>
struct ParamTraits;
} // namespace IPC
-namespace network {
-namespace mojom {
+namespace network::mojom {
class SchemefulSiteDataView;
-} // namespace mojom
-} // namespace network
+} // namespace network::mojom
namespace mojo {
template <typename DataViewType, typename T>
diff --git a/chromium/net/base/test_completion_callback_unittest.cc b/chromium/net/base/test_completion_callback_unittest.cc
index 68b6f73f1d6..0ba7462e25d 100644
--- a/chromium/net/base/test_completion_callback_unittest.cc
+++ b/chromium/net/base/test_completion_callback_unittest.cc
@@ -98,7 +98,7 @@ ExampleEmployer::~ExampleEmployer() = default;
bool ExampleEmployer::DoSomething(CompletionOnceCallback callback) {
DCHECK(!request_.get()) << "already in use";
- request_ = new ExampleWorker(this, std::move(callback));
+ request_ = base::MakeRefCounted<ExampleWorker>(this, std::move(callback));
if (!base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&ExampleWorker::DoWork, request_))) {
diff --git a/chromium/net/base/upload_bytes_element_reader.cc b/chromium/net/base/upload_bytes_element_reader.cc
index 9dd22c84e54..312b0069ad9 100644
--- a/chromium/net/base/upload_bytes_element_reader.cc
+++ b/chromium/net/base/upload_bytes_element_reader.cc
@@ -64,10 +64,10 @@ UploadOwnedBytesElementReader::UploadOwnedBytesElementReader(
UploadOwnedBytesElementReader::~UploadOwnedBytesElementReader() = default;
-UploadOwnedBytesElementReader*
+std::unique_ptr<UploadOwnedBytesElementReader>
UploadOwnedBytesElementReader::CreateWithString(const std::string& string) {
std::vector<char> data(string.begin(), string.end());
- return new UploadOwnedBytesElementReader(&data);
+ return std::make_unique<UploadOwnedBytesElementReader>(&data);
}
} // namespace net
diff --git a/chromium/net/base/upload_bytes_element_reader.h b/chromium/net/base/upload_bytes_element_reader.h
index dd39f580342..71c5a4bde35 100644
--- a/chromium/net/base/upload_bytes_element_reader.h
+++ b/chromium/net/base/upload_bytes_element_reader.h
@@ -56,7 +56,7 @@ class NET_EXPORT UploadOwnedBytesElementReader
~UploadOwnedBytesElementReader() override;
// Creates UploadOwnedBytesElementReader with a string.
- static UploadOwnedBytesElementReader* CreateWithString(
+ static std::unique_ptr<UploadOwnedBytesElementReader> CreateWithString(
const std::string& string);
private:
diff --git a/chromium/net/base/upload_data_stream.cc b/chromium/net/base/upload_data_stream.cc
index c282bd284a9..3444b89f92f 100644
--- a/chromium/net/base/upload_data_stream.cc
+++ b/chromium/net/base/upload_data_stream.cc
@@ -35,7 +35,13 @@ base::Value CreateReadInfoParams(int current_position) {
} // namespace
UploadDataStream::UploadDataStream(bool is_chunked, int64_t identifier)
- : identifier_(identifier), is_chunked_(is_chunked) {}
+ : UploadDataStream(is_chunked, /*has_null_source=*/false, identifier) {}
+UploadDataStream::UploadDataStream(bool is_chunked,
+ bool has_null_source,
+ int64_t identifier)
+ : identifier_(identifier),
+ is_chunked_(is_chunked),
+ has_null_source_(has_null_source) {}
UploadDataStream::~UploadDataStream() = default;
diff --git a/chromium/net/base/upload_data_stream.h b/chromium/net/base/upload_data_stream.h
index 89eeef08b36..0f9b0c2f7bf 100644
--- a/chromium/net/base/upload_data_stream.h
+++ b/chromium/net/base/upload_data_stream.h
@@ -28,6 +28,7 @@ class NET_EXPORT UploadDataStream {
// cache to formulate a cache key. This value should be unique across browser
// sessions. A value of 0 is used to indicate an unspecified identifier.
UploadDataStream(bool is_chunked, int64_t identifier);
+ UploadDataStream(bool is_chunked, bool has_null_source, int64_t identifier);
UploadDataStream(const UploadDataStream&) = delete;
UploadDataStream& operator=(const UploadDataStream&) = delete;
@@ -73,6 +74,10 @@ class NET_EXPORT UploadDataStream {
bool is_chunked() const { return is_chunked_; }
+ // Returns true if the stream has a null source which is defined at
+ // https://fetch.spec.whatwg.org/#concept-body-source.
+ bool has_null_source() const { return has_null_source_; }
+
// Returns true if all data has been consumed from this upload data
// stream. For chunked uploads, returns false until the first read attempt.
// This makes some state machines a little simpler.
@@ -139,6 +144,7 @@ class NET_EXPORT UploadDataStream {
const int64_t identifier_;
const bool is_chunked_;
+ const bool has_null_source_;
// True if the initialization was successful.
bool initialized_successfully_ = false;
diff --git a/chromium/net/base/upload_file_element_reader.cc b/chromium/net/base/upload_file_element_reader.cc
index b7a94005609..d12c03b2530 100644
--- a/chromium/net/base/upload_file_element_reader.cc
+++ b/chromium/net/base/upload_file_element_reader.cc
@@ -238,18 +238,19 @@ int UploadFileElementReader::DoGetFileInfo(int result) {
next_state_ = State::GET_FILE_INFO_COMPLETE;
- base::File::Info* owned_file_info = new base::File::Info;
+ auto file_info = std::make_unique<base::File::Info>();
+ auto* file_info_ptr = file_info.get();
result = file_stream_->GetFileInfo(
- owned_file_info,
+ file_info_ptr,
base::BindOnce(
[](base::WeakPtr<UploadFileElementReader> weak_this,
- base::File::Info* file_info, int result) {
+ std::unique_ptr<base::File::Info> file_info, int result) {
if (!weak_this)
return;
weak_this->file_info_ = *file_info;
weak_this->OnIOComplete(result);
},
- weak_ptr_factory_.GetWeakPtr(), base::Owned(owned_file_info)));
+ weak_ptr_factory_.GetWeakPtr(), std::move(file_info)));
// GetFileInfo() can't succeed synchronously.
DCHECK_NE(result, OK);
return result;
diff --git a/chromium/net/base/url_util.cc b/chromium/net/base/url_util.cc
index 6dfd1249238..093d325a388 100644
--- a/chromium/net/base/url_util.cc
+++ b/chromium/net/base/url_util.cc
@@ -336,8 +336,7 @@ bool IsCanonicalizedHostCompliant(const std::string& host) {
bool in_component = false;
bool most_recent_component_started_alphanumeric = false;
- for (std::string::const_iterator i(host.begin()); i != host.end(); ++i) {
- const char c = *i;
+ for (char c : host) {
if (!in_component) {
most_recent_component_started_alphanumeric = IsHostCharAlphanumeric(c);
if (!most_recent_component_started_alphanumeric && (c != '-') &&
diff --git a/chromium/net/base/url_util_unittest.cc b/chromium/net/base/url_util_unittest.cc
index 0fea493bf07..a77f8bc8cce 100644
--- a/chromium/net/base/url_util_unittest.cc
+++ b/chromium/net/base/url_util_unittest.cc
@@ -430,7 +430,7 @@ const NonUniqueNameTestData kNonUniqueNameTestData[] = {
class UrlUtilNonUniqueNameTest
: public testing::TestWithParam<NonUniqueNameTestData> {
public:
- virtual ~UrlUtilNonUniqueNameTest() = default;
+ ~UrlUtilNonUniqueNameTest() override = default;
protected:
bool IsUnique(const std::string& hostname) {
diff --git a/chromium/net/cert/asn1_util.cc b/chromium/net/cert/asn1_util.cc
index ffafe1ce416..15393d933f4 100644
--- a/chromium/net/cert/asn1_util.cc
+++ b/chromium/net/cert/asn1_util.cc
@@ -4,14 +4,12 @@
#include "net/cert/asn1_util.h"
-#include "net/cert/internal/parse_certificate.h"
+#include "net/cert/pki/parse_certificate.h"
#include "net/der/input.h"
#include "net/der/parser.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
-namespace net {
-
-namespace asn1 {
+namespace net::asn1 {
namespace {
@@ -330,6 +328,4 @@ bool ExtractExtensionFromDERCert(base::StringPiece cert,
return true;
}
-} // namespace asn1
-
-} // namespace net
+} // namespace net::asn1
diff --git a/chromium/net/cert/asn1_util.h b/chromium/net/cert/asn1_util.h
index ec59393e70c..349b554b39a 100644
--- a/chromium/net/cert/asn1_util.h
+++ b/chromium/net/cert/asn1_util.h
@@ -8,9 +8,7 @@
#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
-namespace net {
-
-namespace asn1 {
+namespace net::asn1 {
// ExtractSubjectFromDERCert parses the DER encoded certificate in |cert| and
// extracts the bytes of the X.501 Subject. On successful return, |subject_out|
@@ -70,8 +68,6 @@ NET_EXPORT bool ExtractExtensionFromDERCert(base::StringPiece cert,
bool* out_extension_critical,
base::StringPiece* out_contents);
-} // namespace asn1
-
-} // namespace net
+} // namespace net::asn1
#endif // NET_CERT_ASN1_UTIL_H_
diff --git a/chromium/net/cert/cert_and_ct_verifier_unittest.cc b/chromium/net/cert/cert_and_ct_verifier_unittest.cc
index 7771312b9e0..858a95250cd 100644
--- a/chromium/net/cert/cert_and_ct_verifier_unittest.cc
+++ b/chromium/net/cert/cert_and_ct_verifier_unittest.cc
@@ -70,7 +70,7 @@ class FakeCTVerifier : public CTVerifier {
class CertAndCTVerifierTest : public TestWithTaskEnvironment {
public:
- CertAndCTVerifierTest() {}
+ CertAndCTVerifierTest() = default;
~CertAndCTVerifierTest() override = default;
};
diff --git a/chromium/net/cert/cert_database.cc b/chromium/net/cert/cert_database.cc
index 99f5dea5695..7e8220b4c14 100644
--- a/chromium/net/cert/cert_database.cc
+++ b/chromium/net/cert/cert_database.cc
@@ -39,7 +39,8 @@ void CertDatabase::NotifyObserversCertDBChanged() {
}
CertDatabase::CertDatabase()
- : observer_list_(new base::ObserverListThreadSafe<Observer>) {}
+ : observer_list_(
+ base::MakeRefCounted<base::ObserverListThreadSafe<Observer>>()) {}
CertDatabase::~CertDatabase() {
#if BUILDFLAG(IS_MAC)
diff --git a/chromium/net/cert/cert_database.h b/chromium/net/cert/cert_database.h
index a56d1880d18..0ffb928c9da 100644
--- a/chromium/net/cert/cert_database.h
+++ b/chromium/net/cert/cert_database.h
@@ -5,6 +5,7 @@
#ifndef NET_CERT_CERT_DATABASE_H_
#define NET_CERT_CERT_DATABASE_H_
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "build/build_config.h"
#include "net/base/net_export.h"
@@ -39,7 +40,7 @@ class NET_EXPORT CertDatabase {
Observer(const Observer&) = delete;
Observer& operator=(const Observer&) = delete;
- virtual ~Observer() {}
+ virtual ~Observer() = default;
// Called whenever the Cert Database is known to have changed.
// Typically, this will be in response to a CA certificate being added,
@@ -48,7 +49,7 @@ class NET_EXPORT CertDatabase {
virtual void OnCertDBChanged() {}
protected:
- Observer() {}
+ Observer() = default;
};
// Returns the CertDatabase singleton.
@@ -91,7 +92,7 @@ class NET_EXPORT CertDatabase {
class Notifier;
friend class Notifier;
- Notifier* notifier_ = nullptr;
+ raw_ptr<Notifier> notifier_ = nullptr;
#endif
};
diff --git a/chromium/net/cert/cert_database_mac.cc b/chromium/net/cert/cert_database_mac.cc
index 1cd7809ccc4..f561550305f 100644
--- a/chromium/net/cert/cert_database_mac.cc
+++ b/chromium/net/cert/cert_database_mac.cc
@@ -10,6 +10,7 @@
#include "base/check.h"
#include "base/location.h"
#include "base/mac/mac_logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "base/process/process_handle.h"
#include "base/synchronization/lock.h"
@@ -39,6 +40,12 @@ class CertDatabase::Notifier {
FROM_HERE, base::BindOnce(&Notifier::Init, base::Unretained(this)));
}
+// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
+// Removal of its use is tracked in https://crbug.com/1348251 but deprecation
+// warnings are disabled in the meanwhile.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
// Should be called from the |task_runner_|'s sequence. Use Shutdown()
// to shutdown on arbitrary sequence.
~Notifier() {
@@ -48,6 +55,8 @@ class CertDatabase::Notifier {
SecKeychainRemoveCallback(&Notifier::KeychainCallback);
}
+#pragma clang diagnostic pop
+
void Shutdown() {
called_shutdown_ = true;
if (!task_runner_->DeleteSoon(FROM_HERE, this)) {
@@ -58,6 +67,12 @@ class CertDatabase::Notifier {
}
}
+// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
+// Removal of its use is tracked in https://crbug.com/1348251 but deprecation
+// warnings are disabled in the meanwhile.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
private:
void Init() {
SecKeychainEventMask event_mask =
@@ -68,13 +83,15 @@ class CertDatabase::Notifier {
registered_ = true;
}
+#pragma clang diagnostic pop
+
// SecKeychainCallback function that receives notifications from securityd
// and forwards them to the |cert_db_|.
static OSStatus KeychainCallback(SecKeychainEvent keychain_event,
SecKeychainCallbackInfo* info,
void* context);
- CertDatabase* const cert_db_;
+ const raw_ptr<CertDatabase> cert_db_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
bool registered_ = false;
bool called_shutdown_ = false;
diff --git a/chromium/net/cert/cert_net_fetcher.h b/chromium/net/cert/cert_net_fetcher.h
index e29167fee99..3ac71321b22 100644
--- a/chromium/net/cert/cert_net_fetcher.h
+++ b/chromium/net/cert/cert_net_fetcher.h
@@ -31,7 +31,7 @@ class NET_EXPORT CertNetFetcher
public:
class Request {
public:
- virtual ~Request() {}
+ virtual ~Request() = default;
// WaitForResult() can be called at most once.
//
@@ -43,7 +43,7 @@ class NET_EXPORT CertNetFetcher
// This value can be used in place of timeout or max size limits.
enum { DEFAULT = -1 };
- CertNetFetcher() {}
+ CertNetFetcher() = default;
CertNetFetcher(const CertNetFetcher&) = delete;
CertNetFetcher& operator=(const CertNetFetcher&) = delete;
@@ -83,7 +83,7 @@ class NET_EXPORT CertNetFetcher
int max_response_bytes) = 0;
protected:
- virtual ~CertNetFetcher() {}
+ virtual ~CertNetFetcher() = default;
private:
friend class base::RefCountedThreadSafe<CertNetFetcher>;
diff --git a/chromium/net/cert/cert_verifier.h b/chromium/net/cert/cert_verifier.h
index 589b03554e2..cc03c8dc133 100644
--- a/chromium/net/cert/cert_verifier.h
+++ b/chromium/net/cert/cert_verifier.h
@@ -76,13 +76,13 @@ class NET_EXPORT CertVerifier {
class Request {
public:
- Request() {}
+ Request() = default;
Request(const Request&) = delete;
Request& operator=(const Request&) = delete;
// Destruction of the Request cancels it.
- virtual ~Request() {}
+ virtual ~Request() = default;
};
enum VerifyFlags {
@@ -155,7 +155,7 @@ class NET_EXPORT CertVerifier {
// When the verifier is destroyed, all certificate verification requests are
// canceled, and their completion callbacks will not be called.
- virtual ~CertVerifier() {}
+ virtual ~CertVerifier() = default;
// Verifies the given certificate against the given hostname as an SSL server.
// Returns OK if successful or an error code upon failure.
diff --git a/chromium/net/cert/cert_verify_proc.cc b/chromium/net/cert/cert_verify_proc.cc
index cb40c44e7fc..eaeb8416f8b 100644
--- a/chromium/net/cert/cert_verify_proc.cc
+++ b/chromium/net/cert/cert_verify_proc.cc
@@ -31,15 +31,15 @@
#include "net/cert/cert_verifier.h"
#include "net/cert/cert_verify_result.h"
#include "net/cert/crl_set.h"
-#include "net/cert/internal/extended_key_usage.h"
-#include "net/cert/internal/ocsp.h"
-#include "net/cert/internal/parse_certificate.h"
#include "net/cert/internal/revocation_checker.h"
-#include "net/cert/internal/signature_algorithm.h"
#include "net/cert/internal/system_trust_store.h"
#include "net/cert/known_roots.h"
#include "net/cert/ocsp_revocation_status.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/extended_key_usage.h"
+#include "net/cert/pki/ocsp.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/signature_algorithm.h"
#include "net/cert/symantec_certs.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_certificate_net_log_param.h"
@@ -358,29 +358,6 @@ bool AreSHA1IntermediatesAllowed() {
#endif
}
-// Validate if a digest hash algorithm is acceptable in a certificate.
-//
-// Sets as a side effect the "has_*" boolean members in
-// |verify_result| that correspond with the the presence of |hash|
-// somewhere in the certificate chain (excluding the trust anchor).
-bool ValidateHashAlgorithm(DigestAlgorithm hash,
- CertVerifyResult* verify_result) {
- switch (hash) {
- case DigestAlgorithm::Sha1:
- verify_result->has_sha1 = true;
- return true; // For now.
- case DigestAlgorithm::Sha256:
- case DigestAlgorithm::Sha384:
- case DigestAlgorithm::Sha512:
- return true;
- case DigestAlgorithm::Md2:
- case DigestAlgorithm::Md4:
- case DigestAlgorithm::Md5:
- return false;
- }
- NOTREACHED();
-}
-
// Inspects the signature algorithms in a single certificate |cert|.
//
// * Sets |verify_result->has_sha1| to true if the certificate uses SHA1.
@@ -399,37 +376,43 @@ bool ValidateHashAlgorithm(DigestAlgorithm hash,
return false;
}
- if (!SignatureAlgorithm::IsEquivalent(der::Input(cert_algorithm_sequence),
- der::Input(tbs_algorithm_sequence))) {
+ absl::optional<SignatureAlgorithm> cert_algorithm =
+ ParseSignatureAlgorithm(der::Input(cert_algorithm_sequence), nullptr);
+ absl::optional<SignatureAlgorithm> tbs_algorithm =
+ ParseSignatureAlgorithm(der::Input(tbs_algorithm_sequence), nullptr);
+ if (!cert_algorithm || !tbs_algorithm || *cert_algorithm != *tbs_algorithm) {
return false;
}
- std::unique_ptr<SignatureAlgorithm> algorithm =
- SignatureAlgorithm::Create(der::Input(cert_algorithm_sequence), nullptr);
- if (!algorithm) {
- return false;
- }
+ switch (*cert_algorithm) {
+ case SignatureAlgorithm::kRsaPkcs1Sha1:
+ case SignatureAlgorithm::kEcdsaSha1:
+ case SignatureAlgorithm::kDsaSha1:
+ verify_result->has_sha1 = true;
+ return true; // For now.
- if (!ValidateHashAlgorithm(algorithm->digest(), verify_result)) {
- return false;
- }
+ case SignatureAlgorithm::kRsaPkcs1Md2:
+ case SignatureAlgorithm::kRsaPkcs1Md4:
+ case SignatureAlgorithm::kRsaPkcs1Md5:
+ // TODO(https://crbug.com/1321688): Remove these from the parser
+ // altogether.
+ return false;
- // Check algorithm-specific parameters.
- switch (algorithm->algorithm()) {
- case SignatureAlgorithmId::Dsa:
- case SignatureAlgorithmId::RsaPkcs1:
- case SignatureAlgorithmId::Ecdsa:
- DCHECK(!algorithm->has_params());
- break;
- case SignatureAlgorithmId::RsaPss:
- if (!ValidateHashAlgorithm(algorithm->ParamsForRsaPss()->mgf1_hash(),
- verify_result)) {
- return false;
- }
- break;
+ case SignatureAlgorithm::kRsaPkcs1Sha256:
+ case SignatureAlgorithm::kRsaPkcs1Sha384:
+ case SignatureAlgorithm::kRsaPkcs1Sha512:
+ case SignatureAlgorithm::kEcdsaSha256:
+ case SignatureAlgorithm::kEcdsaSha384:
+ case SignatureAlgorithm::kEcdsaSha512:
+ case SignatureAlgorithm::kRsaPssSha256:
+ case SignatureAlgorithm::kRsaPssSha384:
+ case SignatureAlgorithm::kRsaPssSha512:
+ case SignatureAlgorithm::kDsaSha256:
+ return true;
}
- return true;
+ NOTREACHED();
+ return false;
}
// InspectSignatureAlgorithmsInChain() sets |verify_result->has_*| based on
@@ -532,13 +515,14 @@ base::Value CertVerifyParams(X509Certificate* cert,
scoped_refptr<CertVerifyProc> CertVerifyProc::CreateSystemVerifyProc(
scoped_refptr<CertNetFetcher> cert_net_fetcher) {
#if BUILDFLAG(IS_ANDROID)
- return new CertVerifyProcAndroid(std::move(cert_net_fetcher));
+ return base::MakeRefCounted<CertVerifyProcAndroid>(
+ std::move(cert_net_fetcher));
#elif BUILDFLAG(IS_IOS)
- return new CertVerifyProcIOS();
+ return base::MakeRefCounted<CertVerifyProcIOS>();
#elif BUILDFLAG(IS_MAC)
- return new CertVerifyProcMac();
+ return base::MakeRefCounted<CertVerifyProcMac>();
#elif BUILDFLAG(IS_WIN)
- return new CertVerifyProcWin();
+ return base::MakeRefCounted<CertVerifyProcWin>();
#else
#error Unsupported platform
#endif
@@ -554,7 +538,7 @@ scoped_refptr<CertVerifyProc> CertVerifyProc::CreateBuiltinVerifyProc(
}
#endif
-CertVerifyProc::CertVerifyProc() {}
+CertVerifyProc::CertVerifyProc() = default;
CertVerifyProc::~CertVerifyProc() = default;
diff --git a/chromium/net/cert/cert_verify_proc_android.cc b/chromium/net/cert/cert_verify_proc_android.cc
index 550661305d6..95ec17f5ff2 100644
--- a/chromium/net/cert/cert_verify_proc_android.cc
+++ b/chromium/net/cert/cert_verify_proc_android.cc
@@ -22,9 +22,9 @@
#include "net/cert/cert_net_fetcher.h"
#include "net/cert/cert_status_flags.h"
#include "net/cert/cert_verify_result.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
#include "net/cert/known_roots.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "url/gurl.h"
@@ -341,7 +341,7 @@ CertVerifyProcAndroid::CertVerifyProcAndroid(
scoped_refptr<CertNetFetcher> cert_net_fetcher)
: cert_net_fetcher_(std::move(cert_net_fetcher)) {}
-CertVerifyProcAndroid::~CertVerifyProcAndroid() {}
+CertVerifyProcAndroid::~CertVerifyProcAndroid() = default;
bool CertVerifyProcAndroid::SupportsAdditionalTrustAnchors() const {
return false;
diff --git a/chromium/net/cert/cert_verify_proc_android_unittest.cc b/chromium/net/cert/cert_verify_proc_android_unittest.cc
index 84dd80e68b4..2b3e37f544b 100644
--- a/chromium/net/cert/cert_verify_proc_android_unittest.cc
+++ b/chromium/net/cert/cert_verify_proc_android_unittest.cc
@@ -11,8 +11,8 @@
#include "net/cert/cert_verify_proc_android.h"
#include "net/cert/cert_verify_result.h"
#include "net/cert/crl_set.h"
-#include "net/cert/internal/test_helpers.h"
#include "net/cert/mock_cert_net_fetcher.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/cert/test_root_certs.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
diff --git a/chromium/net/cert/cert_verify_proc_builtin.cc b/chromium/net/cert/cert_verify_proc_builtin.cc
index e63df98b015..afe1bc86066 100644
--- a/chromium/net/cert/cert_verify_proc_builtin.cc
+++ b/chromium/net/cert/cert_verify_proc_builtin.cc
@@ -20,18 +20,18 @@
#include "net/cert/cert_verify_proc.h"
#include "net/cert/cert_verify_result.h"
#include "net/cert/ev_root_ca_metadata.h"
-#include "net/cert/internal/cert_errors.h"
#include "net/cert/internal/cert_issuer_source_aia.h"
-#include "net/cert/internal/cert_issuer_source_static.h"
-#include "net/cert/internal/common_cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/path_builder.h"
#include "net/cert/internal/revocation_checker.h"
-#include "net/cert/internal/simple_path_builder_delegate.h"
#include "net/cert/internal/system_trust_store.h"
-#include "net/cert/internal/trust_store_collection.h"
-#include "net/cert/internal/trust_store_in_memory.h"
#include "net/cert/known_roots.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/cert_issuer_source_static.h"
+#include "net/cert/pki/common_cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/path_builder.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
+#include "net/cert/pki/trust_store_collection.h"
+#include "net/cert/pki/trust_store_in_memory.h"
#include "net/cert/test_root_certs.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
@@ -58,19 +58,19 @@ const void* kResultDebugDataKey = &kResultDebugDataKey;
base::Value NetLogCertParams(const CRYPTO_BUFFER* cert_handle,
const CertErrors& errors) {
- base::Value results(base::Value::Type::DICTIONARY);
+ base::Value::Dict results;
std::string pem_encoded;
if (X509Certificate::GetPEMEncodedFromDER(
x509_util::CryptoBufferAsStringPiece(cert_handle), &pem_encoded)) {
- results.GetDict().Set("certificate", pem_encoded);
+ results.Set("certificate", pem_encoded);
}
std::string errors_string = errors.ToDebugString();
if (!errors_string.empty())
- results.GetDict().Set("errors", errors_string);
+ results.Set("errors", errors_string);
- return results;
+ return base::Value(std::move(results));
}
#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
@@ -124,6 +124,7 @@ RevocationPolicy NoRevocationChecking() {
RevocationPolicy policy;
policy.check_revocation = false;
policy.networking_allowed = false;
+ policy.crl_allowed = false;
policy.allow_missing_info = true;
policy.allow_unable_to_check = true;
return policy;
@@ -275,11 +276,8 @@ class PathBuilderDelegateImpl : public SimplePathBuilderDelegate {
}
// Select an appropriate revocation policy for this chain based on the
- // verifier flags and root, and whether this is an EV or DV path building
- // attempt.
- bool crlset_leaf_coverage_sufficient;
- RevocationPolicy policy =
- ChooseRevocationPolicy(path->certs, &crlset_leaf_coverage_sufficient);
+ // verifier flags and root.
+ RevocationPolicy policy = ChooseRevocationPolicy(path->certs);
// Check for revocations using the CRLSet.
switch (
@@ -287,12 +285,6 @@ class PathBuilderDelegateImpl : public SimplePathBuilderDelegate {
case CRLSet::Result::REVOKED:
return;
case CRLSet::Result::GOOD:
- if (crlset_leaf_coverage_sufficient) {
- // Weaken the revocation checking requirement as it has been
- // satisfied. (Don't early-return, since still want to consult
- // cached OCSP/CRL if available).
- policy = NoRevocationChecking();
- }
break;
case CRLSet::Result::UNKNOWN:
// CRLSet was inconclusive.
@@ -316,12 +308,7 @@ class PathBuilderDelegateImpl : public SimplePathBuilderDelegate {
private:
// Selects a revocation policy based on the CertVerifier flags and the given
// certificate chain.
- RevocationPolicy ChooseRevocationPolicy(
- const ParsedCertificateList& certs,
- bool* crlset_leaf_coverage_sufficient) {
- // The only case this is set to true is for EV.
- *crlset_leaf_coverage_sufficient = false;
-
+ RevocationPolicy ChooseRevocationPolicy(const ParsedCertificateList& certs) {
// Use hard-fail revocation checking for local trust anchors, if requested
// by the load flag and the chain uses a non-public root.
if ((flags_ & CertVerifyProc::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS) &&
@@ -329,19 +316,7 @@ class PathBuilderDelegateImpl : public SimplePathBuilderDelegate {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
- policy.allow_missing_info = false;
- policy.allow_unable_to_check = false;
- return policy;
- }
-
- // Use hard-fail revocation checking for EV certificates.
- if (verification_type_ == VerificationType::kEV) {
- // For EV verification leaf coverage is considered sufficient.
- *crlset_leaf_coverage_sufficient = true;
-
- RevocationPolicy policy;
- policy.check_revocation = true;
- policy.networking_allowed = true;
+ policy.crl_allowed = true;
policy.allow_missing_info = false;
policy.allow_unable_to_check = false;
return policy;
@@ -352,6 +327,11 @@ class PathBuilderDelegateImpl : public SimplePathBuilderDelegate {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
+ // Publicly trusted certs are required to have OCSP by the Baseline
+ // Requirements and CRLs can be quite large, so disable the fallback to
+ // CRLs for chains to known roots.
+ policy.crl_allowed =
+ !certs.empty() && !trust_store_->IsKnownRoot(certs.back().get());
policy.allow_missing_info = true;
policy.allow_unable_to_check = true;
return policy;
@@ -734,6 +714,7 @@ int CertVerifyProcBuiltin::VerifyInternal(
verify_result->cert_status |= CERT_STATUS_AUTHORITY_INVALID;
return ERR_CERT_AUTHORITY_INVALID;
}
+ absl::optional<int64_t> chrome_root_store_version_opt = absl::nullopt;
#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
int64_t chrome_root_store_version =
system_trust_store_->chrome_root_store_version();
@@ -742,11 +723,13 @@ int CertVerifyProcBuiltin::VerifyInternal(
NetLogEventType::CERT_VERIFY_PROC_CHROME_ROOT_STORE_VERSION, [&] {
return NetLogChromeRootStoreVersion(chrome_root_store_version);
});
+ chrome_root_store_version_opt = chrome_root_store_version;
}
#endif
CertVerifyProcBuiltinResultDebugData::Create(verify_result, verification_time,
- der_verification_time);
+ der_verification_time,
+ chrome_root_store_version_opt);
// Parse the target certificate.
scoped_refptr<ParsedCertificate> target;
@@ -820,12 +803,12 @@ int CertVerifyProcBuiltin::VerifyInternal(
verification_type = cur_attempt.verification_type;
net_log.BeginEvent(
NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT, [&] {
- base::Value results(base::Value::Type::DICTIONARY);
+ base::Value::Dict results;
if (verification_type == VerificationType::kEV)
- results.GetDict().Set("is_ev_attempt", true);
- results.GetDict().Set("digest_policy",
- static_cast<int>(cur_attempt.digest_policy));
- return results;
+ results.Set("is_ev_attempt", true);
+ results.Set("digest_policy",
+ static_cast<int>(cur_attempt.digest_policy));
+ return base::Value(std::move(results));
});
// If a previous attempt used up most/all of the deadline, extend the
@@ -855,16 +838,7 @@ int CertVerifyProcBuiltin::VerifyInternal(
break;
if (result.exceeded_deadline) {
- if (verification_type == VerificationType::kEV &&
- result.AnyPathContainsError(cert_errors::kUnableToCheckRevocation)) {
- // EV verification failed due to deadline exceeded and unable to check
- // revocation. Try the non-EV attempt even though the deadline has been
- // reached, since a revocation checking failure on EV should be a
- // soft-fail. (Since the non-EV attempt generally will not be using
- // revocation checking it hopefully won't hit the deadline too.)
- continue;
- }
- // Otherwise, stop immediately if an attempt exceeds the deadline.
+ // Stop immediately if an attempt exceeds the deadline.
break;
}
@@ -903,9 +877,11 @@ int CertVerifyProcBuiltin::VerifyInternal(
CertVerifyProcBuiltinResultDebugData::CertVerifyProcBuiltinResultDebugData(
base::Time verification_time,
- const der::GeneralizedTime& der_verification_time)
+ const der::GeneralizedTime& der_verification_time,
+ absl::optional<int64_t> chrome_root_store_version)
: verification_time_(verification_time),
- der_verification_time_(der_verification_time) {}
+ der_verification_time_(der_verification_time),
+ chrome_root_store_version_(chrome_root_store_version) {}
// static
const CertVerifyProcBuiltinResultDebugData*
@@ -919,11 +895,12 @@ CertVerifyProcBuiltinResultDebugData::Get(
void CertVerifyProcBuiltinResultDebugData::Create(
base::SupportsUserData* debug_data,
base::Time verification_time,
- const der::GeneralizedTime& der_verification_time) {
+ const der::GeneralizedTime& der_verification_time,
+ absl::optional<int64_t> chrome_root_store_version) {
debug_data->SetUserData(
kResultDebugDataKey,
std::make_unique<CertVerifyProcBuiltinResultDebugData>(
- verification_time, der_verification_time));
+ verification_time, der_verification_time, chrome_root_store_version));
}
std::unique_ptr<base::SupportsUserData::Data>
diff --git a/chromium/net/cert/cert_verify_proc_builtin.h b/chromium/net/cert/cert_verify_proc_builtin.h
index d0a88f66ec2..74400831b98 100644
--- a/chromium/net/cert/cert_verify_proc_builtin.h
+++ b/chromium/net/cert/cert_verify_proc_builtin.h
@@ -12,6 +12,7 @@
#include "base/time/time.h"
#include "net/base/net_export.h"
#include "net/der/parse_values.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
namespace net {
@@ -24,13 +25,15 @@ class NET_EXPORT CertVerifyProcBuiltinResultDebugData
public:
CertVerifyProcBuiltinResultDebugData(
base::Time verification_time,
- const der::GeneralizedTime& der_verification_time);
+ const der::GeneralizedTime& der_verification_time,
+ absl::optional<int64_t> chrome_root_store_version);
static const CertVerifyProcBuiltinResultDebugData* Get(
const base::SupportsUserData* debug_data);
static void Create(base::SupportsUserData* debug_data,
base::Time verification_time,
- const der::GeneralizedTime& der_verification_time);
+ const der::GeneralizedTime& der_verification_time,
+ absl::optional<int64_t> chrome_root_store_version);
// base::SupportsUserData::Data implementation:
std::unique_ptr<Data> Clone() override;
@@ -39,10 +42,14 @@ class NET_EXPORT CertVerifyProcBuiltinResultDebugData
const der::GeneralizedTime& der_verification_time() const {
return der_verification_time_;
}
+ absl::optional<int64_t> chrome_root_store_version() const {
+ return chrome_root_store_version_;
+ }
private:
base::Time verification_time_;
der::GeneralizedTime der_verification_time_;
+ absl::optional<int64_t> chrome_root_store_version_;
};
// TODO(crbug.com/649017): This is not how other cert_verify_proc_*.h are
diff --git a/chromium/net/cert/cert_verify_proc_builtin_unittest.cc b/chromium/net/cert/cert_verify_proc_builtin_unittest.cc
index c864606223c..a69e47a46e5 100644
--- a/chromium/net/cert/cert_verify_proc_builtin_unittest.cc
+++ b/chromium/net/cert/cert_verify_proc_builtin_unittest.cc
@@ -16,9 +16,9 @@
#include "net/cert/crl_set.h"
#include "net/cert/ev_root_ca_metadata.h"
#include "net/cert/internal/system_trust_store.h"
-#include "net/cert/internal/trust_store.h"
-#include "net/cert/internal/trust_store_collection.h"
-#include "net/cert/internal/trust_store_in_memory.h"
+#include "net/cert/pki/trust_store.h"
+#include "net/cert/pki/trust_store_collection.h"
+#include "net/cert/pki/trust_store_in_memory.h"
#include "net/cert_net/cert_net_fetcher_url_request.h"
#include "net/der/encode_values.h"
#include "net/log/net_log_with_source.h"
@@ -30,6 +30,7 @@
#include "net/test/embedded_test_server/http_response.h"
#include "net/test/embedded_test_server/request_handler_util.h"
#include "net/test/gtest_util.h"
+#include "net/test/revocation_builder.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_builder.h"
#include "net/url_request/url_request_test_util.h"
@@ -63,6 +64,31 @@ std::unique_ptr<test_server::HttpResponse> FailRequestAndFailTest(
return response;
}
+std::unique_ptr<test_server::HttpResponse> ServeResponse(
+ HttpStatusCode status_code,
+ const std::string& content_type,
+ const std::string& content,
+ const test_server::HttpRequest& request) {
+ auto http_response = std::make_unique<test_server::BasicHttpResponse>();
+
+ http_response->set_code(status_code);
+ http_response->set_content_type(content_type);
+ http_response->set_content(content);
+ return http_response;
+}
+
+std::string MakeRandomHexString(size_t num_bytes) {
+ std::vector<char> rand_bytes;
+ rand_bytes.resize(num_bytes);
+
+ base::RandBytes(rand_bytes.data(), rand_bytes.size());
+ return base::HexEncode(rand_bytes.data(), rand_bytes.size());
+}
+
+static std::string MakeRandomPath(base::StringPiece suffix) {
+ return "/" + MakeRandomHexString(12) + std::string(suffix);
+}
+
int VerifyOnWorkerThread(const scoped_refptr<CertVerifyProc>& verify_proc,
scoped_refptr<X509Certificate> cert,
const std::string& hostname,
@@ -91,17 +117,22 @@ class MockSystemTrustStore : public SystemTrustStore {
bool UsesSystemTrustStore() const override { return false; }
bool IsKnownRoot(const ParsedCertificate* trust_anchor) const override {
- return false;
+ return mock_is_known_root_;
}
void AddTrustStore(TrustStore* store) { trust_store_.AddTrustStore(store); }
+ void SetMockIsKnownRoot(bool is_known_root) {
+ mock_is_known_root_ = is_known_root;
+ }
+
#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
int64_t chrome_root_store_version() override { return 0; }
#endif
private:
TrustStoreCollection trust_store_;
+ bool mock_is_known_root_ = false;
};
class BlockingTrustStore : public TrustStore {
@@ -164,6 +195,18 @@ class CertVerifyProcBuiltinTest : public ::testing::Test {
base::test::TaskEnvironment& task_environment() { return task_environment_; }
void CreateChain(std::unique_ptr<CertBuilder>* out_leaf,
+ std::unique_ptr<CertBuilder>* out_root) {
+ CertBuilder::CreateSimpleChain(out_leaf, out_root);
+ ASSERT_TRUE(*out_leaf && *out_root);
+ // This test uses MOCK_TIME, so need to set the cert validity dates based
+ // on whatever the mock time happens to start at.
+ base::Time not_before = base::Time::Now() - base::Days(1);
+ base::Time not_after = base::Time::Now() + base::Days(10);
+ (*out_leaf)->SetValidity(not_before, not_after);
+ (*out_root)->SetValidity(not_before, not_after);
+ }
+
+ void CreateChain(std::unique_ptr<CertBuilder>* out_leaf,
std::unique_ptr<CertBuilder>* out_intermediate,
std::unique_ptr<CertBuilder>* out_root) {
CertBuilder::CreateSimpleChain(out_leaf, out_intermediate, out_root);
@@ -177,10 +220,32 @@ class CertVerifyProcBuiltinTest : public ::testing::Test {
(*out_root)->SetValidity(not_before, not_after);
}
+ // Creates a CRL issued and signed by |crl_issuer|, marking |revoked_serials|
+ // as revoked, and registers it to be served by the test server.
+ // Returns the full URL to retrieve the CRL from the test server.
+ GURL CreateAndServeCrl(
+ EmbeddedTestServer* test_server,
+ CertBuilder* crl_issuer,
+ const std::vector<uint64_t>& revoked_serials,
+ absl::optional<SignatureAlgorithm> signature_algorithm = absl::nullopt) {
+ std::string crl = BuildCrl(crl_issuer->GetSubject(), crl_issuer->GetKey(),
+ revoked_serials, signature_algorithm);
+ std::string crl_path = MakeRandomPath(".crl");
+ test_server->RegisterRequestHandler(
+ base::BindRepeating(&test_server::HandlePrefixedRequest, crl_path,
+ base::BindRepeating(ServeResponse, HTTP_OK,
+ "application/pkix-crl", crl)));
+ return test_server->GetURL(crl_path);
+ }
+
void AddTrustStore(TrustStore* store) {
mock_system_trust_store_->AddTrustStore(store);
}
+ void SetMockIsKnownRoot(bool is_known_root) {
+ mock_system_trust_store_->SetMockIsKnownRoot(is_known_root);
+ }
+
private:
base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME,
@@ -213,6 +278,56 @@ TEST_F(CertVerifyProcBuiltinTest, SimpleSuccess) {
EXPECT_THAT(error, IsOk());
}
+TEST_F(CertVerifyProcBuiltinTest, CRLNotCheckedForKnownRoots) {
+ std::unique_ptr<CertBuilder> leaf, root;
+ CreateChain(&leaf, &root);
+ ASSERT_TRUE(leaf && root);
+
+ EmbeddedTestServer test_server(EmbeddedTestServer::TYPE_HTTP);
+ ASSERT_TRUE(test_server.InitializeAndListen());
+
+ // CRL that marks leaf as revoked.
+ leaf->SetCrlDistributionPointUrl(
+ CreateAndServeCrl(&test_server, root.get(), {leaf->GetSerialNumber()}));
+
+ test_server.StartAcceptingConnections();
+
+ scoped_refptr<X509Certificate> chain = leaf->GetX509CertificateChain();
+ ASSERT_TRUE(chain.get());
+
+ NetLogSource verify_net_log_source;
+
+ {
+ CertVerifyResult verify_result;
+ TestCompletionCallback verify_callback;
+ Verify(chain.get(), "www.example.com",
+ CertVerifyProc::VERIFY_REV_CHECKING_ENABLED,
+ /*additional_trust_anchors=*/{root->GetX509Certificate()},
+ &verify_result, &verify_net_log_source, verify_callback.callback());
+
+ int error = verify_callback.WaitForResult();
+ EXPECT_THAT(error, IsError(ERR_CERT_REVOKED));
+ EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
+ }
+
+ {
+ // Pretend the root is a known root.
+ SetMockIsKnownRoot(true);
+ CertVerifyResult verify_result;
+ TestCompletionCallback verify_callback;
+ Verify(chain.get(), "www.example.com",
+ CertVerifyProc::VERIFY_REV_CHECKING_ENABLED,
+ /*additional_trust_anchors=*/{root->GetX509Certificate()},
+ &verify_result, &verify_net_log_source, verify_callback.callback());
+
+ int error = verify_callback.WaitForResult();
+ // CRLs are not checked for chains issued by known roots, so verification
+ // should be successful.
+ EXPECT_THAT(error, IsOk());
+ EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
+ }
+}
+
// Tests that if the verification deadline is exceeded during revocation
// checking, additional CRL fetches will not be attempted.
TEST_F(CertVerifyProcBuiltinTest, RevocationCheckDeadlineCRL) {
@@ -360,9 +475,9 @@ TEST_F(CertVerifyProcBuiltinTest, RevocationCheckDeadlineOCSP) {
}
#if defined(PLATFORM_USES_CHROMIUM_EV_METADATA)
-// Tests that if the verification deadline is exceeded during EV revocation
-// checking, the certificate is verified as non-EV.
-TEST_F(CertVerifyProcBuiltinTest, EVRevocationCheckDeadline) {
+// Tests that if we're doing EV verification, that no OCSP revocation checking
+// is done.
+TEST_F(CertVerifyProcBuiltinTest, EVNoOCSPRevocationChecks) {
std::unique_ptr<CertBuilder> leaf, intermediate, root;
CreateChain(&leaf, &intermediate, &root);
ASSERT_TRUE(leaf && intermediate && root);
@@ -372,31 +487,20 @@ TEST_F(CertVerifyProcBuiltinTest, EVRevocationCheckDeadline) {
leaf->SetCertificatePolicies({kEVTestCertPolicy});
intermediate->SetCertificatePolicies({kEVTestCertPolicy});
- const base::TimeDelta timeout_increment =
- CertNetFetcherURLRequest::GetDefaultTimeoutForTesting() +
- base::Milliseconds(1);
- const int expected_request_count =
- base::ClampFloor(GetCertVerifyProcBuiltinTimeLimitForTesting() /
- timeout_increment) +
- 1;
-
EmbeddedTestServer test_server(EmbeddedTestServer::TYPE_HTTP);
ASSERT_TRUE(test_server.InitializeAndListen());
- // Set up the test intermediate to have enough OCSP urls that if all the
- // requests hang the deadline will be exceeded.
+ // Set up the test intermediate to have an OCSP url that fails the test if
+ // called.
std::vector<GURL> ocsp_urls;
- std::vector<base::RunLoop> runloops(expected_request_count);
- for (int i = 0; i < expected_request_count; ++i) {
- std::string path = base::StringPrintf("/hung/%i", i);
- ocsp_urls.emplace_back(test_server.GetURL(path));
- test_server.RegisterRequestHandler(
- base::BindRepeating(&test_server::HandlePrefixedRequest, path,
- base::BindRepeating(&HangRequestAndCallback,
- runloops[i].QuitClosure())));
- }
+ std::string path = "/failtest";
+ ocsp_urls.emplace_back(test_server.GetURL(path));
+ test_server.RegisterRequestHandler(base::BindRepeating(
+ &test_server::HandlePrefixedRequest, path,
+ base::BindRepeating(FailRequestAndFailTest,
+ "no OCSP requests should be sent",
+ base::SequencedTaskRunnerHandle::Get())));
intermediate->SetCaIssuersAndOCSPUrls({}, ocsp_urls);
-
test_server.StartAcceptingConnections();
// Consider the root of the test chain a valid EV root for the test policy.
@@ -417,22 +521,12 @@ TEST_F(CertVerifyProcBuiltinTest, EVRevocationCheckDeadline) {
/*additional_trust_anchors=*/{root->GetX509Certificate()},
&verify_result, &verify_net_log_source, verify_callback.callback());
- for (int i = 0; i < expected_request_count; i++) {
- // Wait for request #|i| to be made.
- runloops[i].Run();
- // Advance virtual time to cause the timeout task to become runnable.
- task_environment().AdvanceClock(timeout_increment);
- }
-
- // Once |expected_request_count| requests have been made and timed out, the
- // overall deadline should be reached, causing the EV verification attempt to
- // fail.
+ // EV doesn't do revocation checking, therefore verification result
+ // should be OK and EV.
int error = verify_callback.WaitForResult();
- // EV uses soft-fail revocation checking, therefore verification result
- // should be OK but not EV.
EXPECT_THAT(error, IsOk());
- EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_IS_EV);
- EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
+ EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_IS_EV);
+ EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
auto events = net_log_observer.GetEntriesForSource(verify_net_log_source);
@@ -450,35 +544,6 @@ TEST_F(CertVerifyProcBuiltinTest, EVRevocationCheckDeadline) {
ASSERT_NE(event, events.end());
EXPECT_EQ(net::NetLogEventPhase::NONE, event->phase);
ASSERT_TRUE(event->params.is_dict());
- const std::string* errors = event->params.FindStringKey("errors");
- ASSERT_TRUE(errors);
- EXPECT_EQ("----- Certificate i=1 (CN=" +
- intermediate->GetX509Certificate()->subject().common_name +
- ") -----\nERROR: Unable to check revocation\n\n",
- *errors);
-
- event = std::find_if(++event, events.end(), [](const auto& e) {
- return e.type == NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT;
- });
- ASSERT_NE(event, events.end());
- EXPECT_EQ(net::NetLogEventPhase::END, event->phase);
- ASSERT_TRUE(event->params.is_dict());
- EXPECT_EQ(false, event->params.FindBoolKey("has_valid_path"));
-
- event = std::find_if(++event, events.end(), [](const auto& e) {
- return e.type == NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT;
- });
- ASSERT_NE(event, events.end());
- EXPECT_EQ(net::NetLogEventPhase::BEGIN, event->phase);
- ASSERT_TRUE(event->params.is_dict());
- EXPECT_EQ(absl::nullopt, event->params.FindBoolKey("is_ev_attempt"));
-
- event = std::find_if(++event, events.end(), [](const auto& e) {
- return e.type == NetLogEventType::CERT_VERIFY_PROC_PATH_BUILT;
- });
- ASSERT_NE(event, events.end());
- EXPECT_EQ(net::NetLogEventPhase::NONE, event->phase);
- ASSERT_TRUE(event->params.is_dict());
EXPECT_FALSE(event->params.FindStringKey("errors"));
event = std::find_if(++event, events.end(), [](const auto& e) {
@@ -573,4 +638,110 @@ TEST_F(CertVerifyProcBuiltinTest, DebugData) {
(time - der_verification_time_converted_back_to_base_time).InSeconds());
}
+namespace {
+
+// Returns a TLV to use as an invalid signature algorithm when building a cert.
+// This is a SEQUENCE so that it will pass the ParseCertificate code
+// and fail inside ParseSignatureAlgorithm.
+// SEQUENCE {
+// INTEGER { 42 }
+// }
+std::string InvalidSignatureAlgorithmTLV() {
+ const uint8_t kInvalidSignatureAlgorithmTLV[] = {0x30, 0x03, 0x02, 0x01,
+ 0x2a};
+ return std::string(std::begin(kInvalidSignatureAlgorithmTLV),
+ std::end(kInvalidSignatureAlgorithmTLV));
+}
+
+} // namespace
+
+TEST_F(CertVerifyProcBuiltinTest,
+ UnparsableMismatchedTBSSignatureAlgorithmTarget) {
+ std::unique_ptr<CertBuilder> leaf, root;
+ CreateChain(&leaf, &root);
+ ASSERT_TRUE(leaf && root);
+ // Set only the tbsCertificate signature to an invalid value.
+ leaf->SetTBSSignatureAlgorithmTLV(InvalidSignatureAlgorithmTLV());
+
+ // Trust the root and build a chain to verify.
+ ScopedTestRoot scoped_root(root->GetX509Certificate().get());
+ scoped_refptr<X509Certificate> chain = leaf->GetX509CertificateChain();
+ ASSERT_TRUE(chain.get());
+
+ int flags = 0;
+ CertVerifyResult verify_result;
+ NetLogSource verify_net_log_source;
+ TestCompletionCallback callback;
+ Verify(chain.get(), "www.example.com", flags, CertificateList(),
+ &verify_result, &verify_net_log_source, callback.callback());
+ int error = callback.WaitForResult();
+ // Invalid signature algorithm in the leaf cert should result in the
+ // cert being invalid.
+ EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID);
+ EXPECT_THAT(error, IsError(ERR_CERT_INVALID));
+}
+
+TEST_F(CertVerifyProcBuiltinTest,
+ UnparsableMismatchedTBSSignatureAlgorithmIntermediate) {
+ std::unique_ptr<CertBuilder> leaf, intermediate, root;
+ CreateChain(&leaf, &intermediate, &root);
+ ASSERT_TRUE(leaf && intermediate && root);
+ // Set only the tbsCertificate signature to an invalid value.
+ intermediate->SetTBSSignatureAlgorithmTLV(InvalidSignatureAlgorithmTLV());
+
+ // Trust the root and build a chain to verify that includes the intermediate.
+ ScopedTestRoot scoped_root(root->GetX509Certificate().get());
+ scoped_refptr<X509Certificate> chain = leaf->GetX509CertificateChain();
+ ASSERT_TRUE(chain.get());
+ ASSERT_EQ(chain->intermediate_buffers().size(), 1U);
+
+ int flags = 0;
+ CertVerifyResult verify_result;
+ NetLogSource verify_net_log_source;
+ TestCompletionCallback callback;
+ Verify(chain.get(), "www.example.com", flags, CertificateList(),
+ &verify_result, &verify_net_log_source, callback.callback());
+ int error = callback.WaitForResult();
+ // Invalid signature algorithm in the intermediate cert should result in the
+ // cert being invalid.
+ EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID);
+ EXPECT_THAT(error, IsError(ERR_CERT_INVALID));
+}
+
+// This test is disabled on Android as adding the invalid root through
+// ScopedTestRoot causes it to be parsed by the Java X509 code which barfs. We
+// could re-enable if Chrome on Android has fully switched to the
+// builtin-verifier and ScopedTestRoot no longer has Android-specific code.
+#if BUILDFLAG(IS_ANDROID)
+#define MAYBE_UnparsableMismatchedTBSSignatureAlgorithmRoot \
+ DISABLED_UnparsableMismatchedTBSSignatureAlgorithmRoot
+#else
+#define MAYBE_UnparsableMismatchedTBSSignatureAlgorithmRoot \
+ UnparsableMismatchedTBSSignatureAlgorithmRoot
+#endif
+TEST_F(CertVerifyProcBuiltinTest,
+ MAYBE_UnparsableMismatchedTBSSignatureAlgorithmRoot) {
+ std::unique_ptr<CertBuilder> leaf, intermediate, root;
+ CreateChain(&leaf, &intermediate, &root);
+ ASSERT_TRUE(leaf && intermediate && root);
+ // Set only the tbsCertificate signature to an invalid value.
+ root->SetTBSSignatureAlgorithmTLV(InvalidSignatureAlgorithmTLV());
+
+ // Trust the root and build a chain to verify that includes the intermediate.
+ ScopedTestRoot scoped_root(root->GetX509Certificate().get());
+ scoped_refptr<X509Certificate> chain = leaf->GetX509CertificateChain();
+ ASSERT_TRUE(chain.get());
+
+ int flags = 0;
+ CertVerifyResult verify_result;
+ NetLogSource verify_net_log_source;
+ TestCompletionCallback callback;
+ Verify(chain.get(), "www.example.com", flags, CertificateList(),
+ &verify_result, &verify_net_log_source, callback.callback());
+ int error = callback.WaitForResult();
+ // Invalid signature algorithm in the root cert should have no effect on
+ // verification.
+ EXPECT_THAT(error, IsOk());
+}
+
} // namespace net
diff --git a/chromium/net/cert/cert_verify_proc_ios.cc b/chromium/net/cert/cert_verify_proc_ios.cc
index ff02587d1b8..634266c003b 100644
--- a/chromium/net/cert/cert_verify_proc_ios.cc
+++ b/chromium/net/cert/cert_verify_proc_ios.cc
@@ -228,17 +228,9 @@ int BuildAndEvaluateSecTrustRef(CFArrayRef cert_array,
#endif
}
- ScopedCFTypeRef<CFMutableArrayRef> tmp_verified_chain(
- CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
- const CFIndex chain_length = SecTrustGetCertificateCount(tmp_trust);
- for (CFIndex i = 0; i < chain_length; ++i) {
- SecCertificateRef chain_cert = SecTrustGetCertificateAtIndex(tmp_trust, i);
- CFArrayAppendValue(tmp_verified_chain, chain_cert);
- }
-
trust_ref->swap(scoped_tmp_trust);
trust_error->swap(tmp_error);
- verified_chain->reset(tmp_verified_chain.release());
+ *verified_chain = x509_util::CertificateChainFromSecTrust(tmp_trust);
*is_trusted = tmp_is_trusted;
return OK;
}
diff --git a/chromium/net/cert/cert_verify_proc_mac.cc b/chromium/net/cert/cert_verify_proc_mac.cc
index 2da63bd1b5c..395c467be7e 100644
--- a/chromium/net/cert/cert_verify_proc_mac.cc
+++ b/chromium/net/cert/cert_verify_proc_mac.cc
@@ -29,10 +29,10 @@
#include "net/cert/crl_set.h"
#include "net/cert/ct_serialization.h"
#include "net/cert/ev_root_ca_metadata.h"
-#include "net/cert/internal/certificate_policies.h"
-#include "net/cert/internal/parsed_certificate.h"
#include "net/cert/known_roots.h"
#include "net/cert/known_roots_mac.h"
+#include "net/cert/pki/certificate_policies.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/test_keychain_search_list_mac.h"
#include "net/cert/test_root_certs.h"
#include "net/cert/x509_certificate.h"
@@ -572,7 +572,7 @@ int BuildAndEvaluateSecTrustRef(CFArrayRef cert_array,
SecTrustResultType* trust_result,
ScopedCFTypeRef<CFArrayRef>* verified_chain,
std::vector<CertEvidenceInfo>* chain_info) {
- SecTrustRef tmp_trust = NULL;
+ SecTrustRef tmp_trust = nullptr;
OSStatus status = SecTrustCreateWithCertificates(cert_array, trust_policies,
&tmp_trust);
if (status)
@@ -656,7 +656,7 @@ int BuildAndEvaluateSecTrustRef(CFArrayRef cert_array,
status = SecTrustEvaluate(tmp_trust, &tmp_trust_result);
if (status)
return NetErrorFromOSStatus(status);
- CFArrayRef tmp_verified_chain = NULL;
+ CFArrayRef tmp_verified_chain = nullptr;
CSSM_TP_APPLE_EVIDENCE_INFO* tmp_chain_info;
status = SecTrustGetResult(tmp_trust, &tmp_trust_result, &tmp_verified_chain,
&tmp_chain_info);
@@ -1143,44 +1143,10 @@ int CertVerifyProcMac::VerifyInternal(
if (!candidate_ev_policy_oid.empty() &&
CheckCertChainEV(verify_result->verified_cert.get(),
candidate_ev_policy_oid)) {
- // EV policies check out and the verification succeeded. See if revocation
- // checking still needs to be done before it can be marked as EV. Even if
- // the first verification had VERIFY_REV_CHECKING_ENABLED, verification
- // must be repeated since the previous verification was done with soft-fail
- // revocation checking.
- if (completed_chain_crl_result == kCRLSetUnknown) {
- // If this is an EV cert and it wasn't covered by CRLSets and revocation
- // checking wasn't already on, try again with revocation forced on.
- //
- // Restore the input state of |*verify_result|, so that the
- // re-verification starts with a clean slate.
- CertVerifyResult ev_verify_result = input_verify_result;
- int tmp_rv = VerifyWithGivenFlags(
- verify_result->verified_cert.get(), hostname, ocsp_response, sct_list,
- flags | VERIFY_REV_CHECKING_ENABLED,
- /*rev_checking_soft_fail=*/false, crl_set, &ev_verify_result,
- &completed_chain_crl_result);
- if (tmp_rv == OK) {
- // If EV re-verification succeeded, mark as EV and return those results.
- *verify_result = ev_verify_result;
- verify_result->cert_status |= CERT_STATUS_IS_EV;
- } else if (tmp_rv == ERR_CERT_REVOKED) {
- // This matches the historical behavior of cert_verify_proc_mac where a
- // revoked result from the EV verification attempt results in revoked
- // result overall. (Technically this may not be correct if there was a
- // different non-revoked, non-EV path that could have been built.)
- *verify_result = ev_verify_result;
- return tmp_rv;
- } else {
- // If EV was attempted, set CERT_STATUS_REV_CHECKING_ENABLED even if the
- // EV result wasn't used. This is a little weird but matches the
- // behavior of the other verifiers.
- verify_result->cert_status |= CERT_STATUS_REV_CHECKING_ENABLED;
- }
- } else {
- // EV cert and it was covered by CRLSets.
- verify_result->cert_status |= CERT_STATUS_IS_EV;
- }
+ // EV policies check out and the verification succeeded. Revocation checking
+ // may have been done, but revocation checking is not required for EV certs
+ // (see https://crbug.com/705285).
+ verify_result->cert_status |= CERT_STATUS_IS_EV;
}
LogNameNormalizationMetrics(".Mac", verify_result->verified_cert.get(),
diff --git a/chromium/net/cert/cert_verify_proc_mac_unittest.cc b/chromium/net/cert/cert_verify_proc_mac_unittest.cc
index b3dfd6b3743..908d5fccd15 100644
--- a/chromium/net/cert/cert_verify_proc_mac_unittest.cc
+++ b/chromium/net/cert/cert_verify_proc_mac_unittest.cc
@@ -84,6 +84,12 @@ TEST(CertVerifyProcMacTest, DISABLED_MacCRLIntermediate) {
TestKeychainSearchList::Create());
ASSERT_TRUE(test_keychain_search_list);
+// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
+// Removal of its use is tracked in https://crbug.com/1348251 but deprecation
+// warnings are disabled in the meanwhile.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
base::FilePath keychain_path(
GetTestCertsDirectory().AppendASCII("multi-root-BFE.keychain"));
// SecKeychainOpen does not fail if the file doesn't exist, so assert it here
@@ -97,6 +103,8 @@ TEST(CertVerifyProcMacTest, DISABLED_MacCRLIntermediate) {
base::ScopedCFTypeRef<SecKeychainRef> scoped_keychain(keychain);
test_keychain_search_list->AddKeychain(keychain);
+#pragma clang diagnostic pop
+
scoped_refptr<CRLSet> crl_set;
std::string crl_set_bytes;
// CRL which blocks C by SPKI.
@@ -147,6 +155,12 @@ TEST(CertVerifyProcMacTest, DISABLED_MacKeychainReordering) {
X509Certificate::FORMAT_AUTO);
ASSERT_TRUE(cert);
+// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
+// Removal of its use is tracked in https://crbug.com/1348251 but deprecation
+// warnings are disabled in the meanwhile.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
// Create a test keychain search list that will Always Trust the SHA1
// cross-signed VeriSign Class 3 Public Primary Certification Authority - G5
std::unique_ptr<TestKeychainSearchList> test_keychain_search_list(
@@ -166,6 +180,8 @@ TEST(CertVerifyProcMacTest, DISABLED_MacKeychainReordering) {
base::ScopedCFTypeRef<SecKeychainRef> scoped_keychain(keychain);
test_keychain_search_list->AddKeychain(keychain);
+#pragma clang diagnostic pop
+
int flags = 0;
CertVerifyResult verify_result;
scoped_refptr<CertVerifyProc> verify_proc =
@@ -184,6 +200,12 @@ TEST(CertVerifyProcMacTest, DISABLED_MacKeychainReordering) {
ASSERT_EQ(2U, verified_intermediates.size());
}
+// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
+// Removal of its use is tracked in https://crbug.com/1348251 but deprecation
+// warnings are disabled in the meanwhile.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
// Test that the system root certificate keychain is in the expected location
// and can be opened. Other tests would fail if this was not true, but this
// test makes the reason for the failure obvious.
@@ -198,6 +220,8 @@ TEST(CertVerifyProcMacTest, MacSystemRootCertificateKeychainLocation) {
CFRelease(keychain);
}
+#pragma clang diagnostic pop
+
// Test that CertVerifyProcMac reacts appropriately when Apple's certificate
// verifier rejects a certificate with a fatal error. This is a regression
// test for https://crbug.com/472291.
diff --git a/chromium/net/cert/cert_verify_proc_unittest.cc b/chromium/net/cert/cert_verify_proc_unittest.cc
index 19608b63a5c..edbe04abeda 100644
--- a/chromium/net/cert/cert_verify_proc_unittest.cc
+++ b/chromium/net/cert/cert_verify_proc_unittest.cc
@@ -34,12 +34,12 @@
#include "net/cert/cert_verify_result.h"
#include "net/cert/crl_set.h"
#include "net/cert/ev_root_ca_metadata.h"
-#include "net/cert/internal/extended_key_usage.h"
-#include "net/cert/internal/parse_certificate.h"
-#include "net/cert/internal/signature_algorithm.h"
#include "net/cert/internal/system_trust_store.h"
#include "net/cert/ocsp_revocation_status.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/extended_key_usage.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/signature_algorithm.h"
#include "net/cert/test_root_certs.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
@@ -191,16 +191,17 @@ scoped_refptr<CertVerifyProc> CreateCertVerifyProc(
switch (type) {
#if BUILDFLAG(IS_ANDROID)
case CERT_VERIFY_PROC_ANDROID:
- return new CertVerifyProcAndroid(std::move(cert_net_fetcher));
+ return base::MakeRefCounted<CertVerifyProcAndroid>(
+ std::move(cert_net_fetcher));
#elif BUILDFLAG(IS_IOS)
case CERT_VERIFY_PROC_IOS:
- return new CertVerifyProcIOS();
+ return base::MakeRefCounted<CertVerifyProcIOS>();
#elif BUILDFLAG(IS_MAC)
case CERT_VERIFY_PROC_MAC:
- return new CertVerifyProcMac();
+ return base::MakeRefCounted<CertVerifyProcMac>();
#elif BUILDFLAG(IS_WIN)
case CERT_VERIFY_PROC_WIN:
- return new CertVerifyProcWin();
+ return base::MakeRefCounted<CertVerifyProcWin>();
#endif
case CERT_VERIFY_PROC_BUILTIN:
return CreateCertVerifyProcBuiltin(std::move(cert_net_fetcher),
@@ -229,9 +230,15 @@ const std::vector<CertVerifyProcType> kAllCertVerifiers = {
#elif BUILDFLAG(IS_IOS)
CERT_VERIFY_PROC_IOS
#elif BUILDFLAG(IS_MAC)
- CERT_VERIFY_PROC_MAC, CERT_VERIFY_PROC_BUILTIN
+ CERT_VERIFY_PROC_MAC, CERT_VERIFY_PROC_BUILTIN,
+#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
+ CERT_VERIFY_PROC_BUILTIN_CHROME_ROOTS
+#endif
#elif BUILDFLAG(IS_WIN)
- CERT_VERIFY_PROC_WIN, CERT_VERIFY_PROC_BUILTIN_CHROME_ROOTS
+ CERT_VERIFY_PROC_WIN,
+#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
+ CERT_VERIFY_PROC_BUILTIN_CHROME_ROOTS
+#endif
#elif BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
CERT_VERIFY_PROC_BUILTIN
#else
@@ -622,11 +629,19 @@ TEST_P(CertVerifyProcInternalTest, TrustedIntermediateCertWithEVPolicy) {
ASSERT_EQ(3U, orig_certs.size());
for (bool trust_the_intermediate : {false, true}) {
+ SCOPED_TRACE(trust_the_intermediate);
+
// Need to build unique certs for each try otherwise caching can break
// things.
CertBuilder root(orig_certs[2]->cert_buffer(), nullptr);
+ root.SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ root.GenerateECKey();
CertBuilder intermediate(orig_certs[1]->cert_buffer(), &root);
+ intermediate.SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ intermediate.GenerateECKey();
CertBuilder leaf(orig_certs[0]->cert_buffer(), &intermediate);
+ leaf.SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ leaf.GenerateECKey();
// The policy that "explicit-policy-chain.pem" target certificate asserts.
static const char kEVTestCertPolicy[] = "1.2.3.4";
@@ -1192,8 +1207,7 @@ class CertVerifyProcInspectSignatureAlgorithmsTest : public ::testing::Test {
CertVerifyResult dummy_result;
CertVerifyResult verify_result;
- scoped_refptr<CertVerifyProc> verify_proc =
- new MockCertVerifyProc(dummy_result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(dummy_result);
return verify_proc->Verify(
chain.get(), "test.example.com", /*ocsp_response=*/std::string(),
@@ -1621,7 +1635,7 @@ TEST_P(CertVerifyProcInternalTest, TestKnownRoot) {
<< "against mattm.";
EXPECT_TRUE(verify_result.is_issued_by_known_root);
#if BUILDFLAG(IS_MAC)
- if (VerifyProcTypeIsBuiltin()) {
+ if (verify_proc_type() == CERT_VERIFY_PROC_BUILTIN) {
auto* mac_trust_debug_info =
net::TrustStoreMac::ResultDebugData::Get(&verify_result);
ASSERT_TRUE(mac_trust_debug_info);
@@ -1848,8 +1862,7 @@ TEST(CertVerifyProcTest, IntranetHostsRejected) {
// Intranet names for public CAs should be flagged:
CertVerifyResult dummy_result;
dummy_result.is_issued_by_known_root = true;
- scoped_refptr<CertVerifyProc> verify_proc =
- new MockCertVerifyProc(dummy_result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(dummy_result);
error = verify_proc->Verify(
cert.get(), "webmail", /*ocsp_response=*/std::string(),
/*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
@@ -3114,11 +3127,12 @@ class CertVerifyProcInternalWithNetFetchingTest
// Creates a CRL issued and signed by |crl_issuer|, marking |revoked_serials|
// as revoked, and registers it to be served by the test server.
// Returns the full URL to retrieve the CRL from the test server.
- GURL CreateAndServeCrl(CertBuilder* crl_issuer,
- const std::vector<uint64_t>& revoked_serials,
- DigestAlgorithm digest = DigestAlgorithm::Sha256) {
+ GURL CreateAndServeCrl(
+ CertBuilder* crl_issuer,
+ const std::vector<uint64_t>& revoked_serials,
+ absl::optional<SignatureAlgorithm> signature_algorithm = absl::nullopt) {
std::string crl = BuildCrl(crl_issuer->GetSubject(), crl_issuer->GetKey(),
- revoked_serials, digest);
+ revoked_serials, signature_algorithm);
std::string crl_path = MakeRandomPath(".crl");
return RegisterSimpleTestServerHandler(crl_path, HTTP_OK,
"application/pkix-crl", crl);
@@ -3428,8 +3442,13 @@ TEST_P(CertVerifyProcInternalWithNetFetchingTest,
// Build slightly modified variants of |orig_certs|.
CertBuilder root(orig_certs[2]->cert_buffer(), nullptr);
+ root.SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ root.GenerateECKey();
CertBuilder intermediate(orig_certs[1]->cert_buffer(), &root);
+ intermediate.GenerateECKey();
CertBuilder leaf(orig_certs[0]->cert_buffer(), &intermediate);
+ leaf.SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ leaf.GenerateECKey();
// Make the leaf certificate have an AIA (CA Issuers) that points to the
// embedded test server. This uses a random URL for predictable behavior in
@@ -3443,11 +3462,11 @@ TEST_P(CertVerifyProcInternalWithNetFetchingTest,
// that is SHA1 signed. Note that the subjectKeyIdentifier for `intermediate`
// is intentionally not changed, so that path building will consider both
// certificate paths.
- intermediate.SetSignatureAlgorithmRsaPkca1(DigestAlgorithm::Sha256);
+ intermediate.SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
intermediate.SetRandomSerialNumber();
auto intermediate_sha256 = intermediate.DupCertBuffer();
- intermediate.SetSignatureAlgorithmRsaPkca1(DigestAlgorithm::Sha1);
+ intermediate.SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha1);
intermediate.SetRandomSerialNumber();
auto intermediate_sha1 = intermediate.DupCertBuffer();
@@ -3998,9 +4017,10 @@ TEST_P(CertVerifyProcInternalWithNetFetchingTest,
intermediate->SetCrlDistributionPointUrl(CreateAndServeCrl(root.get(), {}));
// Leaf is revoked by intermediate issued CRL which is signed with
- // sha1WithRSAEncryption.
- leaf->SetCrlDistributionPointUrl(CreateAndServeCrl(
- intermediate.get(), {leaf->GetSerialNumber()}, DigestAlgorithm::Sha1));
+ // ecdsaWithSha256.
+ leaf->SetCrlDistributionPointUrl(
+ CreateAndServeCrl(intermediate.get(), {leaf->GetSerialNumber()},
+ SignatureAlgorithm::kEcdsaSha1));
// Trust the root and build a chain to verify that includes the intermediate.
ScopedTestRoot scoped_root(root->GetX509Certificate().get());
@@ -4040,11 +4060,17 @@ TEST_P(CertVerifyProcInternalWithNetFetchingTest,
// Root-issued CRL which does not revoke intermediate.
intermediate->SetCrlDistributionPointUrl(CreateAndServeCrl(root.get(), {}));
+ // This test wants to check handling of MD5 CRLs, but ecdsa-with-md5
+ // signatureAlgorithm does not exist. Use an RSA private key for intermediate
+ // so that the CRL will be signed with the md5WithRSAEncryption algorithm.
+ intermediate->GenerateRSAKey();
+ leaf->SetSignatureAlgorithm(SignatureAlgorithm::kRsaPkcs1Sha256);
// Leaf is revoked by intermediate issued CRL which is signed with
// md5WithRSAEncryption.
- leaf->SetCrlDistributionPointUrl(CreateAndServeCrl(
- intermediate.get(), {leaf->GetSerialNumber()}, DigestAlgorithm::Md5));
+ leaf->SetCrlDistributionPointUrl(
+ CreateAndServeCrl(intermediate.get(), {leaf->GetSerialNumber()},
+ SignatureAlgorithm::kRsaPkcs1Md5));
// Trust the root and build a chain to verify that includes the intermediate.
ScopedTestRoot scoped_root(root->GetX509Certificate().get());
@@ -4191,11 +4217,11 @@ TEST_P(CertVerifyProcInternalWithNetFetchingTest,
CRLSet::BuiltinCRLSet().get(), CertificateList(), &verify_result);
EXPECT_THAT(error, IsOk());
EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_IS_EV);
- EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
+ EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
// Tests that an EV cert verification with that could not retrieve online OCSP
-// revocation information is verified but not marked as CERT_STATUS_IS_EV.
+// revocation information is verified but still marked as CERT_STATUS_IS_EV.
TEST_P(CertVerifyProcInternalWithNetFetchingTest,
EVOnlineOCSPRevocationCheckingSoftFail) {
if (!SupportsEV()) {
@@ -4233,12 +4259,12 @@ TEST_P(CertVerifyProcInternalWithNetFetchingTest,
Verify(chain.get(), ocsp_test_server.host_port_pair().host(), flags,
CRLSet::BuiltinCRLSet().get(), CertificateList(), &verify_result);
EXPECT_THAT(error, IsOk());
- EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_IS_EV);
+ EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_IS_EV);
+ EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
// Tests that an EV cert verification with online OCSP returning affirmatively
-// revoked is not marked as CERT_STATUS_IS_EV. On some platforms verification
-// will fail with ERR_CERT_REVOKED.
+// revoked is marked as CERT_STATUS_IS_EV.
TEST_P(CertVerifyProcInternalWithNetFetchingTest,
EVOnlineOCSPRevocationCheckingRevoked) {
if (!SupportsEV()) {
@@ -4275,11 +4301,9 @@ TEST_P(CertVerifyProcInternalWithNetFetchingTest,
int error =
Verify(chain.get(), ocsp_test_server.host_port_pair().host(), flags,
CRLSet::BuiltinCRLSet().get(), CertificateList(), &verify_result);
- if (VerifyProcTypeIsBuiltin())
- EXPECT_THAT(error, IsOk());
- else
- EXPECT_THAT(error, IsError(ERR_CERT_REVOKED));
- EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_IS_EV);
+ EXPECT_THAT(error, IsOk());
+ EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_IS_EV);
+ EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
TEST(CertVerifyProcTest, RejectsPublicSHA1Leaves) {
@@ -4291,7 +4315,7 @@ TEST(CertVerifyProcTest, RejectsPublicSHA1Leaves) {
result.has_sha1 = true;
result.has_sha1_leaf = true;
result.is_issued_by_known_root = true;
- scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(result);
int flags = 0;
CertVerifyResult verify_result;
@@ -4312,7 +4336,7 @@ TEST(CertVerifyProcTest, RejectsPublicSHA1IntermediatesUnlessAllowed) {
result.has_sha1 = true;
result.has_sha1_leaf = false;
result.is_issued_by_known_root = true;
- scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(result);
int flags = 0;
CertVerifyResult verify_result;
@@ -4339,7 +4363,7 @@ TEST(CertVerifyProcTest, RejectsPrivateSHA1UnlessFlag) {
result.has_sha1 = true;
result.has_sha1_leaf = true;
result.is_issued_by_known_root = false;
- scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(result);
// SHA-1 should be rejected by default for private roots...
int flags = 0;
@@ -4396,7 +4420,7 @@ class CertVerifyProcWeakDigestTest
: public testing::TestWithParam<WeakDigestTestData> {
public:
CertVerifyProcWeakDigestTest() = default;
- virtual ~CertVerifyProcWeakDigestTest() = default;
+ ~CertVerifyProcWeakDigestTest() override = default;
};
// Tests that the CertVerifyProc::Verify() properly surfaces the (weak) hash
@@ -4438,8 +4462,7 @@ TEST_P(CertVerifyProcWeakDigestTest, VerifyDetectsAlgorithm) {
//
// This is sufficient for the purposes of this test, as the checking for weak
// hash algorithms is done by CertVerifyProc::Verify().
- scoped_refptr<CertVerifyProc> proc =
- new MockCertVerifyProc(CertVerifyResult());
+ auto proc = base::MakeRefCounted<MockCertVerifyProc>(CertVerifyResult());
int error = proc->Verify(ee_chain.get(), "127.0.0.1",
/*ocsp_response=*/std::string(),
/*sct_list=*/std::string(), flags,
@@ -4569,7 +4592,7 @@ class CertVerifyProcNameTest : public ::testing::Test {
ASSERT_TRUE(cert);
CertVerifyResult result;
result.is_issued_by_known_root = false;
- scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(result);
CertVerifyResult verify_result;
int error = verify_proc->Verify(
@@ -4678,7 +4701,7 @@ TEST(CertVerifyProcTest, HasTrustAnchorVerifyUMA) {
const base::HistogramBase::Sample kGTSRootR4HistogramID = 486;
- scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(result);
histograms.ExpectTotalCount(kTrustAnchorVerifyHistogram, 0);
@@ -4726,7 +4749,7 @@ TEST(CertVerifyProcTest, LogsOnlyMostSpecificTrustAnchorUMA) {
const base::HistogramBase::Sample kGTSRootR3HistogramID = 485;
- scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(result);
histograms.ExpectTotalCount(kTrustAnchorVerifyHistogram, 0);
@@ -4764,7 +4787,7 @@ TEST(CertVerifyProcTest, HasTrustAnchorVerifyOutOfDateUMA) {
result.public_key_hashes.push_back(HashValue(root_hash));
result.is_issued_by_known_root = true;
- scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(result);
histograms.ExpectTotalCount(kTrustAnchorVerifyHistogram, 0);
histograms.ExpectTotalCount(kTrustAnchorVerifyOutOfDateHistogram, 0);
@@ -4797,7 +4820,7 @@ TEST(CertVerifyProcTest, DoesNotRecalculateStapledOCSPResult) {
result.ocsp_result.response_status = OCSPVerifyResult::PROVIDED;
result.ocsp_result.revocation_status = OCSPRevocationStatus::GOOD;
- scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(result);
int flags = 0;
CertVerifyResult verify_result;
@@ -4828,7 +4851,7 @@ TEST(CertVerifyProcTest, CalculateStapledOCSPResultIfNotAlreadyDone) {
EXPECT_EQ(OCSPRevocationStatus::UNKNOWN,
result.ocsp_result.revocation_status);
- scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result);
+ auto verify_proc = base::MakeRefCounted<MockCertVerifyProc>(result);
int flags = 0;
CertVerifyResult verify_result;
diff --git a/chromium/net/cert/cert_verify_proc_win.cc b/chromium/net/cert/cert_verify_proc_win.cc
index 3ab050f51f1..9d767d0e216 100644
--- a/chromium/net/cert/cert_verify_proc_win.cc
+++ b/chromium/net/cert/cert_verify_proc_win.cc
@@ -285,7 +285,7 @@ void GetCertChainInfo(PCCERT_CHAIN_CONTEXT chain_context,
NULL, X509_ASN_ENCODING, CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT,
const_cast<PCERT_CONTEXT>(cert),
CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT,
- const_cast<PCERT_CONTEXT>(issuer), 0, NULL)) {
+ const_cast<PCERT_CONTEXT>(issuer), 0, nullptr)) {
verify_result->cert_status |= CERT_STATUS_INVALID;
break;
}
@@ -453,7 +453,7 @@ CRLSetResult CheckRevocationWithCRLSet(CRLSet* crl_set,
// Compute the subject's serial.
const CRYPT_INTEGER_BLOB* serial_blob =
&subject_cert->pCertInfo->SerialNumber;
- std::unique_ptr<uint8_t[]> serial_bytes(new uint8_t[serial_blob->cbData]);
+ auto serial_bytes = std::make_unique<uint8_t[]>(serial_blob->cbData);
// The bytes of the serial number are stored little-endian.
// Note: While MSDN implies that bytes are stripped from this serial,
// they are not - only CertCompareIntegerBlob actually removes bytes.
@@ -1055,9 +1055,9 @@ CertVerifyProcWin::ResultDebugData::Clone() {
return std::make_unique<ResultDebugData>(*this);
}
-CertVerifyProcWin::CertVerifyProcWin() {}
+CertVerifyProcWin::CertVerifyProcWin() = default;
-CertVerifyProcWin::~CertVerifyProcWin() {}
+CertVerifyProcWin::~CertVerifyProcWin() = default;
bool CertVerifyProcWin::SupportsAdditionalTrustAnchors() const {
return false;
@@ -1250,26 +1250,11 @@ int CertVerifyProcWin::VerifyInternal(
if (crl_set_result == kCRLSetRevoked) {
verify_result->cert_status |= CERT_STATUS_REVOKED;
- } else if (crl_set_result == kCRLSetUnknown && !rev_checking_enabled &&
- ev_policy_oid) {
- // We don't have fresh information about this chain from the CRLSet and
- // it's probably an EV certificate. Retry with online revocation checking.
- rev_checking_enabled = true;
- chain_flags &= ~CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY;
- verify_result->cert_status |= CERT_STATUS_REV_CHECKING_ENABLED;
-
- CertFreeCertificateChain(chain_context);
- if (!CertGetCertificateChain(chain_engine.get(), cert_list.get(),
- nullptr, // current system time
- cert_list->hCertStore, &chain_para,
- chain_flags,
- nullptr, // reserved
- &chain_context)) {
- verify_result->cert_status |= CERT_STATUS_INVALID;
- return MapSecurityError(GetLastError());
- }
}
+ // Even if the cert is possibly EV and crl_set_result == kCRLSetUnknown, we
+ // don't check with online revocation checking enabled. See crbug.com/1268848.
+
if (chain_context->TrustStatus.dwErrorStatus &
CERT_TRUST_IS_NOT_VALID_FOR_USAGE) {
// Could not verify the cert with the EV policy. Remove the EV policy and
diff --git a/chromium/net/cert/client_cert_verifier.h b/chromium/net/cert/client_cert_verifier.h
index 8c49a63232f..b29d61875ba 100644
--- a/chromium/net/cert/client_cert_verifier.h
+++ b/chromium/net/cert/client_cert_verifier.h
@@ -19,16 +19,16 @@ class NET_EXPORT ClientCertVerifier {
public:
class Request {
public:
- Request() {}
+ Request() = default;
Request(const Request&) = delete;
Request& operator=(const Request&) = delete;
// Destruction of the Request cancels it.
- virtual ~Request() {}
+ virtual ~Request() = default;
};
- virtual ~ClientCertVerifier() {}
+ virtual ~ClientCertVerifier() = default;
// Verifies the given certificate as a client certificate.
// Returns OK if successful or an error code upon failure.
diff --git a/chromium/net/cert/crl_set.cc b/chromium/net/cert/crl_set.cc
index cc9e6c50f6c..d60b386396f 100644
--- a/chromium/net/cert/crl_set.cc
+++ b/chromium/net/cert/crl_set.cc
@@ -177,7 +177,7 @@ bool CopyHashToHashesMapFromHeader(
std::vector<std::string> allowed_spkis;
for (const auto& j : i.second.GetList()) {
- allowed_spkis.push_back(std::string());
+ allowed_spkis.emplace_back();
if (!j.is_string() ||
!base::Base64Decode(j.GetString(), &allowed_spkis.back())) {
return false;
@@ -236,7 +236,7 @@ bool CRLSet::Parse(base::StringPiece data, scoped_refptr<CRLSet>* out_crl_set) {
if (not_after < 0)
return false;
- scoped_refptr<CRLSet> crl_set(new CRLSet());
+ auto crl_set = base::WrapRefCounted(new CRLSet());
crl_set->sequence_ = static_cast<uint32_t>(*sequence);
crl_set->not_after_ = static_cast<uint64_t>(not_after);
crl_set->crls_.reserve(64); // Value observed experimentally.
@@ -276,13 +276,13 @@ bool CRLSet::Parse(base::StringPiece data, scoped_refptr<CRLSet>* out_crl_set) {
// Defines kSPKIBlockList and kKnownInterceptionList
#include "net/cert/cert_verify_proc_blocklist.inc"
for (const auto& hash : kSPKIBlockList) {
- crl_set->blocked_spkis_.push_back(std::string(
- reinterpret_cast<const char*>(hash), crypto::kSHA256Length));
+ crl_set->blocked_spkis_.emplace_back(reinterpret_cast<const char*>(hash),
+ crypto::kSHA256Length);
}
for (const auto& hash : kKnownInterceptionList) {
- crl_set->known_interception_spkis_.push_back(std::string(
- reinterpret_cast<const char*>(hash), crypto::kSHA256Length));
+ crl_set->known_interception_spkis_.emplace_back(
+ reinterpret_cast<const char*>(hash), crypto::kSHA256Length);
}
// Sort, as these will be std::binary_search()'d.
@@ -435,7 +435,7 @@ scoped_refptr<CRLSet> CRLSet::ForTesting(
OPENSSL_free(x501_data);
}
- scoped_refptr<CRLSet> crl_set(new CRLSet);
+ auto crl_set = base::WrapRefCounted(new CRLSet());
crl_set->sequence_ = 0;
if (is_expired)
crl_set->not_after_ = 1;
diff --git a/chromium/net/cert/ct_log_response_parser.cc b/chromium/net/cert/ct_log_response_parser.cc
index 1d92485a1e3..614a56b252f 100644
--- a/chromium/net/cert/ct_log_response_parser.cc
+++ b/chromium/net/cert/ct_log_response_parser.cc
@@ -15,9 +15,7 @@
#include "net/cert/ct_serialization.h"
#include "net/cert/signed_tree_head.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
namespace {
@@ -128,6 +126,4 @@ bool FillConsistencyProof(const base::Value& json_consistency_proof,
return true;
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/ct_log_response_parser.h b/chromium/net/cert/ct_log_response_parser.h
index 403f8bfb050..c5ece4ef53a 100644
--- a/chromium/net/cert/ct_log_response_parser.h
+++ b/chromium/net/cert/ct_log_response_parser.h
@@ -15,9 +15,7 @@ namespace base {
class Value;
} // namespace base
-namespace net {
-
-namespace ct {
+namespace net::ct {
struct SignedTreeHead;
// Fills in |signed_tree_head| from its JSON representation in
@@ -31,7 +29,5 @@ NET_EXPORT bool FillConsistencyProof(
const base::Value& json_signed_tree_head,
std::vector<std::string>* consistency_proof);
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_CT_LOG_RESPONSE_PARSER_H_
diff --git a/chromium/net/cert/ct_log_response_parser_unittest.cc b/chromium/net/cert/ct_log_response_parser_unittest.cc
index b3ed665947a..ce479ef99ad 100644
--- a/chromium/net/cert/ct_log_response_parser_unittest.cc
+++ b/chromium/net/cert/ct_log_response_parser_unittest.cc
@@ -16,9 +16,7 @@
#include "net/test/ct_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
TEST(CTLogResponseParserTest, ParsesValidJsonSTH) {
absl::optional<base::Value> sample_sth_json =
@@ -154,6 +152,4 @@ TEST(CTLogResponseParserTest, ParsesProofJsonWithExtraFields) {
EXPECT_TRUE(FillConsistencyProof(*badly_encoded, &output));
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/ct_log_verifier.cc b/chromium/net/cert/ct_log_verifier.cc
index 7d6fcca74fd..f231491fa81 100644
--- a/chromium/net/cert/ct_log_verifier.cc
+++ b/chromium/net/cert/ct_log_verifier.cc
@@ -59,8 +59,7 @@ const EVP_MD* GetEvpAlg(ct::DigitallySigned::HashAlgorithm alg) {
scoped_refptr<const CTLogVerifier> CTLogVerifier::Create(
const base::StringPiece& public_key,
std::string description) {
- scoped_refptr<CTLogVerifier> result(
- new CTLogVerifier(std::move(description)));
+ auto result = base::WrapRefCounted(new CTLogVerifier(std::move(description)));
if (!result->Init(public_key))
return nullptr;
return result;
@@ -284,7 +283,7 @@ bool CTLogVerifier::Init(const base::StringPiece& public_key) {
// Right now, only RSASSA-PKCS1v15 with SHA-256 and ECDSA with SHA-256 are
// supported.
- switch (EVP_PKEY_type(public_key_->type)) {
+ switch (EVP_PKEY_id(public_key_)) {
case EVP_PKEY_RSA:
hash_algorithm_ = ct::DigitallySigned::HASH_ALGO_SHA256;
signature_algorithm_ = ct::DigitallySigned::SIG_ALGO_RSA;
diff --git a/chromium/net/cert/ct_log_verifier_unittest.cc b/chromium/net/cert/ct_log_verifier_unittest.cc
index f54e071d2b5..2faf373297c 100644
--- a/chromium/net/cert/ct_log_verifier_unittest.cc
+++ b/chromium/net/cert/ct_log_verifier_unittest.cc
@@ -256,7 +256,7 @@ void CheckVerifyAuditProof(const CTLogVerifier& log,
}
wrong_proof = proof;
- wrong_proof.push_back(std::string());
+ wrong_proof.emplace_back();
EXPECT_FALSE(
VerifyAuditProof(log, leaf, tree_size, wrong_proof, root_hash, leaf_hash))
<< "proof passed verification with an empty node appended";
@@ -275,7 +275,7 @@ void CheckVerifyAuditProof(const CTLogVerifier& log,
}
wrong_proof.clear();
- wrong_proof.push_back(std::string());
+ wrong_proof.emplace_back();
wrong_proof.insert(wrong_proof.end(), proof.begin(), proof.end());
EXPECT_FALSE(
VerifyAuditProof(log, leaf, tree_size, wrong_proof, root_hash, leaf_hash))
@@ -355,7 +355,7 @@ void CheckVerifyConsistencyProof(const CTLogVerifier& log,
}
wrong_proof = proof;
- wrong_proof.push_back(std::string());
+ wrong_proof.emplace_back();
EXPECT_FALSE(VerifyConsistencyProof(log, old_tree_size, old_root,
new_tree_size, new_root, wrong_proof))
<< "proof passed verification with empty node appended";
@@ -372,7 +372,7 @@ void CheckVerifyConsistencyProof(const CTLogVerifier& log,
<< "proof passed verification with last node missing";
wrong_proof.clear();
- wrong_proof.push_back(std::string());
+ wrong_proof.emplace_back();
wrong_proof.insert(wrong_proof.end(), proof.begin(), proof.end());
EXPECT_FALSE(VerifyConsistencyProof(log, old_tree_size, old_root,
new_tree_size, new_root, wrong_proof))
diff --git a/chromium/net/cert/ct_log_verifier_util.cc b/chromium/net/cert/ct_log_verifier_util.cc
index 402fd0c59f3..0a74dac7b32 100644
--- a/chromium/net/cert/ct_log_verifier_util.cc
+++ b/chromium/net/cert/ct_log_verifier_util.cc
@@ -10,11 +10,7 @@
#include "crypto/secure_hash.h"
#include "crypto/sha2.h"
-namespace net {
-
-namespace ct {
-
-namespace internal {
+namespace net::ct::internal {
std::string HashNodes(const std::string& lh, const std::string& rh) {
std::unique_ptr<crypto::SecureHash> hash(
@@ -30,8 +26,4 @@ std::string HashNodes(const std::string& lh, const std::string& rh) {
return result;
}
-} // namespace internal
-
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct::internal
diff --git a/chromium/net/cert/ct_log_verifier_util.h b/chromium/net/cert/ct_log_verifier_util.h
index 2e62d1a7a3d..2149e942cff 100644
--- a/chromium/net/cert/ct_log_verifier_util.h
+++ b/chromium/net/cert/ct_log_verifier_util.h
@@ -11,20 +11,12 @@
#include "net/base/net_export.h"
-namespace net {
-
-namespace ct {
-
-namespace internal {
+namespace net::ct::internal {
// Hash |lh| and |rh| to produce a node hash according to
// http://tools.ietf.org/html/rfc6962#section-2.1
NET_EXPORT std::string HashNodes(const std::string& lh, const std::string& rh);
-} // namespace internal
-
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct::internal
#endif // NET_CERT_CT_LOG_VERIFIER_UTIL_H_
diff --git a/chromium/net/cert/ct_objects_extractor.cc b/chromium/net/cert/ct_objects_extractor.cc
index 4021ec7a524..25ccf2d2986 100644
--- a/chromium/net/cert/ct_objects_extractor.cc
+++ b/chromium/net/cert/ct_objects_extractor.cc
@@ -17,9 +17,7 @@
#include "third_party/boringssl/src/include/openssl/bytestring.h"
#include "third_party/boringssl/src/include/openssl/mem.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
namespace {
@@ -425,6 +423,4 @@ bool ExtractSCTListFromOCSPResponse(const CRYPTO_BUFFER* issuer,
sizeof(kOCSPExtensionOid), sct_list);
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/ct_objects_extractor.h b/chromium/net/cert/ct_objects_extractor.h
index e18a84a5ac5..d51ddbaf103 100644
--- a/chromium/net/cert/ct_objects_extractor.h
+++ b/chromium/net/cert/ct_objects_extractor.h
@@ -11,9 +11,7 @@
#include "net/base/net_export.h"
#include "net/cert/x509_certificate.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
struct SignedEntryData;
@@ -57,8 +55,6 @@ NET_EXPORT_PRIVATE bool ExtractSCTListFromOCSPResponse(
base::StringPiece ocsp_response,
std::string* sct_list);
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_CT_OBJECTS_EXTRACTOR_H_
diff --git a/chromium/net/cert/ct_objects_extractor_unittest.cc b/chromium/net/cert/ct_objects_extractor_unittest.cc
index aee5b069f83..56e42cedd19 100644
--- a/chromium/net/cert/ct_objects_extractor_unittest.cc
+++ b/chromium/net/cert/ct_objects_extractor_unittest.cc
@@ -14,9 +14,7 @@
#include "net/test/test_data_directory.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
class CTObjectsExtractorTest : public ::testing::Test {
public:
@@ -191,6 +189,4 @@ TEST_F(CTObjectsExtractorTest, ExtractSCTListFromOCSPResponseMatchesIssuer) {
&extracted_sct_list));
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/ct_policy_status.h b/chromium/net/cert/ct_policy_status.h
index c67269724df..bb077c226db 100644
--- a/chromium/net/cert/ct_policy_status.h
+++ b/chromium/net/cert/ct_policy_status.h
@@ -5,9 +5,7 @@
#ifndef NET_CERT_CT_POLICY_STATUS_H_
#define NET_CERT_CT_POLICY_STATUS_H_
-namespace net {
-
-namespace ct {
+namespace net::ct {
// Information about the connection's compliance with the CT policy. This value
// is histogrammed, so do not re-order or change values, and add new values at
@@ -30,8 +28,6 @@ enum class CTPolicyCompliance {
CT_POLICY_COUNT
};
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_CT_POLICY_STATUS_H_
diff --git a/chromium/net/cert/ct_sct_to_string.cc b/chromium/net/cert/ct_sct_to_string.cc
index 211f7ea264a..43d863466ba 100644
--- a/chromium/net/cert/ct_sct_to_string.cc
+++ b/chromium/net/cert/ct_sct_to_string.cc
@@ -7,9 +7,7 @@
#include "base/logging.h"
#include "base/notreached.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
const std::string HashAlgorithmToString(
DigitallySigned::HashAlgorithm hashAlgorithm) {
@@ -77,6 +75,4 @@ const std::string StatusToString(SCTVerifyStatus status) {
return "Unknown";
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/ct_sct_to_string.h b/chromium/net/cert/ct_sct_to_string.h
index 5dc77962190..d22ecec7487 100644
--- a/chromium/net/cert/ct_sct_to_string.h
+++ b/chromium/net/cert/ct_sct_to_string.h
@@ -11,12 +11,10 @@
#include "net/cert/sct_status_flags.h"
#include "net/cert/signed_certificate_timestamp.h"
-namespace net {
-
// Functions for converting non-string attributes of
// net::ct::SignedCertificateTimestamp and net::ct::SCTVerifyStatus values to
// strings.
-namespace ct {
+namespace net::ct {
// Returns a textual representation of |hash_algorithm|.
NET_EXPORT const std::string HashAlgorithmToString(
@@ -33,8 +31,6 @@ NET_EXPORT const std::string SignatureAlgorithmToString(
// Returns a textual representation of |status|.
NET_EXPORT const std::string StatusToString(SCTVerifyStatus status);
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_CT_SCT_TO_STRING_H_
diff --git a/chromium/net/cert/ct_serialization.cc b/chromium/net/cert/ct_serialization.cc
index 0059979ed54..1147a3785fc 100644
--- a/chromium/net/cert/ct_serialization.cc
+++ b/chromium/net/cert/ct_serialization.cc
@@ -12,9 +12,7 @@
#include "net/cert/signed_tree_head.h"
#include "third_party/boringssl/src/include/openssl/bytestring.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
namespace {
@@ -320,8 +318,7 @@ bool DecodeSCTList(base::StringPiece input,
bool DecodeSignedCertificateTimestamp(
base::StringPiece* input,
scoped_refptr<SignedCertificateTimestamp>* output) {
- scoped_refptr<SignedCertificateTimestamp> result(
- new SignedCertificateTimestamp());
+ auto result = base::MakeRefCounted<SignedCertificateTimestamp>();
uint8_t version;
CBS input_cbs;
CBS_init(&input_cbs, reinterpret_cast<const uint8_t*>(input->data()),
@@ -401,6 +398,4 @@ bool EncodeSCTListForTesting(const base::StringPiece& sct,
return true;
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/ct_serialization.h b/chromium/net/cert/ct_serialization.h
index dcfa3fca9e4..37003245209 100644
--- a/chromium/net/cert/ct_serialization.h
+++ b/chromium/net/cert/ct_serialization.h
@@ -13,11 +13,9 @@
#include "base/time/time.h"
#include "net/base/net_export.h"
-namespace net {
-
// Utility functions for encoding/decoding structures used by Certificate
// Transparency to/from the TLS wire format encoding.
-namespace ct {
+namespace net::ct {
struct DigitallySigned;
struct MerkleTreeLeaf;
@@ -97,8 +95,6 @@ NET_EXPORT bool EncodeSignedCertificateTimestamp(
// Writes an SCTList into |output|, containing a single |sct|.
NET_EXPORT_PRIVATE bool EncodeSCTListForTesting(const base::StringPiece& sct,
std::string* output);
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_CT_SERIALIZATION_H_
diff --git a/chromium/net/cert/ct_signed_certificate_timestamp_log_param.cc b/chromium/net/cert/ct_signed_certificate_timestamp_log_param.cc
index 1ada1a9b7a6..5721f68f589 100644
--- a/chromium/net/cert/ct_signed_certificate_timestamp_log_param.cc
+++ b/chromium/net/cert/ct_signed_certificate_timestamp_log_param.cc
@@ -73,11 +73,11 @@ base::Value SCTListToPrintableValues(
base::Value NetLogSignedCertificateTimestampParams(
const SignedCertificateTimestampAndStatusList* scts) {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
- dict.GetDict().Set("scts", SCTListToPrintableValues(*scts));
+ dict.Set("scts", SCTListToPrintableValues(*scts));
- return dict;
+ return base::Value(std::move(dict));
}
base::Value NetLogRawSignedCertificateTimestampParams(
diff --git a/chromium/net/cert/ct_verifier.h b/chromium/net/cert/ct_verifier.h
index 63c0923bc43..a0103c9e9f9 100644
--- a/chromium/net/cert/ct_verifier.h
+++ b/chromium/net/cert/ct_verifier.h
@@ -17,7 +17,7 @@ class X509Certificate;
// Interface for verifying Signed Certificate Timestamps over a certificate.
class NET_EXPORT CTVerifier {
public:
- virtual ~CTVerifier() {}
+ virtual ~CTVerifier() = default;
// Verifies SCTs embedded in the certificate itself, SCTs embedded in a
// stapled OCSP response, and SCTs obtained via the
diff --git a/chromium/net/cert/internal/cert_issuer_source_aia.cc b/chromium/net/cert/internal/cert_issuer_source_aia.cc
index d7c07c18d0c..22411efff84 100644
--- a/chromium/net/cert/internal/cert_issuer_source_aia.cc
+++ b/chromium/net/cert/internal/cert_issuer_source_aia.cc
@@ -8,8 +8,8 @@
#include "base/logging.h"
#include "base/strings/string_piece.h"
#include "net/cert/cert_net_fetcher.h"
-#include "net/cert/internal/cert_errors.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/cert_errors.h"
#include "net/cert/x509_util.h"
#include "url/gurl.h"
@@ -195,7 +195,7 @@ void CertIssuerSourceAia::AsyncGetIssuersOf(const ParsedCertificate* cert,
if (urls.empty())
return;
- std::unique_ptr<AiaRequest> aia_request(new AiaRequest());
+ auto aia_request = std::make_unique<AiaRequest>();
for (const auto& url : urls) {
// TODO(mattm): add synchronous failure mode to FetchCaIssuers interface so
diff --git a/chromium/net/cert/internal/cert_issuer_source_aia.h b/chromium/net/cert/internal/cert_issuer_source_aia.h
index 1503d435de1..4247bc50a73 100644
--- a/chromium/net/cert/internal/cert_issuer_source_aia.h
+++ b/chromium/net/cert/internal/cert_issuer_source_aia.h
@@ -7,7 +7,7 @@
#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/cert_issuer_source.h"
+#include "net/cert/pki/cert_issuer_source.h"
namespace net {
diff --git a/chromium/net/cert/internal/cert_issuer_source_aia_unittest.cc b/chromium/net/cert/internal/cert_issuer_source_aia_unittest.cc
index 67d7eeeebb5..344ad413f84 100644
--- a/chromium/net/cert/internal/cert_issuer_source_aia_unittest.cc
+++ b/chromium/net/cert/internal/cert_issuer_source_aia_unittest.cc
@@ -7,10 +7,10 @@
#include <memory>
#include "base/files/file_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/test_helpers.h"
#include "net/cert/mock_cert_net_fetcher.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "net/test/test_data_directory.h"
@@ -194,8 +194,7 @@ TEST(CertIssuerSourceAiaTest, OneInvalidOneHttpAia) {
scoped_refptr<ParsedCertificate> intermediate_cert;
ASSERT_TRUE(ReadTestCert("i2.pem", &intermediate_cert));
- scoped_refptr<StrictMock<MockCertNetFetcher>> mock_fetcher(
- new StrictMock<MockCertNetFetcher>());
+ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
EXPECT_CALL(*mock_fetcher,
FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _))
@@ -229,8 +228,7 @@ TEST(CertIssuerSourceAiaTest, TwoAiaCompletedInSeries) {
scoped_refptr<ParsedCertificate> intermediate_cert2;
ASSERT_TRUE(ReadTestCert("i2.pem", &intermediate_cert2));
- scoped_refptr<StrictMock<MockCertNetFetcher>> mock_fetcher(
- new StrictMock<MockCertNetFetcher>());
+ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
EXPECT_CALL(*mock_fetcher,
FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _))
@@ -271,8 +269,7 @@ TEST(CertIssuerSourceAiaTest, OneAiaHttpError) {
scoped_refptr<ParsedCertificate> cert;
ASSERT_TRUE(ReadTestCert("target_one_aia.pem", &cert));
- scoped_refptr<StrictMock<MockCertNetFetcher>> mock_fetcher(
- new StrictMock<MockCertNetFetcher>());
+ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
// HTTP request returns with an error.
EXPECT_CALL(*mock_fetcher,
@@ -296,8 +293,7 @@ TEST(CertIssuerSourceAiaTest, OneAiaParseError) {
scoped_refptr<ParsedCertificate> cert;
ASSERT_TRUE(ReadTestCert("target_one_aia.pem", &cert));
- scoped_refptr<StrictMock<MockCertNetFetcher>> mock_fetcher(
- new StrictMock<MockCertNetFetcher>());
+ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
// HTTP request returns invalid certificate data.
EXPECT_CALL(*mock_fetcher,
@@ -324,8 +320,7 @@ TEST(CertIssuerSourceAiaTest, TwoAiaCompletedInSeriesFirstFails) {
scoped_refptr<ParsedCertificate> intermediate_cert2;
ASSERT_TRUE(ReadTestCert("i2.pem", &intermediate_cert2));
- scoped_refptr<StrictMock<MockCertNetFetcher>> mock_fetcher(
- new StrictMock<MockCertNetFetcher>());
+ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
// Request for I.cer completes first, but fails.
EXPECT_CALL(*mock_fetcher,
@@ -364,8 +359,7 @@ TEST(CertIssuerSourceAiaTest, TwoAiaCompletedInSeriesSecondFails) {
scoped_refptr<ParsedCertificate> intermediate_cert;
ASSERT_TRUE(ReadTestCert("i.pem", &intermediate_cert));
- scoped_refptr<StrictMock<MockCertNetFetcher>> mock_fetcher(
- new StrictMock<MockCertNetFetcher>());
+ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
// Request for I.cer completes first.
EXPECT_CALL(*mock_fetcher,
@@ -402,8 +396,7 @@ TEST(CertIssuerSourceAiaTest, MaxFetchesPerCert) {
scoped_refptr<ParsedCertificate> cert;
ASSERT_TRUE(ReadTestCert("target_six_aia.pem", &cert));
- scoped_refptr<StrictMock<MockCertNetFetcher>> mock_fetcher(
- new StrictMock<MockCertNetFetcher>());
+ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
std::vector<uint8_t> bad_der({1, 2, 3, 4, 5});
diff --git a/chromium/net/cert/internal/cert_issuer_source_sync_unittest.cc b/chromium/net/cert/internal/cert_issuer_source_sync_unittest.cc
index 94ee55c6685..da758ca71d9 100644
--- a/chromium/net/cert/internal/cert_issuer_source_sync_unittest.cc
+++ b/chromium/net/cert/internal/cert_issuer_source_sync_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/cert_issuer_source_sync_unittest.h"
+#include "net/cert/pki/cert_issuer_source_sync_unittest.h"
namespace net {
diff --git a/chromium/net/cert/internal/crl_getcrlstatusforcert_fuzzer.cc b/chromium/net/cert/internal/crl_getcrlstatusforcert_fuzzer.cc
index 56bb3bf05ad..06a1321bfdd 100644
--- a/chromium/net/cert/internal/crl_getcrlstatusforcert_fuzzer.cc
+++ b/chromium/net/cert/internal/crl_getcrlstatusforcert_fuzzer.cc
@@ -6,7 +6,7 @@
#include <stdint.h>
#include "crypto/sha2.h"
-#include "net/cert/internal/crl.h"
+#include "net/cert/pki/crl.h"
#include "net/der/input.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/crl_parse_crl_certificatelist_fuzzer.cc b/chromium/net/cert/internal/crl_parse_crl_certificatelist_fuzzer.cc
index e8f0724516e..b90164de4b3 100644
--- a/chromium/net/cert/internal/crl_parse_crl_certificatelist_fuzzer.cc
+++ b/chromium/net/cert/internal/crl_parse_crl_certificatelist_fuzzer.cc
@@ -7,7 +7,7 @@
#include <tuple>
-#include "net/cert/internal/crl.h"
+#include "net/cert/pki/crl.h"
#include "net/der/input.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/crl_parse_crl_tbscertlist_fuzzer.cc b/chromium/net/cert/internal/crl_parse_crl_tbscertlist_fuzzer.cc
index df64f7b8703..4a82b035e43 100644
--- a/chromium/net/cert/internal/crl_parse_crl_tbscertlist_fuzzer.cc
+++ b/chromium/net/cert/internal/crl_parse_crl_tbscertlist_fuzzer.cc
@@ -7,7 +7,7 @@
#include <tuple>
-#include "net/cert/internal/crl.h"
+#include "net/cert/pki/crl.h"
#include "net/der/input.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/crl_parse_issuing_distribution_point_fuzzer.cc b/chromium/net/cert/internal/crl_parse_issuing_distribution_point_fuzzer.cc
index 24bce9866f8..e4aaeb00308 100644
--- a/chromium/net/cert/internal/crl_parse_issuing_distribution_point_fuzzer.cc
+++ b/chromium/net/cert/internal/crl_parse_issuing_distribution_point_fuzzer.cc
@@ -5,7 +5,7 @@
#include <stddef.h>
#include <stdint.h>
-#include "net/cert/internal/crl.h"
+#include "net/cert/pki/crl.h"
#include "net/der/input.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/crl_unittest.cc b/chromium/net/cert/internal/crl_unittest.cc
index c80de5708eb..b1f9ee7ca98 100644
--- a/chromium/net/cert/internal/crl_unittest.cc
+++ b/chromium/net/cert/internal/crl_unittest.cc
@@ -2,13 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/crl.h"
+#include "net/cert/pki/crl.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/test_helpers.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
diff --git a/chromium/net/cert/internal/general_names_unittest.cc b/chromium/net/cert/internal/general_names_unittest.cc
index 41cf5ba249f..927b4f574c5 100644
--- a/chromium/net/cert/internal/general_names_unittest.cc
+++ b/chromium/net/cert/internal/general_names_unittest.cc
@@ -2,10 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/general_names.h"
+#include "net/cert/pki/general_names.h"
#include "base/strings/string_util.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/test_helpers.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
diff --git a/chromium/net/cert/internal/parse_authority_key_identifier_fuzzer.cc b/chromium/net/cert/internal/parse_authority_key_identifier_fuzzer.cc
index 8448bb29c4a..e3deecab6e1 100644
--- a/chromium/net/cert/internal/parse_authority_key_identifier_fuzzer.cc
+++ b/chromium/net/cert/internal/parse_authority_key_identifier_fuzzer.cc
@@ -7,7 +7,7 @@
#include <tuple>
-#include "net/cert/internal/parse_certificate.h"
+#include "net/cert/pki/parse_certificate.h"
#include "net/der/input.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/revocation_checker.cc b/chromium/net/cert/internal/revocation_checker.cc
index 9d215ee47a9..174c2287c2f 100644
--- a/chromium/net/cert/internal/revocation_checker.cc
+++ b/chromium/net/cert/internal/revocation_checker.cc
@@ -10,12 +10,12 @@
#include "base/strings/string_piece.h"
#include "crypto/sha2.h"
#include "net/cert/cert_net_fetcher.h"
-#include "net/cert/internal/common_cert_errors.h"
-#include "net/cert/internal/crl.h"
-#include "net/cert/internal/ocsp.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/trust_store.h"
#include "net/cert/ocsp_verify_result.h"
+#include "net/cert/pki/common_cert_errors.h"
+#include "net/cert/pki/crl.h"
+#include "net/cert/pki/ocsp.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/trust_store.h"
#include "url/gurl.h"
namespace net {
@@ -154,7 +154,8 @@ bool CheckCertRevocation(const ParsedCertificateList& certs,
// Check CRLs.
ParsedExtension crl_dp_extension;
- if (cert->GetExtension(der::Input(kCrlDistributionPointsOid),
+ if (policy.crl_allowed &&
+ cert->GetExtension(der::Input(kCrlDistributionPointsOid),
&crl_dp_extension)) {
std::vector<ParsedDistributionPoint> distribution_points;
if (ParseCrlDistributionPoints(crl_dp_extension.value,
diff --git a/chromium/net/cert/internal/revocation_checker.h b/chromium/net/cert/internal/revocation_checker.h
index 6da6b17008b..78ae5aa9a68 100644
--- a/chromium/net/cert/internal/revocation_checker.h
+++ b/chromium/net/cert/internal/revocation_checker.h
@@ -9,7 +9,7 @@
#include "base/time/time.h"
#include "net/base/net_export.h"
#include "net/cert/crl_set.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/parsed_certificate.h"
namespace net {
@@ -73,6 +73,10 @@ struct NET_EXPORT_PRIVATE RevocationPolicy {
// networking is not permitted in the course of revocation checking.
bool networking_allowed : 1;
+ // If |crl_allowed| is true then CRLs will be checked as a fallback when an
+ // OCSP URL is not present or OCSP results are indeterminate.
+ bool crl_allowed : 1;
+
// If set to true, considers certificates lacking URLs for OCSP/CRL to be
// unrevoked. Otherwise will fail for certificates lacking revocation
// mechanisms.
diff --git a/chromium/net/cert/internal/revocation_checker_unittest.cc b/chromium/net/cert/internal/revocation_checker_unittest.cc
index 5cbeaa32cdc..1ad965057da 100644
--- a/chromium/net/cert/internal/revocation_checker_unittest.cc
+++ b/chromium/net/cert/internal/revocation_checker_unittest.cc
@@ -5,11 +5,11 @@
#include "net/cert/internal/revocation_checker.h"
#include "base/time/time.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/common_cert_errors.h"
-#include "net/cert/internal/parse_certificate.h"
-#include "net/cert/internal/parsed_certificate.h"
#include "net/cert/mock_cert_net_fetcher.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/common_cert_errors.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/test/cert_builder.h"
#include "net/test/revocation_builder.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -47,6 +47,7 @@ TEST(RevocationChecker, NoRevocationMechanism) {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
+ policy.crl_allowed = true;
policy.allow_unable_to_check = false;
{
@@ -119,12 +120,13 @@ TEST(RevocationChecker, ValidCRL) {
std::string crl_data_as_string_for_some_reason =
BuildCrl(root->GetSubject(), root->GetKey(),
- /*revoked_serials=*/{}, DigestAlgorithm::Sha256);
+ /*revoked_serials=*/{});
std::vector<uint8_t> crl_data(crl_data_as_string_for_some_reason.begin(),
crl_data_as_string_for_some_reason.end());
{
policy.networking_allowed = true;
+ policy.crl_allowed = true;
auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
EXPECT_CALL(*mock_fetcher, FetchCrl(kTestCrlUrl, _, _))
@@ -141,6 +143,7 @@ TEST(RevocationChecker, ValidCRL) {
{
policy.networking_allowed = false;
+ policy.crl_allowed = true;
// No methods on |mock_fetcher| should be called.
auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
@@ -154,6 +157,25 @@ TEST(RevocationChecker, ValidCRL) {
EXPECT_TRUE(errors.ContainsHighSeverityErrors());
EXPECT_TRUE(errors.ContainsError(cert_errors::kUnableToCheckRevocation));
}
+
+ {
+ policy.networking_allowed = true;
+ policy.crl_allowed = false;
+
+ // No methods on |mock_fetcher| should be called.
+ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>();
+
+ CertPathErrors errors;
+ CheckValidatedChainRevocation(
+ chain, policy, /*deadline=*/base::TimeTicks(),
+ /*stapled_leaf_ocsp_response=*/base::StringPiece(), mock_fetcher.get(),
+ &errors, /*stapled_ocsp_verify_result=*/nullptr);
+
+ EXPECT_TRUE(errors.ContainsHighSeverityErrors());
+ // Since CRLs were not considered, the error should be "no revocation
+ // mechanism".
+ EXPECT_TRUE(errors.ContainsError(cert_errors::kNoRevocationMechanism));
+ }
}
TEST(RevocationChecker, RevokedCRL) {
@@ -169,10 +191,11 @@ TEST(RevocationChecker, RevokedCRL) {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
+ policy.crl_allowed = true;
- std::string crl_data_as_string_for_some_reason = BuildCrl(
- root->GetSubject(), root->GetKey(),
- /*revoked_serials=*/{leaf->GetSerialNumber()}, DigestAlgorithm::Sha256);
+ std::string crl_data_as_string_for_some_reason =
+ BuildCrl(root->GetSubject(), root->GetKey(),
+ /*revoked_serials=*/{leaf->GetSerialNumber()});
std::vector<uint8_t> crl_data(crl_data_as_string_for_some_reason.begin(),
crl_data_as_string_for_some_reason.end());
@@ -228,6 +251,7 @@ TEST(RevocationChecker, CRLRequestFails) {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
+ policy.crl_allowed = true;
{
policy.allow_unable_to_check = false;
@@ -299,6 +323,7 @@ TEST(RevocationChecker, CRLNonHttpUrl) {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
+ policy.crl_allowed = true;
policy.allow_unable_to_check = false;
policy.allow_missing_info = false;
@@ -359,12 +384,13 @@ TEST(RevocationChecker, SkipEntireInvalidCRLDistributionPoints) {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
+ policy.crl_allowed = true;
policy.allow_unable_to_check = false;
policy.allow_missing_info = false;
std::string crl_data_as_string_for_some_reason =
BuildCrl(root->GetSubject(), root->GetKey(),
- /*revoked_serials=*/{}, DigestAlgorithm::Sha256);
+ /*revoked_serials=*/{});
std::vector<uint8_t> crl_data(crl_data_as_string_for_some_reason.begin(),
crl_data_as_string_for_some_reason.end());
@@ -444,12 +470,13 @@ TEST(RevocationChecker, SkipUnsupportedCRLDistPointWithNonUriFullname) {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
+ policy.crl_allowed = true;
policy.allow_unable_to_check = false;
policy.allow_missing_info = false;
std::string crl_data_as_string_for_some_reason =
BuildCrl(root->GetSubject(), root->GetKey(),
- /*revoked_serials=*/{}, DigestAlgorithm::Sha256);
+ /*revoked_serials=*/{});
std::vector<uint8_t> crl_data(crl_data_as_string_for_some_reason.begin(),
crl_data_as_string_for_some_reason.end());
@@ -513,12 +540,13 @@ TEST(RevocationChecker, SkipUnsupportedCRLDistPointWithReasons) {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
+ policy.crl_allowed = true;
policy.allow_unable_to_check = false;
policy.allow_missing_info = false;
std::string crl_data_as_string_for_some_reason =
BuildCrl(root->GetSubject(), root->GetKey(),
- /*revoked_serials=*/{}, DigestAlgorithm::Sha256);
+ /*revoked_serials=*/{});
std::vector<uint8_t> crl_data(crl_data_as_string_for_some_reason.begin(),
crl_data_as_string_for_some_reason.end());
@@ -614,12 +642,13 @@ TEST(RevocationChecker, SkipUnsupportedCRLDistPointWithCrlIssuer) {
RevocationPolicy policy;
policy.check_revocation = true;
policy.networking_allowed = true;
+ policy.crl_allowed = true;
policy.allow_unable_to_check = false;
policy.allow_missing_info = false;
std::string crl_data_as_string_for_some_reason =
BuildCrl(root->GetSubject(), root->GetKey(),
- /*revoked_serials=*/{}, DigestAlgorithm::Sha256);
+ /*revoked_serials=*/{});
std::vector<uint8_t> crl_data(crl_data_as_string_for_some_reason.begin(),
crl_data_as_string_for_some_reason.end());
diff --git a/chromium/net/cert/internal/revocation_util_unittest.cc b/chromium/net/cert/internal/revocation_util_unittest.cc
index ead9c9a70b1..fd1b0389748 100644
--- a/chromium/net/cert/internal/revocation_util_unittest.cc
+++ b/chromium/net/cert/internal/revocation_util_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/revocation_util.h"
+#include "net/cert/pki/revocation_util.h"
#include "base/time/time.h"
#include "net/der/encode_values.h"
diff --git a/chromium/net/cert/internal/signature_algorithm.h b/chromium/net/cert/internal/signature_algorithm.h
deleted file mode 100644
index 6d209ff2a23..00000000000
--- a/chromium/net/cert/internal/signature_algorithm.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2015 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.
-
-#ifndef NET_CERT_INTERNAL_SIGNATURE_ALGORITHM_H_
-#define NET_CERT_INTERNAL_SIGNATURE_ALGORITHM_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "net/base/net_export.h"
-
-namespace net {
-
-class CertErrors;
-
-namespace der {
-class Input;
-} // namespace der
-
-// The digest algorithm used within a signature.
-enum class DigestAlgorithm {
- Md2,
- Md4,
- Md5,
- Sha1,
- Sha256,
- Sha384,
- Sha512,
-};
-
-// The signature scheme used within a signature. Parameters are specified
-// separately.
-enum class SignatureAlgorithmId {
- RsaPkcs1, // RSA PKCS#1 v1.5
- RsaPss, // RSASSA-PSS
- Ecdsa, // ECDSA
- Dsa, // DSA
-};
-
-// Parses AlgorithmIdentifier as defined by RFC 5280 section 4.1.1.2:
-//
-// AlgorithmIdentifier ::= SEQUENCE {
-// algorithm OBJECT IDENTIFIER,
-// parameters ANY DEFINED BY algorithm OPTIONAL }
-[[nodiscard]] NET_EXPORT bool ParseAlgorithmIdentifier(const der::Input& input,
- der::Input* algorithm,
- der::Input* parameters);
-
-// Parses a HashAlgorithm as defined by RFC 5912:
-//
-// HashAlgorithm ::= AlgorithmIdentifier{DIGEST-ALGORITHM,
-// {HashAlgorithms}}
-//
-// HashAlgorithms DIGEST-ALGORITHM ::= {
-// { IDENTIFIER id-sha1 PARAMS TYPE NULL ARE preferredPresent } |
-// { IDENTIFIER id-sha224 PARAMS TYPE NULL ARE preferredPresent } |
-// { IDENTIFIER id-sha256 PARAMS TYPE NULL ARE preferredPresent } |
-// { IDENTIFIER id-sha384 PARAMS TYPE NULL ARE preferredPresent } |
-// { IDENTIFIER id-sha512 PARAMS TYPE NULL ARE preferredPresent }
-// }
-[[nodiscard]] bool ParseHashAlgorithm(const der::Input& input,
- DigestAlgorithm* out);
-
-// Base class for describing algorithm parameters.
-class NET_EXPORT SignatureAlgorithmParameters {
- public:
- SignatureAlgorithmParameters() {}
-
- SignatureAlgorithmParameters(const SignatureAlgorithmParameters&) = delete;
- SignatureAlgorithmParameters& operator=(const SignatureAlgorithmParameters&) =
- delete;
-
- virtual ~SignatureAlgorithmParameters() {}
-};
-
-// Parameters for an RSASSA-PSS signature algorithm.
-//
-// The trailer is assumed to be 1 and the mask generation algorithm to be MGF1,
-// as that is all that is implemented, and any other values while parsing the
-// AlgorithmIdentifier will thus be rejected.
-class NET_EXPORT RsaPssParameters : public SignatureAlgorithmParameters {
- public:
- RsaPssParameters(DigestAlgorithm mgf1_hash, uint32_t salt_length);
-
- DigestAlgorithm mgf1_hash() const { return mgf1_hash_; }
- uint32_t salt_length() const { return salt_length_; }
-
- private:
- const DigestAlgorithm mgf1_hash_;
- const uint32_t salt_length_;
-};
-
-// SignatureAlgorithm describes a signature algorithm and its parameters. This
-// corresponds to "AlgorithmIdentifier" from RFC 5280.
-//
-// TODO(crbug.com/1321691): Replace this with a simple enum.
-class NET_EXPORT SignatureAlgorithm {
- public:
- SignatureAlgorithm(const SignatureAlgorithm&) = delete;
- SignatureAlgorithm& operator=(const SignatureAlgorithm&) = delete;
-
- ~SignatureAlgorithm();
-
- SignatureAlgorithmId algorithm() const { return algorithm_; }
- DigestAlgorithm digest() const { return digest_; }
-
- // Creates a SignatureAlgorithm by parsing a DER-encoded "AlgorithmIdentifier"
- // (RFC 5280). Returns nullptr on failure. If |errors| was non-null then
- // error/warning information is output to it.
- static std::unique_ptr<SignatureAlgorithm> Create(
- const der::Input& algorithm_identifier,
- CertErrors* errors);
-
- // Creates a new SignatureAlgorithm with the given type and parameters.
- // Guaranteed to return non-null result.
- static std::unique_ptr<SignatureAlgorithm> CreateRsaPkcs1(
- DigestAlgorithm digest);
- static std::unique_ptr<SignatureAlgorithm> CreateDsa(DigestAlgorithm digest);
- static std::unique_ptr<SignatureAlgorithm> CreateEcdsa(
- DigestAlgorithm digest);
- static std::unique_ptr<SignatureAlgorithm> CreateRsaPss(
- DigestAlgorithm digest,
- DigestAlgorithm mgf1_hash,
- uint32_t salt_length);
-
- // The following methods retrieve the parameters for the signature algorithm.
- //
- // The correct parameters should be chosen based on the algorithm ID. For
- // instance a SignatureAlgorithm with |algorithm() == RsaPss| should retrieve
- // parameters via ParametersForRsaPss().
- //
- // The returned pointer is non-owned, and has the same lifetime as |this|.
- const RsaPssParameters* ParamsForRsaPss() const;
-
- bool has_params() const { return !!params_; }
-
- // Returns true if |alg1_tlv| and |alg2_tlv| represent an equivalent
- // AlgorithmIdentifier once parsed.
- static bool IsEquivalent(const der::Input& alg1_tlv,
- const der::Input& alg2_tlv);
-
- private:
- SignatureAlgorithm(SignatureAlgorithmId algorithm,
- DigestAlgorithm digest,
- std::unique_ptr<SignatureAlgorithmParameters> params);
-
- const SignatureAlgorithmId algorithm_;
- const DigestAlgorithm digest_;
- const std::unique_ptr<SignatureAlgorithmParameters> params_;
-};
-
-} // namespace net
-
-#endif // NET_CERT_INTERNAL_SIGNATURE_ALGORITHM_H_
diff --git a/chromium/net/cert/internal/system_trust_store.cc b/chromium/net/cert/internal/system_trust_store.cc
index c5ba97fb5b0..fc21d3633a2 100644
--- a/chromium/net/cert/internal/system_trust_store.cc
+++ b/chromium/net/cert/internal/system_trust_store.cc
@@ -4,6 +4,7 @@
#include "net/cert/internal/system_trust_store.h"
+#include "base/memory/ptr_util.h"
#include "build/build_config.h"
#include "crypto/crypto_buildflags.h"
@@ -27,10 +28,10 @@
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "build/build_config.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/trust_store_collection.h"
-#include "net/cert/internal/trust_store_in_memory.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/trust_store_collection.h"
+#include "net/cert/pki/trust_store_in_memory.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
@@ -78,15 +79,18 @@ class DummySystemTrustStore : public SystemTrustStore {
} // namespace
#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
-class SystemTrustStoreChrome : public SystemTrustStore {
+class SystemTrustStoreChromeWithUnOwnedSystemStore : public SystemTrustStore {
public:
- explicit SystemTrustStoreChrome(
+ // Creates a SystemTrustStore that gets publicly trusted roots from
+ // |trust_store_chrome| and local trust settings from |trust_store_system|.
+ // Does not take ownership of |trust_store_system|, which must outlive this
+ // object.
+ explicit SystemTrustStoreChromeWithUnOwnedSystemStore(
std::unique_ptr<TrustStoreChrome> trust_store_chrome,
- std::unique_ptr<TrustStore> trust_store_system)
- : trust_store_chrome_(std::move(trust_store_chrome)),
- trust_store_system_(std::move(trust_store_system)) {
+ TrustStore* trust_store_system)
+ : trust_store_chrome_(std::move(trust_store_chrome)) {
trust_store_collection_.AddTrustStore(trust_store_chrome_.get());
- trust_store_collection_.AddTrustStore(trust_store_system_.get());
+ trust_store_collection_.AddTrustStore(trust_store_system);
}
TrustStore* GetTrustStore() override { return &trust_store_collection_; }
@@ -105,17 +109,32 @@ class SystemTrustStoreChrome : public SystemTrustStore {
private:
std::unique_ptr<TrustStoreChrome> trust_store_chrome_;
- std::unique_ptr<TrustStore> trust_store_system_;
TrustStoreCollection trust_store_collection_;
};
+class SystemTrustStoreChrome
+ : public SystemTrustStoreChromeWithUnOwnedSystemStore {
+ public:
+ // Creates a SystemTrustStore that gets publicly trusted roots from
+ // |trust_store_chrome| and local trust settings from |trust_store_system|.
+ explicit SystemTrustStoreChrome(
+ std::unique_ptr<TrustStoreChrome> trust_store_chrome,
+ std::unique_ptr<TrustStore> trust_store_system)
+ : SystemTrustStoreChromeWithUnOwnedSystemStore(
+ std::move(trust_store_chrome),
+ trust_store_system.get()),
+ trust_store_system_(std::move(trust_store_system)) {}
+
+ private:
+ std::unique_ptr<TrustStore> trust_store_system_;
+};
+
std::unique_ptr<SystemTrustStore> CreateSystemTrustStoreChromeForTesting(
std::unique_ptr<TrustStoreChrome> trust_store_chrome,
std::unique_ptr<TrustStore> trust_store_system) {
return std::make_unique<SystemTrustStoreChrome>(
std::move(trust_store_chrome), std::move(trust_store_system));
}
-
#endif // CHROME_ROOT_STORE_SUPPORTED
#if BUILDFLAG(USE_NSS_CERTS)
@@ -163,35 +182,100 @@ class SystemTrustStoreNSS : public SystemTrustStore {
} // namespace
std::unique_ptr<SystemTrustStore> CreateSslSystemTrustStore() {
- return std::make_unique<SystemTrustStoreNSS>(
- std::make_unique<TrustStoreNSS>(trustSSL));
+ return std::make_unique<SystemTrustStoreNSS>(std::make_unique<TrustStoreNSS>(
+ trustSSL, TrustStoreNSS::kUseSystemTrust,
+ TrustStoreNSS::UseTrustFromAllUserSlots()));
}
#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
std::unique_ptr<SystemTrustStore> CreateSslSystemTrustStoreChromeRoot(
std::unique_ptr<TrustStoreChrome> chrome_root) {
return std::make_unique<SystemTrustStoreChrome>(
- std::move(chrome_root),
- std::make_unique<TrustStoreNSS>(
- trustSSL, TrustStoreNSS::IgnoreSystemTrustSettings()));
+ std::move(chrome_root), std::make_unique<TrustStoreNSS>(
+ trustSSL, TrustStoreNSS::kIgnoreSystemTrust,
+ TrustStoreNSS::UseTrustFromAllUserSlots()));
+}
+
+std::unique_ptr<SystemTrustStore>
+CreateSslSystemTrustStoreChromeRootWithUserSlotRestriction(
+ std::unique_ptr<TrustStoreChrome> chrome_root,
+ crypto::ScopedPK11Slot user_slot_restriction) {
+ return std::make_unique<SystemTrustStoreChrome>(
+ std::move(chrome_root), std::make_unique<TrustStoreNSS>(
+ trustSSL, TrustStoreNSS::kIgnoreSystemTrust,
+ std::move(user_slot_restriction)));
}
#endif // CHROME_ROOT_STORE_SUPPORTED
std::unique_ptr<SystemTrustStore>
CreateSslSystemTrustStoreNSSWithUserSlotRestriction(
- crypto::ScopedPK11Slot user_slot) {
+ crypto::ScopedPK11Slot user_slot_restriction) {
return std::make_unique<SystemTrustStoreNSS>(
- std::make_unique<TrustStoreNSS>(trustSSL, std::move(user_slot)));
+ std::make_unique<TrustStoreNSS>(trustSSL, TrustStoreNSS::kUseSystemTrust,
+ std::move(user_slot_restriction)));
}
-std::unique_ptr<SystemTrustStore>
-CreateSslSystemTrustStoreNSSWithNoUserSlots() {
- return std::make_unique<SystemTrustStoreNSS>(std::make_unique<TrustStoreNSS>(
- trustSSL, TrustStoreNSS::DisallowTrustForCertsOnUserSlots()));
+#elif BUILDFLAG(IS_MAC)
+
+namespace {
+
+TrustStoreMac::TrustImplType ParamToTrustImplType(
+ int param,
+ TrustStoreMac::TrustImplType default_impl) {
+ // These values are used in experiment configs, do not change or reuse the
+ // numbers.
+ switch (param) {
+ case 1:
+ return TrustStoreMac::TrustImplType::kDomainCache;
+ case 2:
+ return TrustStoreMac::TrustImplType::kSimple;
+ case 3:
+ return TrustStoreMac::TrustImplType::kLruCache;
+ case 4:
+ return TrustStoreMac::TrustImplType::kDomainCacheFullCerts;
+ default:
+ return default_impl;
+ }
}
-#elif BUILDFLAG(IS_MAC)
+TrustStoreMac::TrustImplType GetTrustStoreImplParam(
+ TrustStoreMac::TrustImplType default_impl) {
+ // TODO(https://crbug.com/1327433): A limitation of this approach is that if
+ // the primary verifier is being set to use the builtin verifier via a
+ // feature flag, it isn't possible to run dual verifier trial comparing that
+ // to the builtin verifier with different flags, since this method can't tell
+ // which flags to use for which verifier.
+ // If handling that becomes necessary, the flags should be checked in the
+ // higher level code (maybe in cert_verifier_creation.cc) so that each
+ // type of CertVerifyProc could be created with the appropriate flags.
+ if (base::FeatureList::IsEnabled(features::kCertVerifierBuiltinFeature)) {
+ return ParamToTrustImplType(features::kCertVerifierBuiltinImpl.Get(),
+ default_impl);
+ }
+ if (base::FeatureList::IsEnabled(
+ features::kCertDualVerificationTrialFeature)) {
+ return ParamToTrustImplType(features::kCertDualVerificationTrialImpl.Get(),
+ default_impl);
+ }
+ return default_impl;
+}
+
+size_t GetTrustStoreCacheSize() {
+ if (base::FeatureList::IsEnabled(features::kCertVerifierBuiltinFeature) &&
+ features::kCertVerifierBuiltinCacheSize.Get() > 0) {
+ return features::kCertVerifierBuiltinCacheSize.Get();
+ }
+ if (base::FeatureList::IsEnabled(
+ features::kCertDualVerificationTrialFeature) &&
+ features::kCertDualVerificationTrialCacheSize.Get() > 0) {
+ return features::kCertDualVerificationTrialCacheSize.Get();
+ }
+ constexpr size_t kDefaultCacheSize = 512;
+ return kDefaultCacheSize;
+}
+
+} // namespace
class SystemTrustStoreMac : public SystemTrustStore {
public:
@@ -211,50 +295,18 @@ class SystemTrustStoreMac : public SystemTrustStore {
GetGlobalTrustStoreMac()->InitializeTrustCache();
}
+#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
+ int64_t chrome_root_store_version() override { return 0; }
+#endif
+
private:
static constexpr TrustStoreMac::TrustImplType kDefaultTrustImpl =
TrustStoreMac::TrustImplType::kLruCache;
- static TrustStoreMac::TrustImplType ParamToTrustImplType(int param) {
- switch (param) {
- case 1:
- return TrustStoreMac::TrustImplType::kDomainCache;
- case 2:
- return TrustStoreMac::TrustImplType::kSimple;
- case 3:
- return TrustStoreMac::TrustImplType::kLruCache;
- default:
- return kDefaultTrustImpl;
- }
- }
-
- static TrustStoreMac::TrustImplType GetTrustStoreImplParam() {
- if (base::FeatureList::IsEnabled(features::kCertVerifierBuiltinFeature))
- return ParamToTrustImplType(features::kCertVerifierBuiltinImpl.Get());
- if (base::FeatureList::IsEnabled(
- features::kCertDualVerificationTrialFeature))
- return ParamToTrustImplType(
- features::kCertDualVerificationTrialImpl.Get());
- return kDefaultTrustImpl;
- }
-
- static size_t GetTrustStoreCacheSize() {
- if (base::FeatureList::IsEnabled(features::kCertVerifierBuiltinFeature) &&
- features::kCertVerifierBuiltinCacheSize.Get() > 0) {
- return features::kCertVerifierBuiltinCacheSize.Get();
- }
- if (base::FeatureList::IsEnabled(
- features::kCertDualVerificationTrialFeature) &&
- features::kCertDualVerificationTrialCacheSize.Get() > 0) {
- return features::kCertDualVerificationTrialCacheSize.Get();
- }
- constexpr size_t kDefaultCacheSize = 512;
- return kDefaultCacheSize;
- }
-
static TrustStoreMac* GetGlobalTrustStoreMac() {
static base::NoDestructor<TrustStoreMac> static_trust_store_mac(
- kSecPolicyAppleSSL, GetTrustStoreImplParam(), GetTrustStoreCacheSize());
+ kSecPolicyAppleSSL, GetTrustStoreImplParam(kDefaultTrustImpl),
+ GetTrustStoreCacheSize(), TrustStoreMac::TrustDomains::kAll);
return static_trust_store_mac.get();
}
};
@@ -263,11 +315,50 @@ std::unique_ptr<SystemTrustStore> CreateSslSystemTrustStore() {
return std::make_unique<SystemTrustStoreMac>();
}
+#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
+namespace {
+
+TrustStoreMac* GetGlobalTrustStoreMacForCRS() {
+ constexpr TrustStoreMac::TrustImplType kDefaultMacTrustImplForCRS =
+ TrustStoreMac::TrustImplType::kDomainCacheFullCerts;
+ static base::NoDestructor<TrustStoreMac> static_trust_store_mac(
+ kSecPolicyAppleSSL, GetTrustStoreImplParam(kDefaultMacTrustImplForCRS),
+ GetTrustStoreCacheSize(), TrustStoreMac::TrustDomains::kUserAndAdmin);
+ return static_trust_store_mac.get();
+}
+
+void InitializeTrustCacheForCRSOnWorkerThread() {
+ GetGlobalTrustStoreMacForCRS()->InitializeTrustCache();
+}
+
+} // namespace
+
+std::unique_ptr<SystemTrustStore> CreateSslSystemTrustStoreChromeRoot(
+ std::unique_ptr<TrustStoreChrome> chrome_root) {
+ return std::make_unique<SystemTrustStoreChromeWithUnOwnedSystemStore>(
+ std::move(chrome_root), GetGlobalTrustStoreMacForCRS());
+}
+#endif // CHROME_ROOT_STORE_SUPPORTED
+
void InitializeTrustStoreMacCache() {
- base::ThreadPool::PostTask(
- FROM_HERE,
- {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
- base::BindOnce(&SystemTrustStoreMac::InitializeTrustCacheOnWorkerThread));
+#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
+ if (base::FeatureList::IsEnabled(net::features::kChromeRootStoreUsed)) {
+ base::ThreadPool::PostTask(
+ FROM_HERE,
+ {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+ base::BindOnce(&InitializeTrustCacheForCRSOnWorkerThread));
+ return;
+ }
+#endif // CHROME_ROOT_STORE_SUPPORTED
+ if (base::FeatureList::IsEnabled(
+ net::features::kCertVerifierBuiltinFeature)) {
+ base::ThreadPool::PostTask(
+ FROM_HERE,
+ {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+ base::BindOnce(
+ &SystemTrustStoreMac::InitializeTrustCacheOnWorkerThread));
+ return;
+ }
}
#elif BUILDFLAG(IS_FUCHSIA)
diff --git a/chromium/net/cert/internal/system_trust_store.h b/chromium/net/cert/internal/system_trust_store.h
index 9cbf4da0289..9a965013ffe 100644
--- a/chromium/net/cert/internal/system_trust_store.h
+++ b/chromium/net/cert/internal/system_trust_store.h
@@ -10,7 +10,7 @@
#include "base/memory/ref_counted.h"
#include "build/build_config.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/net_buildflags.h"
namespace net {
@@ -99,7 +99,8 @@ CreateSystemTrustStoreChromeForTesting(
NET_EXPORT std::unique_ptr<SystemTrustStore> CreateEmptySystemTrustStore();
#if BUILDFLAG(IS_MAC)
-// Initializes trust cache on a worker thread.
+// Initializes trust cache on a worker thread, if the builtin verifier is
+// enabled.
NET_EXPORT void InitializeTrustStoreMacCache();
#endif
diff --git a/chromium/net/cert/internal/system_trust_store_nss.h b/chromium/net/cert/internal/system_trust_store_nss.h
index 8210258ffd6..70b3052d444 100644
--- a/chromium/net/cert/internal/system_trust_store_nss.h
+++ b/chromium/net/cert/internal/system_trust_store_nss.h
@@ -13,16 +13,20 @@ namespace net {
// Create a SystemTrustStore that will accept trust for:
// (*) built-in certificates
-// (*) certificates stored on the |user_slot|.
+// (*) certificates stored on the |user_slot_restriction|, if non-null.
NET_EXPORT std::unique_ptr<SystemTrustStore>
CreateSslSystemTrustStoreNSSWithUserSlotRestriction(
- crypto::ScopedPK11Slot user_slot);
+ crypto::ScopedPK11Slot user_slot_restriction);
+#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
// Create a SystemTrustStore that will accept trust for:
-// (*) built-in certificates
-// It will not accept trust for certificates stored on other slots.
+// (*) Chrome Root Store certificates
+// (*) certificates stored on the |user_slot_restriction|, if non-null.
NET_EXPORT std::unique_ptr<SystemTrustStore>
-CreateSslSystemTrustStoreNSSWithNoUserSlots();
+CreateSslSystemTrustStoreChromeRootWithUserSlotRestriction(
+ std::unique_ptr<TrustStoreChrome> chrome_root,
+ crypto::ScopedPK11Slot user_slot_restriction);
+#endif
} // namespace net
diff --git a/chromium/net/cert/internal/system_trust_store_nss_unittest.cc b/chromium/net/cert/internal/system_trust_store_nss_unittest.cc
index efea095da41..ae343e796aa 100644
--- a/chromium/net/cert/internal/system_trust_store_nss_unittest.cc
+++ b/chromium/net/cert/internal/system_trust_store_nss_unittest.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
#include "net/cert/internal/system_trust_store.h"
#include <cert.h>
@@ -11,9 +12,9 @@
#include "crypto/scoped_nss_types.h"
#include "crypto/scoped_test_nss_db.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
#include "net/cert/internal/system_trust_store_nss.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/test_root_certs.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
@@ -89,7 +90,7 @@ class SystemTrustStoreNSSTest : public ::testing::Test {
crypto::ScopedTestNSSDB test_nssdb_;
crypto::ScopedTestNSSDB other_test_nssdb_;
- TestRootCerts* test_root_certs_;
+ raw_ptr<TestRootCerts> test_root_certs_;
scoped_refptr<X509Certificate> root_cert_;
scoped_refptr<ParsedCertificate> parsed_root_cert_;
@@ -131,7 +132,7 @@ TEST_F(SystemTrustStoreNSSTest, UserSlotRestrictionDisallows) {
// certificate stored on user slots.
TEST_F(SystemTrustStoreNSSTest, NoUserSlots) {
std::unique_ptr<SystemTrustStore> system_trust_store =
- CreateSslSystemTrustStoreNSSWithNoUserSlots();
+ CreateSslSystemTrustStoreNSSWithUserSlotRestriction(nullptr);
ASSERT_NO_FATAL_FAILURE(ImportRootCertAsTrusted(test_nssdb_.slot()));
diff --git a/chromium/net/cert/internal/system_trust_store_unittest.cc b/chromium/net/cert/internal/system_trust_store_unittest.cc
index 51308b77b09..902b40b3c8f 100644
--- a/chromium/net/cert/internal/system_trust_store_unittest.cc
+++ b/chromium/net/cert/internal/system_trust_store_unittest.cc
@@ -4,7 +4,7 @@
#include "net/cert/internal/system_trust_store.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "net/net_buildflags.h"
diff --git a/chromium/net/cert/internal/trust_store_chrome.cc b/chromium/net/cert/internal/trust_store_chrome.cc
index 926c1207d66..56f9d497f0f 100644
--- a/chromium/net/cert/internal/trust_store_chrome.cc
+++ b/chromium/net/cert/internal/trust_store_chrome.cc
@@ -6,8 +6,8 @@
#include "base/containers/span.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/root_store_proto_lite/root_store.pb.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
@@ -73,10 +73,12 @@ TrustStoreChrome::TrustStoreChrome(base::span<const ChromeRootCertInfo> certs,
for (const auto& cert_info : certs) {
bssl::UniquePtr<CRYPTO_BUFFER> cert;
if (certs_are_static) {
- // TODO(mattm,hchao): When the component updater is implemented, ensure
- // the static data crypto_buffers for the compiled-in roots are kept
- // alive, so that roots from the component updater data will de-dupe
- // against them.
+ // TODO(mattm,hchao): Ensure the static data crypto_buffers for the
+ // compiled-in roots are kept alive, so that roots from the component
+ // updater data will de-dupe against them. This currently works if the
+ // new components roots are the same as the compiled in roots, but
+ // fails if a component update drops a root and then the next component
+ // update readds the root without a restart.
cert = x509_util::CreateCryptoBufferFromStaticDataUnsafe(
cert_info.root_cert_der);
} else {
@@ -86,8 +88,6 @@ TrustStoreChrome::TrustStoreChrome(base::span<const ChromeRootCertInfo> certs,
auto parsed = ParsedCertificate::Create(
std::move(cert), x509_util::DefaultParseCertificateOptions(), &errors);
DCHECK(parsed);
- // TODO(hchao): Figure out how to fail gracefully when the Chrome Root Store
- // gets a bad component update.
trust_store_.AddTrustAnchor(parsed);
}
version_ = version;
@@ -130,4 +130,20 @@ int64_t CompiledChromeRootStoreVersion() {
return kRootStoreVersion;
}
+ParsedCertificateList CompiledChromeRootStoreAnchors() {
+ ParsedCertificateList parsed_cert_list;
+ for (const auto& cert_info : kChromeRootCertList) {
+ bssl::UniquePtr<CRYPTO_BUFFER> cert =
+ x509_util::CreateCryptoBufferFromStaticDataUnsafe(
+ cert_info.root_cert_der);
+ CertErrors errors;
+ auto parsed = ParsedCertificate::Create(
+ std::move(cert), x509_util::DefaultParseCertificateOptions(), &errors);
+ DCHECK(parsed);
+ parsed_cert_list.push_back(parsed);
+ }
+
+ return parsed_cert_list;
+}
+
} // namespace net
diff --git a/chromium/net/cert/internal/trust_store_chrome.h b/chromium/net/cert/internal/trust_store_chrome.h
index 5f59e2ce9bf..0d7acc591a5 100644
--- a/chromium/net/cert/internal/trust_store_chrome.h
+++ b/chromium/net/cert/internal/trust_store_chrome.h
@@ -7,8 +7,8 @@
#include "base/containers/span.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/trust_store.h"
-#include "net/cert/internal/trust_store_in_memory.h"
+#include "net/cert/pki/trust_store.h"
+#include "net/cert/pki/trust_store_in_memory.h"
#include "net/cert/root_store_proto_lite/root_store.pb.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -89,6 +89,10 @@ class NET_EXPORT TrustStoreChrome : public TrustStore {
// binary.
NET_EXPORT int64_t CompiledChromeRootStoreVersion();
+// Returns the anchors of the Chrome Root Store that were compiled into the
+// binary.
+NET_EXPORT ParsedCertificateList CompiledChromeRootStoreAnchors();
+
} // namespace net
#endif // NET_CERT_INTERNAL_TRUST_STORE_CHROME_H_
diff --git a/chromium/net/cert/internal/trust_store_chrome_unittest.cc b/chromium/net/cert/internal/trust_store_chrome_unittest.cc
index 1734cf9b9cf..7ba40227386 100644
--- a/chromium/net/cert/internal/trust_store_chrome_unittest.cc
+++ b/chromium/net/cert/internal/trust_store_chrome_unittest.cc
@@ -5,8 +5,8 @@
#include "net/cert/internal/trust_store_chrome.h"
#include "base/containers/span.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "net/test/cert_test_util.h"
diff --git a/chromium/net/cert/internal/trust_store_mac.cc b/chromium/net/cert/internal/trust_store_mac.cc
index fed6c8ed3c6..f3b6e2a53d5 100644
--- a/chromium/net/cert/internal/trust_store_mac.cc
+++ b/chromium/net/cert/internal/trust_store_mac.cc
@@ -14,15 +14,18 @@
#include "base/logging.h"
#include "base/mac/foundation_util.h"
#include "base/mac/mac_logging.h"
+#include "base/metrics/histogram_functions.h"
#include "base/no_destructor.h"
+#include "base/strings/strcat.h"
#include "base/synchronization/lock.h"
#include "crypto/mac_security_services_lock.h"
#include "net/base/hash_value.h"
#include "net/base/network_notification_thread_mac.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parse_name.h"
-#include "net/cert/internal/parsed_certificate.h"
#include "net/cert/known_roots_mac.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/cert_issuer_source_static.h"
+#include "net/cert/pki/parse_name.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/test_keychain_search_list_mac.h"
#include "net/cert/x509_util.h"
#include "net/cert/x509_util_apple.h"
@@ -288,6 +291,7 @@ KnownRootStatus IsCertificateKnownRoot(const ParsedCertificate* cert) {
TrustStatus IsCertificateTrustedForPolicy(const ParsedCertificate* cert,
const CFStringRef policy_oid,
+ TrustStoreMac::TrustDomains domains,
int* debug_info,
KnownRootStatus* out_is_known_root) {
// |*out_is_known_root| is intentionally not cleared before starting, as
@@ -309,6 +313,10 @@ TrustStatus IsCertificateTrustedForPolicy(const ParsedCertificate* cert,
for (const auto& trust_domain :
{kSecTrustSettingsDomainUser, kSecTrustSettingsDomainAdmin,
kSecTrustSettingsDomainSystem}) {
+ if (domains == TrustStoreMac::TrustDomains::kUserAndAdmin &&
+ trust_domain == kSecTrustSettingsDomainSystem) {
+ continue;
+ }
base::ScopedCFTypeRef<CFArrayRef> trust_settings;
OSStatus err;
{
@@ -442,6 +450,139 @@ class TrustDomainCache {
base::flat_map<SHA256HashValue, TrustStatusDetails> trust_status_cache_;
};
+// Caches certificates and calculated trust status for certificates present in
+// a single trust domain.
+class TrustDomainCacheFullCerts {
+ public:
+ struct TrustStatusDetails {
+ TrustStatus trust_status = TrustStatus::UNKNOWN;
+ int debug_info = 0;
+ };
+
+ TrustDomainCacheFullCerts(SecTrustSettingsDomain domain,
+ CFStringRef policy_oid)
+ : domain_(domain), policy_oid_(policy_oid) {
+ DCHECK(policy_oid_);
+ }
+
+ TrustDomainCacheFullCerts(const TrustDomainCacheFullCerts&) = delete;
+ TrustDomainCacheFullCerts& operator=(const TrustDomainCacheFullCerts&) =
+ delete;
+
+ // (Re-)Initializes the cache with the certs in |domain_| set to UNKNOWN trust
+ // status.
+ void Initialize() {
+ trust_status_cache_.clear();
+ cert_issuer_source_.Clear();
+
+ base::ScopedCFTypeRef<CFArrayRef> cert_array;
+ OSStatus rv;
+ {
+ base::AutoLock lock(crypto::GetMacSecurityServicesLock());
+ rv = SecTrustSettingsCopyCertificates(domain_,
+ cert_array.InitializeInto());
+ }
+ if (rv != noErr) {
+ // Note: SecTrustSettingsCopyCertificates can legitimately return
+ // errSecNoTrustSettings if there are no trust settings in |domain_|.
+ HistogramTrustDomainCertCount(0U);
+ return;
+ }
+ std::vector<std::pair<SHA256HashValue, TrustStatusDetails>>
+ trust_status_vector;
+ for (CFIndex i = 0, size = CFArrayGetCount(cert_array); i < size; ++i) {
+ SecCertificateRef cert = reinterpret_cast<SecCertificateRef>(
+ const_cast<void*>(CFArrayGetValueAtIndex(cert_array, i)));
+ base::ScopedCFTypeRef<CFDataRef> der_data(SecCertificateCopyData(cert));
+ if (!der_data) {
+ LOG(ERROR) << "SecCertificateCopyData error";
+ continue;
+ }
+ auto buffer = x509_util::CreateCryptoBuffer(base::make_span(
+ CFDataGetBytePtr(der_data.get()), CFDataGetLength(der_data.get())));
+ CertErrors errors;
+ ParseCertificateOptions options;
+ options.allow_invalid_serial_numbers = true;
+ scoped_refptr<ParsedCertificate> parsed_cert =
+ ParsedCertificate::Create(std::move(buffer), options, &errors);
+ if (!parsed_cert) {
+ LOG(ERROR) << "Error parsing certificate:\n" << errors.ToDebugString();
+ continue;
+ }
+ cert_issuer_source_.AddCert(parsed_cert);
+ trust_status_vector.emplace_back(x509_util::CalculateFingerprint256(cert),
+ TrustStatusDetails());
+ }
+ HistogramTrustDomainCertCount(trust_status_vector.size());
+ trust_status_cache_ = base::flat_map<SHA256HashValue, TrustStatusDetails>(
+ std::move(trust_status_vector));
+ }
+
+ // Returns the trust status for |cert| in |domain_|.
+ TrustStatus IsCertTrusted(const ParsedCertificate* cert,
+ const SHA256HashValue& cert_hash,
+ base::SupportsUserData* debug_data) {
+ auto cache_iter = trust_status_cache_.find(cert_hash);
+ if (cache_iter == trust_status_cache_.end()) {
+ // Cert does not have trust settings in this domain, return UNSPECIFIED.
+ UpdateUserData(0, debug_data,
+ TrustStoreMac::TrustImplType::kDomainCacheFullCerts);
+ return TrustStatus::UNSPECIFIED;
+ }
+
+ if (cache_iter->second.trust_status != TrustStatus::UNKNOWN) {
+ // Cert has trust settings and trust has already been calculated, return
+ // the cached value.
+ UpdateUserData(cache_iter->second.debug_info, debug_data,
+ TrustStoreMac::TrustImplType::kDomainCacheFullCerts);
+ return cache_iter->second.trust_status;
+ }
+
+ // Cert has trust settings but trust has not been calculated yet.
+ // Calculate it now, insert into cache, and return.
+ TrustStatus cert_trust = IsCertificateTrustedForPolicyInDomain(
+ cert, policy_oid_, domain_, &cache_iter->second.debug_info);
+ cache_iter->second.trust_status = cert_trust;
+ UpdateUserData(cache_iter->second.debug_info, debug_data,
+ TrustStoreMac::TrustImplType::kDomainCacheFullCerts);
+ return cert_trust;
+ }
+
+ // Returns true if the certificate with |cert_hash| is present in |domain_|.
+ bool ContainsCert(const SHA256HashValue& cert_hash) const {
+ return trust_status_cache_.find(cert_hash) != trust_status_cache_.end();
+ }
+
+ // Returns a CertIssuerSource containing all the certificates that are
+ // present in |domain_|.
+ CertIssuerSource& cert_issuer_source() { return cert_issuer_source_; }
+
+ private:
+ void HistogramTrustDomainCertCount(size_t count) const {
+ base::StringPiece domain_name;
+ switch (domain_) {
+ case kSecTrustSettingsDomainUser:
+ domain_name = "User";
+ break;
+ case kSecTrustSettingsDomainAdmin:
+ domain_name = "Admin";
+ break;
+ case kSecTrustSettingsDomainSystem:
+ domain_name = "System";
+ break;
+ }
+ base::UmaHistogramCounts1000(
+ base::StrCat(
+ {"Net.CertVerifier.MacTrustDomainCertCount.", domain_name}),
+ count);
+ }
+
+ const SecTrustSettingsDomain domain_;
+ const CFStringRef policy_oid_;
+ base::flat_map<SHA256HashValue, TrustStatusDetails> trust_status_cache_;
+ CertIssuerSourceStatic cert_issuer_source_;
+};
+
SHA256HashValue CalculateFingerprint256(const der::Input& buffer) {
SHA256HashValue sha256;
SHA256(buffer.UnsafeData(), buffer.Length(), sha256.data);
@@ -473,6 +614,12 @@ class KeychainTrustSettingsChangedNotifier {
private:
friend base::NoDestructor<KeychainTrustSettingsChangedNotifier>;
+// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
+// Removal of its use is tracked in https://crbug.com/1348251 but deprecation
+// warnings are disabled in the meanwhile.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
KeychainTrustSettingsChangedNotifier() {
DCHECK(GetNetworkNotificationThreadMac()->RunsTasksInCurrentSequence());
OSStatus status = SecKeychainAddCallback(
@@ -482,6 +629,8 @@ class KeychainTrustSettingsChangedNotifier {
OSSTATUS_LOG(ERROR, status) << "SecKeychainAddCallback failed";
}
+#pragma clang diagnostic pop
+
~KeychainTrustSettingsChangedNotifier() = delete;
static OSStatus KeychainCallback(SecKeychainEvent keychain_event,
@@ -587,6 +736,9 @@ class TrustStoreMac::TrustImpl {
virtual bool IsKnownRoot(const ParsedCertificate* cert) = 0;
virtual TrustStatus IsCertTrusted(const ParsedCertificate* cert,
base::SupportsUserData* debug_data) = 0;
+ virtual bool ImplementsSyncGetIssuersOf() const { return false; }
+ virtual void SyncGetIssuersOf(const ParsedCertificate* cert,
+ ParsedCertificateList* issuers) {}
virtual void InitializeTrustCache() = 0;
};
@@ -596,10 +748,14 @@ class TrustStoreMac::TrustImpl {
// modified.
class TrustStoreMac::TrustImplDomainCache : public TrustStoreMac::TrustImpl {
public:
- explicit TrustImplDomainCache(CFStringRef policy_oid)
- : system_domain_cache_(kSecTrustSettingsDomainSystem, policy_oid),
+ explicit TrustImplDomainCache(CFStringRef policy_oid, TrustDomains domains)
+ : use_system_domain_cache_(domains == TrustDomains::kAll),
admin_domain_cache_(kSecTrustSettingsDomainAdmin, policy_oid),
user_domain_cache_(kSecTrustSettingsDomainUser, policy_oid) {
+ if (use_system_domain_cache_) {
+ system_domain_cache_ = std::make_unique<TrustDomainCache>(
+ kSecTrustSettingsDomainSystem, policy_oid);
+ }
keychain_observer_ = std::make_unique<KeychainTrustObserver>();
}
@@ -613,11 +769,13 @@ class TrustStoreMac::TrustImplDomainCache : public TrustStoreMac::TrustImpl {
// Returns true if |cert| is present in kSecTrustSettingsDomainSystem.
bool IsKnownRoot(const ParsedCertificate* cert) override {
+ if (!use_system_domain_cache_)
+ return false;
SHA256HashValue cert_hash = CalculateFingerprint256(cert->der_cert());
base::AutoLock lock(cache_lock_);
MaybeInitializeCache();
- return system_domain_cache_.ContainsCert(cert_hash);
+ return system_domain_cache_->ContainsCert(cert_hash);
}
// Returns the trust status for |cert|.
@@ -632,12 +790,15 @@ class TrustStoreMac::TrustImplDomainCache : public TrustStoreMac::TrustImpl {
// override system ones, and user settings can override both admin and
// system.
for (TrustDomainCache* trust_domain_cache :
- {&user_domain_cache_, &admin_domain_cache_, &system_domain_cache_}) {
+ {&user_domain_cache_, &admin_domain_cache_}) {
TrustStatus ts =
trust_domain_cache->IsCertTrusted(cert, cert_hash, debug_data);
if (ts != TrustStatus::UNSPECIFIED)
return ts;
}
+ if (use_system_domain_cache_) {
+ return system_domain_cache_->IsCertTrusted(cert, cert_hash, debug_data);
+ }
// Cert did not have trust settings in any domain.
return TrustStatus::UNSPECIFIED;
@@ -661,31 +822,158 @@ class TrustStoreMac::TrustImplDomainCache : public TrustStoreMac::TrustImpl {
iteration_ = keychain_iteration;
user_domain_cache_.Initialize();
admin_domain_cache_.Initialize();
- if (!system_domain_initialized_) {
+ if (use_system_domain_cache_ && !system_domain_initialized_) {
// In practice, the system trust domain does not change during runtime,
// and SecTrustSettingsCopyCertificates on the system domain is quite
// slow, so the system domain cache is not reset on keychain changes.
- system_domain_cache_.Initialize();
+ system_domain_cache_->Initialize();
system_domain_initialized_ = true;
}
}
std::unique_ptr<KeychainTrustObserver> keychain_observer_;
+ // Store whether to use the system domain in a const bool that is initialized
+ // in constructor so it is safe to read without having to lock first.
+ const bool use_system_domain_cache_;
base::Lock cache_lock_;
// |cache_lock_| must be held while accessing any following members.
int64_t iteration_ GUARDED_BY(cache_lock_) = -1;
bool system_domain_initialized_ GUARDED_BY(cache_lock_) = false;
- TrustDomainCache system_domain_cache_ GUARDED_BY(cache_lock_);
+ std::unique_ptr<TrustDomainCache> system_domain_cache_
+ GUARDED_BY(cache_lock_);
TrustDomainCache admin_domain_cache_ GUARDED_BY(cache_lock_);
TrustDomainCache user_domain_cache_ GUARDED_BY(cache_lock_);
};
+// TrustImplDomainCacheFullCerts uses SecTrustSettingsCopyCertificates to get
+// the list of certs in each trust domain and caches the full certificates so
+// that pathbuilding does not need to touch any Mac APIs unless one of those
+// certificates is encountered, at which point the calculated trust status of
+// that cert is cached. The cache is reset if trust settings are modified.
+class TrustStoreMac::TrustImplDomainCacheFullCerts
+ : public TrustStoreMac::TrustImpl {
+ public:
+ explicit TrustImplDomainCacheFullCerts(CFStringRef policy_oid,
+ TrustDomains domains)
+ : use_system_domain_cache_(domains == TrustDomains::kAll),
+ admin_domain_cache_(kSecTrustSettingsDomainAdmin, policy_oid),
+ user_domain_cache_(kSecTrustSettingsDomainUser, policy_oid) {
+ if (use_system_domain_cache_) {
+ system_domain_cache_ = std::make_unique<TrustDomainCacheFullCerts>(
+ kSecTrustSettingsDomainSystem, policy_oid);
+ }
+ keychain_observer_ = std::make_unique<KeychainTrustObserver>();
+ }
+
+ TrustImplDomainCacheFullCerts(const TrustImplDomainCacheFullCerts&) = delete;
+ TrustImplDomainCacheFullCerts& operator=(
+ const TrustImplDomainCacheFullCerts&) = delete;
+
+ ~TrustImplDomainCacheFullCerts() override {
+ GetNetworkNotificationThreadMac()->DeleteSoon(
+ FROM_HERE, std::move(keychain_observer_));
+ }
+
+ // Returns true if |cert| is present in kSecTrustSettingsDomainSystem.
+ bool IsKnownRoot(const ParsedCertificate* cert) override {
+ if (!use_system_domain_cache_)
+ return false;
+ SHA256HashValue cert_hash = CalculateFingerprint256(cert->der_cert());
+
+ base::AutoLock lock(cache_lock_);
+ MaybeInitializeCache();
+ return system_domain_cache_->ContainsCert(cert_hash);
+ }
+
+ // Returns the trust status for |cert|.
+ TrustStatus IsCertTrusted(const ParsedCertificate* cert,
+ base::SupportsUserData* debug_data) override {
+ SHA256HashValue cert_hash = CalculateFingerprint256(cert->der_cert());
+
+ base::AutoLock lock(cache_lock_);
+ MaybeInitializeCache();
+
+ // Evaluate trust domains in user, admin, system order. Admin settings can
+ // override system ones, and user settings can override both admin and
+ // system.
+ for (TrustDomainCacheFullCerts* trust_domain_cache :
+ {&user_domain_cache_, &admin_domain_cache_}) {
+ TrustStatus ts =
+ trust_domain_cache->IsCertTrusted(cert, cert_hash, debug_data);
+ if (ts != TrustStatus::UNSPECIFIED)
+ return ts;
+ }
+ if (use_system_domain_cache_) {
+ return system_domain_cache_->IsCertTrusted(cert, cert_hash, debug_data);
+ }
+
+ // Cert did not have trust settings in any domain.
+ return TrustStatus::UNSPECIFIED;
+ }
+
+ bool ImplementsSyncGetIssuersOf() const override { return true; }
+
+ void SyncGetIssuersOf(const ParsedCertificate* cert,
+ ParsedCertificateList* issuers) override {
+ base::AutoLock lock(cache_lock_);
+ MaybeInitializeCache();
+ user_domain_cache_.cert_issuer_source().SyncGetIssuersOf(cert, issuers);
+ admin_domain_cache_.cert_issuer_source().SyncGetIssuersOf(cert, issuers);
+ if (system_domain_cache_) {
+ system_domain_cache_->cert_issuer_source().SyncGetIssuersOf(cert,
+ issuers);
+ }
+ }
+
+ // Initializes the cache, if it isn't already initialized.
+ void InitializeTrustCache() override {
+ base::AutoLock lock(cache_lock_);
+ MaybeInitializeCache();
+ }
+
+ private:
+ // (Re-)Initialize the cache if necessary. Must be called after acquiring
+ // |cache_lock_| and before accessing any of the |*_domain_cache_| members.
+ void MaybeInitializeCache() EXCLUSIVE_LOCKS_REQUIRED(cache_lock_) {
+ cache_lock_.AssertAcquired();
+ int64_t keychain_iteration = keychain_observer_->Iteration();
+ if (iteration_ == keychain_iteration)
+ return;
+
+ iteration_ = keychain_iteration;
+ user_domain_cache_.Initialize();
+ admin_domain_cache_.Initialize();
+ if (use_system_domain_cache_ && !system_domain_initialized_) {
+ // In practice, the system trust domain does not change during runtime,
+ // and SecTrustSettingsCopyCertificates on the system domain is quite
+ // slow, so the system domain cache is not reset on keychain changes.
+ system_domain_cache_->Initialize();
+ system_domain_initialized_ = true;
+ }
+ }
+
+ std::unique_ptr<KeychainTrustObserver> keychain_observer_;
+ // Store whether to use the system domain in a const bool that is initialized
+ // in constructor so it is safe to read without having to lock first.
+ const bool use_system_domain_cache_;
+
+ base::Lock cache_lock_;
+ // |cache_lock_| must be held while accessing any following members.
+ int64_t iteration_ GUARDED_BY(cache_lock_) = -1;
+ bool system_domain_initialized_ GUARDED_BY(cache_lock_) = false;
+ std::unique_ptr<TrustDomainCacheFullCerts> system_domain_cache_
+ GUARDED_BY(cache_lock_);
+ TrustDomainCacheFullCerts admin_domain_cache_ GUARDED_BY(cache_lock_);
+ TrustDomainCacheFullCerts user_domain_cache_ GUARDED_BY(cache_lock_);
+};
+
// TrustImplNoCache is the simplest approach which calls
// SecTrustSettingsCopyTrustSettings on every cert checked, with no caching.
class TrustStoreMac::TrustImplNoCache : public TrustStoreMac::TrustImpl {
public:
- explicit TrustImplNoCache(CFStringRef policy_oid) : policy_oid_(policy_oid) {}
+ explicit TrustImplNoCache(CFStringRef policy_oid, TrustDomains domains)
+ : policy_oid_(policy_oid), domains_(domains) {}
TrustImplNoCache(const TrustImplNoCache&) = delete;
TrustImplNoCache& operator=(const TrustImplNoCache&) = delete;
@@ -694,6 +982,8 @@ class TrustStoreMac::TrustImplNoCache : public TrustStoreMac::TrustImpl {
// Returns true if |cert| is present in kSecTrustSettingsDomainSystem.
bool IsKnownRoot(const ParsedCertificate* cert) override {
+ if (domains_ == TrustDomains::kUserAndAdmin)
+ return false;
HashValue cert_hash(CalculateFingerprint256(cert->der_cert()));
base::AutoLock lock(crypto::GetMacSecurityServicesLock());
return net::IsKnownRoot(cert_hash);
@@ -703,8 +993,9 @@ class TrustStoreMac::TrustImplNoCache : public TrustStoreMac::TrustImpl {
TrustStatus IsCertTrusted(const ParsedCertificate* cert,
base::SupportsUserData* debug_data) override {
int debug_info = 0;
- TrustStatus result = IsCertificateTrustedForPolicy(
- cert, policy_oid_, &debug_info, /*out_is_known_root=*/nullptr);
+ TrustStatus result =
+ IsCertificateTrustedForPolicy(cert, policy_oid_, domains_, &debug_info,
+ /*out_is_known_root=*/nullptr);
UpdateUserData(debug_info, debug_data,
TrustStoreMac::TrustImplType::kSimple);
return result;
@@ -716,6 +1007,7 @@ class TrustStoreMac::TrustImplNoCache : public TrustStoreMac::TrustImpl {
private:
const CFStringRef policy_oid_;
+ const TrustDomains domains_;
};
// TrustImplLRUCache is calls SecTrustSettingsCopyTrustSettings on every cert
@@ -723,8 +1015,12 @@ class TrustStoreMac::TrustImplNoCache : public TrustStoreMac::TrustImpl {
// keychain updates.
class TrustStoreMac::TrustImplLRUCache : public TrustStoreMac::TrustImpl {
public:
- TrustImplLRUCache(CFStringRef policy_oid, size_t cache_size)
- : policy_oid_(policy_oid), trust_status_cache_(cache_size) {
+ TrustImplLRUCache(CFStringRef policy_oid,
+ size_t cache_size,
+ TrustDomains domains)
+ : policy_oid_(policy_oid),
+ domains_(domains),
+ trust_status_cache_(cache_size) {
keychain_observer_ = std::make_unique<KeychainTrustObserver>();
}
@@ -738,6 +1034,8 @@ class TrustStoreMac::TrustImplLRUCache : public TrustStoreMac::TrustImpl {
// Returns true if |cert| has trust settings in kSecTrustSettingsDomainSystem.
bool IsKnownRoot(const ParsedCertificate* cert) override {
+ if (domains_ == TrustDomains::kUserAndAdmin)
+ return false;
return GetKnownRootStatus(cert) == KnownRootStatus::IS_KNOWN_ROOT;
}
@@ -818,7 +1116,7 @@ class TrustStoreMac::TrustImplLRUCache : public TrustStoreMac::TrustImpl {
}
trust_details.trust_status = IsCertificateTrustedForPolicy(
- cert, policy_oid_, &trust_details.debug_info,
+ cert, policy_oid_, domains_, &trust_details.debug_info,
&trust_details.is_known_root);
{
@@ -841,6 +1139,7 @@ class TrustStoreMac::TrustImplLRUCache : public TrustStoreMac::TrustImpl {
}
const CFStringRef policy_oid_;
+ const TrustDomains domains_;
std::unique_ptr<KeychainTrustObserver> keychain_observer_;
base::Lock cache_lock_;
@@ -858,20 +1157,27 @@ class TrustStoreMac::TrustImplLRUCache : public TrustStoreMac::TrustImpl {
TrustStoreMac::TrustStoreMac(CFStringRef policy_oid,
TrustImplType impl,
- size_t cache_size) {
+ size_t cache_size,
+ TrustDomains domains)
+ : domains_(domains) {
switch (impl) {
case TrustImplType::kUnknown:
DCHECK(false);
break;
case TrustImplType::kDomainCache:
- trust_cache_ = std::make_unique<TrustImplDomainCache>(policy_oid);
+ trust_cache_ =
+ std::make_unique<TrustImplDomainCache>(policy_oid, domains);
break;
case TrustImplType::kSimple:
- trust_cache_ = std::make_unique<TrustImplNoCache>(policy_oid);
+ trust_cache_ = std::make_unique<TrustImplNoCache>(policy_oid, domains);
break;
case TrustImplType::kLruCache:
trust_cache_ =
- std::make_unique<TrustImplLRUCache>(policy_oid, cache_size);
+ std::make_unique<TrustImplLRUCache>(policy_oid, cache_size, domains);
+ break;
+ case TrustImplType::kDomainCacheFullCerts:
+ trust_cache_ =
+ std::make_unique<TrustImplDomainCacheFullCerts>(policy_oid, domains);
break;
}
}
@@ -888,12 +1194,17 @@ bool TrustStoreMac::IsKnownRoot(const ParsedCertificate* cert) const {
void TrustStoreMac::SyncGetIssuersOf(const ParsedCertificate* cert,
ParsedCertificateList* issuers) {
+ if (trust_cache_->ImplementsSyncGetIssuersOf()) {
+ trust_cache_->SyncGetIssuersOf(cert, issuers);
+ return;
+ }
+
base::ScopedCFTypeRef<CFDataRef> name_data = GetMacNormalizedIssuer(cert);
if (!name_data)
return;
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> matching_cert_buffers =
- FindMatchingCertificatesForMacNormalizedSubject(name_data);
+ FindMatchingCertificatesForMacNormalizedSubject(name_data, domains_);
// Convert to ParsedCertificate.
for (auto& buffer : matching_cert_buffers) {
@@ -937,7 +1248,8 @@ CertificateTrust TrustStoreMac::GetTrust(
// static
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>>
TrustStoreMac::FindMatchingCertificatesForMacNormalizedSubject(
- CFDataRef name_data) {
+ CFDataRef name_data,
+ TrustDomains domains) {
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> matching_cert_buffers;
base::ScopedCFTypeRef<CFMutableDictionaryRef> query(
CFDictionaryCreateMutable(nullptr, 0, &kCFTypeDictionaryKeyCallBacks,
@@ -961,43 +1273,56 @@ TrustStoreMac::FindMatchingCertificatesForMacNormalizedSubject(
}
}
- // If a TestKeychainSearchList is present, it will have already set
- // |scoped_alternate_keychain_search_list|, which will be used as the
- // basis for reordering the keychain. Otherwise, get the current keychain
- // search list and use that.
- if (!scoped_alternate_keychain_search_list) {
- OSStatus status = SecKeychainCopySearchList(
- scoped_alternate_keychain_search_list.InitializeInto());
+// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
+// Removal of its use is tracked in https://crbug.com/1348251 but deprecation
+// warnings are disabled in the meanwhile.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
+ if (domains == TrustDomains::kAll) {
+ // If a TestKeychainSearchList is present, it will have already set
+ // |scoped_alternate_keychain_search_list|, which will be used as the
+ // basis for reordering the keychain. Otherwise, get the current keychain
+ // search list and use that.
+ if (!scoped_alternate_keychain_search_list) {
+ OSStatus status = SecKeychainCopySearchList(
+ scoped_alternate_keychain_search_list.InitializeInto());
+ if (status) {
+ OSSTATUS_LOG(ERROR, status) << "SecKeychainCopySearchList error";
+ return matching_cert_buffers;
+ }
+ }
+
+ CFMutableArrayRef mutable_keychain_search_list = CFArrayCreateMutableCopy(
+ kCFAllocatorDefault,
+ CFArrayGetCount(scoped_alternate_keychain_search_list.get()) + 1,
+ scoped_alternate_keychain_search_list.get());
+ if (!mutable_keychain_search_list) {
+ LOG(ERROR) << "CFArrayCreateMutableCopy";
+ return matching_cert_buffers;
+ }
+ scoped_alternate_keychain_search_list.reset(mutable_keychain_search_list);
+
+ base::ScopedCFTypeRef<SecKeychainRef> roots_keychain;
+ // The System Roots keychain is not normally searched by
+ // SecItemCopyMatching. Get a reference to it and include in the keychain
+ // search list.
+ OSStatus status = SecKeychainOpen(
+ "/System/Library/Keychains/SystemRootCertificates.keychain",
+ roots_keychain.InitializeInto());
if (status) {
- OSSTATUS_LOG(ERROR, status) << "SecKeychainCopySearchList error";
+ OSSTATUS_LOG(ERROR, status) << "SecKeychainOpen error";
return matching_cert_buffers;
}
+ CFArrayAppendValue(mutable_keychain_search_list, roots_keychain);
}
- CFMutableArrayRef mutable_keychain_search_list = CFArrayCreateMutableCopy(
- kCFAllocatorDefault,
- CFArrayGetCount(scoped_alternate_keychain_search_list.get()) + 1,
- scoped_alternate_keychain_search_list.get());
- if (!mutable_keychain_search_list) {
- LOG(ERROR) << "CFArrayCreateMutableCopy";
- return matching_cert_buffers;
- }
- scoped_alternate_keychain_search_list.reset(mutable_keychain_search_list);
+#pragma clang diagnostic pop
- base::ScopedCFTypeRef<SecKeychainRef> roots_keychain;
- // The System Roots keychain is not normally searched by SecItemCopyMatching.
- // Get a reference to it and include in the keychain search list.
- OSStatus status = SecKeychainOpen(
- "/System/Library/Keychains/SystemRootCertificates.keychain",
- roots_keychain.InitializeInto());
- if (status) {
- OSSTATUS_LOG(ERROR, status) << "SecKeychainOpen error";
- return matching_cert_buffers;
+ if (scoped_alternate_keychain_search_list) {
+ CFDictionarySetValue(query, kSecMatchSearchList,
+ scoped_alternate_keychain_search_list.get());
}
- CFArrayAppendValue(mutable_keychain_search_list, roots_keychain);
-
- CFDictionarySetValue(query, kSecMatchSearchList,
- scoped_alternate_keychain_search_list.get());
base::ScopedCFTypeRef<CFArrayRef> matching_items;
OSStatus err = SecItemCopyMatching(
diff --git a/chromium/net/cert/internal/trust_store_mac.h b/chromium/net/cert/internal/trust_store_mac.h
index 02c39fc21b5..e7f9a964cb0 100644
--- a/chromium/net/cert/internal/trust_store_mac.h
+++ b/chromium/net/cert/internal/trust_store_mac.h
@@ -11,7 +11,7 @@
#include "base/mac/scoped_cftyperef.h"
#include "base/memory/ref_counted.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/trust_store.h"
+#include "net/cert/pki/trust_store.h"
namespace net {
@@ -74,11 +74,25 @@ class NET_EXPORT TrustStoreMac : public TrustStore {
COPY_TRUST_SETTINGS_ERROR = 1 << 11,
};
+ // NOTE: When updating this enum, also update ParamToTrustImplType in
+ // system_trust_store.cc
enum class TrustImplType {
kUnknown = 0,
kDomainCache = 1,
kSimple = 2,
kLruCache = 3,
+ kDomainCacheFullCerts = 4,
+ };
+
+ enum class TrustDomains {
+ // Load trust settings and certificates from all three trust domains
+ // (user, admin, system).
+ kAll = 0,
+
+ // Load trust settings and certificates from only the user and admin trust
+ // domains. This will find trust settings that have been set locally or by
+ // an enterprise, but not those distributed with the OS.
+ kUserAndAdmin = 1,
};
class ResultDebugData : public base::SupportsUserData::Data {
@@ -111,7 +125,10 @@ class NET_EXPORT TrustStoreMac : public TrustStore {
// |impl| selects which internal implementation is used for checking trust
// settings, and the interpretation of |cache_size| varies depending on
// |impl|.
- TrustStoreMac(CFStringRef policy_oid, TrustImplType impl, size_t cache_size);
+ TrustStoreMac(CFStringRef policy_oid,
+ TrustImplType impl,
+ size_t cache_size,
+ TrustDomains domains);
TrustStoreMac(const TrustStoreMac&) = delete;
TrustStoreMac& operator=(const TrustStoreMac&) = delete;
@@ -134,6 +151,7 @@ class NET_EXPORT TrustStoreMac : public TrustStore {
private:
class TrustImpl;
class TrustImplDomainCache;
+ class TrustImplDomainCacheFullCerts;
class TrustImplNoCache;
class TrustImplLRUCache;
@@ -143,7 +161,8 @@ class NET_EXPORT TrustStoreMac : public TrustStore {
// The result is an array of CRYPTO_BUFFERs containing the DER certificate
// data.
static std::vector<bssl::UniquePtr<CRYPTO_BUFFER>>
- FindMatchingCertificatesForMacNormalizedSubject(CFDataRef name_data);
+ FindMatchingCertificatesForMacNormalizedSubject(CFDataRef name_data,
+ TrustDomains domains);
// Returns the OS-normalized issuer of |cert|.
// macOS internally uses a normalized form of subject/issuer names for
@@ -152,6 +171,7 @@ class NET_EXPORT TrustStoreMac : public TrustStore {
static base::ScopedCFTypeRef<CFDataRef> GetMacNormalizedIssuer(
const ParsedCertificate* cert);
+ TrustDomains domains_;
std::unique_ptr<TrustImpl> trust_cache_;
};
diff --git a/chromium/net/cert/internal/trust_store_mac_unittest.cc b/chromium/net/cert/internal/trust_store_mac_unittest.cc
index 095b90df72f..92383414d74 100644
--- a/chromium/net/cert/internal/trust_store_mac_unittest.cc
+++ b/chromium/net/cert/internal/trust_store_mac_unittest.cc
@@ -4,19 +4,25 @@
#include "net/cert/internal/trust_store_mac.h"
+#include <algorithm>
+#include <set>
+
#include "base/base_paths.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/process/launch.h"
+#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/synchronization/lock.h"
+#include "base/test/metrics/histogram_tester.h"
#include "crypto/mac_security_services_lock.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/test_helpers.h"
+#include "crypto/sha2.h"
#include "net/cert/known_roots_mac.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/cert/test_keychain_search_list_mac.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
@@ -83,6 +89,28 @@ std::vector<std::string> ParsedCertificateListAsDER(
return result;
}
+std::set<std::string> ParseFindCertificateOutputToDerCerts(std::string output) {
+ std::set<std::string> certs;
+ for (const std::string& hash_and_pem_partial : base::SplitStringUsingSubstr(
+ output, "-----END CERTIFICATE-----", base::TRIM_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY)) {
+ // Re-add the PEM ending mark, since SplitStringUsingSubstr eats it.
+ const std::string hash_and_pem =
+ hash_and_pem_partial + "\n-----END CERTIFICATE-----\n";
+
+ // Parse the PEM encoded text to DER bytes.
+ PEMTokenizer pem_tokenizer(hash_and_pem, {kCertificateHeader});
+ if (!pem_tokenizer.GetNext()) {
+ ADD_FAILURE() << "!pem_tokenizer.GetNext()";
+ continue;
+ }
+ std::string cert_der(pem_tokenizer.data());
+ EXPECT_FALSE(pem_tokenizer.GetNext());
+ certs.insert(cert_der);
+ }
+ return certs;
+}
+
class DebugData : public base::SupportsUserData {
public:
~DebugData() override = default;
@@ -96,8 +124,15 @@ enum IsKnownRootTestOrder {
} // namespace
class TrustStoreMacImplTest
- : public testing::TestWithParam<
- std::tuple<TrustStoreMac::TrustImplType, IsKnownRootTestOrder>> {};
+ : public testing::TestWithParam<std::tuple<TrustStoreMac::TrustImplType,
+ IsKnownRootTestOrder,
+ TrustStoreMac::TrustDomains>> {};
+
+// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
+// Removal of its use is tracked in https://crbug.com/1348251 but deprecation
+// warnings are disabled in the meanwhile.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// Test the trust store using known test certificates in a keychain. Tests
// that issuer searching returns the expected certificates, and that none of
@@ -118,9 +153,13 @@ TEST_P(TrustStoreMacImplTest, MultiRootNotTrusted) {
ASSERT_TRUE(keychain);
test_keychain_search_list->AddKeychain(keychain);
+#pragma clang diagnostic pop
+
const TrustStoreMac::TrustImplType trust_impl = std::get<0>(GetParam());
const IsKnownRootTestOrder is_known_root_test_order = std::get<1>(GetParam());
- TrustStoreMac trust_store(kSecPolicyAppleSSL, trust_impl, kDefaultCacheSize);
+ const TrustStoreMac::TrustDomains trust_domains = std::get<2>(GetParam());
+ TrustStoreMac trust_store(kSecPolicyAppleSSL, trust_impl, kDefaultCacheSize,
+ trust_domains);
scoped_refptr<ParsedCertificate> a_by_b, b_by_c, b_by_f, c_by_d, c_by_e,
f_by_e, d_by_d, e_by_e;
@@ -155,7 +194,7 @@ TEST_P(TrustStoreMacImplTest, MultiRootNotTrusted) {
{
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> scoped_matching_items =
TrustStoreMac::FindMatchingCertificatesForMacNormalizedSubject(
- normalized_name_b.get());
+ normalized_name_b.get(), trust_domains);
EXPECT_THAT(CryptoBufferVectorAsStringVector(scoped_matching_items),
UnorderedElementsAreArray(
@@ -165,7 +204,7 @@ TEST_P(TrustStoreMacImplTest, MultiRootNotTrusted) {
{
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> scoped_matching_items =
TrustStoreMac::FindMatchingCertificatesForMacNormalizedSubject(
- normalized_name_c.get());
+ normalized_name_c.get(), trust_domains);
EXPECT_THAT(CryptoBufferVectorAsStringVector(scoped_matching_items),
UnorderedElementsAreArray(
ParsedCertificateListAsDER({c_by_d, c_by_e})));
@@ -174,7 +213,7 @@ TEST_P(TrustStoreMacImplTest, MultiRootNotTrusted) {
{
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> scoped_matching_items =
TrustStoreMac::FindMatchingCertificatesForMacNormalizedSubject(
- normalized_name_f.get());
+ normalized_name_f.get(), trust_domains);
EXPECT_THAT(
CryptoBufferVectorAsStringVector(scoped_matching_items),
UnorderedElementsAreArray(ParsedCertificateListAsDER({f_by_e})));
@@ -183,7 +222,7 @@ TEST_P(TrustStoreMacImplTest, MultiRootNotTrusted) {
{
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> scoped_matching_items =
TrustStoreMac::FindMatchingCertificatesForMacNormalizedSubject(
- normalized_name_d.get());
+ normalized_name_d.get(), trust_domains);
EXPECT_THAT(
CryptoBufferVectorAsStringVector(scoped_matching_items),
UnorderedElementsAreArray(ParsedCertificateListAsDER({d_by_d})));
@@ -192,7 +231,7 @@ TEST_P(TrustStoreMacImplTest, MultiRootNotTrusted) {
{
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> scoped_matching_items =
TrustStoreMac::FindMatchingCertificatesForMacNormalizedSubject(
- normalized_name_e.get());
+ normalized_name_e.get(), trust_domains);
EXPECT_THAT(
CryptoBufferVectorAsStringVector(scoped_matching_items),
UnorderedElementsAreArray(ParsedCertificateListAsDER({e_by_e})));
@@ -242,43 +281,33 @@ TEST_P(TrustStoreMacImplTest, SystemCerts) {
"/System/Library/Keychains/SystemRootCertificates.keychain"},
&find_certificate_system_roots_output));
+ std::set<std::string> find_certificate_default_search_list_certs =
+ ParseFindCertificateOutputToDerCerts(
+ find_certificate_default_search_list_output);
+ std::set<std::string> find_certificate_system_roots_certs =
+ ParseFindCertificateOutputToDerCerts(
+ find_certificate_system_roots_output);
+
const TrustStoreMac::TrustImplType trust_impl = std::get<0>(GetParam());
const IsKnownRootTestOrder is_known_root_test_order = std::get<1>(GetParam());
+ const TrustStoreMac::TrustDomains trust_domains = std::get<2>(GetParam());
+
+ base::HistogramTester histogram_tester;
TrustStoreMac trust_store(kSecPolicyAppleX509Basic, trust_impl,
- kDefaultCacheSize);
+ kDefaultCacheSize, trust_domains);
base::ScopedCFTypeRef<SecPolicyRef> sec_policy(SecPolicyCreateBasicX509());
ASSERT_TRUE(sec_policy);
- for (const std::string& hash_and_pem_partial : base::SplitStringUsingSubstr(
- find_certificate_system_roots_output +
- find_certificate_default_search_list_output,
- "-----END CERTIFICATE-----", base::TRIM_WHITESPACE,
- base::SPLIT_WANT_NONEMPTY)) {
- // Re-add the PEM ending mark, since SplitStringUsingSubstr eats it.
- const std::string hash_and_pem =
- hash_and_pem_partial + "\n-----END CERTIFICATE-----\n";
-
- // Use the first hash value found in the text. This might be SHA-256 or
- // SHA-1, but it's only for debugging purposes so it doesn't matter as long
- // as one exists.
- std::string::size_type hash_pos = hash_and_pem.find("hash: ");
- ASSERT_NE(std::string::npos, hash_pos);
- hash_pos += 6;
- std::string::size_type eol_pos = hash_and_pem.find_first_of("\r\n");
- ASSERT_NE(std::string::npos, eol_pos);
- // Extract the hash of the certificate. This isn't necessary for the
- // test, but is a convenient identifier to use in any error messages.
- std::string hash_text = hash_and_pem.substr(hash_pos, eol_pos - hash_pos);
-
+ std::vector<std::string> all_certs;
+ std::set_union(find_certificate_default_search_list_certs.begin(),
+ find_certificate_default_search_list_certs.end(),
+ find_certificate_system_roots_certs.begin(),
+ find_certificate_system_roots_certs.end(),
+ std::back_inserter(all_certs));
+ for (const std::string& cert_der : all_certs) {
+ std::string hash = crypto::SHA256HashString(cert_der);
+ std::string hash_text = base::HexEncode(hash.data(), hash.size());
SCOPED_TRACE(hash_text);
- // TODO(mattm): The same cert might exist in both lists, could de-dupe
- // before testing?
-
- // Parse the PEM encoded text to DER bytes.
- PEMTokenizer pem_tokenizer(hash_and_pem, {kCertificateHeader});
- ASSERT_TRUE(pem_tokenizer.GetNext());
- std::string cert_der(pem_tokenizer.data());
- ASSERT_FALSE(pem_tokenizer.GetNext());
CertErrors errors;
// Note: don't actually need to make a ParsedCertificate here, just need
@@ -307,9 +336,11 @@ TEST_P(TrustStoreMacImplTest, SystemCerts) {
if (is_known_root_test_order == TEST_IS_KNOWN_ROOT_BEFORE) {
bool trust_store_is_known_root = trust_store.IsKnownRoot(cert.get());
- {
+ if (trust_domains == TrustStoreMac::TrustDomains::kAll) {
base::AutoLock lock(crypto::GetMacSecurityServicesLock());
EXPECT_EQ(net::IsKnownRoot(cert_handle), trust_store_is_known_root);
+ } else {
+ EXPECT_FALSE(trust_store_is_known_root);
}
}
@@ -334,13 +365,26 @@ TEST_P(TrustStoreMacImplTest, SystemCerts) {
kSecTrustOptionAllowExpired |
kSecTrustOptionAllowExpiredRoot));
- SecTrustResultType trust_result;
- ASSERT_EQ(noErr, SecTrustEvaluate(trust, &trust_result));
- bool expected_trust_anchor =
- ((trust_result == kSecTrustResultProceed) ||
- (trust_result == kSecTrustResultUnspecified)) &&
- (SecTrustGetCertificateCount(trust) == 1);
- EXPECT_EQ(expected_trust_anchor, is_trust_anchor);
+ if (trust_domains == TrustStoreMac::TrustDomains::kUserAndAdmin &&
+ find_certificate_default_search_list_certs.count(cert_der) &&
+ find_certificate_system_roots_certs.count(cert_der)) {
+ // If the same certificate is present in both the System and User/Admin
+ // domains, and TrustStoreMac is only using trust settings from
+ // User/Admin, then it's not possible for this test to know whether the
+ // result from SecTrustEvaluate should match the TrustStoreMac result.
+ // Just ignore such certificates.
+ } else if (trust_domains == TrustStoreMac::TrustDomains::kUserAndAdmin &&
+ !find_certificate_default_search_list_certs.count(cert_der)) {
+ EXPECT_FALSE(is_trust_anchor);
+ } else {
+ SecTrustResultType trust_result;
+ ASSERT_EQ(noErr, SecTrustEvaluate(trust, &trust_result));
+ bool expected_trust_anchor =
+ ((trust_result == kSecTrustResultProceed) ||
+ (trust_result == kSecTrustResultUnspecified)) &&
+ (SecTrustGetCertificateCount(trust) == 1);
+ EXPECT_EQ(expected_trust_anchor, is_trust_anchor);
+ }
auto* trust_debug_data = TrustStoreMac::ResultDebugData::Get(&debug_data);
ASSERT_TRUE(trust_debug_data);
if (is_trust_anchor) {
@@ -355,9 +399,11 @@ TEST_P(TrustStoreMacImplTest, SystemCerts) {
if (is_known_root_test_order == TEST_IS_KNOWN_ROOT_AFTER) {
bool trust_store_is_known_root = trust_store.IsKnownRoot(cert.get());
- {
+ if (trust_domains == TrustStoreMac::TrustDomains::kAll) {
base::AutoLock lock(crypto::GetMacSecurityServicesLock());
EXPECT_EQ(net::IsKnownRoot(cert_handle), trust_store_is_known_root);
+ } else {
+ EXPECT_FALSE(trust_store_is_known_root);
}
}
@@ -375,6 +421,20 @@ TEST_P(TrustStoreMacImplTest, SystemCerts) {
trust_debug_data2->combined_trust_debug_info());
EXPECT_EQ(trust_debug_data->trust_impl(), trust_debug_data2->trust_impl());
}
+
+ if (trust_impl == TrustStoreMac::TrustImplType::kDomainCacheFullCerts) {
+ // Since this is testing the actual platform trust settings, we don't know
+ // what values the histogram should be for each domain, so just verify that
+ // the histogram is recorded (or not) depending on the requested trust
+ // domains.
+ histogram_tester.ExpectTotalCount(
+ "Net.CertVerifier.MacTrustDomainCertCount.User", 1);
+ histogram_tester.ExpectTotalCount(
+ "Net.CertVerifier.MacTrustDomainCertCount.Admin", 1);
+ histogram_tester.ExpectTotalCount(
+ "Net.CertVerifier.MacTrustDomainCertCount.System",
+ (trust_domains == TrustStoreMac::TrustDomains::kAll) ? 1 : 0);
+ }
}
INSTANTIATE_TEST_SUITE_P(
@@ -383,11 +443,14 @@ INSTANTIATE_TEST_SUITE_P(
testing::Combine(
testing::Values(TrustStoreMac::TrustImplType::kDomainCache,
TrustStoreMac::TrustImplType::kSimple,
- TrustStoreMac::TrustImplType::kLruCache),
+ TrustStoreMac::TrustImplType::kLruCache,
+ TrustStoreMac::TrustImplType::kDomainCacheFullCerts),
// Some TrustImpls may calculate/cache IsKnownRoot values and trust
// values independently, so test with calling IsKnownRoot both before
// and after GetTrust to try to ensure there is no ordering issue with
// which one initializes the cache first.
- testing::Values(TEST_IS_KNOWN_ROOT_BEFORE, TEST_IS_KNOWN_ROOT_AFTER)));
+ testing::Values(TEST_IS_KNOWN_ROOT_BEFORE, TEST_IS_KNOWN_ROOT_AFTER),
+ testing::Values(TrustStoreMac::TrustDomains::kAll,
+ TrustStoreMac::TrustDomains::kUserAndAdmin)));
} // namespace net
diff --git a/chromium/net/cert/internal/trust_store_nss.cc b/chromium/net/cert/internal/trust_store_nss.cc
index 07687377dcb..f9d616119a4 100644
--- a/chromium/net/cert/internal/trust_store_nss.cc
+++ b/chromium/net/cert/internal/trust_store_nss.cc
@@ -9,39 +9,22 @@
#include "base/logging.h"
#include "crypto/nss_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/trust_store.h"
#include "net/cert/known_roots_nss.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/trust_store.h"
#include "net/cert/scoped_nss_types.h"
-#include "net/cert/test_root_certs.h"
#include "net/cert/x509_util.h"
#include "net/cert/x509_util_nss.h"
namespace net {
-TrustStoreNSS::TrustStoreNSS(SECTrustType trust_type)
- : trust_type_(trust_type), filter_trusted_certs_by_slot_(false) {}
-
TrustStoreNSS::TrustStoreNSS(SECTrustType trust_type,
- crypto::ScopedPK11Slot user_slot)
- : trust_type_(trust_type),
- filter_trusted_certs_by_slot_(true),
- user_slot_(std::move(user_slot)) {
- DCHECK(user_slot_);
-}
-
-TrustStoreNSS::TrustStoreNSS(
- SECTrustType trust_type,
- DisallowTrustForCertsOnUserSlots disallow_trust_for_certs_on_user_slots)
- : trust_type_(trust_type), filter_trusted_certs_by_slot_(true) {}
-
-TrustStoreNSS::TrustStoreNSS(
- SECTrustType trust_type,
- IgnoreSystemTrustSettings ignore_system_trust_settings)
+ SystemTrustSetting system_trust_setting,
+ UserSlotTrustSetting user_slot_trust_setting)
: trust_type_(trust_type),
- ignore_system_trust_settings_(true),
- filter_trusted_certs_by_slot_(false) {}
+ ignore_system_trust_settings_(system_trust_setting == kIgnoreSystemTrust),
+ user_slot_trust_setting_(std::move(user_slot_trust_setting)) {}
TrustStoreNSS::~TrustStoreNSS() = default;
@@ -148,10 +131,10 @@ CertificateTrust TrustStoreNSS::GetTrust(
}
bool TrustStoreNSS::IsCertAllowedForTrust(CERTCertificate* cert) const {
- // If |filter_trusted_certs_by_slot_| is false, allow trust for any
- // certificate, no matter which slot it is stored on.
- if (!filter_trusted_certs_by_slot_)
+ if (absl::holds_alternative<UseTrustFromAllUserSlots>(
+ user_slot_trust_setting_)) {
return true;
+ }
crypto::ScopedPK11SlotList slots_for_cert(
PK11_GetAllSlotsForCert(cert, nullptr));
@@ -169,8 +152,11 @@ bool TrustStoreNSS::IsCertAllowedForTrust(CERTCertificate* cert) const {
PK11_HasRootCerts(slot) ||
// Allow read-only internal slots.
(PK11_IsInternal(slot) && !PK11_IsRemovable(slot)) ||
- // Allow |user_slot_| if specified.
- (user_slot_ && slot == user_slot_.get());
+ // Allow configured user slot if specified.
+ (absl::holds_alternative<crypto::ScopedPK11Slot>(
+ user_slot_trust_setting_) &&
+ slot ==
+ absl::get<crypto::ScopedPK11Slot>(user_slot_trust_setting_).get());
if (allow_slot) {
PK11_FreeSlotListElement(slots_for_cert.get(), slot_element);
diff --git a/chromium/net/cert/internal/trust_store_nss.h b/chromium/net/cert/internal/trust_store_nss.h
index 794fedc9604..2eebd88e2bd 100644
--- a/chromium/net/cert/internal/trust_store_nss.h
+++ b/chromium/net/cert/internal/trust_store_nss.h
@@ -8,10 +8,10 @@
#include <cert.h>
#include <certt.h>
-#include "base/memory/ref_counted.h"
#include "crypto/scoped_nss_types.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/trust_store.h"
+#include "net/cert/pki/trust_store.h"
+#include "third_party/abseil-cpp/absl/types/variant.h"
namespace net {
@@ -19,44 +19,29 @@ namespace net {
// anchors for path building. This TrustStore is thread-safe.
class NET_EXPORT TrustStoreNSS : public TrustStore {
public:
- // TODO(hchao): this won't work when we try to get this working for ChromeOS
- // as we will likely need to be able to specify multiple options (trust_type,
- // user_slot, ignoring_system_certs_unless_distrusted), so we'll need to
- // re-engineer to not get combinatorial explosion for constructors.
- struct DisallowTrustForCertsOnUserSlots {};
- struct IgnoreSystemTrustSettings {};
+ enum SystemTrustSetting {
+ kUseSystemTrust,
+ kIgnoreSystemTrust,
+ };
- // Creates a TrustStoreNSS which will find anchors that are trusted for
- // |trust_type|.
- // The created TrustStoreNSS will not perform any filtering based on the slot
- // certificates are stored on.
- explicit TrustStoreNSS(SECTrustType trust_type);
-
- // Creates a TrustStoreNSS which will find anchors that are trusted for
- // |trust_type|.
- // The created TrustStoreNSS will allow trust for certificates that:
- // (*) are built-in certificates
- // (*) are stored on a read-only internal slot
- // (*) are stored on the |user_slot|.
- TrustStoreNSS(SECTrustType trust_type, crypto::ScopedPK11Slot user_slot);
+ struct UseTrustFromAllUserSlots : absl::monostate {};
+ using UserSlotTrustSetting =
+ absl::variant<UseTrustFromAllUserSlots, crypto::ScopedPK11Slot>;
// Creates a TrustStoreNSS which will find anchors that are trusted for
// |trust_type|.
- // The created TrustStoreNSS will allow trust for certificates that:
- // (*) are built-in certificates
- // (*) are stored on a read-only internal slot
- TrustStoreNSS(
- SECTrustType trust_type,
- DisallowTrustForCertsOnUserSlots disallow_trust_for_certs_on_user_slots);
-
- // Creates a TrustStoreNSS which will find anchors that are trusted for
- // |trust_type|.
- // The created TrustStoreNSS will ignore system trust settings (but will
- // respect user-added certs).
//
- // TODO(hchao, sleevi): Only ignore builtin trust settings for these certs.
+ // |system_trust_setting| configures the use of trust from the builtin roots.
+ // If |system_trust_setting| is kIgnoreSystemTrust, trust settings from the
+ // builtin roots slot with the Mozilla CA Policy attribute will not be used.
+ //
+ // |user_slot_trust_setting| configures the use of trust from user slots:
+ // * UseTrustFromAllUserSlots: all user slots will be allowed.
+ // * nullptr: no user slots will be allowed.
+ // * non-null PK11Slot: the specified slot will be allowed.
TrustStoreNSS(SECTrustType trust_type,
- IgnoreSystemTrustSettings ignore_system_trust_settings);
+ SystemTrustSetting system_trust_setting,
+ UserSlotTrustSetting user_slot_trust_setting);
TrustStoreNSS(const TrustStoreNSS&) = delete;
TrustStoreNSS& operator=(const TrustStoreNSS&) = delete;
@@ -83,25 +68,16 @@ class NET_EXPORT TrustStoreNSS : public TrustStore {
// while respecting user-configured trust settings, for these certificates.
const bool ignore_system_trust_settings_ = false;
- // |filter_trusted_certs_by_slot_| and |user_slot_| together specify which
- // slots certificates must be stored on to be allowed to be trusted. The
- // possible combinations are:
- //
- // |filter_trusted_certs_by_slot_| == false: Allow any certificate to be
- // trusted, don't filter by slot. |user_slot_| is ignored in this case.
+ // |user_slot_trust_setting_| specifies which slots certificates must be
+ // stored on to be allowed to be trusted. The possible values are:
//
- // |filter_trusted_certs_by_slot_| == true and |user_slot_| = nullptr: Allow
- // certificates to be trusted if they
- // (*) are built-in certificates or
- // (*) are stored on a read-only internal slot.
+ // |user_slot_trust_setting_| is UseTrustFromAllUserSlots: Allow trust
+ // settings from any user slots.
//
- // |filter_trusted_certs_by_slot_| == true and |user_slot_| != nullptr: Allow
- // certificates to be trusted if they
- // (*) are built-in certificates or
- // (*) are stored on a read-only internal slot or
- // (*) are stored on |user_slot_|.
- const bool filter_trusted_certs_by_slot_;
- crypto::ScopedPK11Slot user_slot_;
+ // |user_slot_trust_setting_| is a ScopedPK11Slot: Allow
+ // certificates from the specified slot to be trusted. If the slot is nullptr,
+ // trust from user slots will not be used.
+ const UserSlotTrustSetting user_slot_trust_setting_;
};
} // namespace net
diff --git a/chromium/net/cert/internal/trust_store_nss_unittest.cc b/chromium/net/cert/internal/trust_store_nss_unittest.cc
index 1d3b4481f69..6bdd0c01a2e 100644
--- a/chromium/net/cert/internal/trust_store_nss_unittest.cc
+++ b/chromium/net/cert/internal/trust_store_nss_unittest.cc
@@ -13,10 +13,10 @@
#include "base/strings/string_number_conversions.h"
#include "crypto/nss_util_internal.h"
#include "crypto/scoped_test_nss_db.h"
-#include "net/cert/internal/cert_issuer_source_sync_unittest.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/test_helpers.h"
#include "net/cert/known_roots_nss.h"
+#include "net/cert/pki/cert_issuer_source_sync_unittest.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/cert/scoped_nss_types.h"
#include "net/cert/test_root_certs.h"
#include "net/cert/x509_util.h"
@@ -51,7 +51,7 @@ bool IsBuiltInRootSlot(PK11SlotInfo* slot) {
crypto::ScopedPK11Slot GetBuiltInRootCertsSlot() {
crypto::AutoSECMODListReadLock auto_lock;
SECMODModuleList* head = SECMOD_GetDefaultModuleList();
- for (SECMODModuleList* item = head; item != NULL; item = item->next) {
+ for (SECMODModuleList* item = head; item != nullptr; item = item->next) {
int slot_count = item->module->loaded ? item->module->slotCount : 0;
for (int i = 0; i < slot_count; i++) {
PK11SlotInfo* slot = item->module->slots[i];
@@ -298,13 +298,16 @@ class TrustStoreNSSTestWithSlotFilterType
std::unique_ptr<TrustStoreNSS> CreateTrustStoreNSS() override {
switch (GetParam()) {
case SlotFilterType::kDontFilter:
- return std::make_unique<TrustStoreNSS>(trustSSL);
+ return std::make_unique<TrustStoreNSS>(
+ trustSSL, TrustStoreNSS::kUseSystemTrust,
+ TrustStoreNSS::UseTrustFromAllUserSlots());
case SlotFilterType::kDoNotAllowUserSlots:
return std::make_unique<TrustStoreNSS>(
- trustSSL, TrustStoreNSS::DisallowTrustForCertsOnUserSlots());
+ trustSSL, TrustStoreNSS::kUseSystemTrust,
+ /*user_slot_trust_setting=*/nullptr);
case SlotFilterType::kAllowSpecifiedUserSlot:
return std::make_unique<TrustStoreNSS>(
- trustSSL,
+ trustSSL, TrustStoreNSS::kUseSystemTrust,
crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())));
}
}
@@ -345,7 +348,7 @@ INSTANTIATE_TEST_SUITE_P(
SlotFilterType::kDoNotAllowUserSlots,
SlotFilterType::kAllowSpecifiedUserSlot));
-// Tests a TrustStoreNSS that ignores root certs
+// Tests a TrustStoreNSS that ignores system root certs.
class TrustStoreNSSTestIgnoreSystemCerts : public TrustStoreNSSTestBase {
public:
TrustStoreNSSTestIgnoreSystemCerts() = default;
@@ -353,7 +356,8 @@ class TrustStoreNSSTestIgnoreSystemCerts : public TrustStoreNSSTestBase {
std::unique_ptr<TrustStoreNSS> CreateTrustStoreNSS() override {
return std::make_unique<TrustStoreNSS>(
- trustSSL, TrustStoreNSS::IgnoreSystemTrustSettings());
+ trustSSL, TrustStoreNSS::kIgnoreSystemTrust,
+ TrustStoreNSS::UseTrustFromAllUserSlots());
}
};
@@ -382,7 +386,9 @@ class TrustStoreNSSTestWithoutSlotFilter : public TrustStoreNSSTestBase {
~TrustStoreNSSTestWithoutSlotFilter() override = default;
std::unique_ptr<TrustStoreNSS> CreateTrustStoreNSS() override {
- return std::make_unique<TrustStoreNSS>(trustSSL);
+ return std::make_unique<TrustStoreNSS>(
+ trustSSL, TrustStoreNSS::kUseSystemTrust,
+ TrustStoreNSS::UseTrustFromAllUserSlots());
}
};
@@ -494,8 +500,9 @@ class TrustStoreNSSTestDoNotAllowUserSlots : public TrustStoreNSSTestBase {
~TrustStoreNSSTestDoNotAllowUserSlots() override = default;
std::unique_ptr<TrustStoreNSS> CreateTrustStoreNSS() override {
- return std::make_unique<TrustStoreNSS>(
- trustSSL, TrustStoreNSS::DisallowTrustForCertsOnUserSlots());
+ return std::make_unique<TrustStoreNSS>(trustSSL,
+ TrustStoreNSS::kUseSystemTrust,
+ /*user_slot_trust_setting=*/nullptr);
}
};
@@ -516,7 +523,7 @@ class TrustStoreNSSTestAllowSpecifiedUserSlot : public TrustStoreNSSTestBase {
std::unique_ptr<TrustStoreNSS> CreateTrustStoreNSS() override {
return std::make_unique<TrustStoreNSS>(
- trustSSL,
+ trustSSL, TrustStoreNSS::kUseSystemTrust,
crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())));
}
};
@@ -544,7 +551,10 @@ TEST_F(TrustStoreNSSTestAllowSpecifiedUserSlot, CertOnOtherUserSlot) {
class TrustStoreNSSTestDelegate {
public:
- TrustStoreNSSTestDelegate() : trust_store_nss_(trustSSL) {}
+ TrustStoreNSSTestDelegate()
+ : trust_store_nss_(trustSSL,
+ TrustStoreNSS::kUseSystemTrust,
+ TrustStoreNSS::UseTrustFromAllUserSlots()) {}
void AddCert(scoped_refptr<ParsedCertificate> cert) {
ASSERT_TRUE(test_nssdb_.is_open());
diff --git a/chromium/net/cert/internal/trust_store_win.cc b/chromium/net/cert/internal/trust_store_win.cc
index b1649620e6f..85159c87fa5 100644
--- a/chromium/net/cert/internal/trust_store_win.cc
+++ b/chromium/net/cert/internal/trust_store_win.cc
@@ -9,8 +9,8 @@
#include "base/memory/ptr_util.h"
#include "base/ranges/algorithm.h"
#include "base/strings/string_number_conversions.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/x509_util.h"
#include "net/third_party/mozilla_win/cert/win_util.h"
@@ -43,7 +43,7 @@ namespace {
bool IsCertTrustedForServerAuth(PCCERT_CONTEXT cert) {
DWORD usage_size = 0;
- if (!CertGetEnhancedKeyUsage(cert, 0, NULL, &usage_size)) {
+ if (!CertGetEnhancedKeyUsage(cert, 0, nullptr, &usage_size)) {
return false;
}
diff --git a/chromium/net/cert/internal/trust_store_win.h b/chromium/net/cert/internal/trust_store_win.h
index 833e205e585..4d2fe96e7e6 100644
--- a/chromium/net/cert/internal/trust_store_win.h
+++ b/chromium/net/cert/internal/trust_store_win.h
@@ -10,7 +10,7 @@
#include "base/win/wincrypt_shim.h"
#include "crypto/scoped_capi_types.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/trust_store.h"
+#include "net/cert/pki/trust_store.h"
namespace net {
diff --git a/chromium/net/cert/internal/trust_store_win_unittest.cc b/chromium/net/cert/internal/trust_store_win_unittest.cc
index a01bb8f215c..b1b73c4a92d 100644
--- a/chromium/net/cert/internal/trust_store_win_unittest.cc
+++ b/chromium/net/cert/internal/trust_store_win_unittest.cc
@@ -13,9 +13,9 @@
#include "base/win/wincrypt_shim.h"
#include "crypto/scoped_capi_types.h"
#include "net/cert/cert_net_fetcher.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "net/cert/x509_util_win.h"
@@ -65,7 +65,7 @@ bool AddToStore(HCERTSTORE store, const std::string file_name) {
X509_ASN_ENCODING, CRYPTO_BUFFER_data(cert->cert_buffer()),
CRYPTO_BUFFER_len(cert->cert_buffer())));
return CertAddCertificateContextToStore(store, os_cert.get(),
- CERT_STORE_ADD_ALWAYS, NULL);
+ CERT_STORE_ADD_ALWAYS, nullptr);
}
// Returns true if cert at file_name successfully added to store with
@@ -93,7 +93,7 @@ bool AddToStoreWithEKURestriction(HCERTSTORE store,
}
}
return !!CertAddCertificateContextToStore(store, os_cert.get(),
- CERT_STORE_ADD_ALWAYS, NULL);
+ CERT_STORE_ADD_ALWAYS, nullptr);
}
// TrustStoreWin isset up as follows:
diff --git a/chromium/net/cert/known_roots_mac.cc b/chromium/net/cert/known_roots_mac.cc
index 7f105d1468d..383c576f8a3 100644
--- a/chromium/net/cert/known_roots_mac.cc
+++ b/chromium/net/cert/known_roots_mac.cc
@@ -53,7 +53,7 @@ class OSXKnownRootHelper {
OSXKnownRootHelper() {
crypto::GetMacSecurityServicesLock().AssertAcquired();
- CFArrayRef cert_array = NULL;
+ CFArrayRef cert_array = nullptr;
OSStatus rv = SecTrustSettingsCopyCertificates(
kSecTrustSettingsDomainSystem, &cert_array);
if (rv != noErr) {
@@ -72,7 +72,7 @@ class OSXKnownRootHelper {
std::sort(known_roots_.begin(), known_roots_.end());
}
- ~OSXKnownRootHelper() {}
+ ~OSXKnownRootHelper() = default;
std::vector<SHA256HashValue> known_roots_;
};
diff --git a/chromium/net/cert/known_roots_nss.cc b/chromium/net/cert/known_roots_nss.cc
index edcc608d97e..ab3848b5cc4 100644
--- a/chromium/net/cert/known_roots_nss.cc
+++ b/chromium/net/cert/known_roots_nss.cc
@@ -64,8 +64,7 @@ bool IsKnownRoot(CERTCertificate* root) {
if (PK11_IsPresent(slot) && PK11_HasRootCerts(slot)) {
CK_OBJECT_HANDLE handle = PK11_FindCertInSlot(slot, root, nullptr);
if (handle != CK_INVALID_HANDLE &&
- pk11_has_attribute_set(root->slot, handle,
- CKA_NSS_MOZILLA_CA_POLICY,
+ pk11_has_attribute_set(slot, handle, CKA_NSS_MOZILLA_CA_POLICY,
PR_FALSE) == CK_TRUE) {
return true;
}
diff --git a/chromium/net/cert/merkle_audit_proof.cc b/chromium/net/cert/merkle_audit_proof.cc
index 585ffbbe2b7..46e9f32a05b 100644
--- a/chromium/net/cert/merkle_audit_proof.cc
+++ b/chromium/net/cert/merkle_audit_proof.cc
@@ -6,8 +6,7 @@
#include "base/check_op.h"
-namespace net {
-namespace ct {
+namespace net::ct {
uint64_t CalculateAuditPathLength(uint64_t leaf_index, uint64_t tree_size) {
// RFC6962, section 2.1.1, describes audit paths.
@@ -39,5 +38,4 @@ MerkleAuditProof::MerkleAuditProof(uint64_t leaf_index,
MerkleAuditProof::~MerkleAuditProof() = default;
-} // namespace ct
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/merkle_audit_proof.h b/chromium/net/cert/merkle_audit_proof.h
index 69f2b9c82cf..6aa36205716 100644
--- a/chromium/net/cert/merkle_audit_proof.h
+++ b/chromium/net/cert/merkle_audit_proof.h
@@ -12,8 +12,7 @@
#include "net/base/net_export.h"
-namespace net {
-namespace ct {
+namespace net::ct {
// Returns the length of the audit path for a leaf at |leaf_index| in a Merkle
// tree containing |tree_size| leaves.
@@ -44,7 +43,6 @@ struct NET_EXPORT MerkleAuditProof {
std::vector<std::string> nodes;
};
-} // namespace ct
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_MERKLE_AUDIT_PROOF_H_
diff --git a/chromium/net/cert/merkle_audit_proof_unittest.cc b/chromium/net/cert/merkle_audit_proof_unittest.cc
index d4b988029d7..602a58494fc 100644
--- a/chromium/net/cert/merkle_audit_proof_unittest.cc
+++ b/chromium/net/cert/merkle_audit_proof_unittest.cc
@@ -8,8 +8,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace ct {
+namespace net::ct {
namespace {
TEST(MerkleAuditProofTest, CalculatesAuditPathLengthCorrectly) {
@@ -49,5 +48,4 @@ TEST(MerkleAuditProofDeathTest, DiesIfLeafIndexIsGreaterThanOrEqualToTreeSize) {
}
} // namespace
-} // namespace ct
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/merkle_consistency_proof.cc b/chromium/net/cert/merkle_consistency_proof.cc
index 12ec9366e89..a6ac1bb173c 100644
--- a/chromium/net/cert/merkle_consistency_proof.cc
+++ b/chromium/net/cert/merkle_consistency_proof.cc
@@ -4,9 +4,7 @@
#include "net/cert/merkle_consistency_proof.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
MerkleConsistencyProof::MerkleConsistencyProof() = default;
@@ -22,6 +20,4 @@ MerkleConsistencyProof::MerkleConsistencyProof(
MerkleConsistencyProof::~MerkleConsistencyProof() = default;
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/merkle_consistency_proof.h b/chromium/net/cert/merkle_consistency_proof.h
index 48a70dc5eaa..457ed5284dd 100644
--- a/chromium/net/cert/merkle_consistency_proof.h
+++ b/chromium/net/cert/merkle_consistency_proof.h
@@ -12,9 +12,7 @@
#include "net/base/net_export.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
// Consistency proof between two STHs as defined in section 2.1.2. of RFC6962.
struct NET_EXPORT MerkleConsistencyProof {
@@ -38,8 +36,6 @@ struct NET_EXPORT MerkleConsistencyProof {
uint64_t second_tree_size = 0;
};
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_MERKLE_CONSISTENCY_PROOF_H_
diff --git a/chromium/net/cert/merkle_tree_leaf.cc b/chromium/net/cert/merkle_tree_leaf.cc
index 1030213ac25..70ada09872b 100644
--- a/chromium/net/cert/merkle_tree_leaf.cc
+++ b/chromium/net/cert/merkle_tree_leaf.cc
@@ -9,9 +9,7 @@
#include "net/cert/ct_serialization.h"
#include "net/cert/x509_certificate.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
MerkleTreeLeaf::MerkleTreeLeaf() = default;
@@ -53,6 +51,4 @@ bool GetMerkleTreeLeaf(const X509Certificate* cert,
return true;
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/merkle_tree_leaf_unittest.cc b/chromium/net/cert/merkle_tree_leaf_unittest.cc
index b2bd82010d5..ed9feace299 100644
--- a/chromium/net/cert/merkle_tree_leaf_unittest.cc
+++ b/chromium/net/cert/merkle_tree_leaf_unittest.cc
@@ -16,9 +16,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
namespace {
@@ -129,6 +127,4 @@ TEST_F(MerkleTreeLeafTest, HashForPrecert) {
} // namespace
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/nss_cert_database.cc b/chromium/net/cert/nss_cert_database.cc
index 135e0f1a489..7f1c1290f3b 100644
--- a/chromium/net/cert/nss_cert_database.cc
+++ b/chromium/net/cert/nss_cert_database.cc
@@ -17,6 +17,7 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/observer_list_threadsafe.h"
#include "base/task/thread_pool.h"
#include "base/threading/scoped_blocking_call.h"
@@ -65,7 +66,7 @@ class CertNotificationForwarder : public NSSCertDatabase::Observer {
void OnCertDBChanged() override { cert_db_->NotifyObserversCertDBChanged(); }
private:
- CertDatabase* cert_db_;
+ raw_ptr<CertDatabase> cert_db_;
};
} // namespace
@@ -90,7 +91,8 @@ NSSCertDatabase::NSSCertDatabase(crypto::ScopedPK11Slot public_slot,
crypto::ScopedPK11Slot private_slot)
: public_slot_(std::move(public_slot)),
private_slot_(std::move(private_slot)),
- observer_list_(new base::ObserverListThreadSafe<Observer>) {
+ observer_list_(
+ base::MakeRefCounted<base::ObserverListThreadSafe<Observer>>()) {
CHECK(public_slot_);
CertDatabase* cert_db = CertDatabase::GetInstance();
diff --git a/chromium/net/cert/nss_cert_database.h b/chromium/net/cert/nss_cert_database.h
index cfc4f176808..e8d45d7bbdc 100644
--- a/chromium/net/cert/nss_cert_database.h
+++ b/chromium/net/cert/nss_cert_database.h
@@ -40,14 +40,14 @@ class NET_EXPORT NSSCertDatabase {
Observer(const Observer&) = delete;
Observer& operator=(const Observer&) = delete;
- virtual ~Observer() {}
+ virtual ~Observer() = default;
// Will be called when a certificate is added, removed, or trust settings
// are changed.
virtual void OnCertDBChanged() {}
protected:
- Observer() {}
+ Observer() = default;
};
// Holds an NSS certificate along with additional information.
diff --git a/chromium/net/cert/nss_profile_filter_chromeos.cc b/chromium/net/cert/nss_profile_filter_chromeos.cc
index 85dc7b6e930..d85ac42b13b 100644
--- a/chromium/net/cert/nss_profile_filter_chromeos.cc
+++ b/chromium/net/cert/nss_profile_filter_chromeos.cc
@@ -18,28 +18,30 @@ NSSProfileFilterChromeOS::NSSProfileFilterChromeOS() = default;
NSSProfileFilterChromeOS::NSSProfileFilterChromeOS(
const NSSProfileFilterChromeOS& other) {
- public_slot_.reset(other.public_slot_ ?
- PK11_ReferenceSlot(other.public_slot_.get()) :
- NULL);
- private_slot_.reset(other.private_slot_ ?
- PK11_ReferenceSlot(other.private_slot_.get()) :
- NULL);
- system_slot_.reset(
- other.system_slot_ ? PK11_ReferenceSlot(other.system_slot_.get()) : NULL);
+ public_slot_.reset(other.public_slot_
+ ? PK11_ReferenceSlot(other.public_slot_.get())
+ : nullptr);
+ private_slot_.reset(other.private_slot_
+ ? PK11_ReferenceSlot(other.private_slot_.get())
+ : nullptr);
+ system_slot_.reset(other.system_slot_
+ ? PK11_ReferenceSlot(other.system_slot_.get())
+ : nullptr);
}
NSSProfileFilterChromeOS::~NSSProfileFilterChromeOS() = default;
NSSProfileFilterChromeOS& NSSProfileFilterChromeOS::operator=(
const NSSProfileFilterChromeOS& other) {
- public_slot_.reset(other.public_slot_ ?
- PK11_ReferenceSlot(other.public_slot_.get()) :
- NULL);
- private_slot_.reset(other.private_slot_ ?
- PK11_ReferenceSlot(other.private_slot_.get()) :
- NULL);
- system_slot_.reset(
- other.system_slot_ ? PK11_ReferenceSlot(other.system_slot_.get()) : NULL);
+ public_slot_.reset(other.public_slot_
+ ? PK11_ReferenceSlot(other.public_slot_.get())
+ : nullptr);
+ private_slot_.reset(other.private_slot_
+ ? PK11_ReferenceSlot(other.private_slot_.get())
+ : nullptr);
+ system_slot_.reset(other.system_slot_
+ ? PK11_ReferenceSlot(other.system_slot_.get())
+ : nullptr);
return *this;
}
@@ -94,7 +96,7 @@ bool NSSProfileFilterChromeOS::IsModuleAllowed(PK11SlotInfo* slot) const {
bool NSSProfileFilterChromeOS::IsCertAllowed(CERTCertificate* cert) const {
crypto::ScopedPK11SlotList slots_for_cert(
- PK11_GetAllSlotsForCert(cert, NULL));
+ PK11_GetAllSlotsForCert(cert, nullptr));
if (!slots_for_cert)
return false;
diff --git a/chromium/net/cert/nss_profile_filter_chromeos_unittest.cc b/chromium/net/cert/nss_profile_filter_chromeos_unittest.cc
index 7a4b8024928..0a21f961ce9 100644
--- a/chromium/net/cert/nss_profile_filter_chromeos_unittest.cc
+++ b/chromium/net/cert/nss_profile_filter_chromeos_unittest.cc
@@ -28,7 +28,7 @@ namespace {
crypto::ScopedPK11Slot GetRootCertsSlot() {
crypto::AutoSECMODListReadLock auto_lock;
SECMODModuleList* head = SECMOD_GetDefaultModuleList();
- for (SECMODModuleList* item = head; item != NULL; item = item->next) {
+ for (SECMODModuleList* item = head; item != nullptr; item = item->next) {
int slot_count = item->module->loaded ? item->module->slotCount : 0;
for (int i = 0; i < slot_count; i++) {
PK11SlotInfo* slot = item->module->slots[i];
@@ -121,7 +121,7 @@ class NSSProfileFilterChromeOSTest : public testing::Test {
};
TEST_F(NSSProfileFilterChromeOSTest, TempCertNotAllowed) {
- EXPECT_EQ(NULL, certs_[0]->slot);
+ EXPECT_EQ(nullptr, certs_[0]->slot);
EXPECT_FALSE(no_slots_profile_filter_.IsCertAllowed(certs_[0].get()));
EXPECT_FALSE(profile_filter_1_.IsCertAllowed(certs_[0].get()));
EXPECT_FALSE(profile_filter_1_copy_.IsCertAllowed(certs_[0].get()));
diff --git a/chromium/net/cert/pem.cc b/chromium/net/cert/pem.cc
index cc2e48b6542..fe37b197b07 100644
--- a/chromium/net/cert/pem.cc
+++ b/chromium/net/cert/pem.cc
@@ -90,12 +90,13 @@ void PEMTokenizer::Init(const StringPiece& str,
// Construct PEM header/footer strings for all the accepted types, to
// reduce parsing later.
- for (auto it = allowed_block_types.begin(); it != allowed_block_types.end();
- ++it) {
+ for (const auto& allowed_block_type : allowed_block_types) {
PEMType allowed_type;
- allowed_type.type = *it;
- allowed_type.header = base::StringPrintf(kPEMBeginBlock, it->c_str());
- allowed_type.footer = base::StringPrintf(kPEMEndBlock, it->c_str());
+ allowed_type.type = allowed_block_type;
+ allowed_type.header =
+ base::StringPrintf(kPEMBeginBlock, allowed_block_type.c_str());
+ allowed_type.footer =
+ base::StringPrintf(kPEMEndBlock, allowed_block_type.c_str());
block_types_.push_back(allowed_type);
}
}
diff --git a/chromium/net/cert/pki/README.md b/chromium/net/cert/pki/README.md
new file mode 100644
index 00000000000..9e936b61b99
--- /dev/null
+++ b/chromium/net/cert/pki/README.md
@@ -0,0 +1,11 @@
+# Web PKI Certificate path building and verification
+
+This directory contains the core internal code used for path building
+and verifying certificates. This is existing temporarily in this
+directory while changes are made to remove chromium specific
+dependencies. This code will be moving to it's own separate library
+in boringssl (Issue 1322914).
+
+Please do not depend on this directory continuing to exist, and please
+try to avoid adding dependencies on anything in this directory from
+outside of //net/cert.
diff --git a/chromium/net/cert/internal/cert_error_id.cc b/chromium/net/cert/pki/cert_error_id.cc
index 80ab4f4f214..793b92ffb2c 100644
--- a/chromium/net/cert/internal/cert_error_id.cc
+++ b/chromium/net/cert/pki/cert_error_id.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/cert_error_id.h"
+#include "net/cert/pki/cert_error_id.h"
namespace net {
diff --git a/chromium/net/cert/internal/cert_error_id.h b/chromium/net/cert/pki/cert_error_id.h
index 63a01679816..1c0e4ec947b 100644
--- a/chromium/net/cert/internal/cert_error_id.h
+++ b/chromium/net/cert/pki/cert_error_id.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_CERT_ERROR_ID_H_
-#define NET_CERT_INTERNAL_CERT_ERROR_ID_H_
+#ifndef NET_CERT_PKI_CERT_ERROR_ID_H_
+#define NET_CERT_PKI_CERT_ERROR_ID_H_
#include "net/base/net_export.h"
@@ -34,4 +34,4 @@ NET_EXPORT const char* CertErrorIdToDebugString(CertErrorId id);
} // namespace net
-#endif // NET_CERT_INTERNAL_CERT_ERROR_ID_H_
+#endif // NET_CERT_PKI_CERT_ERROR_ID_H_
diff --git a/chromium/net/cert/internal/cert_error_params.cc b/chromium/net/cert/pki/cert_error_params.cc
index eff1dbfcf0c..0d4f2b61d83 100644
--- a/chromium/net/cert/internal/cert_error_params.cc
+++ b/chromium/net/cert/pki/cert_error_params.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/cert_error_params.h"
+#include "net/cert/pki/cert_error_params.h"
#include <memory>
diff --git a/chromium/net/cert/internal/cert_error_params.h b/chromium/net/cert/pki/cert_error_params.h
index dc696e78afd..b00d0f2e8a4 100644
--- a/chromium/net/cert/internal/cert_error_params.h
+++ b/chromium/net/cert/pki/cert_error_params.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_CERT_ERROR_PARAMS_H_
-#define NET_CERT_INTERNAL_CERT_ERROR_PARAMS_H_
+#ifndef NET_CERT_PKI_CERT_ERROR_PARAMS_H_
+#define NET_CERT_PKI_CERT_ERROR_PARAMS_H_
#include <memory>
#include <string>
@@ -64,4 +64,4 @@ NET_EXPORT std::unique_ptr<CertErrorParams> CreateCertErrorParams2SizeT(
} // namespace net
-#endif // NET_CERT_INTERNAL_CERT_ERROR_PARAMS_H_
+#endif // NET_CERT_PKI_CERT_ERROR_PARAMS_H_
diff --git a/chromium/net/cert/internal/cert_errors.cc b/chromium/net/cert/pki/cert_errors.cc
index cea2115ee8e..833fb1d3638 100644
--- a/chromium/net/cert/internal/cert_errors.cc
+++ b/chromium/net/cert/pki/cert_errors.cc
@@ -2,14 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/cert_errors.h"
+#include "net/cert/pki/cert_errors.h"
-#include "base/strings/strcat.h"
-#include "base/strings/string_split.h"
-#include "base/strings/stringprintf.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/parse_name.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/parse_name.h"
+#include "net/cert/pki/parsed_certificate.h"
+
+#include <sstream>
namespace net {
@@ -18,11 +17,11 @@ namespace {
void AppendLinesWithIndentation(const std::string& text,
const std::string& indentation,
std::string* out) {
- std::vector<base::StringPiece> lines = base::SplitStringPieceUsingSubstr(
- text, "\n", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-
- for (const auto& line : lines) {
- base::StrAppend(out, {indentation, line, "\n"});
+ std::istringstream stream(text);
+ for (std::string line; std::getline(stream, line, '\n');) {
+ out->append(indentation);
+ out->append(line);
+ out->append("\n");
}
}
@@ -68,7 +67,7 @@ CertErrors::~CertErrors() = default;
void CertErrors::Add(CertError::Severity severity,
CertErrorId id,
std::unique_ptr<CertErrorParams> params) {
- nodes_.push_back(CertError(severity, id, std::move(params)));
+ nodes_.emplace_back(severity, id, std::move(params));
}
void CertErrors::AddError(CertErrorId id,
@@ -164,7 +163,7 @@ bool CertPathErrors::ContainsAnyErrorWithSeverity(
std::string CertPathErrors::ToDebugString(
const ParsedCertificateList& certs) const {
- std::string result;
+ std::ostringstream result;
for (size_t i = 0; i < cert_errors_.size(); ++i) {
// Pretty print the current CertErrors. If there were no errors/warnings,
@@ -184,25 +183,19 @@ std::string CertPathErrors::ToDebugString(
cert_name_debug_str = " (" + cert_name_debug_str + ")";
}
}
-
- result +=
- base::StringPrintf("----- Certificate i=%d%s -----\n",
- static_cast<int>(i), cert_name_debug_str.c_str());
-
- result += cert_errors_string;
- result += "\n";
+ result << "----- Certificate i=" << i << cert_name_debug_str << " -----\n";
+ result << cert_errors_string << "\n";
}
// Print any other errors that aren't associated with a particular certificate
// in the chain.
std::string other_errors = other_errors_.ToDebugString();
if (!other_errors.empty()) {
- result += "----- Other errors (not certificate specific) -----\n";
- result += other_errors;
- result += "\n";
+ result << "----- Other errors (not certificate specific) -----\n";
+ result << other_errors << "\n";
}
- return result;
+ return result.str();
}
} // namespace net
diff --git a/chromium/net/cert/internal/cert_errors.h b/chromium/net/cert/pki/cert_errors.h
index 05bc02b68b6..98f635da34b 100644
--- a/chromium/net/cert/internal/cert_errors.h
+++ b/chromium/net/cert/pki/cert_errors.h
@@ -43,16 +43,16 @@
// Error IDs are in truth string literals, whose pointer value will be unique
// per process.
-#ifndef NET_CERT_INTERNAL_CERT_ERRORS_H_
-#define NET_CERT_INTERNAL_CERT_ERRORS_H_
+#ifndef NET_CERT_PKI_CERT_ERRORS_H_
+#define NET_CERT_PKI_CERT_ERRORS_H_
#include <memory>
#include <vector>
#include "base/compiler_specific.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/cert_error_id.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_error_id.h"
+#include "net/cert/pki/parsed_certificate.h"
namespace net {
@@ -165,4 +165,4 @@ class NET_EXPORT CertPathErrors {
} // namespace net
-#endif // NET_CERT_INTERNAL_CERT_ERRORS_H_
+#endif // NET_CERT_PKI_CERT_ERRORS_H_
diff --git a/chromium/net/cert/internal/cert_issuer_source.h b/chromium/net/cert/pki/cert_issuer_source.h
index 8127203cede..1568cd058f3 100644
--- a/chromium/net/cert/internal/cert_issuer_source.h
+++ b/chromium/net/cert/pki/cert_issuer_source.h
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_CERT_ISSUER_SOURCE_H_
-#define NET_CERT_INTERNAL_CERT_ISSUER_SOURCE_H_
+#ifndef NET_CERT_PKI_CERT_ISSUER_SOURCE_H_
+#define NET_CERT_PKI_CERT_ISSUER_SOURCE_H_
#include <memory>
#include <vector>
#include "net/base/net_export.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/parsed_certificate.h"
namespace net {
@@ -64,4 +64,4 @@ class NET_EXPORT CertIssuerSource {
} // namespace net
-#endif // NET_CERT_INTERNAL_CERT_ISSUER_SOURCE_H_
+#endif // NET_CERT_PKI_CERT_ISSUER_SOURCE_H_
diff --git a/chromium/net/cert/internal/cert_issuer_source_static.cc b/chromium/net/cert/pki/cert_issuer_source_static.cc
index e6ddb27b39f..c41aede9d6f 100644
--- a/chromium/net/cert/internal/cert_issuer_source_static.cc
+++ b/chromium/net/cert/pki/cert_issuer_source_static.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/cert_issuer_source_static.h"
+#include "net/cert/pki/cert_issuer_source_static.h"
namespace net {
@@ -14,6 +14,10 @@ void CertIssuerSourceStatic::AddCert(scoped_refptr<ParsedCertificate> cert) {
cert->normalized_subject().AsStringPiece(), std::move(cert)));
}
+void CertIssuerSourceStatic::Clear() {
+ intermediates_.clear();
+}
+
void CertIssuerSourceStatic::SyncGetIssuersOf(const ParsedCertificate* cert,
ParsedCertificateList* issuers) {
auto range =
diff --git a/chromium/net/cert/internal/cert_issuer_source_static.h b/chromium/net/cert/pki/cert_issuer_source_static.h
index 39d3187c8e3..c3be882d023 100644
--- a/chromium/net/cert/internal/cert_issuer_source_static.h
+++ b/chromium/net/cert/pki/cert_issuer_source_static.h
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_CERT_ISSUER_SOURCE_STATIC_H_
-#define NET_CERT_INTERNAL_CERT_ISSUER_SOURCE_STATIC_H_
+#ifndef NET_CERT_PKI_CERT_ISSUER_SOURCE_STATIC_H_
+#define NET_CERT_PKI_CERT_ISSUER_SOURCE_STATIC_H_
#include <unordered_map>
#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/cert_issuer_source.h"
+#include "net/cert/pki/cert_issuer_source.h"
namespace net {
@@ -27,6 +27,9 @@ class NET_EXPORT CertIssuerSourceStatic : public CertIssuerSource {
// provide.
void AddCert(scoped_refptr<ParsedCertificate> cert);
+ // Clears the set of certificates.
+ void Clear();
+
// CertIssuerSource implementation:
void SyncGetIssuersOf(const ParsedCertificate* cert,
ParsedCertificateList* issuers) override;
@@ -44,4 +47,4 @@ class NET_EXPORT CertIssuerSourceStatic : public CertIssuerSource {
} // namespace net
-#endif // NET_CERT_INTERNAL_CERT_ISSUER_SOURCE_STATIC_H_
+#endif // NET_CERT_PKI_CERT_ISSUER_SOURCE_STATIC_H_
diff --git a/chromium/net/cert/internal/cert_issuer_source_static_unittest.cc b/chromium/net/cert/pki/cert_issuer_source_static_unittest.cc
index 9dd45d0c9b0..02727cc6724 100644
--- a/chromium/net/cert/internal/cert_issuer_source_static_unittest.cc
+++ b/chromium/net/cert/pki/cert_issuer_source_static_unittest.cc
@@ -2,10 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/cert_issuer_source_static.h"
+#include "net/cert/pki/cert_issuer_source_static.h"
-#include "net/cert/internal/cert_issuer_source_sync_unittest.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_issuer_source_sync_unittest.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
diff --git a/chromium/net/cert/internal/cert_issuer_source_sync_unittest.h b/chromium/net/cert/pki/cert_issuer_source_sync_unittest.h
index 7d4548b1f0b..e3f165036db 100644
--- a/chromium/net/cert/internal/cert_issuer_source_sync_unittest.h
+++ b/chromium/net/cert/pki/cert_issuer_source_sync_unittest.h
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_CERT_ISSUER_SOURCE_SYNC_UNITTEST_H_
-#define NET_CERT_INTERNAL_CERT_ISSUER_SOURCE_SYNC_UNITTEST_H_
+#ifndef NET_CERT_PKI_CERT_ISSUER_SOURCE_SYNC_UNITTEST_H_
+#define NET_CERT_PKI_CERT_ISSUER_SOURCE_SYNC_UNITTEST_H_
#include <algorithm>
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/cert_issuer_source.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/cert_issuer_source.h"
+#include "net/cert/pki/test_helpers.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
@@ -213,4 +213,4 @@ REGISTER_TYPED_TEST_SUITE_P(CertIssuerSourceSyncNotNormalizedTest,
} // namespace net
-#endif // NET_CERT_INTERNAL_CERT_ISSUER_SOURCE_SYNC_UNITTEST_H_
+#endif // NET_CERT_PKI_CERT_ISSUER_SOURCE_SYNC_UNITTEST_H_
diff --git a/chromium/net/cert/internal/certificate_policies.cc b/chromium/net/cert/pki/certificate_policies.cc
index be5240f6bbd..e7a3c17e435 100644
--- a/chromium/net/cert/internal/certificate_policies.cc
+++ b/chromium/net/cert/pki/certificate_policies.cc
@@ -4,10 +4,10 @@
#include <algorithm>
-#include "net/cert/internal/certificate_policies.h"
+#include "net/cert/pki/certificate_policies.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/cert_errors.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/cert_errors.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "net/der/parser.h"
diff --git a/chromium/net/cert/internal/certificate_policies.h b/chromium/net/cert/pki/certificate_policies.h
index 7ca38f9bd3e..182bf9a82f5 100644
--- a/chromium/net/cert/internal/certificate_policies.h
+++ b/chromium/net/cert/pki/certificate_policies.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_CERTIFICATE_POLICIES_H_
-#define NET_CERT_INTERNAL_CERTIFICATE_POLICIES_H_
+#ifndef NET_CERT_PKI_CERTIFICATE_POLICIES_H_
+#define NET_CERT_PKI_CERTIFICATE_POLICIES_H_
#include <stdint.h>
@@ -132,4 +132,4 @@ struct ParsedPolicyMapping {
} // namespace net
-#endif // NET_CERT_INTERNAL_CERTIFICATE_POLICIES_H_
+#endif // NET_CERT_PKI_CERTIFICATE_POLICIES_H_
diff --git a/chromium/net/cert/internal/certificate_policies_unittest.cc b/chromium/net/cert/pki/certificate_policies_unittest.cc
index 92267559e0e..b38aff49a73 100644
--- a/chromium/net/cert/internal/certificate_policies_unittest.cc
+++ b/chromium/net/cert/pki/certificate_policies_unittest.cc
@@ -2,9 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/certificate_policies.h"
+#include "net/cert/pki/certificate_policies.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/der/input.h"
#include "net/der/parser.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/net/cert/internal/common_cert_errors.cc b/chromium/net/cert/pki/common_cert_errors.cc
index 3aa4cefa214..d282999c472 100644
--- a/chromium/net/cert/internal/common_cert_errors.cc
+++ b/chromium/net/cert/pki/common_cert_errors.cc
@@ -2,11 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/common_cert_errors.h"
+#include "net/cert/pki/common_cert_errors.h"
-namespace net {
-
-namespace cert_errors {
+namespace net::cert_errors {
DEFINE_CERT_ERROR_ID(kInternalError, "Internal error");
DEFINE_CERT_ERROR_ID(kValidityFailedNotAfter, "Time is after notAfter");
@@ -65,6 +63,4 @@ DEFINE_CERT_ERROR_ID(kDeadlineExceeded, "Deadline exceeded");
DEFINE_CERT_ERROR_ID(kIterationLimitExceeded, "Iteration limit exceeded");
DEFINE_CERT_ERROR_ID(kDepthLimitExceeded, "Depth limit exceeded");
-} // namespace cert_errors
-
-} // namespace net
+} // namespace net::cert_errors
diff --git a/chromium/net/cert/internal/common_cert_errors.h b/chromium/net/cert/pki/common_cert_errors.h
index 46625962ba9..2819671f4c9 100644
--- a/chromium/net/cert/internal/common_cert_errors.h
+++ b/chromium/net/cert/pki/common_cert_errors.h
@@ -2,19 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_COMMON_CERT_ERRORS_H_
-#define NET_CERT_INTERNAL_COMMON_CERT_ERRORS_H_
+#ifndef NET_CERT_PKI_COMMON_CERT_ERRORS_H_
+#define NET_CERT_PKI_COMMON_CERT_ERRORS_H_
#include "net/base/net_export.h"
-#include "net/cert/internal/cert_errors.h"
+#include "net/cert/pki/cert_errors.h"
// This file contains the set of "default" certificate errors (those
// defined by the core verification/path building code).
//
// Errors may be defined for other domains.
-namespace net {
-
-namespace cert_errors {
+namespace net::cert_errors {
// An internal error occurred which prevented path building or verification
// from finishing.
@@ -142,8 +140,6 @@ NET_EXPORT extern const CertErrorId kIterationLimitExceeded;
// Depth limit was reached during path building.
NET_EXPORT extern const CertErrorId kDepthLimitExceeded;
-} // namespace cert_errors
-
-} // namespace net
+} // namespace net::cert_errors
-#endif // NET_CERT_INTERNAL_COMMON_CERT_ERRORS_H_
+#endif // NET_CERT_PKI_COMMON_CERT_ERRORS_H_
diff --git a/chromium/net/cert/internal/crl.cc b/chromium/net/cert/pki/crl.cc
index 450b452b15b..c3a0c9dc5fa 100644
--- a/chromium/net/cert/internal/crl.cc
+++ b/chromium/net/cert/pki/crl.cc
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/crl.h"
+#include "net/cert/pki/crl.h"
#include "base/stl_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/revocation_util.h"
-#include "net/cert/internal/signature_algorithm.h"
-#include "net/cert/internal/verify_name_match.h"
-#include "net/cert/internal/verify_signed_data.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/revocation_util.h"
+#include "net/cert/pki/signature_algorithm.h"
+#include "net/cert/pki/verify_name_match.h"
+#include "net/cert/pki/verify_signed_data.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "net/der/parser.h"
@@ -401,18 +401,24 @@ CRLRevocationStatus CheckCRL(base::StringPiece raw_crl,
return CRLRevocationStatus::UNKNOWN;
// 5.1.1.2 signatureAlgorithm
+ //
+ // TODO(https://crbug.com/749276): Check the signature algorithm against
+ // policy.
+ absl::optional<SignatureAlgorithm> signature_algorithm =
+ ParseSignatureAlgorithm(signature_algorithm_tlv,
+ /*errors=*/nullptr);
+ if (!signature_algorithm) {
+ return CRLRevocationStatus::UNKNOWN;
+ }
+
// This field MUST contain the same algorithm identifier as the
// signature field in the sequence tbsCertList (Section 5.1.2.2).
- if (!SignatureAlgorithm::IsEquivalent(
- signature_algorithm_tlv, tbs_cert_list.signature_algorithm_tlv)) {
+ absl::optional<SignatureAlgorithm> tbs_alg =
+ ParseSignatureAlgorithm(tbs_cert_list.signature_algorithm_tlv,
+ /*errors=*/nullptr);
+ if (!tbs_alg || *signature_algorithm != *tbs_alg) {
return CRLRevocationStatus::UNKNOWN;
}
- // TODO(https://crbug.com/749276): Check the signature algorithm against
- // policy.
- std::unique_ptr<SignatureAlgorithm> signature_algorithm =
- SignatureAlgorithm::Create(signature_algorithm_tlv, /*errors=*/nullptr);
- if (!signature_algorithm)
- return CRLRevocationStatus::UNKNOWN;
// Check CRL dates. Roughly corresponds to 6.3.3 (a) (1) but does not attempt
// to update the CRL if it is out of date.
diff --git a/chromium/net/cert/internal/crl.h b/chromium/net/cert/pki/crl.h
index 3b433acfd94..e6add49add4 100644
--- a/chromium/net/cert/internal/crl.h
+++ b/chromium/net/cert/pki/crl.h
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_CRL_H_
-#define NET_CERT_INTERNAL_CRL_H_
+#ifndef NET_CERT_PKI_CRL_H_
+#define NET_CERT_PKI_CRL_H_
#include "base/strings/string_piece_forward.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/general_names.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/general_names.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -221,4 +221,4 @@ CheckCRL(base::StringPiece raw_crl,
} // namespace net
-#endif // NET_CERT_INTERNAL_CRL_H_
+#endif // NET_CERT_PKI_CRL_H_
diff --git a/chromium/net/cert/internal/extended_key_usage.cc b/chromium/net/cert/pki/extended_key_usage.cc
index c7838737bfd..e4e97b30175 100644
--- a/chromium/net/cert/internal/extended_key_usage.cc
+++ b/chromium/net/cert/pki/extended_key_usage.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/extended_key_usage.h"
+#include "net/cert/pki/extended_key_usage.h"
#include "net/der/input.h"
#include "net/der/parser.h"
diff --git a/chromium/net/cert/internal/extended_key_usage.h b/chromium/net/cert/pki/extended_key_usage.h
index 363c8afcdbf..f2ce9eb3e36 100644
--- a/chromium/net/cert/internal/extended_key_usage.h
+++ b/chromium/net/cert/pki/extended_key_usage.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_EXTENDED_KEY_USAGE_H_
-#define NET_CERT_INTERNAL_EXTENDED_KEY_USAGE_H_
+#ifndef NET_CERT_PKI_EXTENDED_KEY_USAGE_H_
+#define NET_CERT_PKI_EXTENDED_KEY_USAGE_H_
#include <vector>
@@ -85,4 +85,4 @@ NET_EXPORT bool ParseEKUExtension(const der::Input& extension_value,
} // namespace net
-#endif // NET_CERT_INTERNAL_EXTENDED_KEY_USAGE_H_
+#endif // NET_CERT_PKI_EXTENDED_KEY_USAGE_H_
diff --git a/chromium/net/cert/internal/extended_key_usage_unittest.cc b/chromium/net/cert/pki/extended_key_usage_unittest.cc
index a8bd055938d..f98ad799882 100644
--- a/chromium/net/cert/internal/extended_key_usage_unittest.cc
+++ b/chromium/net/cert/pki/extended_key_usage_unittest.cc
@@ -4,7 +4,7 @@
#include <algorithm>
-#include "net/cert/internal/extended_key_usage.h"
+#include "net/cert/pki/extended_key_usage.h"
#include "net/der/input.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/net/cert/internal/general_names.cc b/chromium/net/cert/pki/general_names.cc
index b8d6b9a630e..0a598dd24fe 100644
--- a/chromium/net/cert/internal/general_names.cc
+++ b/chromium/net/cert/pki/general_names.cc
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/general_names.h"
+#include "net/cert/pki/general_names.h"
#include "base/check_op.h"
#include "base/strings/string_util.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/cert_errors.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/cert_errors.h"
#include "net/der/input.h"
#include "net/der/parser.h"
#include "net/der/tag.h"
@@ -85,7 +85,7 @@ std::unique_ptr<GeneralNames> GeneralNames::CreateFromValue(
CertErrors* errors) {
DCHECK(errors);
- std::unique_ptr<GeneralNames> general_names(new GeneralNames());
+ auto general_names = std::make_unique<GeneralNames>();
der::Parser sequence_parser(general_names_value);
// The GeneralNames sequence should have at least 1 element.
@@ -190,8 +190,7 @@ std::unique_ptr<GeneralNames> GeneralNames::CreateFromValue(
errors->AddError(kFailedParsingIp);
return false;
}
- subtrees->ip_addresses.push_back(
- IPAddress(value.UnsafeData(), value.Length()));
+ subtrees->ip_addresses.emplace_back(value.UnsafeData(), value.Length());
} else {
DCHECK_EQ(ip_address_type, GeneralNames::IP_ADDRESS_AND_NETMASK);
// RFC 5280 section 4.2.1.10:
@@ -216,9 +215,9 @@ std::unique_ptr<GeneralNames> GeneralNames::CreateFromValue(
errors->AddError(kFailedParsingIp);
return false;
}
- subtrees->ip_address_ranges.push_back(
- std::make_pair(IPAddress(value.UnsafeData(), value.Length() / 2),
- mask_prefix_length));
+ subtrees->ip_address_ranges.emplace_back(
+ IPAddress(value.UnsafeData(), value.Length() / 2),
+ mask_prefix_length);
}
} else if (tag == der::ContextSpecificPrimitive(8)) {
// registeredID [8] OBJECT IDENTIFIER }
diff --git a/chromium/net/cert/internal/general_names.h b/chromium/net/cert/pki/general_names.h
index 87ef0756407..0bacddfe98e 100644
--- a/chromium/net/cert/internal/general_names.h
+++ b/chromium/net/cert/pki/general_names.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_GENERAL_NAMES_H_
-#define NET_CERT_INTERNAL_GENERAL_NAMES_H_
+#ifndef NET_CERT_PKI_GENERAL_NAMES_H_
+#define NET_CERT_PKI_GENERAL_NAMES_H_
#include <memory>
#include <vector>
@@ -11,7 +11,7 @@
#include "base/strings/string_piece_forward.h"
#include "net/base/ip_address.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/cert_error_id.h"
+#include "net/cert/pki/cert_error_id.h"
namespace net {
@@ -121,4 +121,4 @@ struct NET_EXPORT GeneralNames {
} // namespace net
-#endif // NET_CERT_INTERNAL_GENERAL_NAMES_H_
+#endif // NET_CERT_PKI_GENERAL_NAMES_H_
diff --git a/chromium/net/cert/internal/name_constraints.cc b/chromium/net/cert/pki/name_constraints.cc
index 72f21c1f3b1..b66abdbef6c 100644
--- a/chromium/net/cert/internal/name_constraints.cc
+++ b/chromium/net/cert/pki/name_constraints.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/name_constraints.h"
+#include "net/cert/pki/name_constraints.h"
#include <limits.h>
@@ -11,9 +11,9 @@
#include "base/check.h"
#include "base/numerics/clamped_math.h"
#include "base/strings/string_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/common_cert_errors.h"
-#include "net/cert/internal/verify_name_match.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/common_cert_errors.h"
+#include "net/cert/pki/verify_name_match.h"
#include "net/der/input.h"
#include "net/der/parser.h"
#include "net/der/tag.h"
@@ -138,9 +138,9 @@ bool DNSNameMatches(base::StringPiece name,
if (!subtree_sequence.ReadRawTLV(&raw_general_name))
return false;
- if (!ParseGeneralName(
- raw_general_name,
- GeneralNames::IP_ADDRESS_AND_NETMASK, subtrees, errors)) {
+ if (!ParseGeneralName(raw_general_name,
+ GeneralNames::IP_ADDRESS_AND_NETMASK, subtrees,
+ errors)) {
errors->AddError(kFailedParsingGeneralName);
return false;
}
@@ -174,7 +174,7 @@ std::unique_ptr<NameConstraints> NameConstraints::Create(
CertErrors* errors) {
DCHECK(errors);
- std::unique_ptr<NameConstraints> name_constraints(new NameConstraints());
+ auto name_constraints = std::make_unique<NameConstraints>();
if (!name_constraints->Parse(extension_value, is_critical, errors))
return nullptr;
return name_constraints;
diff --git a/chromium/net/cert/internal/name_constraints.h b/chromium/net/cert/pki/name_constraints.h
index 5a64640e0cd..0fe0452da51 100644
--- a/chromium/net/cert/internal/name_constraints.h
+++ b/chromium/net/cert/pki/name_constraints.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_NAME_CONSTRAINTS_H_
-#define NET_CERT_INTERNAL_NAME_CONSTRAINTS_H_
+#ifndef NET_CERT_PKI_NAME_CONSTRAINTS_H_
+#define NET_CERT_PKI_NAME_CONSTRAINTS_H_
#include <stdint.h>
@@ -12,7 +12,7 @@
#include "base/strings/string_piece_forward.h"
#include "net/base/ip_address.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/general_names.h"
+#include "net/cert/pki/general_names.h"
namespace net {
@@ -97,4 +97,4 @@ class NET_EXPORT NameConstraints {
} // namespace net
-#endif // NET_CERT_INTERNAL_NAME_CONSTRAINTS_H_
+#endif // NET_CERT_PKI_NAME_CONSTRAINTS_H_
diff --git a/chromium/net/cert/internal/name_constraints_unittest.cc b/chromium/net/cert/pki/name_constraints_unittest.cc
index c5c556ec957..32a97af4f4b 100644
--- a/chromium/net/cert/internal/name_constraints_unittest.cc
+++ b/chromium/net/cert/pki/name_constraints_unittest.cc
@@ -2,13 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/name_constraints.h"
+#include "net/cert/pki/name_constraints.h"
#include <memory>
#include "net/base/ip_address.h"
-#include "net/cert/internal/common_cert_errors.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/common_cert_errors.h"
+#include "net/cert/pki/test_helpers.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/net/cert/internal/nist_pkits_unittest.cc b/chromium/net/cert/pki/nist_pkits_unittest.cc
index c50a0ac546b..f2309349fba 100644
--- a/chromium/net/cert/internal/nist_pkits_unittest.cc
+++ b/chromium/net/cert/pki/nist_pkits_unittest.cc
@@ -2,10 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/nist_pkits_unittest.h"
+#include "net/cert/pki/nist_pkits_unittest.h"
-#include "base/strings/string_split.h"
-#include "net/cert/internal/certificate_policies.h"
+#include "net/cert/pki/certificate_policies.h"
+
+#include <sstream>
namespace net {
@@ -30,9 +31,21 @@ const uint8_t kTestPolicy6[] = {0x60, 0x86, 0x48, 0x01, 0x65,
void SetPolicySetFromString(const char* const policy_names,
std::set<der::Input>* out) {
out->clear();
- std::vector<std::string> names = base::SplitString(
- policy_names, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
- for (const std::string& policy_name : names) {
+ std::istringstream stream(policy_names);
+ for (std::string line; std::getline(stream, line, ',');) {
+ size_t start = line.find_first_not_of(" \n\t\r\f\v");
+ if (start == std::string::npos) {
+ continue;
+ }
+ size_t end = line.find_last_not_of(" \n\t\r\f\v");
+ if (end == std::string::npos) {
+ continue;
+ }
+ std::string policy_name = line.substr(start, end + 1);
+ if (policy_name.empty()) {
+ continue;
+ }
+
if (policy_name == "anyPolicy") {
out->insert(der::Input(kAnyPolicyOid));
} else if (policy_name == "NIST-test-policy-1") {
diff --git a/chromium/net/cert/internal/nist_pkits_unittest.h b/chromium/net/cert/pki/nist_pkits_unittest.h
index 4202e9da770..bf4d16485c9 100644
--- a/chromium/net/cert/internal/nist_pkits_unittest.h
+++ b/chromium/net/cert/pki/nist_pkits_unittest.h
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_NIST_PKITS_UNITTEST_H_
-#define NET_CERT_INTERNAL_NIST_PKITS_UNITTEST_H_
+#ifndef NET_CERT_PKI_NIST_PKITS_UNITTEST_H_
+#define NET_CERT_PKI_NIST_PKITS_UNITTEST_H_
#include <set>
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/der/parse_values.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -154,4 +154,4 @@ class PkitsTest : public ::testing::Test {
} // namespace net
-#endif // NET_CERT_INTERNAL_NIST_PKITS_UNITTEST_H_
+#endif // NET_CERT_PKI_NIST_PKITS_UNITTEST_H_
diff --git a/chromium/net/cert/internal/ocsp.cc b/chromium/net/cert/pki/ocsp.cc
index 4e316f35725..46fd72f7109 100644
--- a/chromium/net/cert/internal/ocsp.cc
+++ b/chromium/net/cert/pki/ocsp.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/ocsp.h"
+#include "net/cert/pki/ocsp.h"
#include <algorithm>
@@ -10,12 +10,12 @@
#include "base/strings/string_util.h"
#include "base/time/time.h"
#include "net/cert/asn1_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/extended_key_usage.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/revocation_util.h"
-#include "net/cert/internal/verify_name_match.h"
-#include "net/cert/internal/verify_signed_data.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/extended_key_usage.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/revocation_util.h"
+#include "net/cert/pki/verify_name_match.h"
+#include "net/cert/pki/verify_signed_data.h"
#include "net/cert/x509_util.h"
#include "third_party/boringssl/src/include/openssl/bytestring.h"
#include "third_party/boringssl/src/include/openssl/digest.h"
@@ -340,10 +340,11 @@ bool ParseBasicOCSPResponse(const der::Input& raw_tlv, OCSPResponse* out) {
if (!parser.ReadRawTLV(&sigalg_tlv))
return false;
// TODO(crbug.com/634443): Propagate the errors.
- CertErrors errors;
- out->signature_algorithm = SignatureAlgorithm::Create(sigalg_tlv, &errors);
- if (!out->signature_algorithm)
+ absl::optional<SignatureAlgorithm> sigalg =
+ ParseSignatureAlgorithm(sigalg_tlv, /*errors=*/nullptr);
+ if (!sigalg)
return false;
+ out->signature_algorithm = sigalg.value();
absl::optional<der::BitString> signature = parser.ReadBitString();
if (!signature)
return false;
@@ -602,7 +603,7 @@ scoped_refptr<ParsedCertificate> OCSPParseCertificate(base::StringPiece der) {
const OCSPResponse& response,
const ParsedCertificate* cert) {
// TODO(eroman): Must check the signature algorithm against policy.
- return VerifySignedData(*(response.signature_algorithm), response.data,
+ return VerifySignedData(response.signature_algorithm, response.data,
response.signature, cert->tbs().spki_tlv);
}
diff --git a/chromium/net/cert/internal/ocsp.h b/chromium/net/cert/pki/ocsp.h
index dbbf68bb871..6a2a5e5b7d3 100644
--- a/chromium/net/cert/internal/ocsp.h
+++ b/chromium/net/cert/pki/ocsp.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_OCSP_H_
-#define NET_CERT_INTERNAL_OCSP_H_
+#ifndef NET_CERT_PKI_OCSP_H_
+#define NET_CERT_PKI_OCSP_H_
#include <memory>
#include <vector>
@@ -11,10 +11,10 @@
#include "base/strings/string_piece_forward.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/parse_certificate.h"
-#include "net/cert/internal/signature_algorithm.h"
#include "net/cert/ocsp_revocation_status.h"
#include "net/cert/ocsp_verify_result.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/signature_algorithm.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "net/der/parser.h"
@@ -218,7 +218,7 @@ struct NET_EXPORT OCSPResponse {
ResponseStatus status;
der::Input data;
- std::unique_ptr<SignatureAlgorithm> signature_algorithm;
+ SignatureAlgorithm signature_algorithm;
der::BitString signature;
bool has_certs;
std::vector<der::Input> certs;
@@ -325,4 +325,4 @@ NET_EXPORT GURL CreateOCSPGetURL(const ParsedCertificate* cert,
} // namespace net
-#endif // NET_CERT_INTERNAL_OCSP_H_
+#endif // NET_CERT_PKI_OCSP_H_
diff --git a/chromium/net/cert/internal/ocsp_parse_ocsp_cert_id_fuzzer.cc b/chromium/net/cert/pki/ocsp_parse_ocsp_cert_id_fuzzer.cc
index 855908dceb1..1d23453d0b5 100644
--- a/chromium/net/cert/internal/ocsp_parse_ocsp_cert_id_fuzzer.cc
+++ b/chromium/net/cert/pki/ocsp_parse_ocsp_cert_id_fuzzer.cc
@@ -5,7 +5,7 @@
#include <stddef.h>
#include <stdint.h>
-#include "net/cert/internal/ocsp.h"
+#include "net/cert/pki/ocsp.h"
#include "net/der/input.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/ocsp_parse_ocsp_response_data_fuzzer.cc b/chromium/net/cert/pki/ocsp_parse_ocsp_response_data_fuzzer.cc
index 4d7ca7558fc..d312f0fae1b 100644
--- a/chromium/net/cert/internal/ocsp_parse_ocsp_response_data_fuzzer.cc
+++ b/chromium/net/cert/pki/ocsp_parse_ocsp_response_data_fuzzer.cc
@@ -5,7 +5,7 @@
#include <stddef.h>
#include <stdint.h>
-#include "net/cert/internal/ocsp.h"
+#include "net/cert/pki/ocsp.h"
#include "net/der/input.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/ocsp_parse_ocsp_response_fuzzer.cc b/chromium/net/cert/pki/ocsp_parse_ocsp_response_fuzzer.cc
index f5dae65bd16..f3673aeec7a 100644
--- a/chromium/net/cert/internal/ocsp_parse_ocsp_response_fuzzer.cc
+++ b/chromium/net/cert/pki/ocsp_parse_ocsp_response_fuzzer.cc
@@ -5,7 +5,7 @@
#include <stddef.h>
#include <stdint.h>
-#include "net/cert/internal/ocsp.h"
+#include "net/cert/pki/ocsp.h"
#include "net/der/input.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/ocsp_parse_ocsp_single_response_fuzzer.cc b/chromium/net/cert/pki/ocsp_parse_ocsp_single_response_fuzzer.cc
index 9eddfec433c..872e2680a4e 100644
--- a/chromium/net/cert/internal/ocsp_parse_ocsp_single_response_fuzzer.cc
+++ b/chromium/net/cert/pki/ocsp_parse_ocsp_single_response_fuzzer.cc
@@ -5,7 +5,7 @@
#include <stddef.h>
#include <stdint.h>
-#include "net/cert/internal/ocsp.h"
+#include "net/cert/pki/ocsp.h"
#include "net/der/input.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/ocsp_unittest.cc b/chromium/net/cert/pki/ocsp_unittest.cc
index 5a7d0141c0e..6b3ae13a68d 100644
--- a/chromium/net/cert/internal/ocsp_unittest.cc
+++ b/chromium/net/cert/pki/ocsp_unittest.cc
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/ocsp.h"
+#include "net/cert/pki/ocsp.h"
#include "base/base64.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/der/encode_values.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
@@ -179,7 +179,8 @@ TEST_P(CheckOCSPTest, FromFile) {
}
base::StringPiece kGetURLTestParams[] = {
- "http://www.example.com/", "http://www.example.com/path/",
+ "http://www.example.com/",
+ "http://www.example.com/path/",
"http://www.example.com/path",
"http://www.example.com/path?query"
"http://user:pass@www.example.com/path?query",
diff --git a/chromium/net/cert/internal/parse_certificate.cc b/chromium/net/cert/pki/parse_certificate.cc
index 2dddf9d22f6..d206ec897e6 100644
--- a/chromium/net/cert/internal/parse_certificate.cc
+++ b/chromium/net/cert/pki/parse_certificate.cc
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/parse_certificate.h"
+#include "net/cert/pki/parse_certificate.h"
#include <utility>
#include "base/strings/string_util.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/general_names.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/general_names.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "net/der/parser.h"
@@ -236,6 +236,9 @@ bool ParseAndAddDistributionPoint(
ParsedTbsCertificate::ParsedTbsCertificate() = default;
+ParsedTbsCertificate::ParsedTbsCertificate(ParsedTbsCertificate&& other) =
+ default;
+
ParsedTbsCertificate::~ParsedTbsCertificate() = default;
bool VerifySerialNumber(const der::Input& value,
diff --git a/chromium/net/cert/internal/parse_certificate.h b/chromium/net/cert/pki/parse_certificate.h
index ea03bf8fce7..d71dda139b5 100644
--- a/chromium/net/cert/internal/parse_certificate.h
+++ b/chromium/net/cert/pki/parse_certificate.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_PARSE_CERTIFICATE_H_
-#define NET_CERT_INTERNAL_PARSE_CERTIFICATE_H_
+#ifndef NET_CERT_PKI_PARSE_CERTIFICATE_H_
+#define NET_CERT_PKI_PARSE_CERTIFICATE_H_
#include <stdint.h>
@@ -12,7 +12,7 @@
#include <vector>
#include "net/base/net_export.h"
-#include "net/cert/internal/general_names.h"
+#include "net/cert/pki/general_names.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -190,6 +190,8 @@ enum class CertificateVersion {
// sets.
struct NET_EXPORT ParsedTbsCertificate {
ParsedTbsCertificate();
+ ParsedTbsCertificate(ParsedTbsCertificate&& other);
+ ParsedTbsCertificate& operator=(ParsedTbsCertificate&& other) = default;
~ParsedTbsCertificate();
// Corresponds with "version" from RFC 5280:
@@ -616,4 +618,4 @@ struct NET_EXPORT ParsedAuthorityKeyIdentifier {
} // namespace net
-#endif // NET_CERT_INTERNAL_PARSE_CERTIFICATE_H_
+#endif // NET_CERT_PKI_PARSE_CERTIFICATE_H_
diff --git a/chromium/net/cert/internal/parse_certificate_fuzzer.cc b/chromium/net/cert/pki/parse_certificate_fuzzer.cc
index 578a9a64008..b73eb018a24 100644
--- a/chromium/net/cert/internal/parse_certificate_fuzzer.cc
+++ b/chromium/net/cert/pki/parse_certificate_fuzzer.cc
@@ -6,8 +6,8 @@
#include <stdint.h>
#include "base/check_op.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/x509_util.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/chromium/net/cert/internal/parse_certificate_unittest.cc b/chromium/net/cert/pki/parse_certificate_unittest.cc
index 13e881fa538..7f5c48efe3e 100644
--- a/chromium/net/cert/internal/parse_certificate_unittest.cc
+++ b/chromium/net/cert/pki/parse_certificate_unittest.cc
@@ -2,13 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/parse_certificate.h"
+#include "net/cert/pki/parse_certificate.h"
-#include "base/strings/stringprintf.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/general_names.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/general_names.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/der/input.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
@@ -21,9 +20,12 @@ namespace {
// expectations (it is more readable to specify the expected results as a
// string).
std::string ToString(const der::GeneralizedTime& time) {
- return base::StringPrintf(
- "year=%d, month=%d, day=%d, hours=%d, minutes=%d, seconds=%d", time.year,
- time.month, time.day, time.hours, time.minutes, time.seconds);
+ std::ostringstream pretty_time;
+ pretty_time << "year=" << int{time.year} << ", month=" << int{time.month}
+ << ", day=" << int{time.day} << ", hours=" << int{time.hours}
+ << ", minutes=" << int{time.minutes}
+ << ", seconds=" << int{time.seconds};
+ return pretty_time.str();
}
std::string GetFilePath(const std::string& file_name) {
diff --git a/chromium/net/cert/internal/parse_name.cc b/chromium/net/cert/pki/parse_name.cc
index 3d8bfea98e4..5cd4516890c 100644
--- a/chromium/net/cert/internal/parse_name.cc
+++ b/chromium/net/cert/pki/parse_name.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/parse_name.h"
+#include "net/cert/pki/parse_name.h"
#include "base/check_op.h"
#include "base/notreached.h"
diff --git a/chromium/net/cert/internal/parse_name.h b/chromium/net/cert/pki/parse_name.h
index 357f3ebf5d6..e44833a9b30 100644
--- a/chromium/net/cert/internal/parse_name.h
+++ b/chromium/net/cert/pki/parse_name.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_PARSE_NAME_H_
-#define NET_CERT_INTERNAL_PARSE_NAME_H_
+#ifndef NET_CERT_PKI_PARSE_NAME_H_
+#define NET_CERT_PKI_PARSE_NAME_H_
#include <vector>
@@ -154,4 +154,4 @@ typedef std::vector<RelativeDistinguishedName> RDNSequence;
std::string* out);
} // namespace net
-#endif // NET_CERT_INTERNAL_PARSE_NAME_H_
+#endif // NET_CERT_PKI_PARSE_NAME_H_
diff --git a/chromium/net/cert/internal/parse_name_unittest.cc b/chromium/net/cert/pki/parse_name_unittest.cc
index 239f56cfcd5..3e29b808c4e 100644
--- a/chromium/net/cert/internal/parse_name_unittest.cc
+++ b/chromium/net/cert/pki/parse_name_unittest.cc
@@ -2,9 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/parse_name.h"
+#include "net/cert/pki/parse_name.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/test_helpers.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
diff --git a/chromium/net/cert/internal/parsed_certificate.cc b/chromium/net/cert/pki/parsed_certificate.cc
index 5253a7db51d..a1268a127b6 100644
--- a/chromium/net/cert/internal/parsed_certificate.cc
+++ b/chromium/net/cert/pki/parsed_certificate.cc
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/parsed_certificate.h"
-
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/certificate_policies.h"
-#include "net/cert/internal/extended_key_usage.h"
-#include "net/cert/internal/name_constraints.h"
-#include "net/cert/internal/signature_algorithm.h"
-#include "net/cert/internal/verify_name_match.h"
+#include "net/cert/pki/parsed_certificate.h"
+
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/certificate_policies.h"
+#include "net/cert/pki/extended_key_usage.h"
+#include "net/cert/pki/name_constraints.h"
+#include "net/cert/pki/signature_algorithm.h"
+#include "net/cert/pki/verify_name_match.h"
#include "net/der/parser.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
@@ -87,7 +87,7 @@ scoped_refptr<ParsedCertificate> ParsedCertificate::Create(
if (!errors)
errors = &unused_errors;
- scoped_refptr<ParsedCertificate> result(new ParsedCertificate);
+ auto result = base::WrapRefCounted(new ParsedCertificate);
result->cert_data_ = std::move(backing_data);
result->cert_ = der::Input(CRYPTO_BUFFER_data(result->cert_data_.get()),
CRYPTO_BUFFER_len(result->cert_data_.get()));
@@ -106,12 +106,13 @@ scoped_refptr<ParsedCertificate> ParsedCertificate::Create(
}
// Attempt to parse the signature algorithm contained in the Certificate.
- result->signature_algorithm_ =
- SignatureAlgorithm::Create(result->signature_algorithm_tlv_, errors);
- if (!result->signature_algorithm_) {
+ absl::optional<SignatureAlgorithm> sigalg =
+ ParseSignatureAlgorithm(result->signature_algorithm_tlv_, errors);
+ if (!sigalg) {
errors->AddError(kFailedParsingSignatureAlgorithm);
return nullptr;
}
+ result->signature_algorithm_ = *sigalg;
der::Input subject_value;
if (!GetSequenceValue(result->tbs_.subject_tlv, &subject_value)) {
diff --git a/chromium/net/cert/internal/parsed_certificate.h b/chromium/net/cert/pki/parsed_certificate.h
index 55457178afb..d02c4bf5129 100644
--- a/chromium/net/cert/internal/parsed_certificate.h
+++ b/chromium/net/cert/pki/parsed_certificate.h
@@ -3,8 +3,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_PARSED_CERTIFICATE_H_
-#define NET_CERT_INTERNAL_PARSED_CERTIFICATE_H_
+#ifndef NET_CERT_PKI_PARSED_CERTIFICATE_H_
+#define NET_CERT_PKI_PARSED_CERTIFICATE_H_
#include <map>
#include <memory>
@@ -13,8 +13,9 @@
#include "base/check.h"
#include "base/memory/ref_counted.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/certificate_policies.h"
-#include "net/cert/internal/parse_certificate.h"
+#include "net/cert/pki/certificate_policies.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/signature_algorithm.h"
#include "net/der/input.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/boringssl/src/include/openssl/base.h"
@@ -24,7 +25,6 @@ namespace net {
struct GeneralNames;
class NameConstraints;
class ParsedCertificate;
-class SignatureAlgorithm;
class CertErrors;
using ParsedCertificateList = std::vector<scoped_refptr<ParsedCertificate>>;
@@ -86,9 +86,8 @@ class NET_EXPORT ParsedCertificate
const ParsedTbsCertificate& tbs() const { return tbs_; }
// Returns the signatureAlgorithm of the Certificate (not the tbsCertificate).
- const SignatureAlgorithm& signature_algorithm() const {
- DCHECK(signature_algorithm_);
- return *signature_algorithm_;
+ SignatureAlgorithm signature_algorithm() const {
+ return signature_algorithm_;
}
// Returns the DER-encoded raw subject value (including the outer sequence
@@ -262,7 +261,14 @@ class NET_EXPORT ParsedCertificate
ParsedTbsCertificate tbs_;
// The signatureAlgorithm from the Certificate.
- std::unique_ptr<SignatureAlgorithm> signature_algorithm_;
+ //
+ // TODO(crbug.com/1321688): This class requires that we recognize the
+ // signature algorithm, but there are some self-signed root certificates with
+ // weak signature algorithms like MD2. We never verify those signatures, but
+ // this means we must include MD2, etc., in the `SignatureAlgorithm` enum.
+ // Instead, make this an `absl::optional<SignatureAlgorithm>` and make the
+ // call sites handle recognized and unrecognized algorithms.
+ SignatureAlgorithm signature_algorithm_;
// Normalized DER-encoded Subject (not including outer Sequence tag).
std::string normalized_subject_;
@@ -326,4 +332,4 @@ class NET_EXPORT ParsedCertificate
} // namespace net
-#endif // NET_CERT_INTERNAL_PARSED_CERTIFICATE_H_
+#endif // NET_CERT_PKI_PARSED_CERTIFICATE_H_
diff --git a/chromium/net/cert/internal/parsed_certificate_unittest.cc b/chromium/net/cert/pki/parsed_certificate_unittest.cc
index 2d8032fcdca..b33520910b3 100644
--- a/chromium/net/cert/internal/parsed_certificate_unittest.cc
+++ b/chromium/net/cert/pki/parsed_certificate_unittest.cc
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/parsed_certificate.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parse_certificate.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/der/input.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
@@ -33,7 +33,8 @@ scoped_refptr<ParsedCertificate> ParseCertificateFromFile(
// Read the certificate data and error expectations from a single PEM file.
const PemBlockMapping mappings[] = {
- {"CERTIFICATE", &data}, {"ERRORS", &expected_errors, true /*optional*/},
+ {"CERTIFICATE", &data},
+ {"ERRORS", &expected_errors, true /*optional*/},
};
std::string test_file_path = GetFilePath(file_name);
EXPECT_TRUE(ReadTestDataFromPemFile(test_file_path, mappings));
diff --git a/chromium/net/cert/internal/path_builder.cc b/chromium/net/cert/pki/path_builder.cc
index 82702755a8e..cdb9ede48dd 100644
--- a/chromium/net/cert/internal/path_builder.cc
+++ b/chromium/net/cert/pki/path_builder.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/path_builder.h"
+#include "net/cert/pki/path_builder.h"
#include <memory>
#include <set>
@@ -15,14 +15,14 @@
#include "base/strings/string_number_conversions.h"
#include "crypto/sha2.h"
#include "net/base/net_errors.h"
-#include "net/cert/internal/cert_issuer_source.h"
-#include "net/cert/internal/certificate_policies.h"
-#include "net/cert/internal/common_cert_errors.h"
-#include "net/cert/internal/parse_certificate.h"
-#include "net/cert/internal/parse_name.h" // For CertDebugString.
-#include "net/cert/internal/trust_store.h"
-#include "net/cert/internal/verify_certificate_chain.h"
-#include "net/cert/internal/verify_name_match.h"
+#include "net/cert/pki/cert_issuer_source.h"
+#include "net/cert/pki/certificate_policies.h"
+#include "net/cert/pki/common_cert_errors.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/parse_name.h" // For CertDebugString.
+#include "net/cert/pki/trust_store.h"
+#include "net/cert/pki/verify_certificate_chain.h"
+#include "net/cert/pki/verify_name_match.h"
#include "net/der/parser.h"
#include "net/der/tag.h"
@@ -715,9 +715,10 @@ CertPathBuilder::CertPathBuilder(
const std::set<der::Input>& user_initial_policy_set,
InitialPolicyMappingInhibit initial_policy_mapping_inhibit,
InitialAnyPolicyInhibit initial_any_policy_inhibit)
- : cert_path_iter_(new CertPathIter(std::move(cert),
- trust_store,
- /*debug_data=*/&out_result_)),
+ : cert_path_iter_(
+ std::make_unique<CertPathIter>(std::move(cert),
+ trust_store,
+ /*debug_data=*/&out_result_)),
delegate_(delegate),
time_(time),
key_purpose_(key_purpose),
@@ -782,6 +783,7 @@ CertPathBuilder::Result CertPathBuilder::Run() {
}
AddResultPath(std::move(result_path));
}
+ out_result_.iteration_count = iteration_count;
RecordIterationCountHistogram(iteration_count);
return std::move(out_result_);
}
@@ -813,6 +815,7 @@ CertPathBuilder::Result CertPathBuilder::Run() {
AddResultPath(std::move(result_path));
if (path_is_good && !explore_all_paths_) {
+ out_result_.iteration_count = iteration_count;
RecordIterationCountHistogram(iteration_count);
// Found a valid path, return immediately.
return std::move(out_result_);
@@ -839,6 +842,9 @@ void CertPathBuilder::AddResultPath(
out_result_.best_result_index = out_result_.paths.size();
}
}
+ if (result_path->certs.size() > out_result_.max_depth_seen) {
+ out_result_.max_depth_seen = result_path->certs.size();
+ }
out_result_.paths.push_back(std::move(result_path));
}
diff --git a/chromium/net/cert/internal/path_builder.h b/chromium/net/cert/pki/path_builder.h
index 99aac4a43ff..c4bd8a72581 100644
--- a/chromium/net/cert/internal/path_builder.h
+++ b/chromium/net/cert/pki/path_builder.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_PATH_BUILDER_H_
-#define NET_CERT_INTERNAL_PATH_BUILDER_H_
+#ifndef NET_CERT_PKI_PATH_BUILDER_H_
+#define NET_CERT_PKI_PATH_BUILDER_H_
#include <memory>
#include <vector>
@@ -12,10 +12,10 @@
#include "base/supports_user_data.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/trust_store.h"
-#include "net/cert/internal/verify_certificate_chain.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/trust_store.h"
+#include "net/cert/pki/verify_certificate_chain.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
@@ -32,7 +32,7 @@ class CertIssuerSource;
// Base class for custom data that CertPathBuilderDelegate can attach to paths.
class NET_EXPORT CertPathBuilderDelegateData {
public:
- virtual ~CertPathBuilderDelegateData() {}
+ virtual ~CertPathBuilderDelegateData() = default;
};
// Represents a single candidate path that was built or is being processed.
@@ -139,6 +139,12 @@ class NET_EXPORT CertPathBuilder {
// better than invalid, but otherwise nothing is guaranteed.
size_t best_result_index = 0;
+ // The iteration count reached by path building.
+ uint32_t iteration_count = 0;
+
+ // The max depth seen while path building.
+ uint32_t max_depth_seen = 0;
+
// True if the search stopped because it exceeded the iteration limit
// configured with |SetIterationLimit|.
bool exceeded_iteration_limit = false;
@@ -238,4 +244,4 @@ class NET_EXPORT CertPathBuilder {
} // namespace net
-#endif // NET_CERT_INTERNAL_PATH_BUILDER_H_
+#endif // NET_CERT_PKI_PATH_BUILDER_H_
diff --git a/chromium/net/cert/internal/path_builder_pkits_unittest.cc b/chromium/net/cert/pki/path_builder_pkits_unittest.cc
index 57680c769b0..e082f7d55fc 100644
--- a/chromium/net/cert/internal/path_builder_pkits_unittest.cc
+++ b/chromium/net/cert/pki/path_builder_pkits_unittest.cc
@@ -2,23 +2,23 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/path_builder.h"
+#include "net/cert/pki/path_builder.h"
#include "base/time/time.h"
#include "net/base/net_errors.h"
-#include "net/cert/internal/cert_issuer_source_static.h"
-#include "net/cert/internal/common_cert_errors.h"
-#include "net/cert/internal/crl.h"
-#include "net/cert/internal/parse_certificate.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/simple_path_builder_delegate.h"
-#include "net/cert/internal/trust_store_in_memory.h"
-#include "net/cert/internal/verify_certificate_chain.h"
+#include "net/cert/pki/cert_issuer_source_static.h"
+#include "net/cert/pki/common_cert_errors.h"
+#include "net/cert/pki/crl.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
+#include "net/cert/pki/trust_store_in_memory.h"
+#include "net/cert/pki/verify_certificate_chain.h"
#include "net/der/encode_values.h"
#include "net/der/input.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
-#include "net/cert/internal/nist_pkits_unittest.h"
+#include "net/cert/pki/nist_pkits_unittest.h"
namespace net {
diff --git a/chromium/net/cert/internal/path_builder_unittest.cc b/chromium/net/cert/pki/path_builder_unittest.cc
index 545a5157b0a..80c5baa5eae 100644
--- a/chromium/net/cert/internal/path_builder_unittest.cc
+++ b/chromium/net/cert/pki/path_builder_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/path_builder.h"
+#include "net/cert/pki/path_builder.h"
#include "base/base_paths.h"
#include "base/callback_forward.h"
@@ -14,16 +14,16 @@
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "build/build_config.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/cert_issuer_source_static.h"
-#include "net/cert/internal/common_cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/simple_path_builder_delegate.h"
-#include "net/cert/internal/test_helpers.h"
-#include "net/cert/internal/trust_store_collection.h"
-#include "net/cert/internal/trust_store_in_memory.h"
-#include "net/cert/internal/verify_certificate_chain.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/cert_issuer_source_static.h"
+#include "net/cert/pki/common_cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
+#include "net/cert/pki/test_helpers.h"
+#include "net/cert/pki/trust_store_collection.h"
+#include "net/cert/pki/trust_store_in_memory.h"
+#include "net/cert/pki/verify_certificate_chain.h"
#include "net/der/input.h"
#include "net/net_buildflags.h"
#include "net/test/test_certificate_data.h"
@@ -93,8 +93,7 @@ class AsyncCertIssuerSourceStatic : public CertIssuerSource {
num_async_gets_++;
ParsedCertificateList issuers;
static_cert_issuer_source_.SyncGetIssuersOf(cert, &issuers);
- std::unique_ptr<StaticAsyncRequest> req(
- new StaticAsyncRequest(std::move(issuers)));
+ auto req = std::make_unique<StaticAsyncRequest>(std::move(issuers));
*out_req = std::move(req);
if (!async_get_callback_.is_null())
async_get_callback_.Run();
@@ -257,6 +256,7 @@ TEST_F(PathBuilderMultiRootTest, TargetWithSameNameAsTrustAnchorFails) {
auto result = path_builder.Run();
EXPECT_FALSE(result.HasValidPath());
+ EXPECT_EQ(1U, result.max_depth_seen);
}
// Test a failed path building when the trust anchor is provided as a
@@ -682,10 +682,12 @@ TEST_F(PathBuilderMultiRootTest, TestIterationLimit) {
EXPECT_EQ(insufficient_limit, result.exceeded_iteration_limit);
if (insufficient_limit) {
+ EXPECT_EQ(2U, result.iteration_count);
EXPECT_THAT(histogram_tester.GetAllSamples(
"Net.CertVerifier.PathBuilderIterationCount"),
ElementsAre(base::Bucket(/*sample=*/2, /*count=*/1)));
} else {
+ EXPECT_EQ(3U, result.iteration_count);
EXPECT_THAT(histogram_tester.GetAllSamples(
"Net.CertVerifier.PathBuilderIterationCount"),
ElementsAre(base::Bucket(/*sample=*/3, /*count=*/1)));
@@ -828,6 +830,11 @@ TEST_F(PathBuilderMultiRootTest, TestDepthLimit) {
EXPECT_EQ(!insufficient_limit, result.HasValidPath());
EXPECT_EQ(insufficient_limit,
result.AnyPathContainsError(cert_errors::kDepthLimitExceeded));
+ if (insufficient_limit) {
+ EXPECT_EQ(2U, result.max_depth_seen);
+ } else {
+ EXPECT_EQ(4U, result.max_depth_seen);
+ }
}
}
@@ -901,7 +908,7 @@ void AddToStoreWithEKURestriction(HCERTSTORE store,
CertAddEnhancedKeyUsageIdentifier(os_cert.get(), usage_identifier);
}
CertAddCertificateContextToStore(store, os_cert.get(), CERT_STORE_ADD_ALWAYS,
- NULL);
+ nullptr);
}
bool AreCertsEq(const scoped_refptr<ParsedCertificate> cert_1,
@@ -1384,6 +1391,7 @@ TEST_F(PathBuilderKeyRolloverTest, ExploreAllPathsWithIterationLimit) {
EXPECT_EQ(target_, path0.certs[0]);
EXPECT_EQ(newintermediate_, path0.certs[1]);
EXPECT_EQ(newroot_, path0.certs[2]);
+ EXPECT_EQ(3U, result.max_depth_seen);
}
if (expectation.expected_num_paths > 1) {
@@ -1394,6 +1402,7 @@ TEST_F(PathBuilderKeyRolloverTest, ExploreAllPathsWithIterationLimit) {
EXPECT_EQ(target_, path1.certs[0]);
EXPECT_EQ(newintermediate_, path1.certs[1]);
EXPECT_EQ(oldroot_, path1.certs[2]);
+ EXPECT_EQ(3U, result.max_depth_seen);
}
if (expectation.expected_num_paths > 2) {
@@ -1404,6 +1413,7 @@ TEST_F(PathBuilderKeyRolloverTest, ExploreAllPathsWithIterationLimit) {
EXPECT_EQ(target_, path2.certs[0]);
EXPECT_EQ(oldintermediate_, path2.certs[1]);
EXPECT_EQ(oldroot_, path2.certs[2]);
+ EXPECT_EQ(3U, result.max_depth_seen);
}
if (expectation.expected_num_paths > 3) {
@@ -1414,6 +1424,7 @@ TEST_F(PathBuilderKeyRolloverTest, ExploreAllPathsWithIterationLimit) {
EXPECT_EQ(target_, path3.certs[0]);
EXPECT_EQ(oldintermediate_, path3.certs[1]);
EXPECT_EQ(newroot_, path3.certs[2]);
+ EXPECT_EQ(3U, result.max_depth_seen);
}
}
}
@@ -1620,7 +1631,8 @@ class MockCertIssuerSource : public CertIssuerSource {
// only be used with Return, not SetArgPointee.)
class CertIssuerSourceRequestMover {
public:
- CertIssuerSourceRequestMover(std::unique_ptr<CertIssuerSource::Request> req)
+ explicit CertIssuerSourceRequestMover(
+ std::unique_ptr<CertIssuerSource::Request> req)
: request_(std::move(req)) {}
void MoveIt(const ParsedCertificate* cert,
std::unique_ptr<CertIssuerSource::Request>* out_req) {
@@ -1661,8 +1673,8 @@ TEST_F(PathBuilderKeyRolloverTest, TestMultipleAsyncIssuersFromSingleSource) {
path_builder.AddCertIssuerSource(&cert_issuer_source);
// Create the mock CertIssuerSource::Request...
- std::unique_ptr<StrictMock<MockCertIssuerSourceRequest>>
- target_issuers_req_owner(new StrictMock<MockCertIssuerSourceRequest>());
+ auto target_issuers_req_owner =
+ std::make_unique<StrictMock<MockCertIssuerSourceRequest>>();
// Keep a raw pointer to the Request...
StrictMock<MockCertIssuerSourceRequest>* target_issuers_req =
target_issuers_req_owner.get();
@@ -1741,8 +1753,8 @@ TEST_F(PathBuilderKeyRolloverTest, TestDuplicateAsyncIntermediates) {
path_builder.AddCertIssuerSource(&cert_issuer_source);
// Create the mock CertIssuerSource::Request...
- std::unique_ptr<StrictMock<MockCertIssuerSourceRequest>>
- target_issuers_req_owner(new StrictMock<MockCertIssuerSourceRequest>());
+ auto target_issuers_req_owner =
+ std::make_unique<StrictMock<MockCertIssuerSourceRequest>>();
// Keep a raw pointer to the Request...
StrictMock<MockCertIssuerSourceRequest>* target_issuers_req =
target_issuers_req_owner.get();
diff --git a/chromium/net/cert/internal/path_builder_verify_certificate_chain_unittest.cc b/chromium/net/cert/pki/path_builder_verify_certificate_chain_unittest.cc
index 6710dd1dd39..1db806bb67a 100644
--- a/chromium/net/cert/internal/path_builder_verify_certificate_chain_unittest.cc
+++ b/chromium/net/cert/pki/path_builder_verify_certificate_chain_unittest.cc
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/path_builder.h"
+#include "net/cert/pki/path_builder.h"
-#include "net/cert/internal/cert_issuer_source_static.h"
-#include "net/cert/internal/simple_path_builder_delegate.h"
-#include "net/cert/internal/trust_store_in_memory.h"
-#include "net/cert/internal/verify_certificate_chain_typed_unittest.h"
+#include "net/cert/pki/cert_issuer_source_static.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
+#include "net/cert/pki/trust_store_in_memory.h"
+#include "net/cert/pki/verify_certificate_chain_typed_unittest.h"
namespace net {
diff --git a/chromium/net/cert/internal/revocation_util.cc b/chromium/net/cert/pki/revocation_util.cc
index 786ec8697ac..17a75b03c8e 100644
--- a/chromium/net/cert/internal/revocation_util.cc
+++ b/chromium/net/cert/pki/revocation_util.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/revocation_util.h"
+#include "net/cert/pki/revocation_util.h"
#include "base/time/time.h"
#include "net/der/encode_values.h"
diff --git a/chromium/net/cert/internal/revocation_util.h b/chromium/net/cert/pki/revocation_util.h
index 4b71f03825b..2966a0542de 100644
--- a/chromium/net/cert/internal/revocation_util.h
+++ b/chromium/net/cert/pki/revocation_util.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_REVOCATION_UTIL_H_
-#define NET_CERT_INTERNAL_REVOCATION_UTIL_H_
+#ifndef NET_CERT_PKI_REVOCATION_UTIL_H_
+#define NET_CERT_PKI_REVOCATION_UTIL_H_
#include "net/base/net_export.h"
@@ -30,4 +30,4 @@ struct GeneralizedTime;
} // namespace net
-#endif // NET_CERT_INTERNAL_REVOCATION_UTIL_H_
+#endif // NET_CERT_PKI_REVOCATION_UTIL_H_
diff --git a/chromium/net/cert/internal/signature_algorithm.cc b/chromium/net/cert/pki/signature_algorithm.cc
index b733b8ebf03..a7ff1852587 100644
--- a/chromium/net/cert/internal/signature_algorithm.cc
+++ b/chromium/net/cert/pki/signature_algorithm.cc
@@ -2,14 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/signature_algorithm.h"
+#include "net/cert/pki/signature_algorithm.h"
-#include <memory>
-#include <utility>
-
-#include "base/memory/ptr_util.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/cert_errors.h"
+#include "base/check.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/cert_errors.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "net/der/parser.h"
@@ -42,8 +39,8 @@ const uint8_t kOidMd5WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7,
// pkcs-1(1) 5 }
//
// In dotted notation: 1.2.840.113549.1.1.5
-const uint8_t kOidSha1WithRsaEncryption[] =
- {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05};
+const uint8_t kOidSha1WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05};
// sha1WithRSASignature is a deprecated equivalent of
// sha1WithRSAEncryption.
@@ -69,24 +66,24 @@ const uint8_t kOidSha1WithRsaSignature[] = {0x2b, 0x0e, 0x03, 0x02, 0x1d};
// sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 }
//
// In dotted notation: 1.2.840.113549.1.1.11
-const uint8_t kOidSha256WithRsaEncryption[] =
- {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b};
+const uint8_t kOidSha256WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x0b};
// From RFC 5912:
//
// sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 }
//
// In dotted notation: 1.2.840.113549.1.1.11
-const uint8_t kOidSha384WithRsaEncryption[] =
- {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c};
+const uint8_t kOidSha384WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x0c};
// From RFC 5912:
//
// sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 }
//
// In dotted notation: 1.2.840.113549.1.1.13
-const uint8_t kOidSha512WithRsaEncryption[] =
- {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0d};
+const uint8_t kOidSha512WithRsaEncryption[] = {0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x0d};
// From RFC 5912:
//
@@ -104,8 +101,8 @@ const uint8_t kOidEcdsaWithSha1[] = {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x01};
// ecdsa-with-SHA2(3) 2 }
//
// In dotted notation: 1.2.840.10045.4.3.2
-const uint8_t kOidEcdsaWithSha256[] =
- {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02};
+const uint8_t kOidEcdsaWithSha256[] = {0x2a, 0x86, 0x48, 0xce,
+ 0x3d, 0x04, 0x03, 0x02};
// From RFC 5912:
//
@@ -114,8 +111,8 @@ const uint8_t kOidEcdsaWithSha256[] =
// ecdsa-with-SHA2(3) 3 }
//
// In dotted notation: 1.2.840.10045.4.3.3
-const uint8_t kOidEcdsaWithSha384[] =
- {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03};
+const uint8_t kOidEcdsaWithSha384[] = {0x2a, 0x86, 0x48, 0xce,
+ 0x3d, 0x04, 0x03, 0x03};
// From RFC 5912:
//
@@ -124,8 +121,8 @@ const uint8_t kOidEcdsaWithSha384[] =
// ecdsa-with-SHA2(3) 4 }
//
// In dotted notation: 1.2.840.10045.4.3.4
-const uint8_t kOidEcdsaWithSha512[] =
- {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x04};
+const uint8_t kOidEcdsaWithSha512[] = {0x2a, 0x86, 0x48, 0xce,
+ 0x3d, 0x04, 0x03, 0x04};
// From RFC 5912:
//
@@ -181,122 +178,8 @@ const uint8_t kOidMgf1[] = {0x2a, 0x86, 0x48, 0x86, 0xf7,
return !parser.HasMore();
}
-// Parses an RSA PKCS#1 v1.5 signature algorithm given the DER-encoded
-// "parameters" from the parsed AlgorithmIdentifier, and the hash algorithm
-// that was implied by the AlgorithmIdentifier's OID.
-//
-// Returns a nullptr on failure.
-//
-// RFC 5912 requires that the parameters for RSA PKCS#1 v1.5 algorithms be NULL
-// ("PARAMS TYPE NULL ARE required"), however an empty parameter is also
-// allowed for compatibility with non-compliant OCSP responders:
-//
-// sa-rsaWithSHA1 SIGNATURE-ALGORITHM ::= {
-// IDENTIFIER sha1WithRSAEncryption
-// PARAMS TYPE NULL ARE required
-// HASHES { mda-sha1 }
-// PUBLIC-KEYS { pk-rsa }
-// SMIME-CAPS {IDENTIFIED BY sha1WithRSAEncryption }
-// }
-//
-// sa-sha256WithRSAEncryption SIGNATURE-ALGORITHM ::= {
-// IDENTIFIER sha256WithRSAEncryption
-// PARAMS TYPE NULL ARE required
-// HASHES { mda-sha256 }
-// PUBLIC-KEYS { pk-rsa }
-// SMIME-CAPS { IDENTIFIED BY sha256WithRSAEncryption }
-// }
-//
-// sa-sha384WithRSAEncryption SIGNATURE-ALGORITHM ::= {
-// IDENTIFIER sha384WithRSAEncryption
-// PARAMS TYPE NULL ARE required
-// HASHES { mda-sha384 }
-// PUBLIC-KEYS { pk-rsa }
-// SMIME-CAPS { IDENTIFIED BY sha384WithRSAEncryption }
-// }
-//
-// sa-sha512WithRSAEncryption SIGNATURE-ALGORITHM ::= {
-// IDENTIFIER sha512WithRSAEncryption
-// PARAMS TYPE NULL ARE required
-// HASHES { mda-sha512 }
-// PUBLIC-KEYS { pk-rsa }
-// SMIME-CAPS { IDENTIFIED BY sha512WithRSAEncryption }
-// }
-std::unique_ptr<SignatureAlgorithm> ParseRsaPkcs1(DigestAlgorithm digest,
- const der::Input& params) {
- // TODO(svaldez): Add warning about non-strict parsing.
- if (!IsNull(params) && !IsEmpty(params))
- return nullptr;
-
- return SignatureAlgorithm::CreateRsaPkcs1(digest);
-}
-
-// Parses a DSA signature algorithm given the DER-encoded
-// "parameters" from the parsed AlgorithmIdentifier, and the hash algorithm
-// that was implied by the AlgorithmIdentifier's OID.
-//
-// Returns a nullptr on failure.
-//
-// RFC 5912 requires that the parameters for DSA algorithms be absent.
-std::unique_ptr<SignatureAlgorithm> ParseDsa(DigestAlgorithm digest,
- const der::Input& params) {
- // TODO(svaldez): Add warning about non-strict parsing.
- if (!IsNull(params) && !IsEmpty(params))
- return nullptr;
-
- return SignatureAlgorithm::CreateDsa(digest);
-}
-
-// Parses an ECDSA signature algorithm given the DER-encoded "parameters" from
-// the parsed AlgorithmIdentifier, and the hash algorithm that was implied by
-// the AlgorithmIdentifier's OID.
-//
-// On failure returns a nullptr.
-//
-// RFC 5912 requires that the parameters for ECDSA algorithms be absent
-// ("PARAMS TYPE NULL ARE absent"):
-//
-// sa-ecdsaWithSHA1 SIGNATURE-ALGORITHM ::= {
-// IDENTIFIER ecdsa-with-SHA1
-// VALUE ECDSA-Sig-Value
-// PARAMS TYPE NULL ARE absent
-// HASHES { mda-sha1 }
-// PUBLIC-KEYS { pk-ec }
-// SMIME-CAPS {IDENTIFIED BY ecdsa-with-SHA1 }
-// }
-//
-// sa-ecdsaWithSHA256 SIGNATURE-ALGORITHM ::= {
-// IDENTIFIER ecdsa-with-SHA256
-// VALUE ECDSA-Sig-Value
-// PARAMS TYPE NULL ARE absent
-// HASHES { mda-sha256 }
-// PUBLIC-KEYS { pk-ec }
-// SMIME-CAPS { IDENTIFIED BY ecdsa-with-SHA256 }
-// }
-//
-// sa-ecdsaWithSHA384 SIGNATURE-ALGORITHM ::= {
-// IDENTIFIER ecdsa-with-SHA384
-// VALUE ECDSA-Sig-Value
-// PARAMS TYPE NULL ARE absent
-// HASHES { mda-sha384 }
-// PUBLIC-KEYS { pk-ec }
-// SMIME-CAPS { IDENTIFIED BY ecdsa-with-SHA384 }
-// }
-//
-// sa-ecdsaWithSHA512 SIGNATURE-ALGORITHM ::= {
-// IDENTIFIER ecdsa-with-SHA512
-// VALUE ECDSA-Sig-Value
-// PARAMS TYPE NULL ARE absent
-// HASHES { mda-sha512 }
-// PUBLIC-KEYS { pk-ec }
-// SMIME-CAPS { IDENTIFIED BY ecdsa-with-SHA512 }
-// }
-std::unique_ptr<SignatureAlgorithm> ParseEcdsa(DigestAlgorithm digest,
- const der::Input& params) {
- if (!IsEmpty(params))
- return nullptr;
-
- return SignatureAlgorithm::CreateEcdsa(digest);
+[[nodiscard]] bool IsNullOrEmpty(const der::Input& input) {
+ return IsNull(input) || IsEmpty(input);
}
// Parses a MaskGenAlgorithm as defined by RFC 5912:
@@ -364,16 +247,16 @@ std::unique_ptr<SignatureAlgorithm> ParseEcdsa(DigestAlgorithm digest,
// Note also that DER encoding (ITU-T X.690 section 11.5) prohibits
// specifying default values explicitly. The parameter should instead be
// omitted to indicate a default value.
-std::unique_ptr<SignatureAlgorithm> ParseRsaPss(const der::Input& params) {
+absl::optional<SignatureAlgorithm> ParseRsaPss(const der::Input& params) {
der::Parser parser(params);
der::Parser params_parser;
if (!parser.ReadSequence(&params_parser))
- return nullptr;
+ return absl::nullopt;
// There shouldn't be anything after the sequence (by definition the
// parameters is a single sequence).
if (parser.HasMore())
- return nullptr;
+ return absl::nullopt;
// The default values for hashAlgorithm, maskGenAlgorithm, and saltLength
// correspond to SHA-1, which we do not support with RSA-PSS, so treat them as
@@ -397,25 +280,28 @@ std::unique_ptr<SignatureAlgorithm> ParseRsaPss(const der::Input& params) {
&salt_length_parser) ||
!salt_length_parser.ReadUint64(&salt_length) ||
salt_length_parser.HasMore() || params_parser.HasMore()) {
- return nullptr;
+ return absl::nullopt;
}
// Only combinations of RSASSA-PSS-params specified by TLS 1.3 (RFC 8446) are
// supported.
- if ((hash == DigestAlgorithm::Sha256 &&
- mgf1_hash == DigestAlgorithm::Sha256 && salt_length == 32) ||
- (hash == DigestAlgorithm::Sha384 &&
- mgf1_hash == DigestAlgorithm::Sha384 && salt_length == 48) ||
- (hash == DigestAlgorithm::Sha512 &&
- mgf1_hash == DigestAlgorithm::Sha512 && salt_length == 64)) {
- return SignatureAlgorithm::CreateRsaPss(hash, mgf1_hash, salt_length);
+ if (hash != mgf1_hash) {
+ return absl::nullopt; // TLS 1.3 always matches MGF-1 and message hash.
+ }
+ if (hash == DigestAlgorithm::Sha256 && salt_length == 32) {
+ return SignatureAlgorithm::kRsaPssSha256;
+ }
+ if (hash == DigestAlgorithm::Sha384 && salt_length == 48) {
+ return SignatureAlgorithm::kRsaPssSha384;
+ }
+ if (hash == DigestAlgorithm::Sha512 && salt_length == 64) {
+ return SignatureAlgorithm::kRsaPssSha512;
}
- return nullptr;
+ return absl::nullopt;
}
-DEFINE_CERT_ERROR_ID(kUnknownAlgorithmIdentifierOid,
- "Unknown AlgorithmIdentifier OID");
+DEFINE_CERT_ERROR_ID(kUnknownSignatureAlgorithm, "Unknown signature algorithm");
} // namespace
@@ -474,148 +360,128 @@ DEFINE_CERT_ERROR_ID(kUnknownAlgorithmIdentifierOid,
return true;
}
-RsaPssParameters::RsaPssParameters(DigestAlgorithm mgf1_hash,
- uint32_t salt_length)
- : mgf1_hash_(mgf1_hash), salt_length_(salt_length) {
-}
-
-SignatureAlgorithm::~SignatureAlgorithm() = default;
-
-std::unique_ptr<SignatureAlgorithm> SignatureAlgorithm::Create(
+absl::optional<SignatureAlgorithm> ParseSignatureAlgorithm(
const der::Input& algorithm_identifier,
CertErrors* errors) {
der::Input oid;
der::Input params;
if (!ParseAlgorithmIdentifier(algorithm_identifier, &oid, &params))
- return nullptr;
+ return absl::nullopt;
// TODO(eroman): Each OID is tested for equality in order, which is not
// particularly efficient.
- if (oid == der::Input(kOidSha1WithRsaEncryption))
- return ParseRsaPkcs1(DigestAlgorithm::Sha1, params);
-
- if (oid == der::Input(kOidSha256WithRsaEncryption))
- return ParseRsaPkcs1(DigestAlgorithm::Sha256, params);
-
- if (oid == der::Input(kOidSha384WithRsaEncryption))
- return ParseRsaPkcs1(DigestAlgorithm::Sha384, params);
-
- if (oid == der::Input(kOidSha512WithRsaEncryption))
- return ParseRsaPkcs1(DigestAlgorithm::Sha512, params);
-
- if (oid == der::Input(kOidEcdsaWithSha1))
- return ParseEcdsa(DigestAlgorithm::Sha1, params);
-
- if (oid == der::Input(kOidEcdsaWithSha256))
- return ParseEcdsa(DigestAlgorithm::Sha256, params);
-
- if (oid == der::Input(kOidEcdsaWithSha384))
- return ParseEcdsa(DigestAlgorithm::Sha384, params);
+ // RFC 5912 requires that the parameters for RSA PKCS#1 v1.5 algorithms be
+ // NULL ("PARAMS TYPE NULL ARE required"), however an empty parameter is also
+ // allowed for compatibility with non-compliant OCSP responders.
+ //
+ // TODO(svaldez): Add warning about non-strict parsing.
+ if (oid == der::Input(kOidSha1WithRsaEncryption) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kRsaPkcs1Sha1;
+ }
+ if (oid == der::Input(kOidSha256WithRsaEncryption) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kRsaPkcs1Sha256;
+ }
+ if (oid == der::Input(kOidSha384WithRsaEncryption) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kRsaPkcs1Sha384;
+ }
+ if (oid == der::Input(kOidSha512WithRsaEncryption) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kRsaPkcs1Sha512;
+ }
+ if (oid == der::Input(kOidSha1WithRsaSignature) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kRsaPkcs1Sha1;
+ }
+ if (oid == der::Input(kOidMd2WithRsaEncryption) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kRsaPkcs1Md2;
+ }
+ if (oid == der::Input(kOidMd4WithRsaEncryption) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kRsaPkcs1Md4;
+ }
+ if (oid == der::Input(kOidMd5WithRsaEncryption) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kRsaPkcs1Md5;
+ }
- if (oid == der::Input(kOidEcdsaWithSha512))
- return ParseEcdsa(DigestAlgorithm::Sha512, params);
+ // RFC 5912 requires that the parameters for ECDSA algorithms be absent
+ // ("PARAMS TYPE NULL ARE absent"):
+ if (oid == der::Input(kOidEcdsaWithSha1) && IsEmpty(params)) {
+ return SignatureAlgorithm::kEcdsaSha1;
+ }
+ if (oid == der::Input(kOidEcdsaWithSha256) && IsEmpty(params)) {
+ return SignatureAlgorithm::kEcdsaSha256;
+ }
+ if (oid == der::Input(kOidEcdsaWithSha384) && IsEmpty(params)) {
+ return SignatureAlgorithm::kEcdsaSha384;
+ }
+ if (oid == der::Input(kOidEcdsaWithSha512) && IsEmpty(params)) {
+ return SignatureAlgorithm::kEcdsaSha512;
+ }
- if (oid == der::Input(kOidRsaSsaPss))
+ if (oid == der::Input(kOidRsaSsaPss)) {
return ParseRsaPss(params);
+ }
- if (oid == der::Input(kOidSha1WithRsaSignature))
- return ParseRsaPkcs1(DigestAlgorithm::Sha1, params);
-
- if (oid == der::Input(kOidMd2WithRsaEncryption))
- return ParseRsaPkcs1(DigestAlgorithm::Md2, params);
-
- if (oid == der::Input(kOidMd4WithRsaEncryption))
- return ParseRsaPkcs1(DigestAlgorithm::Md4, params);
-
- if (oid == der::Input(kOidMd5WithRsaEncryption))
- return ParseRsaPkcs1(DigestAlgorithm::Md5, params);
-
- if (oid == der::Input(kOidDsaWithSha1))
- return ParseDsa(DigestAlgorithm::Sha1, params);
-
- if (oid == der::Input(kOidDsaWithSha256))
- return ParseDsa(DigestAlgorithm::Sha256, params);
+ // RFC 5912 requires that the parameters for DSA algorithms be absent.
+ //
+ // TODO(svaldez): Add warning about non-strict parsing.
+ if (oid == der::Input(kOidDsaWithSha1) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kDsaSha1;
+ }
+ if (oid == der::Input(kOidDsaWithSha256) && IsNullOrEmpty(params)) {
+ return SignatureAlgorithm::kDsaSha256;
+ }
- // Unknown OID.
+ // Unknown signature algorithm.
if (errors) {
- errors->AddError(kUnknownAlgorithmIdentifierOid,
+ errors->AddError(kUnknownSignatureAlgorithm,
CreateCertErrorParams2Der("oid", oid, "params", params));
}
- return nullptr;
-}
-
-std::unique_ptr<SignatureAlgorithm> SignatureAlgorithm::CreateRsaPkcs1(
- DigestAlgorithm digest) {
- return base::WrapUnique(
- new SignatureAlgorithm(SignatureAlgorithmId::RsaPkcs1, digest, nullptr));
+ return absl::nullopt;
}
-std::unique_ptr<SignatureAlgorithm> SignatureAlgorithm::CreateDsa(
- DigestAlgorithm digest) {
- return base::WrapUnique(
- new SignatureAlgorithm(SignatureAlgorithmId::Dsa, digest, nullptr));
-}
-
-std::unique_ptr<SignatureAlgorithm> SignatureAlgorithm::CreateEcdsa(
- DigestAlgorithm digest) {
- return base::WrapUnique(
- new SignatureAlgorithm(SignatureAlgorithmId::Ecdsa, digest, nullptr));
-}
-
-std::unique_ptr<SignatureAlgorithm> SignatureAlgorithm::CreateRsaPss(
- DigestAlgorithm digest,
- DigestAlgorithm mgf1_hash,
- uint32_t salt_length) {
- return base::WrapUnique(new SignatureAlgorithm(
- SignatureAlgorithmId::RsaPss, digest,
- std::make_unique<RsaPssParameters>(mgf1_hash, salt_length)));
-}
-
-const RsaPssParameters* SignatureAlgorithm::ParamsForRsaPss() const {
- if (algorithm_ == SignatureAlgorithmId::RsaPss)
- return static_cast<RsaPssParameters*>(params_.get());
- return nullptr;
-}
-
-bool SignatureAlgorithm::IsEquivalent(const der::Input& alg1_tlv,
- const der::Input& alg2_tlv) {
- if (alg1_tlv == alg2_tlv)
- return true;
-
- std::unique_ptr<SignatureAlgorithm> alg1 = Create(alg1_tlv, nullptr);
- std::unique_ptr<SignatureAlgorithm> alg2 = Create(alg2_tlv, nullptr);
-
- // Do checks that apply to all algorithms.
- if (!alg1 || !alg2 || (alg1->algorithm() != alg2->algorithm()) ||
- (alg1->digest() != alg2->digest())) {
- return false;
- }
-
- // Check algorithm-specific parameters for equality.
- switch (alg1->algorithm()) {
- case SignatureAlgorithmId::RsaPkcs1:
- case SignatureAlgorithmId::Ecdsa:
- case SignatureAlgorithmId::Dsa:
- DCHECK(!alg1->has_params());
- DCHECK(!alg2->has_params());
- return true;
- case SignatureAlgorithmId::RsaPss: {
- const RsaPssParameters* params1 = alg1->ParamsForRsaPss();
- const RsaPssParameters* params2 = alg2->ParamsForRsaPss();
- return params1 && params2 &&
- (params1->salt_length() == params2->salt_length()) &&
- (params1->mgf1_hash() == params2->mgf1_hash());
- }
+absl::optional<DigestAlgorithm> GetTlsServerEndpointDigestAlgorithm(
+ SignatureAlgorithm alg) {
+ // See RFC 5929, section 4.1. RFC 5929 breaks the signature algorithm
+ // abstraction by trying to extract individual digest algorithms. (While
+ // common, this is not a universal property of signature algorithms.) We
+ // implement this within the library, so callers do not need to condition over
+ // all algorithms.
+ switch (alg) {
+ // If the single digest algorithm is MD5 or SHA-1, use SHA-256.
+ case SignatureAlgorithm::kRsaPkcs1Md5:
+ case SignatureAlgorithm::kRsaPkcs1Sha1:
+ case SignatureAlgorithm::kEcdsaSha1:
+ return DigestAlgorithm::Sha256;
+
+ case SignatureAlgorithm::kRsaPkcs1Sha256:
+ case SignatureAlgorithm::kEcdsaSha256:
+ return DigestAlgorithm::Sha256;
+
+ case SignatureAlgorithm::kRsaPkcs1Sha384:
+ case SignatureAlgorithm::kEcdsaSha384:
+ return DigestAlgorithm::Sha384;
+
+ case SignatureAlgorithm::kRsaPkcs1Sha512:
+ case SignatureAlgorithm::kEcdsaSha512:
+ return DigestAlgorithm::Sha512;
+
+ // It is ambiguous whether hash-matching RSASSA-PSS instantiations count as
+ // using one or multiple digests, but the corresponding digest is the only
+ // reasonable interpretation.
+ case SignatureAlgorithm::kRsaPssSha256:
+ return DigestAlgorithm::Sha256;
+ case SignatureAlgorithm::kRsaPssSha384:
+ return DigestAlgorithm::Sha384;
+ case SignatureAlgorithm::kRsaPssSha512:
+ return DigestAlgorithm::Sha512;
+
+ // Do not return anything for these legacy algorithms.
+ case SignatureAlgorithm::kDsaSha1:
+ case SignatureAlgorithm::kDsaSha256:
+ case SignatureAlgorithm::kRsaPkcs1Md2:
+ case SignatureAlgorithm::kRsaPkcs1Md4:
+ return absl::nullopt;
}
-
- return false;
+ return absl::nullopt;
}
-SignatureAlgorithm::SignatureAlgorithm(
- SignatureAlgorithmId algorithm,
- DigestAlgorithm digest,
- std::unique_ptr<SignatureAlgorithmParameters> params)
- : algorithm_(algorithm), digest_(digest), params_(std::move(params)) {}
-
} // namespace net
diff --git a/chromium/net/cert/pki/signature_algorithm.h b/chromium/net/cert/pki/signature_algorithm.h
new file mode 100644
index 00000000000..e6e2569bbae
--- /dev/null
+++ b/chromium/net/cert/pki/signature_algorithm.h
@@ -0,0 +1,95 @@
+// Copyright 2015 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.
+
+#ifndef NET_CERT_PKI_SIGNATURE_ALGORITHM_H_
+#define NET_CERT_PKI_SIGNATURE_ALGORITHM_H_
+
+#include <stdint.h>
+
+#include "net/base/net_export.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace net {
+
+class CertErrors;
+
+namespace der {
+class Input;
+} // namespace der
+
+// The digest algorithm used within a signature.
+enum class DigestAlgorithm {
+ Md2,
+ Md4,
+ Md5,
+ Sha1,
+ Sha256,
+ Sha384,
+ Sha512,
+};
+
+// The signature algorithm used within a certificate.
+enum class SignatureAlgorithm {
+ kRsaPkcs1Sha1,
+ kRsaPkcs1Sha256,
+ kRsaPkcs1Sha384,
+ kRsaPkcs1Sha512,
+ kEcdsaSha1,
+ kEcdsaSha256,
+ kEcdsaSha384,
+ kEcdsaSha512,
+ // These RSA-PSS constants match RFC 8446 and refer to RSASSA-PSS with MGF-1,
+ // using the specified hash as both the signature and MGF-1 hash, and the hash
+ // length as the salt length.
+ kRsaPssSha256,
+ kRsaPssSha384,
+ kRsaPssSha512,
+ // These algorithms can be parsed but are not supported.
+ // TODO(https://crbug.com/1321688): Remove these.
+ kRsaPkcs1Md2,
+ kRsaPkcs1Md4,
+ kRsaPkcs1Md5,
+ kDsaSha1,
+ kDsaSha256,
+};
+
+// Parses AlgorithmIdentifier as defined by RFC 5280 section 4.1.1.2:
+//
+// AlgorithmIdentifier ::= SEQUENCE {
+// algorithm OBJECT IDENTIFIER,
+// parameters ANY DEFINED BY algorithm OPTIONAL }
+[[nodiscard]] NET_EXPORT bool ParseAlgorithmIdentifier(const der::Input& input,
+ der::Input* algorithm,
+ der::Input* parameters);
+
+// Parses a HashAlgorithm as defined by RFC 5912:
+//
+// HashAlgorithm ::= AlgorithmIdentifier{DIGEST-ALGORITHM,
+// {HashAlgorithms}}
+//
+// HashAlgorithms DIGEST-ALGORITHM ::= {
+// { IDENTIFIER id-sha1 PARAMS TYPE NULL ARE preferredPresent } |
+// { IDENTIFIER id-sha224 PARAMS TYPE NULL ARE preferredPresent } |
+// { IDENTIFIER id-sha256 PARAMS TYPE NULL ARE preferredPresent } |
+// { IDENTIFIER id-sha384 PARAMS TYPE NULL ARE preferredPresent } |
+// { IDENTIFIER id-sha512 PARAMS TYPE NULL ARE preferredPresent }
+// }
+[[nodiscard]] bool ParseHashAlgorithm(const der::Input& input,
+ DigestAlgorithm* out);
+
+// Parses an AlgorithmIdentifier into a signature algorithm and returns it, or
+// returns `absl::nullopt` if `algorithm_identifer` either cannot be parsed or
+// is not a recognized signature algorithm.
+NET_EXPORT absl::optional<SignatureAlgorithm> ParseSignatureAlgorithm(
+ const der::Input& algorithm_identifier,
+ CertErrors* errors);
+
+// Returns the hash to be used with the tls-server-end-point channel binding
+// (RFC 5929) or `absl::nullopt`, if not supported for this signature algorithm.
+absl::optional<DigestAlgorithm> GetTlsServerEndpointDigestAlgorithm(
+ SignatureAlgorithm alg);
+
+} // namespace net
+
+#endif // NET_CERT_PKI_SIGNATURE_ALGORITHM_H_
diff --git a/chromium/net/cert/internal/signature_algorithm_unittest.cc b/chromium/net/cert/pki/signature_algorithm_unittest.cc
index c721eb34836..2247675ca76 100644
--- a/chromium/net/cert/internal/signature_algorithm_unittest.cc
+++ b/chromium/net/cert/pki/signature_algorithm_unittest.cc
@@ -2,15 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/signature_algorithm.h"
+#include "net/cert/pki/signature_algorithm.h"
#include <memory>
#include "base/containers/span.h"
#include "base/files/file_util.h"
#include "base/strings/string_number_conversions.h"
-#include "net/cert/internal/cert_errors.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/cert_errors.h"
#include "net/der/input.h"
#include "net/der/parser.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -19,23 +19,10 @@ namespace net {
namespace {
-// Creates a SignatureAlgorithm given the DER as a byte array. Returns true on
-// success and fills |*out| with a non-null pointer.
-bool ParseDer(base::span<const uint8_t> data,
- std::unique_ptr<SignatureAlgorithm>* out) {
- *out =
- SignatureAlgorithm::Create(der::Input(data.data(), data.size()), nullptr);
- bool success = !!*out;
-
- return success;
-}
-
// Parses a SignatureAlgorithm given an empty DER input.
TEST(SignatureAlgorithmTest, ParseDerEmpty) {
CertErrors errors;
- std::unique_ptr<SignatureAlgorithm> algorithm =
- SignatureAlgorithm::Create(der::Input(), &errors);
- ASSERT_FALSE(algorithm);
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(), &errors));
// TODO(crbug.com/634443): Test the errors.
// EXPECT_FALSE(errors.empty());
}
@@ -43,8 +30,7 @@ TEST(SignatureAlgorithmTest, ParseDerEmpty) {
// Parses a SignatureAlgorithm given invalid DER input.
TEST(SignatureAlgorithmTest, ParseDerBogus) {
const uint8_t kData[] = {0x00};
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a SignatureAlgorithm with an unsupported algorithm OID.
@@ -59,8 +45,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssUnsupportedAlgorithmOid) {
0x42,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a sha1WithRSAEncryption which contains a NULL parameters field.
@@ -77,11 +62,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha1WithRSAEncryptionNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha1, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha1);
}
// Parses a sha1WithRSAEncryption which contains no parameters field.
@@ -96,11 +78,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha1WithRSAEncryptionNoParams) {
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha1, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha1);
}
// Parses a sha1WithRSAEncryption which contains an unexpected parameters
@@ -118,8 +97,7 @@ TEST(SignatureAlgorithmTest, ParseDerSha1WithRSAEncryptionNonNullParams) {
0x02, 0x01, 0x00, // INTEGER (1 byte)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a sha1WithRSASignature which contains a NULL parameters field.
@@ -136,11 +114,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha1WithRSASignatureNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha1, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha1);
}
// Parses a sha1WithRSASignature which contains no parameters field.
@@ -155,11 +130,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha1WithRSASignatureNoParams) {
0x2b, 0x0e, 0x03, 0x02, 0x1d,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha1, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha1);
}
// Parses a sha1WithRSAEncryption which contains values after the sequence.
@@ -178,8 +150,7 @@ TEST(SignatureAlgorithmTest, ParseDerSha1WithRsaEncryptionDataAfterSequence) {
0x02, 0x01, 0x00, // INTEGER (1 byte)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a sha1WithRSAEncryption which contains a bad NULL parameters field.
@@ -198,8 +169,7 @@ TEST(SignatureAlgorithmTest, ParseDerSha1WithRSAEncryptionBadNullParams) {
0x05, 0x01, 0x09, // NULL (1 byte)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a sha1WithRSAEncryption which contains a NULL parameters field,
@@ -220,8 +190,7 @@ TEST(SignatureAlgorithmTest,
0x02, 0x01, 0x00, // INTEGER (1 byte)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a SignatureAlgorithm given DER which does not encode a sequence.
@@ -233,8 +202,7 @@ TEST(SignatureAlgorithmTest, ParseDerNotASequence) {
0x02, 0x01, 0x00, // INTEGER (1 byte)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a sha256WithRSAEncryption which contains a NULL parameters field.
@@ -251,11 +219,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha256WithRSAEncryptionNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha256, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha256);
}
// Parses a sha256WithRSAEncryption which contains no parameters field.
@@ -270,11 +235,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha256WithRSAEncryptionNoParams) {
0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha256, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha256);
}
// Parses a sha384WithRSAEncryption which contains a NULL parameters field.
@@ -291,11 +253,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha384WithRSAEncryptionNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha384, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha384);
}
// Parses a sha384WithRSAEncryption which contains no parameters field.
@@ -310,11 +269,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha384WithRSAEncryptionNoParams) {
0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha384, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha384);
}
// Parses a sha512WithRSAEncryption which contains a NULL parameters field.
@@ -331,11 +287,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha512WithRSAEncryptionNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha512, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha512);
}
// Parses a sha512WithRSAEncryption which contains no parameters field.
@@ -350,11 +303,8 @@ TEST(SignatureAlgorithmTest, ParseDerSha512WithRSAEncryptionNoParams) {
0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0d,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha512, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Sha512);
}
// Parses a sha224WithRSAEncryption which contains a NULL parameters field.
@@ -373,8 +323,7 @@ TEST(SignatureAlgorithmTest, ParseDerSha224WithRSAEncryptionNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a ecdsa-with-SHA1 which contains no parameters field.
@@ -389,11 +338,8 @@ TEST(SignatureAlgorithmTest, ParseDerEcdsaWithSHA1NoParams) {
0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x01,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::Ecdsa, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha1, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kEcdsaSha1);
}
// Parses a ecdsa-with-SHA1 which contains a NULL parameters field.
@@ -410,8 +356,7 @@ TEST(SignatureAlgorithmTest, ParseDerEcdsaWithSHA1NullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a ecdsa-with-SHA256 which contains no parameters field.
@@ -426,11 +371,8 @@ TEST(SignatureAlgorithmTest, ParseDerEcdsaWithSHA256NoParams) {
0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::Ecdsa, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha256, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kEcdsaSha256);
}
// Parses a ecdsa-with-SHA256 which contains a NULL parameters field.
@@ -447,8 +389,7 @@ TEST(SignatureAlgorithmTest, ParseDerEcdsaWithSHA256NullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a ecdsa-with-SHA384 which contains no parameters field.
@@ -463,11 +404,8 @@ TEST(SignatureAlgorithmTest, ParseDerEcdsaWithSHA384NoParams) {
0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::Ecdsa, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha384, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kEcdsaSha384);
}
// Parses a ecdsa-with-SHA384 which contains a NULL parameters field.
@@ -484,8 +422,7 @@ TEST(SignatureAlgorithmTest, ParseDerEcdsaWithSHA384NullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a ecdsa-with-SHA512 which contains no parameters field.
@@ -500,11 +437,8 @@ TEST(SignatureAlgorithmTest, ParseDerEcdsaWithSHA512NoParams) {
0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x04,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::Ecdsa, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha512, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kEcdsaSha512);
}
// Parses a ecdsa-with-SHA512 which contains a NULL parameters field.
@@ -521,26 +455,7 @@ TEST(SignatureAlgorithmTest, ParseDerEcdsaWithSHA512NullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
-}
-
-// Tests that the parmeters returned for an ECDSA algorithm are null for
-// non-ECDSA algorithms.
-TEST(SignatureAlgorithmTest, ParamsAreNullForWrongTypeEcdsa) {
- std::unique_ptr<SignatureAlgorithm> alg1 =
- SignatureAlgorithm::CreateEcdsa(DigestAlgorithm::Sha1);
-
- EXPECT_FALSE(alg1->ParamsForRsaPss());
-}
-
-// Tests that the parmeters returned for an RSA PKCS#1 v1.5 algorithm are null
-// for non-RSA PKCS#1 v1.5 algorithms.
-TEST(SignatureAlgorithmTest, ParamsAreNullForWrongTypeRsaPkcs1) {
- std::unique_ptr<SignatureAlgorithm> alg1 =
- SignatureAlgorithm::CreateRsaPkcs1(DigestAlgorithm::Sha1);
-
- EXPECT_FALSE(alg1->ParamsForRsaPss());
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that uses SHA256 and a salt length of 32.
@@ -586,17 +501,8 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPss) {
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- ASSERT_EQ(SignatureAlgorithmId::RsaPss, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha256, algorithm->digest());
-
- const RsaPssParameters* params = algorithm->ParamsForRsaPss();
-
- ASSERT_TRUE(params);
- EXPECT_EQ(DigestAlgorithm::Sha256, params->mgf1_hash());
- EXPECT_EQ(32u, params->salt_length());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPssSha256);
}
// Parses a rsaPss algorithm that has an empty parameters. This encodes the
@@ -614,8 +520,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssEmptyParams) {
0x30, 0x00, // SEQUENCE (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- EXPECT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that has NULL parameters. This fails.
@@ -632,8 +537,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that has no parameters. This fails.
@@ -648,8 +552,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssNoParams) {
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0A,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that has data after the parameters sequence.
@@ -668,8 +571,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssDataAfterParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that has unrecognized data (NULL) within the
@@ -694,8 +596,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssNullInsideParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that has an unsupported trailer value (2). Only
@@ -718,8 +619,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssUnsupportedTrailer) {
0x02,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that has extra data appearing after the trailer in
@@ -744,8 +644,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssBadTrailer) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that uses SHA384 for the hash, and leaves the rest
@@ -773,8 +672,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssNonDefaultHash) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- EXPECT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that uses an invalid hash algorithm (twiddled the
@@ -799,8 +697,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssUnsupportedHashOid) {
0x60, 0x86, 0x48, 0x02, 0x67, 0x13, 0x04, 0x02, 0x02,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that uses SHA512 MGF1 for the mask gen, and
@@ -833,8 +730,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssNonDefaultMaskGen) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- EXPECT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that uses a mask gen with an unrecognized OID
@@ -866,8 +762,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssUnsupportedMaskGen) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that uses SHA256 for the hash, and SHA512 for the
@@ -908,8 +803,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssNonDefaultHashAndMaskGen) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- EXPECT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that uses SHA256 for the hash, and SHA256 for the
@@ -956,8 +850,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssNonDefaultHashAndMaskGenAndSalt) {
0x0A,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- EXPECT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that specifies default hash (SHA1).
@@ -984,8 +877,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssSpecifiedDefaultHash) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that specifies default mask gen algorithm (SHA1).
@@ -1017,8 +909,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssSpecifiedDefaultMaskGen) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that specifies default salt length.
@@ -1041,8 +932,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssSpecifiedDefaultSaltLength) {
0x14,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that specifies default trailer field.
@@ -1085,8 +975,7 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssSpecifiedDefaultTrailerField) {
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30,
0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x20, 0xa3, 0x03, 0x02, 0x01, 0x01};
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
// Parses a rsaPss algorithm that specifies multiple default parameter values.
@@ -1137,17 +1026,14 @@ TEST(SignatureAlgorithmTest, ParseDerRsaPssMultipleDefaultParameterValues) {
0x01,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_FALSE(ParseDer(kData, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(der::Input(kData), nullptr));
}
TEST(SignatureAlgorithmTest, ParseRsaPss) {
// Test data generated with https://github.com/google/der-ascii.
struct {
std::vector<uint8_t> data;
- DigestAlgorithm expected_digest;
- DigestAlgorithm expected_mgf1_hash;
- uint32_t expected_salt_length;
+ SignatureAlgorithm expected;
} kValidTests[] = {
// SEQUENCE {
// # rsassa-pss
@@ -1182,9 +1068,7 @@ TEST(SignatureAlgorithmTest, ParseRsaPss) {
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30,
0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x20},
- DigestAlgorithm::Sha256,
- DigestAlgorithm::Sha256,
- 32},
+ SignatureAlgorithm::kRsaPssSha256},
// SEQUENCE {
// # rsassa-pss
// OBJECT_IDENTIFIER { 1.2.840.113549.1.1.10 }
@@ -1218,9 +1102,7 @@ TEST(SignatureAlgorithmTest, ParseRsaPss) {
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30,
0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02,
0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x30},
- DigestAlgorithm::Sha384,
- DigestAlgorithm::Sha384,
- 48},
+ SignatureAlgorithm::kRsaPssSha384},
// SEQUENCE {
// # rsassa-pss
// OBJECT_IDENTIFIER { 1.2.840.113549.1.1.10 }
@@ -1254,9 +1136,7 @@ TEST(SignatureAlgorithmTest, ParseRsaPss) {
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30,
0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03,
0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x40},
- DigestAlgorithm::Sha512,
- DigestAlgorithm::Sha512,
- 64},
+ SignatureAlgorithm::kRsaPssSha512},
// The same inputs as above, but the NULLs in the digest algorithms are
// omitted.
@@ -1266,35 +1146,25 @@ TEST(SignatureAlgorithmTest, ParseRsaPss) {
0x18, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
0x08, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
0x04, 0x02, 0x01, 0xa2, 0x03, 0x02, 0x01, 0x20},
- DigestAlgorithm::Sha256,
- DigestAlgorithm::Sha256,
- 32},
+ SignatureAlgorithm::kRsaPssSha256},
{{0x30, 0x3d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
0x01, 0x0a, 0x30, 0x30, 0xa0, 0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60,
0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0xa1, 0x1a, 0x30,
0x18, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
0x08, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
0x04, 0x02, 0x02, 0xa2, 0x03, 0x02, 0x01, 0x30},
- DigestAlgorithm::Sha384,
- DigestAlgorithm::Sha384,
- 48},
+ SignatureAlgorithm::kRsaPssSha384},
{{0x30, 0x3d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
0x01, 0x0a, 0x30, 0x30, 0xa0, 0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60,
0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0xa1, 0x1a, 0x30,
0x18, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
0x08, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
0x04, 0x02, 0x03, 0xa2, 0x03, 0x02, 0x01, 0x40},
- DigestAlgorithm::Sha512,
- DigestAlgorithm::Sha512,
- 64}};
+ SignatureAlgorithm::kRsaPssSha512}};
for (const auto& t : kValidTests) {
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(t.data, &algorithm));
- ASSERT_EQ(SignatureAlgorithmId::RsaPss, algorithm->algorithm());
- EXPECT_EQ(t.expected_digest, algorithm->digest());
- EXPECT_EQ(t.expected_mgf1_hash, algorithm->ParamsForRsaPss()->mgf1_hash());
- EXPECT_EQ(t.expected_salt_length,
- algorithm->ParamsForRsaPss()->salt_length());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(t.data.data(), t.data.size()),
+ nullptr),
+ t.expected);
}
struct {
@@ -1484,8 +1354,8 @@ TEST(SignatureAlgorithmTest, ParseRsaPss) {
0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x41}},
};
for (const auto& t : kInvalidTests) {
- std::unique_ptr<SignatureAlgorithm> algorithm;
- EXPECT_FALSE(ParseDer(t.data, &algorithm));
+ EXPECT_FALSE(ParseSignatureAlgorithm(
+ der::Input(t.data.data(), t.data.size()), nullptr));
}
}
@@ -1503,11 +1373,8 @@ TEST(SignatureAlgorithmTest, ParseDerMd5WithRsaEncryptionNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Md5, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Md5);
}
// Parses a md4WithRSAEncryption which contains a NULL parameters field.
@@ -1524,11 +1391,8 @@ TEST(SignatureAlgorithmTest, ParseDerMd4WithRsaEncryptionNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Md4, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Md4);
}
// Parses a md2WithRSAEncryption which contains a NULL parameters field.
@@ -1545,11 +1409,8 @@ TEST(SignatureAlgorithmTest, ParseDerMd2WithRsaEncryptionNullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::RsaPkcs1, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Md2, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kRsaPkcs1Md2);
}
// Parses a dsaWithSha1 which contains no parameters field.
@@ -1564,11 +1425,8 @@ TEST(SignatureAlgorithmTest, ParseDerDsaWithSha1NoParams) {
0x2a, 0x86, 0x48, 0xce, 0x38, 0x04, 0x03,
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::Dsa, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha1, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kDsaSha1);
}
// Parses a dsaWithSha1 which contains a NULL parameters field.
@@ -1585,11 +1443,8 @@ TEST(SignatureAlgorithmTest, ParseDerDsaWithSha1NullParams) {
0x05, 0x00, // NULL (0 bytes)
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::Dsa, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha1, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kDsaSha1);
}
// Parses a dsaWithSha256 which contains no parameters field.
@@ -1604,11 +1459,8 @@ TEST(SignatureAlgorithmTest, ParseDerDsaWithSha256NoParams) {
0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x02
};
// clang-format on
- std::unique_ptr<SignatureAlgorithm> algorithm;
- ASSERT_TRUE(ParseDer(kData, &algorithm));
-
- EXPECT_EQ(SignatureAlgorithmId::Dsa, algorithm->algorithm());
- EXPECT_EQ(DigestAlgorithm::Sha256, algorithm->digest());
+ EXPECT_EQ(ParseSignatureAlgorithm(der::Input(kData), nullptr),
+ SignatureAlgorithm::kDsaSha256);
}
} // namespace
diff --git a/chromium/net/cert/internal/simple_path_builder_delegate.cc b/chromium/net/cert/pki/simple_path_builder_delegate.cc
index e4259ee6eb3..aa961254d3a 100644
--- a/chromium/net/cert/internal/simple_path_builder_delegate.cc
+++ b/chromium/net/cert/pki/simple_path_builder_delegate.cc
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/simple_path_builder_delegate.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/signature_algorithm.h"
-#include "net/cert/internal/verify_signed_data.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/signature_algorithm.h"
+#include "net/cert/pki/verify_signed_data.h"
#include "third_party/boringssl/src/include/openssl/bn.h"
#include "third_party/boringssl/src/include/openssl/bytestring.h"
#include "third_party/boringssl/src/include/openssl/digest.h"
@@ -53,25 +53,34 @@ void SimplePathBuilderDelegate::CheckPathAfterVerification(
}
bool SimplePathBuilderDelegate::IsSignatureAlgorithmAcceptable(
- const SignatureAlgorithm& algorithm,
+ SignatureAlgorithm algorithm,
CertErrors* errors) {
- // Restrict default permitted signature algorithms to:
- //
- // RSA PKCS#1 v1.5
- // RSASSA-PSS
- // ECDSA
- switch (algorithm.algorithm()) {
- case SignatureAlgorithmId::Dsa:
+ switch (algorithm) {
+ case SignatureAlgorithm::kRsaPkcs1Sha1:
+ case SignatureAlgorithm::kEcdsaSha1:
+ return digest_policy_ == DigestPolicy::kWeakAllowSha1;
+
+ case SignatureAlgorithm::kRsaPkcs1Sha256:
+ case SignatureAlgorithm::kRsaPkcs1Sha384:
+ case SignatureAlgorithm::kRsaPkcs1Sha512:
+ case SignatureAlgorithm::kEcdsaSha256:
+ case SignatureAlgorithm::kEcdsaSha384:
+ case SignatureAlgorithm::kEcdsaSha512:
+ case SignatureAlgorithm::kRsaPssSha256:
+ case SignatureAlgorithm::kRsaPssSha384:
+ case SignatureAlgorithm::kRsaPssSha512:
+ return true;
+
+ case SignatureAlgorithm::kRsaPkcs1Md2:
+ case SignatureAlgorithm::kRsaPkcs1Md4:
+ case SignatureAlgorithm::kRsaPkcs1Md5:
+ case SignatureAlgorithm::kDsaSha1:
+ case SignatureAlgorithm::kDsaSha256:
+ // TODO(https://crbug.com/1321688): We do not implement DSA, MD2, MD4, or
+ // MD5 anyway. Remove them from the parser altogether, so code does not
+ // need to handle them.
return false;
- case SignatureAlgorithmId::Ecdsa:
- case SignatureAlgorithmId::RsaPkcs1:
- return IsAcceptableDigest(algorithm.digest());
- case SignatureAlgorithmId::RsaPss:
- return IsAcceptableDigest(algorithm.digest()) &&
- IsAcceptableDigest(algorithm.ParamsForRsaPss()->mgf1_hash());
}
-
- return false;
}
bool SimplePathBuilderDelegate::IsPublicKeyAcceptable(EVP_PKEY* public_key,
@@ -82,7 +91,7 @@ bool SimplePathBuilderDelegate::IsPublicKeyAcceptable(EVP_PKEY* public_key,
RSA* rsa = EVP_PKEY_get0_RSA(public_key);
if (!rsa)
return false;
- unsigned int modulus_length_bits = BN_num_bits(rsa->n);
+ unsigned int modulus_length_bits = RSA_bits(rsa);
if (modulus_length_bits < min_rsa_modulus_length_bits_) {
errors->AddError(
@@ -114,30 +123,4 @@ bool SimplePathBuilderDelegate::IsPublicKeyAcceptable(EVP_PKEY* public_key,
return false;
}
-// Restricted signature digest algorithms to:
-//
-// SHA1 (if digest_policy_ == kWeakAllowSha1)
-// SHA256
-// SHA384
-// SHA512
-bool SimplePathBuilderDelegate::IsAcceptableDigest(
- DigestAlgorithm digest) const {
- switch (digest) {
- case DigestAlgorithm::Md2:
- case DigestAlgorithm::Md4:
- case DigestAlgorithm::Md5:
- return false;
-
- case DigestAlgorithm::Sha1:
- return digest_policy_ ==
- SimplePathBuilderDelegate::DigestPolicy::kWeakAllowSha1;
- case DigestAlgorithm::Sha256:
- case DigestAlgorithm::Sha384:
- case DigestAlgorithm::Sha512:
- return true;
- }
-
- return false;
-}
-
} // namespace net
diff --git a/chromium/net/cert/internal/simple_path_builder_delegate.h b/chromium/net/cert/pki/simple_path_builder_delegate.h
index bd6ccf733d9..db1b368c215 100644
--- a/chromium/net/cert/internal/simple_path_builder_delegate.h
+++ b/chromium/net/cert/pki/simple_path_builder_delegate.h
@@ -2,19 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_SIMPLE_PATH_BUILDER_DELEGATE_H_
-#define NET_CERT_INTERNAL_SIMPLE_PATH_BUILDER_DELEGATE_H_
+#ifndef NET_CERT_PKI_SIMPLE_PATH_BUILDER_DELEGATE_H_
+#define NET_CERT_PKI_SIMPLE_PATH_BUILDER_DELEGATE_H_
#include <stddef.h>
#include "net/base/net_export.h"
-#include "net/cert/internal/path_builder.h"
-#include "net/cert/internal/signature_algorithm.h"
+#include "net/cert/pki/path_builder.h"
+#include "net/cert/pki/signature_algorithm.h"
namespace net {
class CertErrors;
-class SignatureAlgorithm;
// SimplePathBuilderDelegate is an implementation of CertPathBuilderDelegate
// that uses some default policies:
@@ -46,9 +45,8 @@ class NET_EXPORT SimplePathBuilderDelegate : public CertPathBuilderDelegate {
// Accepts RSA PKCS#1, RSASSA-PSS or ECDA using any of the SHA* digests
// (including SHA1).
- bool IsSignatureAlgorithmAcceptable(
- const SignatureAlgorithm& signature_algorithm,
- CertErrors* errors) override;
+ bool IsSignatureAlgorithmAcceptable(SignatureAlgorithm signature_algorithm,
+ CertErrors* errors) override;
// Requires RSA keys be >= |min_rsa_modulus_length_bits_|.
bool IsPublicKeyAcceptable(EVP_PKEY* public_key, CertErrors* errors) override;
@@ -58,12 +56,10 @@ class NET_EXPORT SimplePathBuilderDelegate : public CertPathBuilderDelegate {
CertPathBuilderResultPath* path) override;
private:
- [[nodiscard]] bool IsAcceptableDigest(DigestAlgorithm digest) const;
-
const size_t min_rsa_modulus_length_bits_;
const DigestPolicy digest_policy_;
};
} // namespace net
-#endif // NET_CERT_INTERNAL_SIMPLE_PATH_BUILDER_DELEGATE_H_
+#endif // NET_CERT_PKI_SIMPLE_PATH_BUILDER_DELEGATE_H_
diff --git a/chromium/net/cert/internal/simple_path_builder_delegate_unittest.cc b/chromium/net/cert/pki/simple_path_builder_delegate_unittest.cc
index e89e0b4e312..e9613a1e61f 100644
--- a/chromium/net/cert/internal/simple_path_builder_delegate_unittest.cc
+++ b/chromium/net/cert/pki/simple_path_builder_delegate_unittest.cc
@@ -1,15 +1,15 @@
// 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.
-#include "net/cert/internal/simple_path_builder_delegate.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
#include <memory>
#include <set>
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/signature_algorithm.h"
-#include "net/cert/internal/test_helpers.h"
-#include "net/cert/internal/verify_signed_data.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/signature_algorithm.h"
+#include "net/cert/pki/test_helpers.h"
+#include "net/cert/pki/verify_signed_data.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "net/der/parser.h"
@@ -22,7 +22,7 @@ namespace {
// Reads the public key and algorithm from the test data at |file_name|.
void ReadTestCase(const char* file_name,
- std::unique_ptr<SignatureAlgorithm>* signature_algorithm,
+ SignatureAlgorithm* signature_algorithm,
bssl::UniquePtr<EVP_PKEY>* public_key) {
std::string path =
std::string("net/data/verify_signed_data_unittest/") + file_name;
@@ -31,15 +31,17 @@ void ReadTestCase(const char* file_name,
std::string algorithm_str;
const PemBlockMapping mappings[] = {
- {"PUBLIC KEY", &public_key_str}, {"ALGORITHM", &algorithm_str},
+ {"PUBLIC KEY", &public_key_str},
+ {"ALGORITHM", &algorithm_str},
};
ASSERT_TRUE(ReadTestDataFromPemFile(path, mappings));
CertErrors algorithm_errors;
- *signature_algorithm =
- SignatureAlgorithm::Create(der::Input(&algorithm_str), &algorithm_errors);
- ASSERT_TRUE(*signature_algorithm) << algorithm_errors.ToDebugString();
+ absl::optional<SignatureAlgorithm> sigalg_opt =
+ ParseSignatureAlgorithm(der::Input(&algorithm_str), &algorithm_errors);
+ ASSERT_TRUE(sigalg_opt) << algorithm_errors.ToDebugString();
+ *signature_algorithm = *sigalg_opt;
ASSERT_TRUE(ParsePublicKey(der::Input(&public_key_str), public_key));
}
@@ -59,10 +61,10 @@ INSTANTIATE_TEST_SUITE_P(All,
::testing::ValuesIn(kSuccess1024Filenames));
TEST_P(SimplePathBuilderDelegate1024SuccessTest, IsAcceptableSignatureAndKey) {
- std::unique_ptr<SignatureAlgorithm> signature_algorithm;
+ SignatureAlgorithm signature_algorithm;
bssl::UniquePtr<EVP_PKEY> public_key;
- ReadTestCase(GetParam(), &signature_algorithm, &public_key);
- ASSERT_TRUE(signature_algorithm);
+ ASSERT_NO_FATAL_FAILURE(
+ ReadTestCase(GetParam(), &signature_algorithm, &public_key));
ASSERT_TRUE(public_key);
CertErrors errors;
@@ -70,7 +72,7 @@ TEST_P(SimplePathBuilderDelegate1024SuccessTest, IsAcceptableSignatureAndKey) {
1024, SimplePathBuilderDelegate::DigestPolicy::kWeakAllowSha1);
EXPECT_TRUE(
- delegate.IsSignatureAlgorithmAcceptable(*signature_algorithm, &errors));
+ delegate.IsSignatureAlgorithmAcceptable(signature_algorithm, &errors));
EXPECT_TRUE(delegate.IsPublicKeyAcceptable(public_key.get(), &errors));
}
@@ -86,10 +88,10 @@ INSTANTIATE_TEST_SUITE_P(All,
::testing::ValuesIn(kFail2048Filenames));
TEST_P(SimplePathBuilderDelegate2048FailTest, RsaKeySmallerThan2048) {
- std::unique_ptr<SignatureAlgorithm> signature_algorithm;
+ SignatureAlgorithm signature_algorithm;
bssl::UniquePtr<EVP_PKEY> public_key;
- ReadTestCase(GetParam(), &signature_algorithm, &public_key);
- ASSERT_TRUE(signature_algorithm);
+ ASSERT_NO_FATAL_FAILURE(
+ ReadTestCase(GetParam(), &signature_algorithm, &public_key));
ASSERT_TRUE(public_key);
CertErrors errors;
@@ -97,7 +99,7 @@ TEST_P(SimplePathBuilderDelegate2048FailTest, RsaKeySmallerThan2048) {
2048, SimplePathBuilderDelegate::DigestPolicy::kWeakAllowSha1);
EXPECT_TRUE(
- delegate.IsSignatureAlgorithmAcceptable(*signature_algorithm, &errors));
+ delegate.IsSignatureAlgorithmAcceptable(signature_algorithm, &errors));
EXPECT_FALSE(delegate.IsPublicKeyAcceptable(public_key.get(), &errors));
}
diff --git a/chromium/net/cert/internal/test_helpers.cc b/chromium/net/cert/pki/test_helpers.cc
index 502d708ebee..914b6a3921a 100644
--- a/chromium/net/cert/internal/test_helpers.cc
+++ b/chromium/net/cert/pki/test_helpers.cc
@@ -2,22 +2,23 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/test_helpers.h"
#include "base/base64.h"
#include "base/base_paths.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/strings/string_piece.h"
-#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/cert_errors.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/cert_errors.h"
#include "net/der/parser.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
+#include <sstream>
+
namespace net {
namespace {
@@ -195,9 +196,6 @@ bool ReadVerifyCertChainTestFromFile(const std::string& file_path_ascii,
if (file_data.empty())
return false;
- std::vector<std::string> lines = base::SplitString(
- file_data, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
-
bool has_chain = false;
bool has_trust = false;
bool has_time = false;
@@ -206,7 +204,20 @@ bool ReadVerifyCertChainTestFromFile(const std::string& file_path_ascii,
base::StringPiece kExpectedErrors = "expected_errors:";
- for (const std::string& line : lines) {
+ std::istringstream stream(file_data);
+ for (std::string line; std::getline(stream, line, '\n');) {
+ size_t start = line.find_first_not_of(" \n\t\r\f\v");
+ if (start == std::string::npos) {
+ continue;
+ }
+ size_t end = line.find_last_not_of(" \n\t\r\f\v");
+ if (end == std::string::npos) {
+ continue;
+ }
+ line = line.substr(start, end + 1);
+ if (line.empty()) {
+ continue;
+ }
base::StringPiece line_piece(line);
std::string value;
diff --git a/chromium/net/cert/internal/test_helpers.h b/chromium/net/cert/pki/test_helpers.h
index 864d424f124..0fe301af316 100644
--- a/chromium/net/cert/internal/test_helpers.h
+++ b/chromium/net/cert/pki/test_helpers.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_TEST_HELPERS_H_
-#define NET_CERT_INTERNAL_TEST_HELPERS_H_
+#ifndef NET_CERT_PKI_TEST_HELPERS_H_
+#define NET_CERT_PKI_TEST_HELPERS_H_
#include <stddef.h>
@@ -12,9 +12,9 @@
#include <vector>
#include "base/memory/raw_ptr.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/trust_store.h"
-#include "net/cert/internal/verify_certificate_chain.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/trust_store.h"
+#include "net/cert/pki/verify_certificate_chain.h"
#include "net/der/input.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -74,7 +74,7 @@ struct PemBlockMapping {
template <size_t N>
::testing::AssertionResult ReadTestDataFromPemFile(
const std::string& file_path_ascii,
- const PemBlockMapping(&mappings)[N]) {
+ const PemBlockMapping (&mappings)[N]) {
return ReadTestDataFromPemFile(file_path_ascii, mappings, N);
}
@@ -152,4 +152,4 @@ void VerifyCertErrors(const std::string& expected_errors_str,
} // namespace net
-#endif // NET_CERT_INTERNAL_TEST_HELPERS_H_
+#endif // NET_CERT_PKI_TEST_HELPERS_H_
diff --git a/chromium/net/cert/internal/trust_store.cc b/chromium/net/cert/pki/trust_store.cc
index 5266521dd12..ee504bff53f 100644
--- a/chromium/net/cert/internal/trust_store.cc
+++ b/chromium/net/cert/pki/trust_store.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/trust_store.h"
+#include "net/cert/pki/trust_store.h"
#include "base/notreached.h"
diff --git a/chromium/net/cert/internal/trust_store.h b/chromium/net/cert/pki/trust_store.h
index e84fc082d5c..1c3a721ea29 100644
--- a/chromium/net/cert/internal/trust_store.h
+++ b/chromium/net/cert/pki/trust_store.h
@@ -2,16 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_TRUST_STORE_H_
-#define NET_CERT_INTERNAL_TRUST_STORE_H_
+#ifndef NET_CERT_PKI_TRUST_STORE_H_
+#define NET_CERT_PKI_TRUST_STORE_H_
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/supports_user_data.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/cert_issuer_source.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_issuer_source.h"
+#include "net/cert/pki/parsed_certificate.h"
namespace net {
@@ -87,4 +87,4 @@ class NET_EXPORT TrustStore : public CertIssuerSource {
} // namespace net
-#endif // NET_CERT_INTERNAL_TRUST_STORE_H_
+#endif // NET_CERT_PKI_TRUST_STORE_H_
diff --git a/chromium/net/cert/internal/trust_store_collection.cc b/chromium/net/cert/pki/trust_store_collection.cc
index abeed9aac61..03657c4d4a0 100644
--- a/chromium/net/cert/internal/trust_store_collection.cc
+++ b/chromium/net/cert/pki/trust_store_collection.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/trust_store_collection.h"
+#include "net/cert/pki/trust_store_collection.h"
namespace net {
diff --git a/chromium/net/cert/internal/trust_store_collection.h b/chromium/net/cert/pki/trust_store_collection.h
index f16f28e945e..4d168aa6cfb 100644
--- a/chromium/net/cert/internal/trust_store_collection.h
+++ b/chromium/net/cert/pki/trust_store_collection.h
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_TRUST_STORE_COLLECTION_H_
-#define NET_CERT_INTERNAL_TRUST_STORE_COLLECTION_H_
+#ifndef NET_CERT_PKI_TRUST_STORE_COLLECTION_H_
+#define NET_CERT_PKI_TRUST_STORE_COLLECTION_H_
#include "base/memory/ref_counted.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/trust_store.h"
+#include "net/cert/pki/trust_store.h"
namespace net {
@@ -41,4 +41,4 @@ class NET_EXPORT TrustStoreCollection : public TrustStore {
} // namespace net
-#endif // NET_CERT_INTERNAL_TRUST_STORE_COLLECTION_H_
+#endif // NET_CERT_PKI_TRUST_STORE_COLLECTION_H_
diff --git a/chromium/net/cert/internal/trust_store_collection_unittest.cc b/chromium/net/cert/pki/trust_store_collection_unittest.cc
index d7f7caa8561..8b17c5a8d8d 100644
--- a/chromium/net/cert/internal/trust_store_collection_unittest.cc
+++ b/chromium/net/cert/pki/trust_store_collection_unittest.cc
@@ -2,10 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/trust_store_collection.h"
+#include "net/cert/pki/trust_store_collection.h"
-#include "net/cert/internal/test_helpers.h"
-#include "net/cert/internal/trust_store_in_memory.h"
+#include "net/cert/pki/test_helpers.h"
+#include "net/cert/pki/trust_store_in_memory.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
diff --git a/chromium/net/cert/internal/trust_store_in_memory.cc b/chromium/net/cert/pki/trust_store_in_memory.cc
index 7b64ff1f0fe..7769b992429 100644
--- a/chromium/net/cert/internal/trust_store_in_memory.cc
+++ b/chromium/net/cert/pki/trust_store_in_memory.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/trust_store_in_memory.h"
+#include "net/cert/pki/trust_store_in_memory.h"
namespace net {
diff --git a/chromium/net/cert/internal/trust_store_in_memory.h b/chromium/net/cert/pki/trust_store_in_memory.h
index 296e87b7119..1d6a7c69257 100644
--- a/chromium/net/cert/internal/trust_store_in_memory.h
+++ b/chromium/net/cert/pki/trust_store_in_memory.h
@@ -2,15 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_TRUST_STORE_IN_MEMORY_H_
-#define NET_CERT_INTERNAL_TRUST_STORE_IN_MEMORY_H_
+#ifndef NET_CERT_PKI_TRUST_STORE_IN_MEMORY_H_
+#define NET_CERT_PKI_TRUST_STORE_IN_MEMORY_H_
#include <unordered_map>
#include "base/memory/ref_counted.h"
#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/trust_store.h"
+#include "net/cert/pki/trust_store.h"
namespace net {
@@ -88,4 +88,4 @@ class NET_EXPORT TrustStoreInMemory : public TrustStore {
} // namespace net
-#endif // NET_CERT_INTERNAL_TRUST_STORE_IN_MEMORY_H_
+#endif // NET_CERT_PKI_TRUST_STORE_IN_MEMORY_H_
diff --git a/chromium/net/cert/internal/verify_certificate_chain.cc b/chromium/net/cert/pki/verify_certificate_chain.cc
index 28ed816948b..5fea3878087 100644
--- a/chromium/net/cert/internal/verify_certificate_chain.cc
+++ b/chromium/net/cert/pki/verify_certificate_chain.cc
@@ -2,21 +2,21 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_certificate_chain.h"
+#include "net/cert/pki/verify_certificate_chain.h"
#include <algorithm>
#include "base/check.h"
#include "base/memory/raw_ptr.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/common_cert_errors.h"
-#include "net/cert/internal/extended_key_usage.h"
-#include "net/cert/internal/name_constraints.h"
-#include "net/cert/internal/parse_certificate.h"
-#include "net/cert/internal/signature_algorithm.h"
-#include "net/cert/internal/trust_store.h"
-#include "net/cert/internal/verify_signed_data.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/common_cert_errors.h"
+#include "net/cert/pki/extended_key_usage.h"
+#include "net/cert/pki/name_constraints.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/signature_algorithm.h"
+#include "net/cert/pki/trust_store.h"
+#include "net/cert/pki/verify_signed_data.h"
#include "net/der/input.h"
#include "net/der/parser.h"
@@ -145,7 +145,20 @@ bool VerifySignatureAlgorithmsMatch(const ParsedCertificate& cert,
// But make a compatibility concession if alternate encodings are used
// TODO(eroman): Turn this warning into an error.
// TODO(eroman): Add a unit-test that exercises this case.
- if (SignatureAlgorithm::IsEquivalent(alg1_tlv, alg2_tlv)) {
+ absl::optional<SignatureAlgorithm> alg1 =
+ ParseSignatureAlgorithm(alg1_tlv, errors);
+ if (!alg1) {
+ errors->AddError(cert_errors::kUnacceptableSignatureAlgorithm);
+ return false;
+ }
+ absl::optional<SignatureAlgorithm> alg2 =
+ ParseSignatureAlgorithm(alg2_tlv, errors);
+ if (!alg2) {
+ errors->AddError(cert_errors::kUnacceptableSignatureAlgorithm);
+ return false;
+ }
+
+ if (*alg1 == *alg2) {
errors->AddWarning(
cert_errors::kSignatureAlgorithmsDifferentEncoding,
CreateCertErrorParams2Der("Certificate.algorithm", alg1_tlv,
@@ -207,9 +220,7 @@ void VerifyExtendedKeyUsage(const ParsedCertificate& cert,
// equivalence between builtin verifier and platform verifier is less
// important.
if ((cert.has_basic_constraints() && cert.basic_constraints().is_ca) &&
- (cert.signature_algorithm().algorithm() ==
- SignatureAlgorithmId::RsaPkcs1) &&
- (cert.signature_algorithm().digest() == DigestAlgorithm::Sha1)) {
+ cert.signature_algorithm() == SignatureAlgorithm::kRsaPkcs1Sha1) {
return;
}
}
@@ -795,8 +806,10 @@ void PathVerifier::BasicCertificateProcessing(
// Check that the signature algorithms in Certificate vs TBSCertificate
// match. This isn't part of RFC 5280 section 6.1.3, but is mandated by
// sections 4.1.1.2 and 4.1.2.3.
- if (!VerifySignatureAlgorithmsMatch(cert, errors))
+ if (!VerifySignatureAlgorithmsMatch(cert, errors)) {
+ CHECK(errors->ContainsAnyErrorWithSeverity(CertError::SEVERITY_HIGH));
*shortcircuit_chain_validation = true;
+ }
// Check whether this signature algorithm is allowed.
if (!delegate_->IsSignatureAlgorithmAcceptable(cert.signature_algorithm(),
@@ -1274,7 +1287,7 @@ void PathVerifier::Run(
// Chains that don't start from a trusted root should short-circuit the
// rest of the verification, as accumulating more errors from untrusted
// certificates would not be meaningful.
- DCHECK(cert_errors->ContainsAnyErrorWithSeverity(
+ CHECK(cert_errors->ContainsAnyErrorWithSeverity(
CertError::SEVERITY_HIGH));
return;
}
@@ -1295,7 +1308,7 @@ void PathVerifier::Run(
// Signature errors should short-circuit the rest of the verification, as
// accumulating more errors from untrusted certificates would not be
// meaningful.
- DCHECK(
+ CHECK(
cert_errors->ContainsAnyErrorWithSeverity(CertError::SEVERITY_HIGH));
return;
}
diff --git a/chromium/net/cert/internal/verify_certificate_chain.h b/chromium/net/cert/pki/verify_certificate_chain.h
index 378a52d2667..3dd187e6ff2 100644
--- a/chromium/net/cert/internal/verify_certificate_chain.h
+++ b/chromium/net/cert/pki/verify_certificate_chain.h
@@ -2,16 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_H_
-#define NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_H_
+#ifndef NET_CERT_PKI_VERIFY_CERTIFICATE_CHAIN_H_
+#define NET_CERT_PKI_VERIFY_CERTIFICATE_CHAIN_H_
#include <set>
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/der/input.h"
#include "third_party/boringssl/src/include/openssl/evp.h"
@@ -54,7 +54,7 @@ class NET_EXPORT VerifyCertificateChainDelegate {
// can optionally add high-severity errors to |errors| with details on why it
// was rejected.
virtual bool IsSignatureAlgorithmAcceptable(
- const SignatureAlgorithm& signature_algorithm,
+ SignatureAlgorithm signature_algorithm,
CertErrors* errors) = 0;
// Implementations should return true if |public_key| is acceptable. This is
@@ -245,4 +245,4 @@ NET_EXPORT void VerifyCertificateChain(
} // namespace net
-#endif // NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_H_
+#endif // NET_CERT_PKI_VERIFY_CERTIFICATE_CHAIN_H_
diff --git a/chromium/net/cert/internal/verify_certificate_chain_pkits_unittest.cc b/chromium/net/cert/pki/verify_certificate_chain_pkits_unittest.cc
index f262f51eb1e..7a2a4aa32ec 100644
--- a/chromium/net/cert/internal/verify_certificate_chain_pkits_unittest.cc
+++ b/chromium/net/cert/pki/verify_certificate_chain_pkits_unittest.cc
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_certificate_chain.h"
+#include "net/cert/pki/verify_certificate_chain.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/simple_path_builder_delegate.h"
-#include "net/cert/internal/trust_store.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
+#include "net/cert/pki/trust_store.h"
#include "net/der/input.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
@@ -17,7 +17,7 @@
#define Section7InvalidkeyUsageNotCriticalcRLSignFalseTest5 \
DISABLED_Section7InvalidkeyUsageNotCriticalcRLSignFalseTest5
-#include "net/cert/internal/nist_pkits_unittest.h"
+#include "net/cert/pki/nist_pkits_unittest.h"
namespace net {
diff --git a/chromium/net/cert/internal/verify_certificate_chain_typed_unittest.h b/chromium/net/cert/pki/verify_certificate_chain_typed_unittest.h
index 31a7922a931..c563f17ffa0 100644
--- a/chromium/net/cert/internal/verify_certificate_chain_typed_unittest.h
+++ b/chromium/net/cert/pki/verify_certificate_chain_typed_unittest.h
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_TYPED_UNITTEST_H_
-#define NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_TYPED_UNITTEST_H_
+#ifndef NET_CERT_PKI_VERIFY_CERTIFICATE_CHAIN_TYPED_UNITTEST_H_
+#define NET_CERT_PKI_VERIFY_CERTIFICATE_CHAIN_TYPED_UNITTEST_H_
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/test_helpers.h"
-#include "net/cert/internal/trust_store.h"
-#include "net/cert/internal/verify_certificate_chain.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/test_helpers.h"
+#include "net/cert/pki/trust_store.h"
+#include "net/cert/pki/verify_certificate_chain.h"
#include "net/der/input.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -225,4 +225,4 @@ REGISTER_TYPED_TEST_SUITE_P(VerifyCertificateChainSingleRootTest,
} // namespace net
-#endif // NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_TYPED_UNITTEST_H_
+#endif // NET_CERT_PKI_VERIFY_CERTIFICATE_CHAIN_TYPED_UNITTEST_H_
diff --git a/chromium/net/cert/internal/verify_certificate_chain_unittest.cc b/chromium/net/cert/pki/verify_certificate_chain_unittest.cc
index e82f1d88dd2..a98532ebc0a 100644
--- a/chromium/net/cert/internal/verify_certificate_chain_unittest.cc
+++ b/chromium/net/cert/pki/verify_certificate_chain_unittest.cc
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_certificate_chain.h"
+#include "net/cert/pki/verify_certificate_chain.h"
-#include "net/cert/internal/simple_path_builder_delegate.h"
-#include "net/cert/internal/test_helpers.h"
-#include "net/cert/internal/trust_store.h"
-#include "net/cert/internal/verify_certificate_chain_typed_unittest.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
+#include "net/cert/pki/test_helpers.h"
+#include "net/cert/pki/trust_store.h"
+#include "net/cert/pki/verify_certificate_chain_typed_unittest.h"
namespace net {
diff --git a/chromium/net/cert/internal/verify_name_match.cc b/chromium/net/cert/pki/verify_name_match.cc
index a606d53ce14..b17ab7e2296 100644
--- a/chromium/net/cert/internal/verify_name_match.cc
+++ b/chromium/net/cert/pki/verify_name_match.cc
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_name_match.h"
+#include "net/cert/pki/verify_name_match.h"
#include "base/check.h"
#include "base/notreached.h"
#include "base/strings/string_util.h"
-#include "net/cert/internal/cert_error_params.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parse_name.h"
+#include "net/cert/pki/cert_error_params.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parse_name.h"
#include "net/der/input.h"
#include "net/der/parser.h"
#include "net/der/tag.h"
@@ -352,9 +352,10 @@ bool NormalizeName(const der::Input& name_rdn_sequence,
return false;
if (!CBB_add_asn1(&attribute_type_and_value_cbb, &value_cbb,
CBS_ASN1_UTF8STRING) ||
- !CBB_add_bytes(&value_cbb, reinterpret_cast<const uint8_t*>(
- normalized_value.data()),
- normalized_value.size()))
+ !CBB_add_bytes(
+ &value_cbb,
+ reinterpret_cast<const uint8_t*>(normalized_value.data()),
+ normalized_value.size()))
return false;
} else {
if (!CBB_add_asn1(&attribute_type_and_value_cbb, &value_cbb,
diff --git a/chromium/net/cert/internal/verify_name_match.h b/chromium/net/cert/pki/verify_name_match.h
index 919effd6a88..4e49d435df5 100644
--- a/chromium/net/cert/internal/verify_name_match.h
+++ b/chromium/net/cert/pki/verify_name_match.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_VERIFY_NAME_MATCH_H_
-#define NET_CERT_INTERNAL_VERIFY_NAME_MATCH_H_
+#ifndef NET_CERT_PKI_VERIFY_NAME_MATCH_H_
+#define NET_CERT_PKI_VERIFY_NAME_MATCH_H_
#include <string>
@@ -54,4 +54,4 @@ NET_EXPORT bool VerifyNameInSubtree(const der::Input& name_rdn_sequence,
} // namespace net
-#endif // NET_CERT_INTERNAL_VERIFY_NAME_MATCH_H_
+#endif // NET_CERT_PKI_VERIFY_NAME_MATCH_H_
diff --git a/chromium/net/cert/internal/verify_name_match_fuzzer.cc b/chromium/net/cert/pki/verify_name_match_fuzzer.cc
index 6522387c0fc..02ae46f62bd 100644
--- a/chromium/net/cert/internal/verify_name_match_fuzzer.cc
+++ b/chromium/net/cert/pki/verify_name_match_fuzzer.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_name_match.h"
+#include "net/cert/pki/verify_name_match.h"
#include <stddef.h>
#include <stdint.h>
diff --git a/chromium/net/cert/internal/verify_name_match_normalizename_fuzzer.cc b/chromium/net/cert/pki/verify_name_match_normalizename_fuzzer.cc
index c65d4ee521e..dc5c810c501 100644
--- a/chromium/net/cert/internal/verify_name_match_normalizename_fuzzer.cc
+++ b/chromium/net/cert/pki/verify_name_match_normalizename_fuzzer.cc
@@ -2,9 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_name_match.h"
+#include "net/cert/pki/verify_name_match.h"
-#include "net/cert/internal/cert_errors.h"
+#include "net/cert/pki/cert_errors.h"
#include "net/der/input.h"
// Entry point for LibFuzzer.
diff --git a/chromium/net/cert/internal/verify_name_match_unittest.cc b/chromium/net/cert/pki/verify_name_match_unittest.cc
index e7a61174323..59660c0c936 100644
--- a/chromium/net/cert/internal/verify_name_match_unittest.cc
+++ b/chromium/net/cert/pki/verify_name_match_unittest.cc
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_name_match.h"
+#include "net/cert/pki/verify_name_match.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/test_helpers.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
diff --git a/chromium/net/cert/internal/verify_name_match_verifynameinsubtree_fuzzer.cc b/chromium/net/cert/pki/verify_name_match_verifynameinsubtree_fuzzer.cc
index 4b981c9a676..996a6353342 100644
--- a/chromium/net/cert/internal/verify_name_match_verifynameinsubtree_fuzzer.cc
+++ b/chromium/net/cert/pki/verify_name_match_verifynameinsubtree_fuzzer.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_name_match.h"
+#include "net/cert/pki/verify_name_match.h"
#include <stddef.h>
#include <stdint.h>
diff --git a/chromium/net/cert/internal/verify_signed_data.cc b/chromium/net/cert/pki/verify_signed_data.cc
index 6fb34a18df6..5dc399129a2 100644
--- a/chromium/net/cert/internal/verify_signed_data.cc
+++ b/chromium/net/cert/pki/verify_signed_data.cc
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_signed_data.h"
+#include "net/cert/pki/verify_signed_data.h"
#include "base/numerics/safe_math.h"
#include "crypto/openssl_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/signature_algorithm.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/signature_algorithm.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "net/der/parser.h"
@@ -18,56 +18,6 @@
namespace net {
-namespace {
-
-// Converts a DigestAlgorithm to an equivalent EVP_MD*.
-[[nodiscard]] bool GetDigest(DigestAlgorithm digest, const EVP_MD** out) {
- *out = nullptr;
-
- switch (digest) {
- case DigestAlgorithm::Md2:
- case DigestAlgorithm::Md4:
- case DigestAlgorithm::Md5:
- // Unsupported.
- break;
- case DigestAlgorithm::Sha1:
- *out = EVP_sha1();
- break;
- case DigestAlgorithm::Sha256:
- *out = EVP_sha256();
- break;
- case DigestAlgorithm::Sha384:
- *out = EVP_sha384();
- break;
- case DigestAlgorithm::Sha512:
- *out = EVP_sha512();
- break;
- }
-
- return *out != nullptr;
-}
-
-// Sets the RSASSA-PSS parameters on |pctx|. Returns true on success.
-[[nodiscard]] bool ApplyRsaPssOptions(const RsaPssParameters* params,
- EVP_PKEY_CTX* pctx) {
- // BoringSSL takes a signed int for the salt length, and interprets
- // negative values in a special manner. Make sure not to silently underflow.
- base::CheckedNumeric<int> salt_length_bytes_int(params->salt_length());
- if (!salt_length_bytes_int.IsValid())
- return false;
-
- const EVP_MD* mgf1_hash;
- if (!GetDigest(params->mgf1_hash(), &mgf1_hash))
- return false;
-
- return EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) &&
- EVP_PKEY_CTX_set_rsa_mgf1_md(pctx, mgf1_hash) &&
- EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx,
- salt_length_bytes_int.ValueOrDie());
-}
-
-} // namespace
-
// Parses an RSA public key or EC public key from SPKI to an EVP_PKEY. Returns
// true on success.
//
@@ -148,23 +98,72 @@ bool ParsePublicKey(const der::Input& public_key_spki,
return true;
}
-bool VerifySignedData(const SignatureAlgorithm& algorithm,
+bool VerifySignedData(SignatureAlgorithm algorithm,
const der::Input& signed_data,
const der::BitString& signature_value,
EVP_PKEY* public_key) {
- // Check that the key type matches the signature algorithm.
- int expected_pkey_id = -1;
- switch (algorithm.algorithm()) {
- case SignatureAlgorithmId::Dsa:
- // DSA is not supported.
- return false;
- case SignatureAlgorithmId::RsaPkcs1:
- case SignatureAlgorithmId::RsaPss:
+ int expected_pkey_id = 1;
+ const EVP_MD* digest = nullptr;
+ bool is_rsa_pss = false;
+ switch (algorithm) {
+ case SignatureAlgorithm::kRsaPkcs1Sha1:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha1();
+ break;
+ case SignatureAlgorithm::kRsaPkcs1Sha256:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha256();
+ break;
+ case SignatureAlgorithm::kRsaPkcs1Sha384:
expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha384();
break;
- case SignatureAlgorithmId::Ecdsa:
+ case SignatureAlgorithm::kRsaPkcs1Sha512:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha512();
+ break;
+
+ case SignatureAlgorithm::kEcdsaSha1:
expected_pkey_id = EVP_PKEY_EC;
+ digest = EVP_sha1();
+ break;
+ case SignatureAlgorithm::kEcdsaSha256:
+ expected_pkey_id = EVP_PKEY_EC;
+ digest = EVP_sha256();
+ break;
+ case SignatureAlgorithm::kEcdsaSha384:
+ expected_pkey_id = EVP_PKEY_EC;
+ digest = EVP_sha384();
+ break;
+ case SignatureAlgorithm::kEcdsaSha512:
+ expected_pkey_id = EVP_PKEY_EC;
+ digest = EVP_sha512();
+ break;
+
+ case SignatureAlgorithm::kRsaPssSha256:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha256();
+ is_rsa_pss = true;
+ break;
+ case SignatureAlgorithm::kRsaPssSha384:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha384();
+ is_rsa_pss = true;
break;
+ case SignatureAlgorithm::kRsaPssSha512:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha512();
+ is_rsa_pss = true;
+ break;
+
+ case SignatureAlgorithm::kDsaSha1:
+ case SignatureAlgorithm::kDsaSha256:
+ case SignatureAlgorithm::kRsaPkcs1Md2:
+ case SignatureAlgorithm::kRsaPkcs1Md4:
+ case SignatureAlgorithm::kRsaPkcs1Md5:
+ // DSA, MD2, MD4, and MD5 are not supported. See
+ // https://crbug.com/1321688.
+ return false;
}
if (expected_pkey_id != EVP_PKEY_id(public_key))
@@ -181,17 +180,17 @@ bool VerifySignedData(const SignatureAlgorithm& algorithm,
bssl::ScopedEVP_MD_CTX ctx;
EVP_PKEY_CTX* pctx = nullptr; // Owned by |ctx|.
- const EVP_MD* digest;
- if (!GetDigest(algorithm.digest(), &digest))
- return false;
-
if (!EVP_DigestVerifyInit(ctx.get(), &pctx, digest, nullptr, public_key))
return false;
- // Set the RSASSA-PSS specific options.
- if (algorithm.algorithm() == SignatureAlgorithmId::RsaPss &&
- !ApplyRsaPssOptions(algorithm.ParamsForRsaPss(), pctx)) {
- return false;
+ if (is_rsa_pss) {
+ // All supported RSASSA-PSS algorithms match signing and MGF-1 digest. They
+ // also use the digest length as the salt length, which is specified with -1
+ // in OpenSSL's API.
+ if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) ||
+ !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1)) {
+ return false;
+ }
}
if (!EVP_DigestVerifyUpdate(ctx.get(), signed_data.UnsafeData(),
@@ -204,7 +203,7 @@ bool VerifySignedData(const SignatureAlgorithm& algorithm,
signature_value_bytes.Length());
}
-bool VerifySignedData(const SignatureAlgorithm& algorithm,
+bool VerifySignedData(SignatureAlgorithm algorithm,
const der::Input& signed_data,
const der::BitString& signature_value,
const der::Input& public_key_spki) {
diff --git a/chromium/net/cert/internal/verify_signed_data.h b/chromium/net/cert/pki/verify_signed_data.h
index 3f97c95e858..b904992dc1c 100644
--- a/chromium/net/cert/internal/verify_signed_data.h
+++ b/chromium/net/cert/pki/verify_signed_data.h
@@ -2,11 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef NET_CERT_INTERNAL_VERIFY_SIGNED_DATA_H_
-#define NET_CERT_INTERNAL_VERIFY_SIGNED_DATA_H_
+#ifndef NET_CERT_PKI_VERIFY_SIGNED_DATA_H_
+#define NET_CERT_PKI_VERIFY_SIGNED_DATA_H_
#include "crypto/openssl_util.h"
#include "net/base/net_export.h"
+#include "net/cert/pki/signature_algorithm.h"
#include "third_party/boringssl/src/include/openssl/evp.h"
namespace net {
@@ -16,8 +17,6 @@ class BitString;
class Input;
} // namespace der
-class SignatureAlgorithm;
-
// Verifies that |signature_value| is a valid signature of |signed_data| using
// the algorithm |algorithm| and the public key |public_key|.
//
@@ -28,7 +27,7 @@ class SignatureAlgorithm;
//
// Returns true if verification was successful.
[[nodiscard]] NET_EXPORT bool VerifySignedData(
- const SignatureAlgorithm& algorithm,
+ SignatureAlgorithm algorithm,
const der::Input& signed_data,
const der::BitString& signature_value,
EVP_PKEY* public_key);
@@ -36,7 +35,7 @@ class SignatureAlgorithm;
// Same as above overload, only the public key is inputted as an SPKI and will
// be parsed internally.
[[nodiscard]] NET_EXPORT bool VerifySignedData(
- const SignatureAlgorithm& algorithm,
+ SignatureAlgorithm algorithm,
const der::Input& signed_data,
const der::BitString& signature_value,
const der::Input& public_key_spki);
@@ -47,4 +46,4 @@ class SignatureAlgorithm;
} // namespace net
-#endif // NET_CERT_INTERNAL_VERIFY_SIGNED_DATA_H_
+#endif // NET_CERT_PKI_VERIFY_SIGNED_DATA_H_
diff --git a/chromium/net/cert/internal/verify_signed_data_unittest.cc b/chromium/net/cert/pki/verify_signed_data_unittest.cc
index 62bf85f161b..8a0a26e9cb0 100644
--- a/chromium/net/cert/internal/verify_signed_data_unittest.cc
+++ b/chromium/net/cert/pki/verify_signed_data_unittest.cc
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/internal/verify_signed_data.h"
+#include "net/cert/pki/verify_signed_data.h"
#include <memory>
#include <set>
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/signature_algorithm.h"
-#include "net/cert/internal/test_helpers.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/signature_algorithm.h"
+#include "net/cert/pki/test_helpers.h"
#include "net/der/input.h"
#include "net/der/parse_values.h"
#include "net/der/parser.h"
@@ -52,8 +52,8 @@ void RunTestCase(VerifyResult expected_result, const char* file_name) {
ASSERT_TRUE(ReadTestDataFromPemFile(path, mappings));
CertErrors algorithm_errors;
- std::unique_ptr<SignatureAlgorithm> signature_algorithm =
- SignatureAlgorithm::Create(der::Input(&algorithm), &algorithm_errors);
+ absl::optional<SignatureAlgorithm> signature_algorithm =
+ ParseSignatureAlgorithm(der::Input(&algorithm), &algorithm_errors);
ASSERT_TRUE(signature_algorithm) << algorithm_errors.ToDebugString();
der::Parser signature_value_parser((der::Input(&signature_value)));
diff --git a/chromium/net/cert/root_cert_list_generated.h b/chromium/net/cert/root_cert_list_generated.h
index 354469a69ca..8f5f7591d1c 100644
--- a/chromium/net/cert/root_cert_list_generated.h
+++ b/chromium/net/cert/root_cert_list_generated.h
@@ -1004,6 +1004,13 @@ const struct RootCertData {
187,
false},
{{
+ 0x42, 0x43, 0x16, 0x27, 0xEA, 0x76, 0xCC, 0x78, 0x69, 0x7F, 0x91,
+ 0x5E, 0x34, 0x55, 0xB1, 0xB2, 0xEC, 0x82, 0xFF, 0x2F, 0x63, 0x80,
+ 0xEE, 0x64, 0x23, 0xEF, 0x3C, 0x08, 0x40, 0xB7, 0xE6, 0x31,
+ },
+ 521,
+ false},
+ {{
0x42, 0xA7, 0x09, 0x84, 0xFF, 0xD3, 0x99, 0xC4, 0xEA, 0xF0, 0xE7,
0x02, 0xA4, 0x4B, 0xEF, 0x2A, 0xD8, 0xA7, 0x9B, 0x8B, 0xF4, 0x64,
0x8F, 0x6B, 0xB2, 0x10, 0xE1, 0x23, 0xFD, 0x07, 0x57, 0x93,
diff --git a/chromium/net/cert/sct_status_flags.cc b/chromium/net/cert/sct_status_flags.cc
index a8f070a7298..92042fa6429 100644
--- a/chromium/net/cert/sct_status_flags.cc
+++ b/chromium/net/cert/sct_status_flags.cc
@@ -4,9 +4,7 @@
#include "net/cert/sct_status_flags.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
bool IsValidSCTStatus(uint32_t status) {
switch (status) {
@@ -22,6 +20,4 @@ bool IsValidSCTStatus(uint32_t status) {
return false;
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/sct_status_flags.h b/chromium/net/cert/sct_status_flags.h
index 86daa0c5925..0957cdcbf6c 100644
--- a/chromium/net/cert/sct_status_flags.h
+++ b/chromium/net/cert/sct_status_flags.h
@@ -9,9 +9,7 @@
#include "net/base/net_export.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
// The possible verification statuses for a SignedCertificateTimestamp.
// Note: The numeric values are used within histograms and should not change
@@ -46,8 +44,6 @@ enum SCTVerifyStatus : uint32_t {
// is all current values in the enum except SCT_STATUS_NONE.
NET_EXPORT bool IsValidSCTStatus(uint32_t status);
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_SCT_STATUS_FLAGS_H_
diff --git a/chromium/net/cert/signed_certificate_timestamp.cc b/chromium/net/cert/signed_certificate_timestamp.cc
index aa3308985d9..da6e2c967b9 100644
--- a/chromium/net/cert/signed_certificate_timestamp.cc
+++ b/chromium/net/cert/signed_certificate_timestamp.cc
@@ -6,9 +6,7 @@
#include "base/pickle.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
bool SignedCertificateTimestamp::LessThan::operator()(
const scoped_refptr<SignedCertificateTimestamp>& lhs,
@@ -51,8 +49,7 @@ SignedCertificateTimestamp::CreateFromPickle(base::PickleIterator* iter) {
int64_t timestamp;
int hash_algorithm;
int sig_algorithm;
- scoped_refptr<SignedCertificateTimestamp> sct(
- new SignedCertificateTimestamp());
+ auto sct = base::MakeRefCounted<SignedCertificateTimestamp>();
int origin;
// string values are set directly
if (!(iter->ReadInt(&version) &&
@@ -97,6 +94,4 @@ bool DigitallySigned::SignatureParametersMatch(
return (hash_algorithm == other_hash_algorithm) &&
(signature_algorithm == other_signature_algorithm);
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/signed_certificate_timestamp.h b/chromium/net/cert/signed_certificate_timestamp.h
index 50d5a02a8bb..a877ee724ec 100644
--- a/chromium/net/cert/signed_certificate_timestamp.h
+++ b/chromium/net/cert/signed_certificate_timestamp.h
@@ -18,10 +18,8 @@ class Pickle;
class PickleIterator;
}
-namespace net {
-
// Structures related to Certificate Transparency (RFC6962).
-namespace ct {
+namespace net::ct {
// Contains the data necessary to reconstruct the signed_entry of a
// SignedCertificateTimestamp, from RFC 6962, Section 3.2.
@@ -148,8 +146,6 @@ struct NET_EXPORT SignedCertificateTimestamp
using SCTList = std::vector<scoped_refptr<ct::SignedCertificateTimestamp>>;
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_SIGNED_CERTIFICATE_TIMESTAMP_H_
diff --git a/chromium/net/cert/signed_certificate_timestamp_unittest.cc b/chromium/net/cert/signed_certificate_timestamp_unittest.cc
index 90b4ab740e3..0b9a7d96b88 100644
--- a/chromium/net/cert/signed_certificate_timestamp_unittest.cc
+++ b/chromium/net/cert/signed_certificate_timestamp_unittest.cc
@@ -10,9 +10,7 @@
#include "net/test/ct_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
namespace {
@@ -60,6 +58,4 @@ TEST_F(SignedCertificateTimestampTest, SCTsWithDifferentOriginsNotEqual) {
} // namespace
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/signed_tree_head.cc b/chromium/net/cert/signed_tree_head.cc
index a2dc9efbfb6..9640b135a5d 100644
--- a/chromium/net/cert/signed_tree_head.cc
+++ b/chromium/net/cert/signed_tree_head.cc
@@ -10,8 +10,7 @@
#include "base/strings/string_number_conversions.h"
-namespace net {
-namespace ct {
+namespace net::ct {
SignedTreeHead::SignedTreeHead() = default;
@@ -59,5 +58,4 @@ bool operator!=(const SignedTreeHead& lhs, const SignedTreeHead& rhs) {
return !(lhs == rhs);
}
-} // namespace ct
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/cert/signed_tree_head.h b/chromium/net/cert/signed_tree_head.h
index 2b97f744506..13248888314 100644
--- a/chromium/net/cert/signed_tree_head.h
+++ b/chromium/net/cert/signed_tree_head.h
@@ -16,9 +16,7 @@
#include "net/base/net_export.h"
#include "net/cert/signed_certificate_timestamp.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
static const uint8_t kSthRootHashLength = 32;
@@ -57,8 +55,6 @@ NET_EXPORT bool operator==(const SignedTreeHead& lhs,
NET_EXPORT bool operator!=(const SignedTreeHead& lhs,
const SignedTreeHead& rhs);
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_CERT_SIGNED_TREE_HEAD_H_
diff --git a/chromium/net/cert/test_root_certs.cc b/chromium/net/cert/test_root_certs.cc
index 10adc528919..fd158a06352 100644
--- a/chromium/net/cert/test_root_certs.cc
+++ b/chromium/net/cert/test_root_certs.cc
@@ -7,11 +7,7 @@
#include <string>
#include <utility>
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/threading/thread_restrictions.h"
-#include "net/cert/internal/cert_errors.h"
+#include "net/cert/pki/cert_errors.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
@@ -25,17 +21,6 @@ bool g_has_instance = false;
base::LazyInstance<TestRootCerts>::Leaky
g_test_root_certs = LAZY_INSTANCE_INITIALIZER;
-CertificateList LoadCertificates(const base::FilePath& filename) {
- std::string raw_cert;
- if (!base::ReadFileToString(filename, &raw_cert)) {
- LOG(ERROR) << "Can't load certificate " << filename.value();
- return CertificateList();
- }
-
- return X509Certificate::CreateCertificateListFromBytes(
- base::as_bytes(base::make_span(raw_cert)), X509Certificate::FORMAT_AUTO);
-}
-
} // namespace
// static
@@ -60,15 +45,6 @@ bool TestRootCerts::Add(X509Certificate* certificate) {
return AddImpl(certificate);
}
-bool TestRootCerts::AddFromFile(const base::FilePath& file) {
- base::ThreadRestrictions::ScopedAllowIO allow_io_for_loading_test_certs;
- CertificateList root_certs = LoadCertificates(file);
- if (root_certs.empty() || root_certs.size() > 1)
- return false;
-
- return Add(root_certs.front().get());
-}
-
void TestRootCerts::Clear() {
ClearImpl();
test_trust_store_.Clear();
@@ -93,6 +69,17 @@ ScopedTestRoot::ScopedTestRoot(CertificateList certs) {
Reset(std::move(certs));
}
+ScopedTestRoot::ScopedTestRoot(ScopedTestRoot&& other) {
+ *this = std::move(other);
+}
+
+ScopedTestRoot& ScopedTestRoot::operator=(ScopedTestRoot&& other) {
+ CertificateList tmp_certs;
+ tmp_certs.swap(other.certs_);
+ Reset(std::move(tmp_certs));
+ return *this;
+}
+
ScopedTestRoot::~ScopedTestRoot() {
Reset({});
}
diff --git a/chromium/net/cert/test_root_certs.h b/chromium/net/cert/test_root_certs.h
index f2251dd1e78..c299b3c6d3b 100644
--- a/chromium/net/cert/test_root_certs.h
+++ b/chromium/net/cert/test_root_certs.h
@@ -6,10 +6,9 @@
#define NET_CERT_TEST_ROOT_CERTS_H_
#include "base/lazy_instance.h"
-#include "base/memory/ref_counted.h"
#include "build/build_config.h"
#include "net/base/net_export.h"
-#include "net/cert/internal/trust_store_in_memory.h"
+#include "net/cert/pki/trust_store_in_memory.h"
#if BUILDFLAG(IS_WIN)
#include <windows.h>
@@ -21,10 +20,6 @@
#include "base/mac/scoped_cftyperef.h"
#endif
-namespace base {
-class FilePath;
-}
-
namespace net {
class X509Certificate;
@@ -33,6 +28,9 @@ typedef std::vector<scoped_refptr<X509Certificate>> CertificateList;
// TestRootCerts is a helper class for unit tests that is used to
// artificially mark a certificate as trusted, independent of the local
// machine configuration.
+//
+// Test roots can be added using the ScopedTestRoot class below. See the
+// class documentation for usage and limitations.
class NET_EXPORT TestRootCerts {
public:
// Obtains the Singleton instance to the trusted certificates.
@@ -44,16 +42,6 @@ class NET_EXPORT TestRootCerts {
// Returns true if an instance exists, without forcing an initialization.
static bool HasInstance();
- // Marks |certificate| as trusted in the effective trust store
- // used by CertVerifier::Verify(). Returns false if the
- // certificate could not be marked trusted.
- bool Add(X509Certificate* certificate);
-
- // Reads a single certificate from |file| and marks it as trusted. Returns
- // false if an error is encountered, such as being unable to read |file|
- // or more than one certificate existing in |file|.
- bool AddFromFile(const base::FilePath& file);
-
// Clears the trusted status of any certificates that were previously
// marked trusted via Add().
void Clear();
@@ -81,10 +69,16 @@ class NET_EXPORT TestRootCerts {
private:
friend struct base::LazyInstanceTraitsBase<TestRootCerts>;
+ friend class ScopedTestRoot;
TestRootCerts();
~TestRootCerts();
+ // Marks |certificate| as trusted in the effective trust store
+ // used by CertVerifier::Verify(). Returns false if the
+ // certificate could not be marked trusted.
+ bool Add(X509Certificate* certificate);
+
// Performs platform-dependent operations.
void Init();
bool AddImpl(X509Certificate* certificate);
@@ -100,21 +94,27 @@ class NET_EXPORT TestRootCerts {
};
// Scoped helper for unittests to handle safely managing trusted roots.
-class NET_EXPORT_PRIVATE ScopedTestRoot {
+//
+// Limitations:
+// Multiple instances of ScopedTestRoot may be created at once, which will
+// trust the union of the certs provided. However, when one of the
+// ScopedTestRoot instances removes its trust, either by going out of scope, or
+// by Reset() being called, *all* test root certs will be untrusted. (This
+// limitation could be removed if a reason arises.)
+class NET_EXPORT ScopedTestRoot {
public:
ScopedTestRoot();
- // Creates a ScopedTestRoot that sets |cert| as the single root in the
- // TestRootCerts store (if there were existing roots they are
- // cleared).
+ // Creates a ScopedTestRoot that adds |cert| to the TestRootCerts store.
explicit ScopedTestRoot(X509Certificate* cert);
- // Creates a ScopedTestRoot that sets |certs| as the only roots in the
- // TestRootCerts store (if there were existing roots they are
- // cleared).
+ // Creates a ScopedTestRoot that adds |certs| to the TestRootCerts store.
explicit ScopedTestRoot(CertificateList certs);
ScopedTestRoot(const ScopedTestRoot&) = delete;
ScopedTestRoot& operator=(const ScopedTestRoot&) = delete;
+ ScopedTestRoot(ScopedTestRoot&& other);
+ ScopedTestRoot& operator=(ScopedTestRoot&& other);
+
~ScopedTestRoot();
// Assigns |certs| to be the new test root certs. If |certs| is empty, undoes
@@ -124,6 +124,9 @@ class NET_EXPORT_PRIVATE ScopedTestRoot {
// cleared.
void Reset(CertificateList certs);
+ // Returns true if this ScopedTestRoot has no certs assigned.
+ bool IsEmpty() const { return certs_.empty(); }
+
private:
CertificateList certs_;
};
diff --git a/chromium/net/cert/test_root_certs_android.cc b/chromium/net/cert/test_root_certs_android.cc
index 308c081d82a..ce1bca56018 100644
--- a/chromium/net/cert/test_root_certs_android.cc
+++ b/chromium/net/cert/test_root_certs_android.cc
@@ -25,7 +25,7 @@ void TestRootCerts::ClearImpl() {
android::ClearTestRootCertificates();
}
-TestRootCerts::~TestRootCerts() {}
+TestRootCerts::~TestRootCerts() = default;
void TestRootCerts::Init() {}
diff --git a/chromium/net/cert/test_root_certs_builtin.cc b/chromium/net/cert/test_root_certs_builtin.cc
index aae6e0ceafd..c26eb4a290e 100644
--- a/chromium/net/cert/test_root_certs_builtin.cc
+++ b/chromium/net/cert/test_root_certs_builtin.cc
@@ -12,7 +12,7 @@ bool TestRootCerts::AddImpl(X509Certificate* certificate) {
void TestRootCerts::ClearImpl() {}
-TestRootCerts::~TestRootCerts() {}
+TestRootCerts::~TestRootCerts() = default;
void TestRootCerts::Init() {}
diff --git a/chromium/net/cert/test_root_certs_mac.cc b/chromium/net/cert/test_root_certs_mac.cc
index f57ad926459..d5023728e2c 100644
--- a/chromium/net/cert/test_root_certs_mac.cc
+++ b/chromium/net/cert/test_root_certs_mac.cc
@@ -7,7 +7,7 @@
#include <Security/Security.h>
#include "build/build_config.h"
-#include "net/cert/internal/cert_errors.h"
+#include "net/cert/pki/cert_errors.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "net/cert/x509_util_apple.h"
@@ -44,7 +44,7 @@ OSStatus TestRootCerts::FixupSecTrustRef(SecTrustRef trust_ref) const {
return SecTrustSetAnchorCertificatesOnly(trust_ref, false);
}
-TestRootCerts::~TestRootCerts() {}
+TestRootCerts::~TestRootCerts() = default;
void TestRootCerts::Init() {
temporary_roots_.reset(
diff --git a/chromium/net/cert/test_root_certs_unittest.cc b/chromium/net/cert/test_root_certs_unittest.cc
index 36b14065675..f430c590623 100644
--- a/chromium/net/cert/test_root_certs_unittest.cc
+++ b/chromium/net/cert/test_root_certs_unittest.cc
@@ -59,26 +59,10 @@ TEST(TestRootCertsTest, AddFromPointer) {
ASSERT_NE(static_cast<TestRootCerts*>(nullptr), test_roots);
EXPECT_TRUE(test_roots->IsEmpty());
- EXPECT_TRUE(test_roots->Add(root_cert.get()));
- EXPECT_FALSE(test_roots->IsEmpty());
-
- test_roots->Clear();
- EXPECT_TRUE(test_roots->IsEmpty());
-}
-
-// Test basic functionality when adding directly from a file, which should
-// behave the same as when adding from an existing certificate.
-TEST(TestRootCertsTest, AddFromFile) {
- TestRootCerts* test_roots = TestRootCerts::GetInstance();
- ASSERT_NE(static_cast<TestRootCerts*>(nullptr), test_roots);
- EXPECT_TRUE(test_roots->IsEmpty());
-
- base::FilePath cert_path =
- GetTestCertsDirectory().AppendASCII(kRootCertificateFile);
- EXPECT_TRUE(test_roots->AddFromFile(cert_path));
- EXPECT_FALSE(test_roots->IsEmpty());
-
- test_roots->Clear();
+ {
+ ScopedTestRoot scoped_root(root_cert.get());
+ EXPECT_FALSE(test_roots->IsEmpty());
+ }
EXPECT_TRUE(test_roots->IsEmpty());
}
@@ -109,8 +93,10 @@ TEST(TestRootCertsTest, OverrideTrust) {
EXPECT_NE(0u, bad_verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID);
// Add the root certificate and mark it as trusted.
- EXPECT_TRUE(test_roots->AddFromFile(
- GetTestCertsDirectory().AppendASCII(kRootCertificateFile)));
+ scoped_refptr<X509Certificate> root_cert =
+ ImportCertFromFile(GetTestCertsDirectory(), kRootCertificateFile);
+ ASSERT_TRUE(root_cert);
+ ScopedTestRoot scoped_root(root_cert.get());
EXPECT_FALSE(test_roots->IsEmpty());
// Test that the certificate verification now succeeds, because the
@@ -141,6 +127,91 @@ TEST(TestRootCertsTest, OverrideTrust) {
EXPECT_EQ(bad_verify_result.cert_status, restored_verify_result.cert_status);
}
+TEST(TestRootCertsTest, Moveable) {
+ TestRootCerts* test_roots = TestRootCerts::GetInstance();
+ ASSERT_NE(static_cast<TestRootCerts*>(nullptr), test_roots);
+ EXPECT_TRUE(test_roots->IsEmpty());
+
+ scoped_refptr<X509Certificate> test_cert =
+ ImportCertFromFile(GetTestCertsDirectory(), kGoodCertificateFile);
+ ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
+
+ int flags = 0;
+ CertVerifyResult bad_verify_result;
+ int bad_status;
+ scoped_refptr<CertVerifyProc> verify_proc(CreateCertVerifyProc());
+ {
+ // Empty ScopedTestRoot at outer scope has no effect.
+ ScopedTestRoot scoped_root_outer;
+ EXPECT_TRUE(test_roots->IsEmpty());
+
+ // Test that the good certificate fails verification, because the root
+ // certificate should not yet be trusted.
+ bad_status = verify_proc->Verify(
+ test_cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
+ /*sct_list=*/std::string(), flags, net::CRLSet::BuiltinCRLSet().get(),
+ CertificateList(), &bad_verify_result, NetLogWithSource());
+ EXPECT_NE(OK, bad_status);
+ EXPECT_NE(0u,
+ bad_verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID);
+
+ {
+ // Add the root certificate and mark it as trusted.
+ scoped_refptr<X509Certificate> root_cert =
+ ImportCertFromFile(GetTestCertsDirectory(), kRootCertificateFile);
+ ASSERT_TRUE(root_cert);
+ ScopedTestRoot scoped_root_inner(root_cert.get());
+ EXPECT_FALSE(test_roots->IsEmpty());
+
+ // Test that the certificate verification now succeeds, because the
+ // TestRootCerts is successfully imbuing trust.
+ CertVerifyResult good_verify_result;
+ int good_status = verify_proc->Verify(
+ test_cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
+ /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
+ CertificateList(), &good_verify_result, NetLogWithSource());
+ EXPECT_THAT(good_status, IsOk());
+ EXPECT_EQ(0u, good_verify_result.cert_status);
+
+ EXPECT_FALSE(scoped_root_inner.IsEmpty());
+ EXPECT_TRUE(scoped_root_outer.IsEmpty());
+ // Move from inner scoped root to outer
+ scoped_root_outer = std::move(scoped_root_inner);
+ EXPECT_FALSE(test_roots->IsEmpty());
+ EXPECT_FALSE(scoped_root_outer.IsEmpty());
+ }
+ // After inner scoper was freed, test root is still trusted since ownership
+ // was moved to the outer scoper.
+ EXPECT_FALSE(test_roots->IsEmpty());
+ EXPECT_FALSE(scoped_root_outer.IsEmpty());
+
+ // Test that the certificate verification still succeeds, because the
+ // TestRootCerts is successfully imbuing trust.
+ CertVerifyResult good_verify_result;
+ int good_status = verify_proc->Verify(
+ test_cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
+ /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
+ CertificateList(), &good_verify_result, NetLogWithSource());
+ EXPECT_THAT(good_status, IsOk());
+ EXPECT_EQ(0u, good_verify_result.cert_status);
+ }
+ EXPECT_TRUE(test_roots->IsEmpty());
+
+ // Ensure that when the TestRootCerts is cleared, the trust settings
+ // revert to their original state, and don't linger. If trust status
+ // lingers, it will likely break other tests in net_unittests.
+ CertVerifyResult restored_verify_result;
+ int restored_status = verify_proc->Verify(
+ test_cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
+ /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
+ CertificateList(), &restored_verify_result, NetLogWithSource());
+ EXPECT_NE(OK, restored_status);
+ EXPECT_NE(0u,
+ restored_verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID);
+ EXPECT_EQ(bad_status, restored_status);
+ EXPECT_EQ(bad_verify_result.cert_status, restored_verify_result.cert_status);
+}
+
// TODO(rsleevi): Add tests for revocation checking via CRLs, ensuring that
// TestRootCerts properly injects itself into the validation process. See
// http://crbug.com/63958
diff --git a/chromium/net/cert/trial_comparison_cert_verifier.cc b/chromium/net/cert/trial_comparison_cert_verifier.cc
index a1d93edec27..963677c5ed0 100644
--- a/chromium/net/cert/trial_comparison_cert_verifier.cc
+++ b/chromium/net/cert/trial_comparison_cert_verifier.cc
@@ -30,9 +30,9 @@ namespace net {
namespace {
base::Value JobResultParams(bool trial_success) {
- base::Value results(base::Value::Type::DICTIONARY);
- results.GetDict().Set("trial_success", trial_success);
- return results;
+ base::Value::Dict results;
+ results.Set("trial_success", trial_success);
+ return base::Value(std::move(results));
}
} // namespace
diff --git a/chromium/net/cert/trial_comparison_cert_verifier_util.cc b/chromium/net/cert/trial_comparison_cert_verifier_util.cc
index d08d51bb566..b51d4306286 100644
--- a/chromium/net/cert/trial_comparison_cert_verifier_util.cc
+++ b/chromium/net/cert/trial_comparison_cert_verifier_util.cc
@@ -10,8 +10,8 @@
#include "net/base/net_errors.h"
#include "net/cert/cert_status_flags.h"
#include "net/cert/ev_root_ca_metadata.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/parsed_certificate.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/parsed_certificate.h"
#include "net/cert/x509_util.h"
namespace net {
diff --git a/chromium/net/cert/x509_cert_types.cc b/chromium/net/cert/x509_cert_types.cc
index daca1dd686e..202181d7e00 100644
--- a/chromium/net/cert/x509_cert_types.cc
+++ b/chromium/net/cert/x509_cert_types.cc
@@ -4,7 +4,7 @@
#include "net/cert/x509_cert_types.h"
-#include "net/cert/internal/parse_name.h"
+#include "net/cert/pki/parse_name.h"
#include "net/der/input.h"
namespace net {
diff --git a/chromium/net/cert/x509_certificate.cc b/chromium/net/cert/x509_certificate.cc
index 17d93695034..1dac369039a 100644
--- a/chromium/net/cert/x509_certificate.cc
+++ b/chromium/net/cert/x509_certificate.cc
@@ -27,13 +27,13 @@
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
#include "net/base/url_util.h"
#include "net/cert/asn1_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/name_constraints.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/signature_algorithm.h"
-#include "net/cert/internal/verify_name_match.h"
-#include "net/cert/internal/verify_signed_data.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/name_constraints.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/signature_algorithm.h"
+#include "net/cert/pki/verify_name_match.h"
+#include "net/cert/pki/verify_signed_data.h"
#include "net/cert/x509_util.h"
#include "net/der/encode_values.h"
#include "net/der/parser.h"
@@ -118,7 +118,7 @@ scoped_refptr<X509Certificate> X509Certificate::CreateFromBuffer(
bssl::UniquePtr<CRYPTO_BUFFER> cert_buffer,
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates) {
DCHECK(cert_buffer);
- scoped_refptr<X509Certificate> cert(
+ auto cert = base::WrapRefCounted(
new X509Certificate(std::move(cert_buffer), std::move(intermediates)));
if (!cert->cert_buffer())
return nullptr; // Initialize() failed.
@@ -131,7 +131,7 @@ scoped_refptr<X509Certificate> X509Certificate::CreateFromBufferUnsafeOptions(
std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates,
UnsafeCreateOptions options) {
DCHECK(cert_buffer);
- scoped_refptr<X509Certificate> cert(new X509Certificate(
+ auto cert = base::WrapRefCounted(new X509Certificate(
std::move(cert_buffer), std::move(intermediates), options));
if (!cert->cert_buffer())
return nullptr; // Initialize() failed.
@@ -205,17 +205,17 @@ scoped_refptr<X509Certificate> X509Certificate::CreateFromPickle(
scoped_refptr<X509Certificate> X509Certificate::CreateFromPickleUnsafeOptions(
base::PickleIterator* pickle_iter,
UnsafeCreateOptions options) {
- int chain_length = 0;
+ size_t chain_length = 0;
if (!pickle_iter->ReadLength(&chain_length))
return nullptr;
std::vector<base::StringPiece> cert_chain;
const char* data = nullptr;
- int data_length = 0;
- for (int i = 0; i < chain_length; ++i) {
+ size_t data_length = 0;
+ for (size_t i = 0; i < chain_length; ++i) {
if (!pickle_iter->ReadData(&data, &data_length))
return nullptr;
- cert_chain.push_back(base::StringPiece(data, data_length));
+ cert_chain.emplace_back(data, data_length);
}
return CreateFromDERCertChainUnsafeOptions(cert_chain, options);
}
@@ -588,8 +588,8 @@ bool X509Certificate::GetPEMEncodedChain(
if (!GetPEMEncoded(cert_buffer(), &pem_data))
return false;
encoded_chain.push_back(pem_data);
- for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) {
- if (!GetPEMEncoded(intermediate_ca_certs_[i].get(), &pem_data))
+ for (const auto& intermediate_ca_cert : intermediate_ca_certs_) {
+ if (!GetPEMEncoded(intermediate_ca_cert.get(), &pem_data))
return false;
encoded_chain.push_back(pem_data);
}
@@ -621,7 +621,7 @@ void X509Certificate::GetPublicKeyInfo(const CRYPTO_BUFFER* cert_buffer,
if (!pkey)
return;
- switch (pkey->type) {
+ switch (EVP_PKEY_id(pkey.get())) {
case EVP_PKEY_RSA:
*type = kPublicKeyTypeRSA;
break;
@@ -743,8 +743,9 @@ bool X509Certificate::IsSelfSigned(const CRYPTO_BUFFER* cert_buffer) {
if (normalized_subject != normalized_issuer)
return false;
- std::unique_ptr<SignatureAlgorithm> signature_algorithm =
- SignatureAlgorithm::Create(signature_algorithm_tlv, nullptr /* errors */);
+ absl::optional<SignatureAlgorithm> signature_algorithm =
+ ParseSignatureAlgorithm(signature_algorithm_tlv,
+ /*errors=*/nullptr);
if (!signature_algorithm)
return false;
diff --git a/chromium/net/cert/x509_certificate_unittest.cc b/chromium/net/cert/x509_certificate_unittest.cc
index 50d55a81739..a32ba859784 100644
--- a/chromium/net/cert/x509_certificate_unittest.cc
+++ b/chromium/net/cert/x509_certificate_unittest.cc
@@ -19,8 +19,8 @@
#include "crypto/rsa_private_key.h"
#include "net/base/net_errors.h"
#include "net/cert/asn1_util.h"
-#include "net/cert/internal/parse_certificate.h"
#include "net/cert/pem.h"
+#include "net/cert/pki/parse_certificate.h"
#include "net/cert/x509_util.h"
#include "net/test/cert_test_util.h"
#include "net/test/test_certificate_data.h"
@@ -1092,7 +1092,7 @@ const struct CertificateFormatTestData {
class X509CertificateParseTest
: public testing::TestWithParam<CertificateFormatTestData> {
public:
- virtual ~X509CertificateParseTest() = default;
+ ~X509CertificateParseTest() override = default;
void SetUp() override { test_data_ = GetParam(); }
void TearDown() override {}
@@ -1324,13 +1324,13 @@ TEST_P(X509CertificateNameVerifyTest, VerifyHostname) {
ip_addressses.push_back(std::move(bytes));
ASSERT_EQ(16U, ip_addressses.back().size()) << i;
} else { // Decimal groups
- std::vector<std::string> decimals_ascii = base::SplitString(
+ std::vector<std::string> decimals_ascii_list = base::SplitString(
addr_ascii, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
- EXPECT_EQ(4U, decimals_ascii.size()) << i;
+ EXPECT_EQ(4U, decimals_ascii_list.size()) << i;
std::string addr_bytes;
- for (size_t j = 0; j < decimals_ascii.size(); ++j) {
+ for (const auto& decimals_ascii : decimals_ascii_list) {
int decimal_value;
- EXPECT_TRUE(base::StringToInt(decimals_ascii[j], &decimal_value));
+ EXPECT_TRUE(base::StringToInt(decimals_ascii, &decimal_value));
EXPECT_GE(decimal_value, 0);
EXPECT_LE(decimal_value, 255);
addr_bytes.push_back(static_cast<char>(decimal_value));
diff --git a/chromium/net/cert/x509_util.cc b/chromium/net/cert/x509_util.cc
index a1a9ddc6cc2..310742ec97a 100644
--- a/chromium/net/cert/x509_util.cc
+++ b/chromium/net/cert/x509_util.cc
@@ -21,11 +21,11 @@
#include "crypto/sha2.h"
#include "net/base/hash_value.h"
#include "net/cert/asn1_util.h"
-#include "net/cert/internal/cert_errors.h"
-#include "net/cert/internal/name_constraints.h"
-#include "net/cert/internal/parse_certificate.h"
-#include "net/cert/internal/parse_name.h"
-#include "net/cert/internal/signature_algorithm.h"
+#include "net/cert/pki/cert_errors.h"
+#include "net/cert/pki/name_constraints.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/parse_name.h"
+#include "net/cert/pki/signature_algorithm.h"
#include "net/cert/x509_certificate.h"
#include "net/der/encode_values.h"
#include "net/der/input.h"
@@ -38,9 +38,7 @@
#include "third_party/boringssl/src/include/openssl/pool.h"
#include "third_party/boringssl/src/include/openssl/stack.h"
-namespace net {
-
-namespace x509_util {
+namespace net::x509_util {
namespace {
@@ -196,25 +194,32 @@ bool GetTLSServerEndPointChannelBinding(const X509Certificate& certificate,
der::BitString signature_value;
if (!ParseCertificate(der::Input(der_encoded_certificate),
&tbs_certificate_tlv, &signature_algorithm_tlv,
- &signature_value, nullptr))
+ &signature_value, nullptr)) {
return false;
-
- std::unique_ptr<SignatureAlgorithm> signature_algorithm =
- SignatureAlgorithm::Create(signature_algorithm_tlv, nullptr);
- if (!signature_algorithm)
+ }
+ absl::optional<SignatureAlgorithm> signature_algorithm =
+ ParseSignatureAlgorithm(signature_algorithm_tlv, nullptr);
+ if (!signature_algorithm) {
return false;
+ }
+ absl::optional<net::DigestAlgorithm> binding_digest =
+ GetTlsServerEndpointDigestAlgorithm(*signature_algorithm);
+ if (!binding_digest) {
+ return false;
+ }
const EVP_MD* digest_evp_md = nullptr;
- switch (signature_algorithm->digest()) {
+ switch (binding_digest.value()) {
case net::DigestAlgorithm::Md2:
case net::DigestAlgorithm::Md4:
- // Shouldn't be reachable.
- digest_evp_md = nullptr;
- break;
-
- // Per RFC 5929 section 4.1, MD5 and SHA1 map to SHA256.
case net::DigestAlgorithm::Md5:
case net::DigestAlgorithm::Sha1:
+ // Legacy digests are not supported, and
+ // `GetTlsServerEndpointDigestAlgorithm` internally maps MD5 and SHA-1 to
+ // SHA-256.
+ NOTREACHED();
+ break;
+
case net::DigestAlgorithm::Sha256:
digest_evp_md = EVP_sha256();
break;
@@ -273,7 +278,7 @@ Extension::Extension(base::span<const uint8_t> in_oid,
bool in_critical,
base::span<const uint8_t> in_contents)
: oid(in_oid), critical(in_critical), contents(in_contents) {}
-Extension::~Extension() {}
+Extension::~Extension() = default;
Extension::Extension(const Extension&) = default;
bool CreateSelfSignedCert(EVP_PKEY* key,
@@ -511,7 +516,7 @@ bool SignatureVerifierInitWithCertificate(
base::make_span(tbs.spki_tlv.UnsafeData(), tbs.spki_tlv.Length()));
}
-bool HasSHA1Signature(const CRYPTO_BUFFER* cert_buffer) {
+bool HasRsaPkcs1Sha1Signature(const CRYPTO_BUFFER* cert_buffer) {
der::Input tbs_certificate_tlv;
der::Input signature_algorithm_tlv;
der::BitString signature_value;
@@ -522,14 +527,12 @@ bool HasSHA1Signature(const CRYPTO_BUFFER* cert_buffer) {
return false;
}
- std::unique_ptr<SignatureAlgorithm> signature_algorithm =
- SignatureAlgorithm::Create(signature_algorithm_tlv, /*errors=*/nullptr);
- if (!signature_algorithm)
- return false;
+ absl::optional<SignatureAlgorithm> signature_algorithm =
+ ParseSignatureAlgorithm(signature_algorithm_tlv,
+ /*errors=*/nullptr);
- return signature_algorithm->digest() == net::DigestAlgorithm::Sha1;
+ return signature_algorithm &&
+ *signature_algorithm == SignatureAlgorithm::kRsaPkcs1Sha1;
}
-} // namespace x509_util
-
-} // namespace net
+} // namespace net::x509_util
diff --git a/chromium/net/cert/x509_util.h b/chromium/net/cert/x509_util.h
index 2344aa8fa90..f86c7cd9a99 100644
--- a/chromium/net/cert/x509_util.h
+++ b/chromium/net/cert/x509_util.h
@@ -169,8 +169,10 @@ NET_EXPORT bool SignatureVerifierInitWithCertificate(
base::span<const uint8_t> signature,
const CRYPTO_BUFFER* certificate);
-// Returns true if the signature on the certificate uses SHA-1.
-NET_EXPORT_PRIVATE bool HasSHA1Signature(const CRYPTO_BUFFER* cert_buffer);
+// Returns true if the signature on the certificate is RSASSA-PKCS1-v1_5 with
+// SHA-1.
+NET_EXPORT_PRIVATE bool HasRsaPkcs1Sha1Signature(
+ const CRYPTO_BUFFER* cert_buffer);
} // namespace x509_util
diff --git a/chromium/net/cert/x509_util_apple.cc b/chromium/net/cert/x509_util_apple.cc
index 4d8c6b27ad5..979e84f2d82 100644
--- a/chromium/net/cert/x509_util_apple.cc
+++ b/chromium/net/cert/x509_util_apple.cc
@@ -137,5 +137,21 @@ SHA256HashValue CalculateFingerprint256(SecCertificateRef cert) {
return sha256;
}
+base::ScopedCFTypeRef<CFArrayRef> CertificateChainFromSecTrust(
+ SecTrustRef trust) {
+ if (__builtin_available(macOS 12.0, iOS 15.0, *)) {
+ return base::ScopedCFTypeRef<CFArrayRef>(
+ SecTrustCopyCertificateChain(trust));
+ }
+
+ base::ScopedCFTypeRef<CFMutableArrayRef> chain(
+ CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
+ const CFIndex chain_length = SecTrustGetCertificateCount(trust);
+ for (CFIndex i = 0; i < chain_length; ++i) {
+ CFArrayAppendValue(chain, SecTrustGetCertificateAtIndex(trust, i));
+ }
+ return base::ScopedCFTypeRef<CFArrayRef>(chain.release());
+}
+
} // namespace x509_util
} // namespace net
diff --git a/chromium/net/cert/x509_util_apple.h b/chromium/net/cert/x509_util_apple.h
index 080565905ec..1348a2ef5f3 100644
--- a/chromium/net/cert/x509_util_apple.h
+++ b/chromium/net/cert/x509_util_apple.h
@@ -69,6 +69,10 @@ CreateX509CertificateFromSecCertificate(
// (all zero) fingerprint on failure.
NET_EXPORT SHA256HashValue CalculateFingerprint256(SecCertificateRef cert);
+// Returns a new CFArrayRef containing the certificate chain built in |trust|.
+base::ScopedCFTypeRef<CFArrayRef> CertificateChainFromSecTrust(
+ SecTrustRef trust);
+
} // namespace x509_util
} // namespace net
diff --git a/chromium/net/cert/x509_util_mac.cc b/chromium/net/cert/x509_util_mac.cc
index d72bc82da29..bb675db0715 100644
--- a/chromium/net/cert/x509_util_mac.cc
+++ b/chromium/net/cert/x509_util_mac.cc
@@ -16,10 +16,7 @@ namespace net {
namespace x509_util {
CSSMFieldValue::CSSMFieldValue()
- : cl_handle_(CSSM_INVALID_HANDLE),
- oid_(NULL),
- field_(NULL) {
-}
+ : cl_handle_(CSSM_INVALID_HANDLE), oid_(nullptr), field_(nullptr) {}
CSSMFieldValue::CSSMFieldValue(CSSM_CL_HANDLE cl_handle,
const CSSM_OID* oid,
CSSM_DATA_PTR field)
@@ -29,7 +26,7 @@ CSSMFieldValue::CSSMFieldValue(CSSM_CL_HANDLE cl_handle,
}
CSSMFieldValue::~CSSMFieldValue() {
- Reset(CSSM_INVALID_HANDLE, NULL, NULL);
+ Reset(CSSM_INVALID_HANDLE, nullptr, nullptr);
}
void CSSMFieldValue::Reset(CSSM_CL_HANDLE cl_handle,
@@ -76,7 +73,7 @@ OSStatus CSSMCachedCertificate::GetField(const CSSM_OID* field_oid,
DCHECK(cached_cert_handle_);
CSSM_OID_PTR oid = const_cast<CSSM_OID_PTR>(field_oid);
- CSSM_DATA_PTR field_ptr = NULL;
+ CSSM_DATA_PTR field_ptr = nullptr;
CSSM_HANDLE results_handle = CSSM_INVALID_HANDLE;
uint32_t field_value_count = 0;
CSSM_RETURN status = CSSM_CL_CertGetFirstCachedFieldValue(
diff --git a/chromium/net/cert/x509_util_mac.h b/chromium/net/cert/x509_util_mac.h
index d2eb69eff6d..d95f21af267 100644
--- a/chromium/net/cert/x509_util_mac.h
+++ b/chromium/net/cert/x509_util_mac.h
@@ -7,8 +7,7 @@
#include <Security/Security.h>
-namespace net {
-namespace x509_util {
+namespace net::x509_util {
// CSSM functions are deprecated as of OSX 10.7, but have no replacement.
// https://bugs.chromium.org/p/chromium/issues/detail?id=590914#c1
@@ -40,7 +39,7 @@ class CSSMFieldValue {
// enough to actually contain the requested type.
template <typename T> const T* GetAs() const {
if (!field_ || field_->Length < sizeof(T))
- return NULL;
+ return nullptr;
return reinterpret_cast<const T*>(field_->Data);
}
@@ -100,7 +99,6 @@ inline bool CSSMOIDEqual(const CSSM_OID* oid1, const CSSM_OID* oid2) {
#pragma clang diagnostic pop // "-Wdeprecated-declarations"
-} // namespace x509_util
-} // namespace net
+} // namespace net::x509_util
#endif // NET_CERT_X509_UTIL_MAC_H_
diff --git a/chromium/net/cert/x509_util_nss.cc b/chromium/net/cert/x509_util_nss.cc
index 98827784394..d52282832e5 100644
--- a/chromium/net/cert/x509_util_nss.cc
+++ b/chromium/net/cert/x509_util_nss.cc
@@ -22,9 +22,7 @@
#include "crypto/scoped_nss_types.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
-namespace net {
-
-namespace x509_util {
+namespace net::x509_util {
namespace {
@@ -85,8 +83,8 @@ std::string GetDefaultNickname(CERTCertificate* nss_cert, CertType type) {
// Find the private key for this certificate and see if it has a
// nickname. If there is a private key, and it has a nickname, then
// return that nickname.
- SECKEYPrivateKey* private_key =
- PK11_FindPrivateKeyFromCert(nss_cert->slot, nss_cert, NULL /*wincx*/);
+ SECKEYPrivateKey* private_key = PK11_FindPrivateKeyFromCert(
+ nss_cert->slot, nss_cert, nullptr /*wincx*/);
if (private_key) {
char* private_key_nickname = PK11_GetPrivateKeyNickname(private_key);
if (private_key_nickname) {
@@ -155,7 +153,7 @@ ScopedCERTCertificate CreateCERTCertificateFromBytes(const uint8_t* data,
crypto::EnsureNSSInit();
if (!NSS_IsInitialized())
- return NULL;
+ return nullptr;
SECItem der_cert;
der_cert.data = const_cast<uint8_t*>(data);
@@ -309,7 +307,7 @@ bool GetPEMEncoded(CERTCertificate* cert, std::string* pem_encoded) {
void GetRFC822SubjectAltNames(CERTCertificate* cert_handle,
std::vector<std::string>* names) {
- crypto::ScopedSECItem alt_name(SECITEM_AllocItem(NULL, NULL, 0));
+ crypto::ScopedSECItem alt_name(SECITEM_AllocItem(nullptr, nullptr, 0));
DCHECK(alt_name.get());
names->clear();
@@ -339,7 +337,7 @@ void GetRFC822SubjectAltNames(CERTCertificate* cert_handle,
void GetUPNSubjectAltNames(CERTCertificate* cert_handle,
std::vector<std::string>* names) {
- crypto::ScopedSECItem alt_name(SECITEM_AllocItem(NULL, NULL, 0));
+ crypto::ScopedSECItem alt_name(SECITEM_AllocItem(nullptr, nullptr, 0));
DCHECK(alt_name.get());
names->clear();
@@ -389,7 +387,7 @@ std::string GetCERTNameDisplayName(CERTName* name) {
CERTRDN** rdns = name->rdns;
for (size_t rdn = 0; rdns[rdn]; ++rdn) {
CERTAVA** avas = rdns[rdn]->avas;
- for (size_t pair = 0; avas[pair] != 0; ++pair) {
+ for (size_t pair = 0; avas[pair] != nullptr; ++pair) {
SECOidTag tag = CERT_GetAVATag(avas[pair]);
if (tag == SEC_OID_AVA_COMMON_NAME) {
// If CN is found, return immediately.
@@ -438,6 +436,4 @@ SHA256HashValue CalculateFingerprint256(CERTCertificate* cert) {
return sha256;
}
-} // namespace x509_util
-
-} // namespace net
+} // namespace net::x509_util
diff --git a/chromium/net/cert/x509_util_nss.h b/chromium/net/cert/x509_util_nss.h
index 8c54996dae0..c9cb113a88d 100644
--- a/chromium/net/cert/x509_util_nss.h
+++ b/chromium/net/cert/x509_util_nss.h
@@ -20,9 +20,7 @@ typedef struct CERTNameStr CERTName;
typedef struct PK11SlotInfoStr PK11SlotInfo;
typedef struct SECItemStr SECItem;
-namespace net {
-
-namespace x509_util {
+namespace net::x509_util {
// Returns true if two certificate handles refer to identical certificates.
NET_EXPORT bool IsSameCertificate(CERTCertificate* a, CERTCertificate* b);
@@ -159,8 +157,6 @@ NET_EXPORT bool GetValidityTimes(CERTCertificate* cert,
// (all zero) fingerprint on failure.
NET_EXPORT SHA256HashValue CalculateFingerprint256(CERTCertificate* cert);
-} // namespace x509_util
-
-} // namespace net
+} // namespace net::x509_util
#endif // NET_CERT_X509_UTIL_NSS_H_
diff --git a/chromium/net/cert/x509_util_unittest.cc b/chromium/net/cert/x509_util_unittest.cc
index d89ff5069b6..00d5d281297 100644
--- a/chromium/net/cert/x509_util_unittest.cc
+++ b/chromium/net/cert/x509_util_unittest.cc
@@ -19,9 +19,7 @@
#include "third_party/boringssl/src/include/openssl/evp.h"
#include "third_party/boringssl/src/include/openssl/rsa.h"
-namespace net {
-
-namespace x509_util {
+namespace net::x509_util {
// This test creates a self-signed cert and a private key and then verifies the
// content of the certificate.
@@ -790,20 +788,18 @@ TEST(X509UtilTest, SignatureVerifierInitWithCertificate) {
}
}
-TEST(X509UtilTest, HasSHA1Signature) {
+TEST(X509UtilTest, HasRsaPkcs1Sha1Signature) {
base::FilePath certs_dir = GetTestCertsDirectory();
scoped_refptr<X509Certificate> sha1_leaf =
ImportCertFromFile(certs_dir, "sha1_leaf.pem");
ASSERT_TRUE(sha1_leaf);
- EXPECT_TRUE(HasSHA1Signature(sha1_leaf->cert_buffer()));
+ EXPECT_TRUE(HasRsaPkcs1Sha1Signature(sha1_leaf->cert_buffer()));
scoped_refptr<X509Certificate> ok_cert =
ImportCertFromFile(certs_dir, "ok_cert.pem");
ASSERT_TRUE(ok_cert);
- EXPECT_FALSE(HasSHA1Signature(ok_cert->cert_buffer()));
+ EXPECT_FALSE(HasRsaPkcs1Sha1Signature(ok_cert->cert_buffer()));
}
-} // namespace x509_util
-
-} // namespace net
+} // namespace net::x509_util
diff --git a/chromium/net/cert/x509_util_win.h b/chromium/net/cert/x509_util_win.h
index 7d667797594..02f52cdaee1 100644
--- a/chromium/net/cert/x509_util_win.h
+++ b/chromium/net/cert/x509_util_win.h
@@ -17,9 +17,7 @@
#include "net/base/net_export.h"
#include "net/cert/x509_certificate.h"
-namespace net {
-
-namespace x509_util {
+namespace net::x509_util {
// Creates an X509Certificate representing |os_cert| with intermediates
// |os_chain|.
@@ -64,8 +62,6 @@ NET_EXPORT SHA256HashValue CalculateFingerprint256(PCCERT_CONTEXT cert);
// Returns true if the certificate is self-signed.
NET_EXPORT bool IsSelfSigned(PCCERT_CONTEXT cert_handle);
-} // namespace x509_util
-
-} // namespace net
+} // namespace net::x509_util
#endif // NET_CERT_X509_UTIL_WIN_H_
diff --git a/chromium/net/cert_net/cert_net_fetcher_url_request.cc b/chromium/net/cert_net/cert_net_fetcher_url_request.cc
index e570758f94a..4835ea8aa63 100644
--- a/chromium/net/cert_net/cert_net_fetcher_url_request.cc
+++ b/chromium/net/cert_net/cert_net_fetcher_url_request.cc
@@ -691,8 +691,9 @@ void CertNetFetcherURLRequest::AsyncCertNetFetcherURLRequest::Fetch(
return;
}
- job = new Job(std::move(request_params), this);
- jobs_[job] = base::WrapUnique(job);
+ auto new_job = std::make_unique<Job>(std::move(request_params), this);
+ job = new_job.get();
+ jobs_[job] = std::move(new_job);
// Attach the request before calling StartURLRequest; this ensures that the
// request will get signalled if StartURLRequest completes the job
// synchronously.
@@ -803,7 +804,7 @@ std::unique_ptr<CertNetFetcher::Request>
CertNetFetcherURLRequest::FetchCaIssuers(const GURL& url,
int timeout_milliseconds,
int max_response_bytes) {
- std::unique_ptr<RequestParams> request_params(new RequestParams);
+ auto request_params = std::make_unique<RequestParams>();
request_params->url = url;
request_params->http_method = HTTP_METHOD_GET;
@@ -818,7 +819,7 @@ std::unique_ptr<CertNetFetcher::Request> CertNetFetcherURLRequest::FetchCrl(
const GURL& url,
int timeout_milliseconds,
int max_response_bytes) {
- std::unique_ptr<RequestParams> request_params(new RequestParams);
+ auto request_params = std::make_unique<RequestParams>();
request_params->url = url;
request_params->http_method = HTTP_METHOD_GET;
@@ -833,7 +834,7 @@ std::unique_ptr<CertNetFetcher::Request> CertNetFetcherURLRequest::FetchOcsp(
const GURL& url,
int timeout_milliseconds,
int max_response_bytes) {
- std::unique_ptr<RequestParams> request_params(new RequestParams);
+ auto request_params = std::make_unique<RequestParams>();
request_params->url = url;
request_params->http_method = HTTP_METHOD_GET;
@@ -867,7 +868,7 @@ void CertNetFetcherURLRequest::DoFetchOnNetworkSequence(
std::unique_ptr<CertNetFetcherURLRequest::Request>
CertNetFetcherURLRequest::DoFetch(
std::unique_ptr<RequestParams> request_params) {
- scoped_refptr<RequestCore> request_core = new RequestCore(task_runner_);
+ auto request_core = base::MakeRefCounted<RequestCore>(task_runner_);
// If the fetcher has already been shutdown, DoFetchOnNetworkSequence will
// signal the request with an error. However, if the fetcher shuts down
diff --git a/chromium/net/cookies/canonical_cookie.cc b/chromium/net/cookies/canonical_cookie.cc
index f31ac89afbe..06fbffaee10 100644
--- a/chromium/net/cookies/canonical_cookie.cc
+++ b/chromium/net/cookies/canonical_cookie.cc
@@ -76,17 +76,20 @@ using base::Time;
namespace net {
static constexpr int kMinutesInTwelveHours = 12 * 60;
+static constexpr int kMinutesInTwentyFourHours = 24 * 60;
namespace {
// Determine the cookie domain to use for setting the specified cookie.
bool GetCookieDomain(const GURL& url,
const ParsedCookie& pc,
+ CookieInclusionStatus& status,
std::string* result) {
std::string domain_string;
if (pc.HasDomain())
domain_string = pc.Domain();
- return cookie_util::GetCookieDomainWithString(url, domain_string, result);
+ return cookie_util::GetCookieDomainWithString(url, domain_string, status,
+ result);
}
// Compares cookies using name, domain and path, so that "equivalent" cookies
@@ -304,32 +307,6 @@ void ApplySameSiteCookieWarningToStatus(
status->MaybeClearSameSiteWarning();
}
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class SameSiteNonePartyContextType {
- // SameSite=None was required in order for the cookie to be included.
- kSameSiteNoneRequired = 0,
- // The cookie would have been included if it were SameParty (using only the
- // top frame and resource URL).
- kSamePartyTopResource = 1,
- // The cookie would have been included if it were SameParty (using the
- // resource URL and all frame ancestors).
- kSamePartyAncestors = 2,
- // The cookie would have been included if it were SameSite=Lax.
- kSameSiteLax = 3,
- // The cookie would have been included if it were SameSite=Strict.
- kSameSiteStrict = 4,
- kMaxValue = kSameSiteStrict
-};
-
-void RecordSameSiteNoneReadContextMetric(SameSiteNonePartyContextType type) {
- UMA_HISTOGRAM_ENUMERATION("Cookie.SameSiteNone.PartyContext.Read", type);
-}
-
-void RecordSameSiteNoneWriteContextMetric(SameSiteNonePartyContextType type) {
- UMA_HISTOGRAM_ENUMERATION("Cookie.SameSiteNone.PartyContext.Write", type);
-}
-
// Converts CookieSameSite to CookieSameSiteForMetrics by adding 1 to it.
CookieSameSiteForMetrics CookieSameSiteToCookieSameSiteForMetrics(
CookieSameSite enum_in) {
@@ -359,17 +336,6 @@ bool HasValidHostPrefixAttributes(const GURL& url,
return domain.empty() || (url.HostIsIPAddress() && url.host() == domain);
}
-// Test that a cookie has the attributes for a valid Parititioned attribute.
-// For M104, we do not require that Partitioned cookies do not have the Domain
-// attribute.
-// TODO(crbug.com/1296161): Determine if we need to delete this function.
-bool HasValidAttributesForPartitioned(const GURL& url,
- bool secure,
- const std::string& path,
- bool is_same_party) {
- return url.SchemeIsCryptographic() && secure && path == "/" && !is_same_party;
-}
-
} // namespace
CookieAccessParams::CookieAccessParams(CookieAccessSemantics access_semantics,
@@ -492,18 +458,32 @@ Time CanonicalCookie::ParseExpiration(const ParsedCookie& pc,
base::TimeDelta clock_skew = (current - server_time);
// Record the magnitude (absolute value) of the skew in minutes.
int clock_skew_magnitude = clock_skew.magnitude().InMinutes();
+ // Determine the new expiry with clock skew factored in.
+ Time adjusted_expiry = parsed_expiry + (current - server_time);
if (clock_skew.is_positive() || clock_skew.is_zero()) {
UMA_HISTOGRAM_CUSTOM_COUNTS("Cookie.ClockSkew.AddMinutes",
clock_skew_magnitude, 1,
kMinutesInTwelveHours, 100);
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Cookie.ClockSkew.AddMinutes12To24Hours",
+ clock_skew_magnitude, kMinutesInTwelveHours,
+ kMinutesInTwentyFourHours, 100);
+ // Also record the range of minutes added that allowed the cookie to
+ // avoid expiring immediately.
+ if (parsed_expiry <= Time::Now() && adjusted_expiry > Time::Now()) {
+ UMA_HISTOGRAM_CUSTOM_COUNTS(
+ "Cookie.ClockSkew.WithoutAddMinutesExpires", clock_skew_magnitude,
+ 1, kMinutesInTwentyFourHours, 100);
+ }
} else if (clock_skew.is_negative()) {
// These histograms only support positive numbers, so negative skews
// will be converted to positive (via magnitude) before recording.
UMA_HISTOGRAM_CUSTOM_COUNTS("Cookie.ClockSkew.SubtractMinutes",
clock_skew_magnitude, 1,
kMinutesInTwelveHours, 100);
+ UMA_HISTOGRAM_CUSTOM_COUNTS(
+ "Cookie.ClockSkew.SubtractMinutes12To24Hours", clock_skew_magnitude,
+ kMinutesInTwelveHours, kMinutesInTwentyFourHours, 100);
}
- Time adjusted_expiry = parsed_expiry + (current - server_time);
// Record if we were going to expire the cookie before we added the clock
// skew.
UMA_HISTOGRAM_BOOLEAN(
@@ -578,7 +558,7 @@ std::unique_ptr<CanonicalCookie> CanonicalCookie::Create(
!base::IsStringASCII(parsed_cookie.Domain()));
std::string cookie_domain;
- if (!GetCookieDomain(url, parsed_cookie, &cookie_domain)) {
+ if (!GetCookieDomain(url, parsed_cookie, *status, &cookie_domain)) {
DVLOG(net::cookie_util::kVlogSetCookies)
<< "Create() failed to get a valid cookie domain";
status->AddExclusionReason(CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN);
@@ -761,7 +741,7 @@ std::unique_ptr<CanonicalCookie> CanonicalCookie::CreateSanitizedCookie(
status->AddExclusionReason(
net::CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN);
} else if (!cookie_util::GetCookieDomainWithString(url, domain_attribute,
- &cookie_domain)) {
+ *status, &cookie_domain)) {
status->AddExclusionReason(
net::CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN);
}
@@ -824,9 +804,8 @@ std::unique_ptr<CanonicalCookie> CanonicalCookie::CreateSanitizedCookie(
status->AddExclusionReason(
net::CookieInclusionStatus::EXCLUDE_INVALID_SAMEPARTY);
}
- if (!IsCookiePartitionedValid(url, secure, cookie_path,
+ if (!IsCookiePartitionedValid(url, secure,
/*is_partitioned=*/partition_key.has_value(),
- /*is_same_party=*/same_party,
/*partition_has_nonce=*/
CookiePartitionKey::HasNonce(partition_key))) {
status->AddExclusionReason(
@@ -1154,47 +1133,6 @@ CookieAccessResult CanonicalCookie::IncludeForRequestURL(
UMA_HISTOGRAM_ENUMERATION("Cookie.IncludedRequestEffectiveSameSite",
effective_same_site,
CookieEffectiveSameSite::COUNT);
-
- if (SameSite() == CookieSameSite::NO_RESTRICTION) {
- SamePartyContext::Type top_resource =
- options.same_party_context().top_resource_for_metrics_only();
- SamePartyContext::Type ancestors =
- options.same_party_context().ancestors_for_metrics_only();
-
- if (top_resource == SamePartyContext::Type::kCrossParty) {
- status.AddWarningReason(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED);
- RecordSameSiteNoneReadContextMetric(
- SameSiteNonePartyContextType::kSameSiteNoneRequired);
- } else if (ancestors == SamePartyContext::Type::kCrossParty) {
- status.AddWarningReason(
- CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_TOP_RESOURCE);
- RecordSameSiteNoneReadContextMetric(
- SameSiteNonePartyContextType::kSamePartyTopResource);
- } else if (cookie_inclusion_context <
- CookieOptions::SameSiteCookieContext::ContextType::
- SAME_SITE_LAX) {
- status.AddWarningReason(
- CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_ANCESTORS);
- RecordSameSiteNoneReadContextMetric(
- SameSiteNonePartyContextType::kSamePartyAncestors);
- } else if (cookie_inclusion_context <
- CookieOptions::SameSiteCookieContext::ContextType::
- SAME_SITE_STRICT) {
- status.AddWarningReason(
- CookieInclusionStatus::WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_LAX);
- RecordSameSiteNoneReadContextMetric(
- SameSiteNonePartyContextType::kSameSiteLax);
- } else {
- status.AddWarningReason(
- CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_STRICT);
- RecordSameSiteNoneReadContextMetric(
- SameSiteNonePartyContextType::kSameSiteStrict);
- }
- }
}
using ContextRedirectTypeBug1221316 = CookieOptions::SameSiteCookieContext::
@@ -1397,42 +1335,6 @@ CookieAccessResult CanonicalCookie::IsSetPermittedInContext(
UMA_HISTOGRAM_ENUMERATION("Cookie.IncludedResponseEffectiveSameSite",
access_result.effective_same_site,
CookieEffectiveSameSite::COUNT);
-
- if (SameSite() == CookieSameSite::NO_RESTRICTION) {
- SamePartyContext::Type top_resource =
- options.same_party_context().top_resource_for_metrics_only();
- SamePartyContext::Type ancestors =
- options.same_party_context().ancestors_for_metrics_only();
-
- if (top_resource == SamePartyContext::Type::kCrossParty) {
- access_result.status.AddWarningReason(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED);
- RecordSameSiteNoneWriteContextMetric(
- SameSiteNonePartyContextType::kSameSiteNoneRequired);
- } else if (ancestors == SamePartyContext::Type::kCrossParty) {
- access_result.status.AddWarningReason(
- CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_TOP_RESOURCE);
- RecordSameSiteNoneWriteContextMetric(
- SameSiteNonePartyContextType::kSamePartyTopResource);
- } else if (cookie_inclusion_context <
- CookieOptions::SameSiteCookieContext::ContextType::
- SAME_SITE_LAX) {
- access_result.status.AddWarningReason(
- CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_ANCESTORS);
- RecordSameSiteNoneWriteContextMetric(
- SameSiteNonePartyContextType::kSamePartyAncestors);
- } else {
- // NB: unlike when sending a cookie, there's no distinction between
- // SameSite=Lax and SameSite=Strict when setting a cookie.
- access_result.status.AddWarningReason(
- CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_STRICT);
- RecordSameSiteNoneWriteContextMetric(
- SameSiteNonePartyContextType::kSameSiteStrict);
- }
- }
}
using ContextRedirectTypeBug1221316 = CookieOptions::SameSiteCookieContext::
@@ -1547,9 +1449,8 @@ bool CanonicalCookie::IsCanonicalForFromStorage() const {
if (IsPartitioned()) {
if (CookiePartitionKey::HasNonce(partition_key_))
return true;
- if (!secure_ || path_ != "/" || same_party_) {
+ if (!secure_)
return false;
- }
}
return true;
@@ -1587,6 +1488,43 @@ std::string CanonicalCookie::BuildCookieLine(
}
// static
+std::string CanonicalCookie::BuildCookieAttributesLine(
+ const CanonicalCookie& cookie) {
+ std::string cookie_line;
+ // In Mozilla, if you set a cookie like "AAA", it will have an empty token
+ // and a value of "AAA". When it sends the cookie back, it will send "AAA",
+ // so we need to avoid sending "=AAA" for a blank token value.
+ if (!cookie.Name().empty())
+ cookie_line += cookie.Name() + "=";
+ cookie_line += cookie.Value();
+ if (!cookie.Domain().empty())
+ cookie_line += "; domain=" + cookie.Domain();
+ if (!cookie.Path().empty())
+ cookie_line += "; path=" + cookie.Path();
+ if (cookie.ExpiryDate() != base::Time())
+ cookie_line += "; expires=" + TimeFormatHTTP(cookie.ExpiryDate());
+ if (cookie.IsSecure())
+ cookie_line += "; secure";
+ if (cookie.IsHttpOnly())
+ cookie_line += "; httponly";
+ switch (cookie.SameSite()) {
+ case CookieSameSite::NO_RESTRICTION:
+ cookie_line += "; samesite=none";
+ break;
+ case CookieSameSite::LAX_MODE:
+ cookie_line += "; samesite=lax";
+ break;
+ case CookieSameSite::STRICT_MODE:
+ cookie_line += "; samesite=strict";
+ break;
+ case CookieSameSite::UNSPECIFIED:
+ // Don't append any text if the samesite attribute wasn't explicitly set.
+ break;
+ }
+ return cookie_line;
+}
+
+// static
CanonicalCookie::CookiePrefix CanonicalCookie::GetCookiePrefix(
const std::string& name) {
const char kSecurePrefix[] = "__Secure-";
@@ -1726,26 +1664,21 @@ bool CanonicalCookie::IsCookiePartitionedValid(
bool partition_has_nonce) {
return IsCookiePartitionedValid(
url, /*secure=*/parsed_cookie.IsSecure(),
- parsed_cookie.HasPath() ? parsed_cookie.Path() : "",
- /*is_partitioned=*/parsed_cookie.IsPartitioned(),
- /*is_same_party=*/parsed_cookie.IsSameParty(), partition_has_nonce);
+ /*is_partitioned=*/parsed_cookie.IsPartitioned(), partition_has_nonce);
}
// static
bool CanonicalCookie::IsCookiePartitionedValid(const GURL& url,
bool secure,
- const std::string& path,
bool is_partitioned,
- bool is_same_party,
bool partition_has_nonce) {
if (!is_partitioned)
return true;
if (partition_has_nonce)
return true;
- bool result =
- HasValidAttributesForPartitioned(url, secure, path, is_same_party);
+ bool result = url.SchemeIsCryptographic() && secure;
DLOG_IF(WARNING, !result)
- << "CanonicalCookie has invalid Partitioned attribute ";
+ << "CanonicalCookie has invalid Partitioned attribute";
return result;
}
diff --git a/chromium/net/cookies/canonical_cookie.h b/chromium/net/cookies/canonical_cookie.h
index 1ddf1b1532b..7afdc20a502 100644
--- a/chromium/net/cookies/canonical_cookie.h
+++ b/chromium/net/cookies/canonical_cookie.h
@@ -429,6 +429,11 @@ class NET_EXPORT CanonicalCookie {
// (ignores the access result).
static std::string BuildCookieLine(const CookieAccessResultList& cookies);
+ // Takes a single CanonicalCookie and returns a cookie line containing the
+ // attributes of |cookie| formatted like a http set cookie header.
+ // (e.g. "cookie1=value1; domain=abc.com; path=/; secure").
+ static std::string BuildCookieAttributesLine(const CanonicalCookie& cookie);
+
private:
FRIEND_TEST_ALL_PREFIXES(CanonicalCookieTest, TestPrefixHistograms);
FRIEND_TEST_ALL_PREFIXES(CanonicalCookieTest, TestHasHiddenPrefixName);
@@ -512,16 +517,13 @@ class NET_EXPORT CanonicalCookie {
// Returns true iff the cookie is a partitioned cookie with a nonce or that
// does not violate the semantics of the Partitioned attribute:
- // - Must have the Secure and Path=/ attributes
- // - Must not have the Domain or SameParty attributes
+ // - Must have the Secure attribute OR the cookie partition contains a nonce.
static bool IsCookiePartitionedValid(const GURL& url,
const ParsedCookie& parsed_cookie,
bool partition_has_nonce);
static bool IsCookiePartitionedValid(const GURL& url,
bool secure,
- const std::string& path,
bool is_partitioned,
- bool is_same_party,
bool partition_has_nonce);
// Keep defaults here in sync with
diff --git a/chromium/net/cookies/canonical_cookie_unittest.cc b/chromium/net/cookies/canonical_cookie_unittest.cc
index e49d701ca5c..49cbaf3ea55 100644
--- a/chromium/net/cookies/canonical_cookie_unittest.cc
+++ b/chromium/net/cookies/canonical_cookie_unittest.cc
@@ -366,10 +366,6 @@ TEST(CanonicalCookieTest, Create) {
// Test that a cookie string with an empty domain attribute generates a
// canonical host cookie.
TEST(CanonicalCookieTest, CreateHostCookieFromString) {
- // Enable the feature flag for this test.
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kCookieDomainAttributeEmptyString);
// Create a new canonical host cookie via empty string domain in the
// cookie_line.
GURL url("http://www.example.com/test/foo.html");
@@ -471,7 +467,10 @@ TEST(CanonicalCookieTest, CreateWithNonASCIIDomain) {
absl::nullopt /* cookie_partition_key */, &status);
EXPECT_EQ(nullptr, cookie.get());
EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
- {CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN}));
+ {CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN,
+ CookieInclusionStatus::EXCLUDE_DOMAIN_NON_ASCII}));
+ EXPECT_FALSE(
+ status.HasWarningReason(CookieInclusionStatus::WARN_DOMAIN_NON_ASCII));
}
// Test with feature flag disabled.
@@ -486,6 +485,8 @@ TEST(CanonicalCookieTest, CreateWithNonASCIIDomain) {
EXPECT_TRUE(cookie2.get());
EXPECT_TRUE(status2.IsInclude());
+ EXPECT_TRUE(
+ status2.HasWarningReason(CookieInclusionStatus::WARN_DOMAIN_NON_ASCII));
}
// Test that regular ascii punycode still works.
@@ -495,6 +496,8 @@ TEST(CanonicalCookieTest, CreateWithNonASCIIDomain) {
absl::nullopt /* cookie_partition_key */, &status3);
EXPECT_TRUE(cookie3.get());
EXPECT_TRUE(status3.IsInclude());
+ EXPECT_FALSE(
+ status3.HasWarningReason(CookieInclusionStatus::WARN_DOMAIN_NON_ASCII));
}
TEST(CanonicalCookieTest, CreateWithDomainAsIP) {
@@ -645,23 +648,25 @@ TEST(CanonicalCookieTest, CreateWithPartitioned) {
EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
{CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED}));
- // Invalid Partitioned attribute: No Path attribute.
+ // Partitioned attribute: No Path attribute.
status = CookieInclusionStatus();
cookie =
CanonicalCookie::Create(url, "A=2; Partitioned; Secure", creation_time,
server_time, partition_key, &status);
- EXPECT_FALSE(cookie.get());
- EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
- {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED}));
+ EXPECT_TRUE(cookie.get());
+ EXPECT_TRUE(status.IsInclude());
+ EXPECT_TRUE(cookie->IsPartitioned());
+ EXPECT_EQ(partition_key, cookie->PartitionKey());
- // Invalid Partitioned attribute: invalid Path attribute.
+ // Partitioned attribute: Path attribute not equal to "/".
status = CookieInclusionStatus();
cookie = CanonicalCookie::Create(
url, "A=2; Partitioned; Path=/foobar; Secure", creation_time, server_time,
partition_key, &status);
- EXPECT_FALSE(cookie.get());
- EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
- {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED}));
+ EXPECT_TRUE(cookie.get());
+ EXPECT_TRUE(status.IsInclude());
+ EXPECT_TRUE(cookie->IsPartitioned());
+ EXPECT_EQ(partition_key, cookie->PartitionKey());
// Partitioned attribute: Domain cookie.
status = CookieInclusionStatus();
@@ -674,30 +679,11 @@ TEST(CanonicalCookieTest, CreateWithPartitioned) {
EXPECT_TRUE(cookie->IsPartitioned());
EXPECT_EQ(partition_key, cookie->PartitionKey());
- // Invalid Partitioned attribute: SameParty cookie.
+ // No Partitioned attribute but with a nonce.
status = CookieInclusionStatus();
- cookie = CanonicalCookie::Create(
- url, "A=2; Partitioned; Path=/; Secure; SameParty", creation_time,
- server_time, partition_key, &status);
- EXPECT_FALSE(cookie.get());
- EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
- {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED}));
-
- // Invalid Partitioned attribute: SameParty cookie but with a nonce.
auto partition_key_with_nonce =
absl::make_optional(CookiePartitionKey::FromURLForTesting(
GURL("https://toplevelsite.com"), base::UnguessableToken::Create()));
- status = CookieInclusionStatus();
- cookie = CanonicalCookie::Create(
- url, "A=2; Partitioned; Path=/; Secure; SameParty", creation_time,
- server_time, partition_key_with_nonce, &status);
- EXPECT_TRUE(cookie.get());
- EXPECT_TRUE(status.IsInclude());
- EXPECT_TRUE(cookie->IsPartitioned());
- EXPECT_EQ(partition_key_with_nonce, cookie->PartitionKey());
-
- // No Partitioned attribute but with a nonce.
- status = CookieInclusionStatus();
cookie =
CanonicalCookie::Create(url, "__Host-A=2; Path=/; Secure", creation_time,
server_time, partition_key_with_nonce, &status);
@@ -1633,25 +1619,21 @@ TEST(CanonicalCookieTest, IncludeForRequestURLSameSite) {
{"Common=10;SameSite=None;Secure", CookieSameSite::NO_RESTRICTION,
CookieEffectiveSameSite::NO_RESTRICTION,
SameSiteCookieContext(SameSiteCookieContext::ContextType::CROSS_SITE),
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED)},
+ CookieInclusionStatus()},
{"Common=11;SameSite=None;Secure", CookieSameSite::NO_RESTRICTION,
CookieEffectiveSameSite::NO_RESTRICTION,
SameSiteCookieContext(
SameSiteCookieContext::ContextType::SAME_SITE_LAX_METHOD_UNSAFE),
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED)},
+ CookieInclusionStatus()},
{"Common=12;SameSite=None;Secure", CookieSameSite::NO_RESTRICTION,
CookieEffectiveSameSite::NO_RESTRICTION,
SameSiteCookieContext(SameSiteCookieContext::ContextType::SAME_SITE_LAX),
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED)},
+ CookieInclusionStatus()},
{"Common=13;SameSite=None;Secure", CookieSameSite::NO_RESTRICTION,
CookieEffectiveSameSite::NO_RESTRICTION,
SameSiteCookieContext(
SameSiteCookieContext::ContextType::SAME_SITE_STRICT),
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED)},
+ CookieInclusionStatus()},
// Because NO_RESTRICTION cookies are always sent, the schemeful context
// downgrades shouldn't matter.
{"Common=14;SameSite=None;Secure", CookieSameSite::NO_RESTRICTION,
@@ -1659,35 +1641,30 @@ TEST(CanonicalCookieTest, IncludeForRequestURLSameSite) {
SameSiteCookieContext(
SameSiteCookieContext::ContextType::SAME_SITE_STRICT,
SameSiteCookieContext::ContextType::SAME_SITE_LAX),
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED)},
+ CookieInclusionStatus()},
{"Common=15;SameSite=None;Secure", CookieSameSite::NO_RESTRICTION,
CookieEffectiveSameSite::NO_RESTRICTION,
SameSiteCookieContext(
SameSiteCookieContext::ContextType::SAME_SITE_STRICT,
SameSiteCookieContext::ContextType::SAME_SITE_LAX_METHOD_UNSAFE),
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED)},
+ CookieInclusionStatus()},
{"Common=16;SameSite=None;Secure", CookieSameSite::NO_RESTRICTION,
CookieEffectiveSameSite::NO_RESTRICTION,
SameSiteCookieContext(
SameSiteCookieContext::ContextType::SAME_SITE_STRICT,
SameSiteCookieContext::ContextType::CROSS_SITE),
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED)},
+ CookieInclusionStatus()},
{"Common=17;SameSite=None;Secure", CookieSameSite::NO_RESTRICTION,
CookieEffectiveSameSite::NO_RESTRICTION,
SameSiteCookieContext(SameSiteCookieContext::ContextType::SAME_SITE_LAX,
SameSiteCookieContext::ContextType::CROSS_SITE),
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED)},
+ CookieInclusionStatus()},
{"Common=18;SameSite=None;Secure", CookieSameSite::NO_RESTRICTION,
CookieEffectiveSameSite::NO_RESTRICTION,
SameSiteCookieContext(
SameSiteCookieContext::ContextType::SAME_SITE_LAX_METHOD_UNSAFE,
SameSiteCookieContext::ContextType::CROSS_SITE),
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED)},
+ CookieInclusionStatus()},
};
// Test cases where the unspecified-SameSite cookie defaults to SameSite=None
@@ -2088,10 +2065,7 @@ TEST(CanonicalCookieTest, IncludeForRequestURL_SameSiteNone_Metrics) {
CookieAccessParams(CookieAccessSemantics::LEGACY,
delegate_treats_url_as_trustworthy,
CookieSamePartyStatus::kNoSamePartyEnforcement)),
- MatchesCookieAccessResult(
- CookieInclusionStatus::MakeFromReasonsForTesting(
- {}, {CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED}),
- _, _, true));
+ MatchesCookieAccessResult(CookieInclusionStatus(), _, _, true));
EXPECT_THAT(
same_party_cookie->IncludeForRequestURL(
url, options,
@@ -2106,20 +2080,15 @@ TEST(CanonicalCookieTest, IncludeForRequestURL_SameSiteNone_Metrics) {
// though they would differ unless we changed the real definition.) Then
// check that if we modify the cookie as indicated, the set would be allowed,
// but the next-most-restrictive variation would still be blocked.
- options.set_same_party_context(SamePartyContext(
- SamePartyContextType::kSameParty, SamePartyContextType::kCrossParty,
- SamePartyContextType::kSameParty));
+ options.set_same_party_context(
+ SamePartyContext(SamePartyContextType::kSameParty));
EXPECT_THAT(
same_site_none_cookie->IncludeForRequestURL(
url, options,
CookieAccessParams(CookieAccessSemantics::LEGACY,
delegate_treats_url_as_trustworthy,
CookieSamePartyStatus::kNoSamePartyEnforcement)),
- MatchesCookieAccessResult(
- CookieInclusionStatus::MakeFromReasonsForTesting(
- {}, {CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_TOP_RESOURCE}),
- _, _, true));
+ MatchesCookieAccessResult(CookieInclusionStatus(), _, _, true));
EXPECT_THAT(
same_party_cookie->IncludeForRequestURL(
url, options,
@@ -2143,11 +2112,7 @@ TEST(CanonicalCookieTest, IncludeForRequestURL_SameSiteNone_Metrics) {
CookieAccessParams(CookieAccessSemantics::LEGACY,
delegate_treats_url_as_trustworthy,
CookieSamePartyStatus::kNoSamePartyEnforcement)),
- MatchesCookieAccessResult(
- CookieInclusionStatus::MakeFromReasonsForTesting(
- {}, {CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_ANCESTORS}),
- _, _, true));
+ MatchesCookieAccessResult(CookieInclusionStatus(), _, _, true));
EXPECT_THAT(
same_party_cookie->IncludeForRequestURL(
url, options,
@@ -2172,11 +2137,7 @@ TEST(CanonicalCookieTest, IncludeForRequestURL_SameSiteNone_Metrics) {
CookieAccessParams(CookieAccessSemantics::LEGACY,
delegate_treats_url_as_trustworthy,
CookieSamePartyStatus::kNoSamePartyEnforcement)),
- MatchesCookieAccessResult(
- CookieInclusionStatus::MakeFromReasonsForTesting(
- {}, {CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_LAX}),
- _, _, true));
+ MatchesCookieAccessResult(CookieInclusionStatus(), _, _, true));
EXPECT_THAT(
same_site_lax_cookie->IncludeForRequestURL(
url, options,
@@ -2201,11 +2162,7 @@ TEST(CanonicalCookieTest, IncludeForRequestURL_SameSiteNone_Metrics) {
CookieAccessParams(CookieAccessSemantics::LEGACY,
delegate_treats_url_as_trustworthy,
CookieSamePartyStatus::kNoSamePartyEnforcement)),
- MatchesCookieAccessResult(
- CookieInclusionStatus::MakeFromReasonsForTesting(
- {}, {CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_STRICT}),
- _, _, true));
+ MatchesCookieAccessResult(CookieInclusionStatus(), _, _, true));
EXPECT_THAT(
same_site_strict_cookie->IncludeForRequestURL(
url, options,
@@ -3009,27 +2966,16 @@ TEST(CanonicalCookieTest, IsCanonical) {
GURL("https://toplevelsite.com")))
->IsCanonical());
- // Partitioned attribute invalid, no Path.
- EXPECT_FALSE(CanonicalCookie::CreateUnsafeCookieForTesting(
- "A", "B", "x.y", "", base::Time(), base::Time(),
- base::Time(), base::Time(), /*secure=*/true,
- /*httponly=*/false, CookieSameSite::UNSPECIFIED,
- COOKIE_PRIORITY_LOW,
- /*same_party=*/false,
- CookiePartitionKey::FromURLForTesting(
- GURL("https://toplevelsite.com")))
- ->IsCanonical());
-
- // Partitioned attribute invalid, invalid Path.
- EXPECT_FALSE(CanonicalCookie::CreateUnsafeCookieForTesting(
- "A", "B", "x.y", "/foobar", base::Time(), base::Time(),
- base::Time(), base::Time(), /*secure=*/true,
- /*httponly=*/false, CookieSameSite::UNSPECIFIED,
- COOKIE_PRIORITY_LOW,
- /*same_party=*/false,
- CookiePartitionKey::FromURLForTesting(
- GURL("https://toplevelsite.com")))
- ->IsCanonical());
+ // Partitioned attribute is valid when Path != "/".
+ EXPECT_TRUE(CanonicalCookie::CreateUnsafeCookieForTesting(
+ "A", "B", "x.y", "/foo/bar", base::Time(), base::Time(),
+ base::Time(), base::Time(), /*secure=*/true,
+ /*httponly=*/false, CookieSameSite::UNSPECIFIED,
+ COOKIE_PRIORITY_LOW,
+ /*same_party=*/false,
+ CookiePartitionKey::FromURLForTesting(
+ GURL("https://toplevelsite.com")))
+ ->IsCanonical());
// Partitioned attribute is valid when Domain attribute also included.
EXPECT_TRUE(CanonicalCookie::CreateUnsafeCookieForTesting(
@@ -3042,17 +2988,6 @@ TEST(CanonicalCookieTest, IsCanonical) {
GURL("https://toplevelsite.com")))
->IsCanonical());
- // Partitioned attribute invalid, SameParty attribute also included.
- EXPECT_FALSE(CanonicalCookie::CreateUnsafeCookieForTesting(
- "__Host-A", "B", "x.y", "/", base::Time(), base::Time(),
- base::Time(), base::Time(), /*secure=*/true,
- /*httponly=*/false, CookieSameSite::UNSPECIFIED,
- COOKIE_PRIORITY_LOW,
- /*same_party=*/true,
- CookiePartitionKey::FromURLForTesting(
- GURL("https://toplevelsite.com")))
- ->IsCanonical());
-
// Hidden cookie prefixes.
EXPECT_FALSE(CanonicalCookie::CreateUnsafeCookieForTesting(
"", "__Secure-a=b", "x.y", "/", base::Time(), base::Time(),
@@ -3170,6 +3105,36 @@ TEST(CanonicalCookieTest, BuildCookieLine) {
MatchCookieLineToVector("A=B; C; D=E; F=G; D=E; H=I", cookies);
}
+TEST(CanonicalCookieTest, BuildCookieAttributesLine) {
+ std::unique_ptr<CanonicalCookie> cookie;
+ GURL url("https://example.com/");
+ base::Time now = base::Time::Now();
+ absl::optional<base::Time> server_time = absl::nullopt;
+
+ cookie = CanonicalCookie::Create(url, "A=B", now, server_time,
+ absl::nullopt /* cookie_partition_key */);
+ EXPECT_EQ("A=B; domain=example.com; path=/",
+ CanonicalCookie::BuildCookieAttributesLine(*cookie));
+ // Nameless cookies are sent back without a prefixed '='.
+ cookie = CanonicalCookie::Create(url, "C", now, server_time,
+ absl::nullopt /* cookie_partition_key */);
+ EXPECT_EQ("C; domain=example.com; path=/",
+ CanonicalCookie::BuildCookieAttributesLine(*cookie));
+ // BuildCookieAttributesLine should match the spec in the case of an empty
+ // name with a value containing an equal sign (even if it currently produces
+ // "invalid" cookie lines).
+ cookie = CanonicalCookie::Create(url, "=H=I", now, server_time,
+ absl::nullopt /* cookie_partition_key */);
+ EXPECT_EQ("H=I; domain=example.com; path=/",
+ CanonicalCookie::BuildCookieAttributesLine(*cookie));
+ // BuildCookieAttributesLine should include all attributes.
+ cookie = CanonicalCookie::Create(
+ url, "A=B; domain=.example.com; path=/; secure; httponly; samesite=lax",
+ now, server_time, absl::nullopt /* cookie_partition_key */);
+ EXPECT_EQ("A=B; domain=.example.com; path=/; secure; httponly; samesite=lax",
+ CanonicalCookie::BuildCookieAttributesLine(*cookie));
+}
+
// Confirm that input arguments are reflected in the output cookie.
TEST(CanonicalCookieTest, CreateSanitizedCookie_Inputs) {
base::Time two_hours_ago = base::Time::Now() - base::Hours(2);
@@ -3828,7 +3793,7 @@ TEST(CanonicalCookieTest, CreateSanitizedCookie_Logic) {
{CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED}));
// Invalid: invalid Path.
status = CookieInclusionStatus();
- EXPECT_FALSE(CanonicalCookie::CreateSanitizedCookie(
+ EXPECT_TRUE(CanonicalCookie::CreateSanitizedCookie(
GURL("https://www.foo.com"), "A", "B", std::string(), "/foobar",
two_hours_ago, one_hour_from_now, one_hour_ago, /*secure=*/true,
/*http_only=*/false, CookieSameSite::NO_RESTRICTION,
@@ -3837,8 +3802,7 @@ TEST(CanonicalCookieTest, CreateSanitizedCookie_Logic) {
absl::optional<CookiePartitionKey>(CookiePartitionKey::FromURLForTesting(
GURL("https://toplevelsite.com"))),
&status));
- EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
- {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED}));
+ EXPECT_TRUE(status.IsInclude());
// Domain attribute present is still valid.
status = CookieInclusionStatus();
EXPECT_TRUE(CanonicalCookie::CreateSanitizedCookie(
@@ -3850,18 +3814,6 @@ TEST(CanonicalCookieTest, CreateSanitizedCookie_Logic) {
GURL("https://toplevelsite.com"))),
&status));
EXPECT_TRUE(status.IsInclude());
- // Invalid: SameParty attribute present.
- status = CookieInclusionStatus();
- EXPECT_FALSE(CanonicalCookie::CreateSanitizedCookie(
- GURL("https://www.foo.com"), "A", "B", std::string(), "/", two_hours_ago,
- one_hour_from_now, one_hour_ago, /*secure=*/true, /*http_only=*/false,
- CookieSameSite::NO_RESTRICTION, CookiePriority::COOKIE_PRIORITY_DEFAULT,
- /*same_party=*/true,
- absl::optional<CookiePartitionKey>(CookiePartitionKey::FromURLForTesting(
- GURL("https://toplevelsite.com"))),
- &status));
- EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
- {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED}));
status = CookieInclusionStatus();
@@ -5021,10 +4973,7 @@ TEST(CanonicalCookieTest, IsSetPermitted_SameSiteNone_Metrics) {
delegate_treats_url_as_trustworthy,
CookieSamePartyStatus::kNoSamePartyEnforcement),
kCookieableSchemes),
- MatchesCookieAccessResult(
- CookieInclusionStatus::MakeFromReasonsForTesting(
- {}, {CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED}),
- _, _, true));
+ MatchesCookieAccessResult(CookieInclusionStatus(), _, _, true));
EXPECT_THAT(
same_party_cookie->IsSetPermittedInContext(
url, options,
@@ -5039,9 +4988,8 @@ TEST(CanonicalCookieTest, IsSetPermitted_SameSiteNone_Metrics) {
// "real" same-partyness value match the value computed for the metric, even
// though they would differ unless we changed the real definition.) Then
// check that if we modify the cookie as indicated, the set would be allowed.
- options.set_same_party_context(SamePartyContext(
- SamePartyContextType::kSameParty, SamePartyContextType::kCrossParty,
- SamePartyContextType::kSameParty));
+ options.set_same_party_context(
+ SamePartyContext(SamePartyContextType::kSameParty));
EXPECT_THAT(
same_site_none_cookie->IsSetPermittedInContext(
url, options,
@@ -5049,11 +4997,7 @@ TEST(CanonicalCookieTest, IsSetPermitted_SameSiteNone_Metrics) {
delegate_treats_url_as_trustworthy,
CookieSamePartyStatus::kNoSamePartyEnforcement),
kCookieableSchemes),
- MatchesCookieAccessResult(
- CookieInclusionStatus::MakeFromReasonsForTesting(
- {}, {CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_TOP_RESOURCE}),
- _, _, true));
+ MatchesCookieAccessResult(CookieInclusionStatus(), _, _, true));
EXPECT_THAT(
same_party_cookie->IsSetPermittedInContext(
url, options,
@@ -5080,11 +5024,7 @@ TEST(CanonicalCookieTest, IsSetPermitted_SameSiteNone_Metrics) {
delegate_treats_url_as_trustworthy,
CookieSamePartyStatus::kNoSamePartyEnforcement),
kCookieableSchemes),
- MatchesCookieAccessResult(
- CookieInclusionStatus::MakeFromReasonsForTesting(
- {}, {CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_ANCESTORS}),
- _, _, true));
+ MatchesCookieAccessResult(CookieInclusionStatus(), _, _, true));
EXPECT_THAT(
same_party_cookie->IsSetPermittedInContext(
url, options,
@@ -5112,11 +5052,7 @@ TEST(CanonicalCookieTest, IsSetPermitted_SameSiteNone_Metrics) {
delegate_treats_url_as_trustworthy,
CookieSamePartyStatus::kNoSamePartyEnforcement),
kCookieableSchemes),
- MatchesCookieAccessResult(
- CookieInclusionStatus::MakeFromReasonsForTesting(
- {}, {CookieInclusionStatus::
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_STRICT}),
- _, _, true));
+ MatchesCookieAccessResult(CookieInclusionStatus(), _, _, true));
EXPECT_THAT(
same_site_lax_cookie->IsSetPermittedInContext(
url, options,
@@ -5364,8 +5300,12 @@ TEST(CanonicalCookieTest, TestHasHiddenPrefixName) {
{" \t ", false},
{"\t", false},
{"__Secure-abc", false},
+ {"__Secure=-", false},
+ {"__Secure=-abc", false},
{"__Secur=e-abc", false},
{"__Secureabc", false},
+ {"__Host=-", false},
+ {"__Host=-abc", false},
{"__Host-abc", false},
{"__Hos=t-abc", false},
{"_Host", false},
@@ -5373,12 +5313,16 @@ TEST(CanonicalCookieTest, TestHasHiddenPrefixName) {
{"\t__Host-", false},
{"a__Host-abc=123", false},
{"a__Secure-abc=123", false},
+ {"__Host-=", true},
+ {"__Host-=123", true},
{"__Host-abc=", true},
{"__Host-abc=123", true},
{" __Host-abc=123", true},
{" __Host-abc=", true},
{"\t\t\t\t\t__Host-abc=123", true},
{"\t __Host-abc=", true},
+ {"__Secure-=", true},
+ {"__Secure-=123", true},
{"__Secure-abc=", true},
{"__Secure-abc=123", true},
{" __Secure-abc=123", true},
diff --git a/chromium/net/cookies/cookie_access_delegate.cc b/chromium/net/cookies/cookie_access_delegate.cc
index 9ed9ed4a15e..87422832773 100644
--- a/chromium/net/cookies/cookie_access_delegate.cc
+++ b/chromium/net/cookies/cookie_access_delegate.cc
@@ -7,22 +7,21 @@
#include <set>
#include "base/callback.h"
-#include "base/stl_util.h"
#include "net/base/schemeful_site.h"
#include "net/cookies/cookie_partition_key.h"
-#include "net/cookies/first_party_set_metadata.h"
+#include "net/cookies/first_party_set_entry.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace net {
namespace {
-CookiePartitionKey CreateCookiePartitionKeyFromFirstPartySetOwner(
+CookiePartitionKey CreateCookiePartitionKeyFromFirstPartySetEntry(
const CookiePartitionKey& cookie_partition_key,
- absl::optional<SchemefulSite> first_party_set_owner) {
- if (!first_party_set_owner) {
+ base::flat_map<net::SchemefulSite, FirstPartySetEntry> entries) {
+ if (entries.empty()) {
return cookie_partition_key;
}
- return CookiePartitionKey::FromWire(first_party_set_owner.value(),
+ return CookiePartitionKey::FromWire(entries.begin()->second.primary(),
cookie_partition_key.nonce());
}
} // namespace
@@ -48,15 +47,15 @@ CookieAccessDelegate::FirstPartySetifyPartitionKey(
return cookie_partition_key;
}
- absl::optional<absl::optional<SchemefulSite>> maybe_owner =
- delegate->FindFirstPartySetOwner(
- cookie_partition_key.site(),
- base::BindOnce(&CreateCookiePartitionKeyFromFirstPartySetOwner,
+ absl::optional<base::flat_map<net::SchemefulSite, FirstPartySetEntry>>
+ maybe_entries = delegate->FindFirstPartySetOwners(
+ {cookie_partition_key.site()},
+ base::BindOnce(&CreateCookiePartitionKeyFromFirstPartySetEntry,
cookie_partition_key)
.Then(std::move(callback)));
- if (maybe_owner.has_value())
- return CreateCookiePartitionKeyFromFirstPartySetOwner(cookie_partition_key,
- maybe_owner.value());
+ if (maybe_entries.has_value())
+ return CreateCookiePartitionKeyFromFirstPartySetEntry(
+ cookie_partition_key, maybe_entries.value());
return absl::nullopt;
}
diff --git a/chromium/net/cookies/cookie_access_delegate.h b/chromium/net/cookies/cookie_access_delegate.h
index 71878fad70b..3d69dbe7d38 100644
--- a/chromium/net/cookies/cookie_access_delegate.h
+++ b/chromium/net/cookies/cookie_access_delegate.h
@@ -15,6 +15,7 @@
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_constants.h"
#include "net/cookies/cookie_partition_key.h"
+#include "net/cookies/first_party_set_entry.h"
#include "net/cookies/first_party_set_metadata.h"
#include "net/cookies/same_party_context.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -67,34 +68,21 @@ class NET_EXPORT CookieAccessDelegate {
const std::set<net::SchemefulSite>& party_context,
base::OnceCallback<void(FirstPartySetMetadata)> callback) const = 0;
- // Computes the owner of a `site`'s First-Party Set if `site` is in a
- // non-trivial set; `nullopt` otherwise.
- //
- // This may return a result synchronously, or asynchronously invoke `callback`
- // with the result. The callback will be invoked iff the return value is
- // nullopt; i.e. a result will be provided via return value or callback, but
- // not both, and not neither.
- [[nodiscard]] virtual absl::optional<absl::optional<net::SchemefulSite>>
- FindFirstPartySetOwner(
- const net::SchemefulSite& site,
- base::OnceCallback<void(absl::optional<net::SchemefulSite>)> callback)
- const = 0;
-
- // Computes the owners of a set of sites' First-Party Sets if the site are in
- // non-trivial sets. If a given site is not in a non-trivial set, the output
- // does not contain a corresponding owner.
+ // Returns the entries of a set of sites if the sites are in non-trivial sets.
+ // If a given site is not in a non-trivial set, the output does not contain a
+ // corresponding entry.
//
// This may return a result synchronously, or asynchronously invoke `callback`
// with the result. The callback will be invoked iff the return value is
// nullopt; i.e. a result will be provided via return value or callback, but
// not both, and not neither.
[[nodiscard]] virtual absl::optional<
- base::flat_map<net::SchemefulSite, net::SchemefulSite>>
+ base::flat_map<net::SchemefulSite, net::FirstPartySetEntry>>
FindFirstPartySetOwners(
const base::flat_set<net::SchemefulSite>& sites,
- base::OnceCallback<void(
- base::flat_map<net::SchemefulSite, net::SchemefulSite>)> callback)
- const = 0;
+ base::OnceCallback<
+ void(base::flat_map<net::SchemefulSite, net::FirstPartySetEntry>)>
+ callback) const = 0;
// Converts the CookiePartitionKey's site to its First-Party Set owner if
// the site is in a nontrivial set.
@@ -108,19 +96,6 @@ class NET_EXPORT CookieAccessDelegate {
const CookieAccessDelegate* delegate,
const CookiePartitionKey& cookie_partition_key,
base::OnceCallback<void(CookiePartitionKey)> callback);
-
- // Computes the First-Party Sets.
- //
- // This may return a result synchronously, or asynchronously invoke `callback`
- // with the result. The callback will be invoked iff the return value is
- // nullopt; i.e. a result will be provided via return value or callback, but
- // not both, and not neither.
- [[nodiscard]] virtual absl::optional<
- base::flat_map<net::SchemefulSite, std::set<net::SchemefulSite>>>
- RetrieveFirstPartySets(
- base::OnceCallback<void(
- base::flat_map<net::SchemefulSite, std::set<net::SchemefulSite>>)>
- callback) const = 0;
};
} // namespace net
diff --git a/chromium/net/cookies/cookie_constants.h b/chromium/net/cookies/cookie_constants.h
index 52f1aca96d9..30e9ea6203d 100644
--- a/chromium/net/cookies/cookie_constants.h
+++ b/chromium/net/cookies/cookie_constants.h
@@ -306,28 +306,6 @@ enum class CookieSourceSchemeName {
kMaxValue = kChromeExtensionScheme
};
-// This enum must match the numbering for FirstPartySetsContextType in
-// histograms/enums.xml. Do not reorder or remove items, only add new items at
-// the end.
-enum class FirstPartySetsContextType {
- // Unknown context type.
- kUnknown = 0,
- // The top frame was ignored, and the rest of the context consisted of at
- // least 2 different parties.
- kTopFrameIgnoredMixed = 1,
- // The top frame was ignored, and the rest of the context was a single party.
- kTopFrameIgnoredHomogeneous = 2,
- // The top frame and resource URL were of different parties.
- kTopResourceMismatch = 3,
- // The top frame and resource URL were both of the same party, and there was
- // at least one intervening frame of a different party.
- kTopResourceMatchMixed = 4,
- // The top frame, resource URL, and all intervening frames were all from the
- // same party.
- kHomogeneous = 5,
- kMaxValue = kHomogeneous,
-};
-
// Returns the Set-Cookie header priority token corresponding to |priority|.
NET_EXPORT std::string CookiePriorityToString(CookiePriority priority);
diff --git a/chromium/net/cookies/cookie_inclusion_status.cc b/chromium/net/cookies/cookie_inclusion_status.cc
index 46342570471..58f0e738abd 100644
--- a/chromium/net/cookies/cookie_inclusion_status.cc
+++ b/chromium/net/cookies/cookie_inclusion_status.cc
@@ -170,28 +170,26 @@ CookieInclusionStatus::GetBreakingDowngradeMetricsEnumValue(
switch (reason) {
case WarningReason::WARN_STRICT_LAX_DOWNGRADE_STRICT_SAMESITE:
return url_is_secure
- ? ContextDowngradeMetricValues::STRICT_LAX_STRICT_SECURE
- : ContextDowngradeMetricValues::STRICT_LAX_STRICT_INSECURE;
+ ? ContextDowngradeMetricValues::kStrictLaxStrictSecure
+ : ContextDowngradeMetricValues::kStrictLaxStrictInsecure;
case WarningReason::WARN_STRICT_CROSS_DOWNGRADE_STRICT_SAMESITE:
return url_is_secure
- ? ContextDowngradeMetricValues::STRICT_CROSS_STRICT_SECURE
- : ContextDowngradeMetricValues::STRICT_CROSS_STRICT_INSECURE;
+ ? ContextDowngradeMetricValues::kStrictCrossStrictSecure
+ : ContextDowngradeMetricValues::kStrictCrossStrictInsecure;
case WarningReason::WARN_STRICT_CROSS_DOWNGRADE_LAX_SAMESITE:
return url_is_secure
- ? ContextDowngradeMetricValues::STRICT_CROSS_LAX_SECURE
- : ContextDowngradeMetricValues::STRICT_CROSS_LAX_INSECURE;
+ ? ContextDowngradeMetricValues::kStrictCrossLaxSecure
+ : ContextDowngradeMetricValues::kStrictCrossLaxInsecure;
case WarningReason::WARN_LAX_CROSS_DOWNGRADE_STRICT_SAMESITE:
return url_is_secure
- ? ContextDowngradeMetricValues::LAX_CROSS_STRICT_SECURE
- : ContextDowngradeMetricValues::LAX_CROSS_STRICT_INSECURE;
+ ? ContextDowngradeMetricValues::kLaxCrossStrictSecure
+ : ContextDowngradeMetricValues::kLaxCrossStrictInsecure;
case WarningReason::WARN_LAX_CROSS_DOWNGRADE_LAX_SAMESITE:
- return url_is_secure
- ? ContextDowngradeMetricValues::LAX_CROSS_LAX_SECURE
- : ContextDowngradeMetricValues::LAX_CROSS_LAX_INSECURE;
+ return url_is_secure ? ContextDowngradeMetricValues::kLaxCrossLaxSecure
+ : ContextDowngradeMetricValues::kLaxCrossLaxInsecure;
default:
- return url_is_secure
- ? ContextDowngradeMetricValues::NO_DOWNGRADE_SECURE
- : ContextDowngradeMetricValues::NO_DOWNGRADE_INSECURE;
+ return url_is_secure ? ContextDowngradeMetricValues::kNoDowngradeSecure
+ : ContextDowngradeMetricValues::kNoDowngradeInsecure;
}
}
@@ -227,6 +225,7 @@ std::string CookieInclusionStatus::GetDebugString() const {
"EXCLUDE_NAME_VALUE_PAIR_EXCEEDS_MAX_SIZE"},
{EXCLUDE_ATTRIBUTE_VALUE_EXCEEDS_MAX_SIZE,
"EXCLUDE_ATTRIBUTE_VALUE_EXCEEDS_MAX_SIZE"},
+ {EXCLUDE_DOMAIN_NON_ASCII, "EXCLUDE_DOMAIN_NON_ASCII"},
}) {
if (HasExclusionReason(reason.first))
base::StrAppend(&out, {reason.second, ", "});
@@ -261,19 +260,11 @@ std::string CookieInclusionStatus::GetDebugString() const {
"WARN_SAMEPARTY_EXCLUSION_OVERRULED_SAMESITE"},
{WARN_SAMEPARTY_INCLUSION_OVERRULED_SAMESITE,
"WARN_SAMEPARTY_INCLUSION_OVERRULED_SAMESITE"},
- {WARN_SAMESITE_NONE_REQUIRED, "WARN_SAMESITE_NONE_REQUIRED"},
- {WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_TOP_RESOURCE,
- "WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_TOP_RESOURCE"},
- {WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_ANCESTORS,
- "WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_ANCESTORS"},
- {WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_LAX,
- "WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_LAX"},
- {WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_STRICT,
- "WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_STRICT"},
{WARN_CROSS_SITE_REDIRECT_DOWNGRADE_CHANGES_INCLUSION,
"WARN_CROSS_SITE_REDIRECT_DOWNGRADE_CHANGES_INCLUSION"},
{WARN_ATTRIBUTE_VALUE_EXCEEDS_MAX_SIZE,
"WARN_ATTRIBUTE_VALUE_EXCEEDS_MAX_SIZE"},
+ {WARN_DOMAIN_NON_ASCII, "WARN_DOMAIN_NON_ASCII"},
}) {
if (HasWarningReason(reason.first))
base::StrAppend(&out, {reason.second, ", "});
diff --git a/chromium/net/cookies/cookie_inclusion_status.h b/chromium/net/cookies/cookie_inclusion_status.h
index 2e9c319a3d2..246fe025f27 100644
--- a/chromium/net/cookies/cookie_inclusion_status.h
+++ b/chromium/net/cookies/cookie_inclusion_status.h
@@ -94,6 +94,8 @@ class NET_EXPORT CookieInclusionStatus {
// whole cookie to be rejected. There will be a corresponding WarningReason
// to notify users that an attribute value was ignored in that case.
EXCLUDE_ATTRIBUTE_VALUE_EXCEEDS_MAX_SIZE = 20,
+ // Cookie was set with a Domain attribute containing non ASCII characters.
+ EXCLUDE_DOMAIN_NON_ASCII = 21,
// This should be kept last.
NUM_EXCLUSION_REASONS
@@ -186,26 +188,6 @@ class NET_EXPORT CookieInclusionStatus {
// contexts, for cookies that are 'SameParty; SameSite=Lax'.)
WARN_SAMEPARTY_INCLUSION_OVERRULED_SAMESITE = 11,
- // This cookie was SameSite=None and was included, but would have been
- // excluded if it had been SameParty and the SameParty context had been
- // computed using *either* top & current or the whole ancestor tree.
- WARN_SAMESITE_NONE_REQUIRED = 12,
- // This cookie was SameSite=None, was included, would have been included if
- // it had been SameParty and the SameParty context type had been computed
- // with only the top frame & resource URL, but would have been excluded if
- // the SameParty context type had been computed using all ancestor frames.
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_TOP_RESOURCE = 13,
- // This cookie was SameSite=None, was included, and would have been included
- // if it had been SameParty and the SameParty context type had been computed
- // using all ancestor frames.
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMEPARTY_ANCESTORS = 14,
- // This cookie was SameSite=None, was included, and would have been included
- // if it had been SameSite=Lax.
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_LAX = 15,
- // This cookie was SameSite=None, was included, and would have been included
- // if it had been SameSite=Strict.
- WARN_SAMESITE_NONE_INCLUDED_BY_SAMESITE_STRICT = 16,
-
// The cookie would have been included prior to the spec change considering
// redirects in the SameSite context calculation
// (https://github.com/httpwg/http-extensions/pull/1348)
@@ -216,13 +198,16 @@ class NET_EXPORT CookieInclusionStatus {
// was actually used for the inclusion decision). This is not applied if
// the context was downgraded but the cookie would have been
// included/excluded in both cases.
- WARN_CROSS_SITE_REDIRECT_DOWNGRADE_CHANGES_INCLUSION = 17,
+ WARN_CROSS_SITE_REDIRECT_DOWNGRADE_CHANGES_INCLUSION = 12,
// The cookie exceeded the attribute size limit. RFC6265bis indicates that
// large attributes should be ignored instead of causing the whole cookie
// to be rejected. This is applied by the code that parses cookie lines and
// notifies the user that an attribute value was ignored.
- WARN_ATTRIBUTE_VALUE_EXCEEDS_MAX_SIZE = 18,
+ WARN_ATTRIBUTE_VALUE_EXCEEDS_MAX_SIZE = 13,
+
+ // Cookie was set with a Domain attribute containing non ASCII characters.
+ WARN_DOMAIN_NON_ASCII = 14,
// This should be kept last.
NUM_WARNING_REASONS
@@ -230,30 +215,30 @@ class NET_EXPORT CookieInclusionStatus {
// These enums encode the context downgrade warnings + the secureness of the
// url sending/setting the cookie. They're used for metrics only. The format
- // is {context}_{schemeful_context}_{samesite_value}_{securness}.
- // NO_DOWNGRADE_{securness} indicates that a cookie didn't have a breaking
+ // is k{context}{schemeful_context}{samesite_value}{securness}.
+ // kNoDowngrade{securness} indicates that a cookie didn't have a breaking
// context downgrade and was A) included B) excluded only due to insufficient
// same-site context. I.e. the cookie wasn't excluded due to other reasons
// such as third-party cookie blocking. Keep this in line with
// SameSiteCookieContextBreakingDowngradeWithSecureness in enums.xml.
- enum ContextDowngradeMetricValues {
- NO_DOWNGRADE_INSECURE = 0,
- NO_DOWNGRADE_SECURE = 1,
-
- STRICT_LAX_STRICT_INSECURE = 2,
- STRICT_CROSS_STRICT_INSECURE = 3,
- STRICT_CROSS_LAX_INSECURE = 4,
- LAX_CROSS_STRICT_INSECURE = 5,
- LAX_CROSS_LAX_INSECURE = 6,
-
- STRICT_LAX_STRICT_SECURE = 7,
- STRICT_CROSS_STRICT_SECURE = 8,
- STRICT_CROSS_LAX_SECURE = 9,
- LAX_CROSS_STRICT_SECURE = 10,
- LAX_CROSS_LAX_SECURE = 11,
+ enum class ContextDowngradeMetricValues {
+ kNoDowngradeInsecure = 0,
+ kNoDowngradeSecure = 1,
+
+ kStrictLaxStrictInsecure = 2,
+ kStrictCrossStrictInsecure = 3,
+ kStrictCrossLaxInsecure = 4,
+ kLaxCrossStrictInsecure = 5,
+ kLaxCrossLaxInsecure = 6,
+
+ kStrictLaxStrictSecure = 7,
+ kStrictCrossStrictSecure = 8,
+ kStrictCrossLaxSecure = 9,
+ kLaxCrossStrictSecure = 10,
+ kLaxCrossLaxSecure = 11,
// Keep last.
- kMaxValue = LAX_CROSS_LAX_SECURE
+ kMaxValue = kLaxCrossLaxSecure
};
using ExclusionReasonBitset =
diff --git a/chromium/net/cookies/cookie_monster.cc b/chromium/net/cookies/cookie_monster.cc
index 644e5fc1371..937e61e2663 100644
--- a/chromium/net/cookies/cookie_monster.cc
+++ b/chromium/net/cookies/cookie_monster.cc
@@ -59,6 +59,7 @@
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/ranges/algorithm.h"
+#include "base/strings/strcat.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
@@ -82,6 +83,7 @@
#include "url/origin.h"
#include "url/third_party/mozilla/url_parse.h"
#include "url/url_canon.h"
+#include "url/url_constants.h"
using base::Time;
using base::TimeTicks;
@@ -159,6 +161,13 @@ bool IncludeUnpartitionedCookies(
return false;
}
+size_t NameValueSizeBytes(const std::string& name, const std::string& value) {
+ base::CheckedNumeric<size_t> name_value_pair_size = name.size();
+ name_value_pair_size += value.size();
+ DCHECK(name_value_pair_size.IsValid());
+ return name_value_pair_size.ValueOrDie();
+}
+
} // namespace
namespace net {
@@ -993,12 +1002,11 @@ void CookieMonster::EnsureCookiesMapIsValid() {
DCHECK(thread_checker_.CalledOnValidThread());
// Iterate through all the of the cookies, grouped by host.
- auto prev_range_end = cookies_.begin();
- while (prev_range_end != cookies_.end()) {
- auto cur_range_begin = prev_range_end;
+ for (auto next = cookies_.begin(); next != cookies_.end();) {
+ auto cur_range_begin = next;
const std::string key = cur_range_begin->first; // Keep a copy.
auto cur_range_end = cookies_.upper_bound(key);
- prev_range_end = cur_range_end;
+ next = cur_range_end;
// Ensure no equivalent cookies for this host.
TrimDuplicateCookiesForKey(key, cur_range_begin, cur_range_end,
@@ -1117,8 +1125,10 @@ void CookieMonster::TrimDuplicateCookiesForKey(
}
std::vector<CanonicalCookie*>
-CookieMonster::FindCookiesForRegistryControlledHost(const GURL& url,
- CookieMap* cookie_map) {
+CookieMonster::FindCookiesForRegistryControlledHost(
+ const GURL& url,
+ CookieMap* cookie_map,
+ CookieMonster::PartitionedCookieMap::iterator* partition_it) {
DCHECK(thread_checker_.CalledOnValidThread());
if (!cookie_map)
@@ -1138,7 +1148,14 @@ CookieMonster::FindCookiesForRegistryControlledHost(const GURL& url,
// If the cookie is expired, delete it.
if (cc->IsExpired(current_time)) {
- InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPIRED);
+ if (cc->IsPartitioned()) {
+ DCHECK(partition_it);
+ DCHECK_EQ((*partition_it)->second.get(), cookie_map);
+ InternalDeletePartitionedCookie(*partition_it, curit, true,
+ DELETE_COOKIE_EXPIRED);
+ } else {
+ InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPIRED);
+ }
continue;
}
cookies.push_back(cc);
@@ -1157,7 +1174,7 @@ CookieMonster::FindPartitionedCookiesForRegistryControlledHost(
if (it == partitioned_cookies_.end())
return std::vector<CanonicalCookie*>();
- return FindCookiesForRegistryControlledHost(url, it->second.get());
+ return FindCookiesForRegistryControlledHost(url, it->second.get(), &it);
}
void CookieMonster::FilterCookiesWithOptions(
@@ -1542,6 +1559,11 @@ void CookieMonster::SetCanonicalCookie(
1 + IsolationInfo::kPartyContextMaxSize);
}
+ if (cc->IsEffectivelySameSiteNone()) {
+ UMA_HISTOGRAM_COUNTS_10000("Cookie.SameSiteNoneSizeBytes",
+ NameValueSizeBytes(cc->Name(), cc->Value()));
+ }
+
bool is_partitioned_cookie = cc->IsPartitioned();
CookiePartitionKey cookie_partition_key;
if (is_partitioned_cookie)
@@ -1562,11 +1584,11 @@ void CookieMonster::SetCanonicalCookie(
CookieSource cookie_source_sample =
(source_url.SchemeIsCryptographic()
? (cc->IsSecure()
- ? COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME
- : COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME)
+ ? CookieSource::kSecureCookieCryptographicScheme
+ : CookieSource::kNonsecureCookieCryptographicScheme)
: (cc->IsSecure()
- ? COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME
- : COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME));
+ ? CookieSource::kSecureCookieNoncryptographicScheme
+ : CookieSource::kNonsecureCookieNoncryptographicScheme));
UMA_HISTOGRAM_ENUMERATION("Cookie.CookieSourceScheme",
cookie_source_sample);
@@ -2238,8 +2260,20 @@ bool CookieMonster::DoRecordPeriodicStats() {
base::UmaHistogramCounts100000("Cookie.Count2", cookies_.size());
if (cookie_access_delegate()) {
- absl::optional<base::flat_map<SchemefulSite, std::set<SchemefulSite>>>
- maybe_sets = cookie_access_delegate()->RetrieveFirstPartySets(
+ std::vector<SchemefulSite> sites;
+ for (const auto& entry : cookies_) {
+ sites.emplace_back(
+ GURL(base::StrCat({url::kHttpsScheme, "://", entry.first})));
+ }
+ for (const auto& [partition_key, cookie_map] : partitioned_cookies_) {
+ for (const auto& [domain, unused_cookie] : *cookie_map) {
+ sites.emplace_back(
+ GURL(base::StrCat({url::kHttpsScheme, "://", domain})));
+ }
+ }
+ absl::optional<base::flat_map<SchemefulSite, FirstPartySetEntry>>
+ maybe_sets = cookie_access_delegate()->FindFirstPartySetOwners(
+ sites,
base::BindOnce(&CookieMonster::RecordPeriodicFirstPartySetsStats,
weak_ptr_factory_.GetWeakPtr()));
if (maybe_sets.has_value())
@@ -2252,6 +2286,20 @@ bool CookieMonster::DoRecordPeriodicStats() {
// Can be up to kMaxCookies.
UMA_HISTOGRAM_COUNTS_10000("Cookie.NumKeys", num_keys_);
+ std::map<std::string, size_t> n_same_site_none_cookies;
+ for (const auto& [host_key, host_cookie] : cookies_) {
+ if (!host_cookie || !host_cookie->IsEffectivelySameSiteNone())
+ continue;
+ n_same_site_none_cookies[host_key]++;
+ }
+ size_t max_n_cookies = 0;
+ for (const auto& entry : n_same_site_none_cookies) {
+ max_n_cookies = std::max(max_n_cookies, entry.second);
+ }
+ // Can be up to 180 cookies, the max per-domain.
+ base::UmaHistogramCounts1000("Cookie.MaxSameSiteNoneCookiesPerKey",
+ max_n_cookies);
+
// Collect stats for partitioned cookies if they are enabled.
if (base::FeatureList::IsEnabled(features::kPartitionedCookies)) {
base::UmaHistogramCounts1000("Cookie.PartitionCount",
@@ -2264,8 +2312,12 @@ bool CookieMonster::DoRecordPeriodicStats() {
}
void CookieMonster::RecordPeriodicFirstPartySetsStats(
- base::flat_map<SchemefulSite, std::set<SchemefulSite>> sets) const {
- for (const auto& set : sets) {
+ base::flat_map<SchemefulSite, FirstPartySetEntry> sets) const {
+ base::flat_map<SchemefulSite, std::set<SchemefulSite>> grouped_by_owner;
+ for (const auto& [site, entry] : sets) {
+ grouped_by_owner[entry.primary()].insert(site);
+ }
+ for (const auto& set : grouped_by_owner) {
int sample = std::accumulate(
set.second.begin(), set.second.end(), 0,
[this](int acc, const net::SchemefulSite& site) -> int {
diff --git a/chromium/net/cookies/cookie_monster.h b/chromium/net/cookies/cookie_monster.h
index d2cfebf4900..213d37d2509 100644
--- a/chromium/net/cookies/cookie_monster.h
+++ b/chromium/net/cookies/cookie_monster.h
@@ -344,17 +344,17 @@ class NET_EXPORT CookieMonster : public CookieStore {
// entries. New items MUST be added at the end of the list, and kMaxValue
// should be updated to the last value.
//
- // COOKIE_SOURCE_(NON)SECURE_COOKIE_(NON)CRYPTOGRAPHIC_SCHEME means
+ // CookieSource::k(Non)SecureCookie(Non)CryptographicScheme means
// that a cookie was set or overwritten from a URL with the given type
// of scheme. This enum should not be used when cookies are *cleared*,
// because its purpose is to understand if Chrome can deprecate the
// ability of HTTP urls to set/overwrite Secure cookies.
- enum CookieSource {
- COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME = 0,
- COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME,
- COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME,
- COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME,
- kMaxValue = COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME
+ enum class CookieSource : uint8_t {
+ kSecureCookieCryptographicScheme = 0,
+ kSecureCookieNoncryptographicScheme,
+ kNonsecureCookieCryptographicScheme,
+ kNonsecureCookieNoncryptographicScheme,
+ kMaxValue = kNonsecureCookieNoncryptographicScheme
};
// Enum for collecting metrics on how frequently a cookie is sent to the same
@@ -483,7 +483,8 @@ class NET_EXPORT CookieMonster : public CookieStore {
std::vector<CanonicalCookie*> FindCookiesForRegistryControlledHost(
const GURL& url,
- CookieMap* cookie_map = nullptr);
+ CookieMap* cookie_map = nullptr,
+ PartitionedCookieMap::iterator* partition_it = nullptr);
std::vector<CanonicalCookie*> FindPartitionedCookiesForRegistryControlledHost(
const CookiePartitionKey& cookie_partition_key,
@@ -688,10 +689,8 @@ class NET_EXPORT CookieMonster : public CookieStore {
// First-Party Sets presents a potentially asynchronous interface, these stats
// may be collected asynchronously w.r.t. the rest of the stats collected by
// `RecordPeriodicStats`.
- // TODO(https://crbug.com/1266014): don't assume that the sets can all fit in
- // memory at once.
void RecordPeriodicFirstPartySetsStats(
- base::flat_map<SchemefulSite, std::set<SchemefulSite>> sets) const;
+ base::flat_map<SchemefulSite, FirstPartySetEntry> sets) const;
// Defers the callback until the full coookie database has been loaded. If
// it's already been loaded, runs the callback synchronously.
diff --git a/chromium/net/cookies/cookie_monster_perftest.cc b/chromium/net/cookies/cookie_monster_perftest.cc
index 12de7b53e46..6ad5922a685 100644
--- a/chromium/net/cookies/cookie_monster_perftest.cc
+++ b/chromium/net/cookies/cookie_monster_perftest.cc
@@ -63,7 +63,7 @@ perf_test::PerfResultReporter SetUpCookieMonsterReporter(
class CookieMonsterTest : public testing::Test {
public:
- CookieMonsterTest() {}
+ CookieMonsterTest() = default;
private:
base::test::SingleThreadTaskEnvironment task_environment_{
@@ -220,7 +220,7 @@ TEST_F(CookieMonsterTest, TestAddCookieOnManyHosts) {
std::string cookie(kCookieLine);
std::vector<GURL> gurls; // just wanna have ffffuunnn
for (int i = 0; i < kNumCookies; ++i) {
- gurls.push_back(GURL(base::StringPrintf("https://a%04d.izzle", i)));
+ gurls.emplace_back(base::StringPrintf("https://a%04d.izzle", i));
}
SetCookieCallback setCookieCallback;
@@ -356,7 +356,7 @@ TEST_F(CookieMonsterTest, TestDomainLine) {
}
TEST_F(CookieMonsterTest, TestImport) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
std::vector<std::unique_ptr<CanonicalCookie>> initial_cookies;
GetCookieListCallback getCookieListCallback;
@@ -377,8 +377,8 @@ TEST_F(CookieMonsterTest, TestImport) {
store->SetLoadExpectation(true, std::move(initial_cookies));
- std::unique_ptr<CookieMonster> cm(
- new CookieMonster(store.get(), nullptr, kFirstPartySetsEnabled));
+ auto cm = std::make_unique<CookieMonster>(store.get(), nullptr,
+ kFirstPartySetsEnabled);
// Import will happen on first access.
GURL gurl("www.foo.com");
@@ -394,8 +394,8 @@ TEST_F(CookieMonsterTest, TestImport) {
}
TEST_F(CookieMonsterTest, TestGetKey) {
- std::unique_ptr<CookieMonster> cm(
- new CookieMonster(nullptr, nullptr, kFirstPartySetsEnabled));
+ auto cm =
+ std::make_unique<CookieMonster>(nullptr, nullptr, kFirstPartySetsEnabled);
auto reporter = SetUpCookieMonsterReporter("baseline_story");
base::ElapsedTimer get_key_timer;
for (int i = 0; i < kNumCookies; i++)
diff --git a/chromium/net/cookies/cookie_monster_store_test.cc b/chromium/net/cookies/cookie_monster_store_test.cc
index 1bc8e950827..38bce0b9b6a 100644
--- a/chromium/net/cookies/cookie_monster_store_test.cc
+++ b/chromium/net/cookies/cookie_monster_store_test.cc
@@ -141,8 +141,10 @@ void MockSimplePersistentCookieStore::Load(
const NetLogWithSource& /* net_log */) {
std::vector<std::unique_ptr<CanonicalCookie>> out_cookies;
- for (auto it = cookies_.begin(); it != cookies_.end(); it++)
- out_cookies.push_back(std::make_unique<CanonicalCookie>(it->second));
+ for (const auto& cookie_map_it : cookies_) {
+ out_cookies.push_back(
+ std::make_unique<CanonicalCookie>(cookie_map_it.second));
+ }
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
@@ -203,8 +205,7 @@ std::unique_ptr<CookieMonster> CreateMonsterFromStoreForGC(
int days_old) {
base::Time current(base::Time::Now());
base::Time past_creation(base::Time::Now() - base::Days(100));
- scoped_refptr<MockSimplePersistentCookieStore> store(
- new MockSimplePersistentCookieStore);
+ auto store = base::MakeRefCounted<MockSimplePersistentCookieStore>();
int total_cookies = num_secure_cookies + num_non_secure_cookies;
int base = 0;
// Must expire to be persistent
diff --git a/chromium/net/cookies/cookie_monster_unittest.cc b/chromium/net/cookies/cookie_monster_unittest.cc
index f143924451e..7150e7399cb 100644
--- a/chromium/net/cookies/cookie_monster_unittest.cc
+++ b/chromium/net/cookies/cookie_monster_unittest.cc
@@ -376,9 +376,9 @@ class CookieMonsterTestBase : public CookieStoreTest<T> {
const std::string& domain,
const std::string& name) {
CookieList cookies = this->GetAllCookies(cm);
- for (auto it = cookies.begin(); it != cookies.end(); ++it)
- if (it->Domain() == domain && it->Name() == name)
- return this->DeleteCanonicalCookie(cm, *it);
+ for (auto& cookie : cookies)
+ if (cookie.Domain() == domain && cookie.Name() == name)
+ return this->DeleteCanonicalCookie(cm, cookie);
return false;
}
@@ -557,7 +557,7 @@ class CookieMonsterTestBase : public CookieStoreTest<T> {
CookiePriorityToString(priority).c_str(),
is_secure ? "secure" : "");
EXPECT_TRUE(SetCookie(cm, https_www_foo_.url(), cookie));
- cookie_data.push_back(std::make_pair(is_secure, priority));
+ cookie_data.emplace_back(is_secure, priority);
id_list[is_secure][priority].push_back(next_cookie_id);
}
}
@@ -957,9 +957,9 @@ class CookieMonsterTestBase : public CookieStoreTest<T> {
// Function for creating a CM with a number of cookies in it,
// no store (and hence no ability to affect access time).
- CookieMonster* CreateMonsterForGC(int num_cookies) {
- CookieMonster* cm(
- new CookieMonster(nullptr, net::NetLog::Get(), kFirstPartySetsDefault));
+ std::unique_ptr<CookieMonster> CreateMonsterForGC(int num_cookies) {
+ auto cm = std::make_unique<CookieMonster>(nullptr, net::NetLog::Get(),
+ kFirstPartySetsDefault);
base::Time creation_time = base::Time::Now();
for (int i = 0; i < num_cookies; i++) {
std::unique_ptr<CanonicalCookie> cc(
@@ -979,16 +979,16 @@ class CookieMonsterTestBase : public CookieStoreTest<T> {
}
bool IsCookieInList(const CanonicalCookie& cookie, const CookieList& list) {
- for (auto it = list.begin(); it != list.end(); ++it) {
- if (it->Name() == cookie.Name() && it->Value() == cookie.Value() &&
- it->Domain() == cookie.Domain() && it->Path() == cookie.Path() &&
- it->CreationDate() == cookie.CreationDate() &&
- it->ExpiryDate() == cookie.ExpiryDate() &&
- it->LastAccessDate() == cookie.LastAccessDate() &&
- it->LastUpdateDate() == cookie.LastUpdateDate() &&
- it->IsSecure() == cookie.IsSecure() &&
- it->IsHttpOnly() == cookie.IsHttpOnly() &&
- it->Priority() == cookie.Priority()) {
+ for (const auto& c : list) {
+ if (c.Name() == cookie.Name() && c.Value() == cookie.Value() &&
+ c.Domain() == cookie.Domain() && c.Path() == cookie.Path() &&
+ c.CreationDate() == cookie.CreationDate() &&
+ c.ExpiryDate() == cookie.ExpiryDate() &&
+ c.LastAccessDate() == cookie.LastAccessDate() &&
+ c.LastUpdateDate() == cookie.LastUpdateDate() &&
+ c.IsSecure() == cookie.IsSecure() &&
+ c.IsHttpOnly() == cookie.IsHttpOnly() &&
+ c.Priority() == cookie.Priority()) {
return true;
}
}
@@ -1443,9 +1443,9 @@ TEST_F(DeferredCookieTaskTest, DeferredTaskOrder) {
}
TEST_F(CookieMonsterTest, TestCookieDeleteAll) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
CookieOptions options = CookieOptions::MakeAllInclusive();
EXPECT_TRUE(SetCookie(cm.get(), http_www_foo_.url(), kValidCookieLine));
@@ -1740,9 +1740,9 @@ static const base::TimeDelta kAccessDelay =
kLastAccessThreshold + base::Milliseconds(20);
TEST_F(CookieMonsterTest, TestLastAccess) {
- std::unique_ptr<CookieMonster> cm(
- new CookieMonster(nullptr, kLastAccessThreshold, net::NetLog::Get(),
- kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(nullptr, kLastAccessThreshold,
+ net::NetLog::Get(),
+ kFirstPartySetsDefault);
EXPECT_TRUE(SetCookie(cm.get(), http_www_foo_.url(), "A=B"));
const Time last_access_date(GetFirstCookieAccessDate(cm.get()));
@@ -1803,8 +1803,8 @@ TEST_F(CookieMonsterTest, SetCookieableSchemes) {
auto cm = std::make_unique<CookieMonster>(nullptr, net::NetLog::Get(),
kFirstPartySetsDefault);
- std::unique_ptr<CookieMonster> cm_foo(
- new CookieMonster(nullptr, net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cm_foo = std::make_unique<CookieMonster>(nullptr, net::NetLog::Get(),
+ kFirstPartySetsDefault);
// Only cm_foo should allow foo:// cookies.
std::vector<std::string> schemes;
@@ -1865,9 +1865,9 @@ TEST_F(CookieMonsterTest, SetCookieableSchemes) {
}
TEST_F(CookieMonsterTest, GetAllCookiesForURL) {
- std::unique_ptr<CookieMonster> cm(
- new CookieMonster(nullptr, kLastAccessThreshold, net::NetLog::Get(),
- kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(nullptr, kLastAccessThreshold,
+ net::NetLog::Get(),
+ kFirstPartySetsDefault);
// Create an httponly cookie.
CookieOptions options = CookieOptions::MakeAllInclusive();
@@ -1983,9 +1983,9 @@ TEST_F(CookieMonsterTest, GetAllCookiesForURL) {
}
TEST_F(CookieMonsterTest, GetExcludedCookiesForURL) {
- std::unique_ptr<CookieMonster> cm(
- new CookieMonster(nullptr, kLastAccessThreshold, net::NetLog::Get(),
- kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(nullptr, kLastAccessThreshold,
+ net::NetLog::Get(),
+ kFirstPartySetsDefault);
// Create an httponly cookie.
CookieOptions options = CookieOptions::MakeAllInclusive();
@@ -2248,13 +2248,44 @@ TEST_F(CookieMonsterTest, DeleteExpiredCookiesOnGet) {
EXPECT_EQ(1u, cookies.size());
}
+// Test that cookie expiration works when there are only partitioned cookies and
+// expiration happens without SetCookie.
+TEST_F(CookieMonsterTest, DeleteExpiredPartitionedCookiesOnlyOnGet) {
+ auto cm = std::make_unique<CookieMonster>(
+ /*store=*/nullptr, net::NetLog::Get(), kFirstPartySetsDefault);
+ auto cookie_partition_key =
+ CookiePartitionKey::FromURLForTesting(GURL("https://toplevelsite.com"));
+
+ EXPECT_TRUE(SetCookie(cm.get(), https_www_bar_.url(),
+ "__Host-A=B; secure; path=/; partitioned",
+ cookie_partition_key));
+ // Set a cookie with a Max-Age. Since we only parse integers for this
+ // attribute, 1 second is the minimum allowable time.
+ EXPECT_TRUE(SetCookie(cm.get(), https_www_bar_.url(),
+ "__Host-C=D; secure; path=/; partitioned; max-age=1",
+ cookie_partition_key));
+
+ CookieList cookies =
+ GetAllCookiesForURL(cm.get(), https_www_bar_.url(),
+ CookiePartitionKeyCollection(cookie_partition_key));
+ EXPECT_EQ(2u, cookies.size());
+
+ // Sleep for entire Max-Age of the second cookie.
+ base::PlatformThread::Sleep(base::Seconds(1));
+
+ cookies =
+ GetAllCookiesForURL(cm.get(), https_www_bar_.url(),
+ CookiePartitionKeyCollection(cookie_partition_key));
+ EXPECT_EQ(1u, cookies.size());
+}
+
// Tests importing from a persistent cookie store that contains duplicate
// equivalent cookies. This situation should be handled by removing the
// duplicate cookie (both from the in-memory cache, and from the backing store).
//
// This is a regression test for: http://crbug.com/17855.
TEST_F(CookieMonsterTest, DontImportDuplicateCookies) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
// We will fill some initial cookies into the PersistentCookieStore,
// to simulate a database with 4 duplicates. Note that we need to
@@ -2304,8 +2335,8 @@ TEST_F(CookieMonsterTest, DontImportDuplicateCookies) {
// Inject our initial cookies into the mock PersistentCookieStore.
store->SetLoadExpectation(true, std::move(initial_cookies));
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
// Verify that duplicates were not imported for path "/".
// (If this had failed, GetCookies() would have also returned X=1, X=2, X=4).
@@ -2349,9 +2380,9 @@ TEST_F(CookieMonsterTest, DontImportDuplicateCookies_PartitionedCookies) {
Time::Now() + base::Days(1), absl::nullopt, cookie_partition_key);
initial_cookies.push_back(std::move(cc));
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
store->SetLoadExpectation(true, std::move(initial_cookies));
@@ -2372,7 +2403,7 @@ TEST_F(CookieMonsterTest, DontImportDuplicateCookies_PartitionedCookies) {
//
// This is a regression test for: http://crbug.com/43188.
TEST_F(CookieMonsterTest, ImportDuplicateCreationTimes) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
Time now(Time::Now());
Time earlier(now - base::Days(1));
@@ -2403,8 +2434,8 @@ TEST_F(CookieMonsterTest, ImportDuplicateCreationTimes) {
// Inject our initial cookies into the mock PersistentCookieStore.
store->SetLoadExpectation(true, std::move(initial_cookies));
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
CookieList list(GetAllCookies(cm.get()));
EXPECT_EQ(2U, list.size());
@@ -2417,7 +2448,7 @@ TEST_F(CookieMonsterTest, ImportDuplicateCreationTimes) {
}
TEST_F(CookieMonsterTest, ImportDuplicateCreationTimes_PartitionedCookies) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
Time now(Time::Now());
Time earlier(now - base::Days(1));
@@ -2461,8 +2492,8 @@ TEST_F(CookieMonsterTest, ImportDuplicateCreationTimes_PartitionedCookies) {
// Inject our initial cookies into the mock PersistentCookieStore.
store->SetLoadExpectation(true, std::move(initial_cookies));
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
CookieList list(GetAllCookies(cm.get()));
EXPECT_EQ(2U, list.size());
@@ -2533,8 +2564,7 @@ TEST_F(CookieMonsterTest, BackingStoreCommunication) {
// Store details for cookies transforming through the backing store interface.
base::Time current(base::Time::Now());
- scoped_refptr<MockSimplePersistentCookieStore> store(
- new MockSimplePersistentCookieStore);
+ auto store = base::MakeRefCounted<MockSimplePersistentCookieStore>();
base::Time expires(base::Time::Now() + base::Seconds(100));
const CookiesInputInfo input_info[] = {
@@ -2551,8 +2581,8 @@ TEST_F(CookieMonsterTest, BackingStoreCommunication) {
// Create new cookies and flush them to the store.
{
- std::unique_ptr<CookieMonster> cmout(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cmout = std::make_unique<CookieMonster>(
+ store.get(), net::NetLog::Get(), kFirstPartySetsDefault);
for (const auto& cookie : input_info) {
EXPECT_TRUE(SetCanonicalCookie(
cmout.get(),
@@ -2571,8 +2601,8 @@ TEST_F(CookieMonsterTest, BackingStoreCommunication) {
// Create a new cookie monster and make sure that everything is correct
{
- std::unique_ptr<CookieMonster> cmin(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cmin = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
CookieList cookies(GetAllCookies(cmin.get()));
ASSERT_EQ(2u, cookies.size());
// Ordering is path length, then creation time. So second cookie
@@ -2777,10 +2807,10 @@ TEST_F(CookieMonsterTest, GarbageCollectWithSecureCookiesOnly) {
TEST_F(CookieMonsterTest, WhileLoadingLoadCompletesBeforeKeyLoadCompletes) {
const GURL kUrl = GURL(kTopLevelDomainPlus1);
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
store->set_store_load_commands(true);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
auto cookie = CanonicalCookie::Create(
kUrl, "a=b", base::Time::Now(), absl::nullopt /* server_time */,
@@ -2827,10 +2857,10 @@ TEST_F(CookieMonsterTest, WhileLoadingLoadCompletesBeforeKeyLoadCompletes) {
TEST_F(CookieMonsterTest, WhileLoadingDeleteAllGetForURL) {
const GURL kUrl = GURL(kTopLevelDomainPlus1);
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
store->set_store_load_commands(true);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
ResultSavingCookieCallback<uint32_t> delete_callback;
cm->DeleteAllAsync(delete_callback.MakeCallback());
@@ -2867,10 +2897,10 @@ TEST_F(CookieMonsterTest, WhileLoadingDeleteAllGetForURL) {
TEST_F(CookieMonsterTest, WhileLoadingGetAllSetGetAll) {
const GURL kUrl = GURL(kTopLevelDomainPlus1);
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
store->set_store_load_commands(true);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
GetAllCookiesCallback get_cookies_callback1;
cm->GetAllCookiesAsync(get_cookies_callback1.MakeCallback());
@@ -2918,10 +2948,10 @@ void RunClosureOnAllCookiesReceived(base::OnceClosure closure,
TEST_F(CookieMonsterTest, CheckOrderOfCookieTaskQueueWhenLoadingCompletes) {
const GURL kUrl = GURL(kTopLevelDomainPlus1);
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
store->set_store_load_commands(true);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
// Get all cookies task that queues a task to set a cookie when executed.
auto cookie = CanonicalCookie::Create(
@@ -3016,7 +3046,7 @@ TEST_F(CookieMonsterTest, FlushStore) {
}
TEST_F(CookieMonsterTest, SetAllCookies) {
- scoped_refptr<FlushablePersistentStore> store(new FlushablePersistentStore());
+ auto store = base::MakeRefCounted<FlushablePersistentStore>();
auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
kFirstPartySetsDefault);
cm->SetPersistSessionCookies(true);
@@ -3088,7 +3118,7 @@ TEST_F(CookieMonsterTest, SetAllCookies) {
// Check that DeleteAll does flush (as a quick check that flush_count() works).
TEST_F(CookieMonsterTest, DeleteAll) {
- scoped_refptr<FlushablePersistentStore> store(new FlushablePersistentStore());
+ auto store = base::MakeRefCounted<FlushablePersistentStore>();
auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
kFirstPartySetsDefault);
cm->SetPersistSessionCookies(true);
@@ -3162,9 +3192,9 @@ TEST_F(CookieMonsterTest, InvalidExpiryTime) {
// Test that CookieMonster writes session cookies into the underlying
// CookieStore if the "persist session cookies" option is on.
TEST_F(CookieMonsterTest, PersistSessionCookies) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
cm->SetPersistSessionCookies(true);
// All cookies set with SetCookie are session cookies.
@@ -3200,9 +3230,9 @@ TEST_F(CookieMonsterTest, PersistSessionCookies) {
// Test the commands sent to the persistent cookie store.
TEST_F(CookieMonsterTest, PersisentCookieStorageTest) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
// Add a cookie.
EXPECT_TRUE(SetCookie(cm.get(), http_www_foo_.url(),
@@ -3251,7 +3281,7 @@ TEST_F(CookieMonsterTest, ControlCharacterPurge) {
const std::string domain("host");
const std::string path("/path");
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
std::vector<std::unique_ptr<CanonicalCookie>> initial_cookies;
@@ -3300,8 +3330,8 @@ TEST_F(CookieMonsterTest, ControlCharacterPurge) {
// Inject our initial cookies into the mock PersistentCookieStore.
store->SetLoadExpectation(true, std::move(initial_cookies));
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
EXPECT_EQ("foo=bar; hello=world",
GetCookies(cm.get(), url,
@@ -3313,9 +3343,9 @@ TEST_F(CookieMonsterTest, CookieSourceHistogram) {
base::HistogramTester histograms;
const std::string cookie_source_histogram = "Cookie.CookieSourceScheme";
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
histograms.ExpectTotalCount(cookie_source_histogram, 0);
@@ -3324,21 +3354,21 @@ TEST_F(CookieMonsterTest, CookieSourceHistogram) {
histograms.ExpectTotalCount(cookie_source_histogram, 1);
histograms.ExpectBucketCount(
cookie_source_histogram,
- CookieMonster::COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME, 1);
+ CookieMonster::CookieSource::kSecureCookieCryptographicScheme, 1);
// Set a non-secure cookie on a cryptographic scheme.
EXPECT_TRUE(SetCookie(cm.get(), https_www_foo_.url(), "C=D; path=/;"));
histograms.ExpectTotalCount(cookie_source_histogram, 2);
histograms.ExpectBucketCount(
cookie_source_histogram,
- CookieMonster::COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME, 1);
+ CookieMonster::CookieSource::kNonsecureCookieCryptographicScheme, 1);
// Set a secure cookie on a non-cryptographic scheme.
EXPECT_FALSE(SetCookie(cm.get(), http_www_foo_.url(), "D=E; path=/; Secure"));
histograms.ExpectTotalCount(cookie_source_histogram, 2);
histograms.ExpectBucketCount(
cookie_source_histogram,
- CookieMonster::COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME, 0);
+ CookieMonster::CookieSource::kSecureCookieNoncryptographicScheme, 0);
// Overwrite a secure cookie (set by a cryptographic scheme) on a
// non-cryptographic scheme.
@@ -3346,10 +3376,10 @@ TEST_F(CookieMonsterTest, CookieSourceHistogram) {
histograms.ExpectTotalCount(cookie_source_histogram, 2);
histograms.ExpectBucketCount(
cookie_source_histogram,
- CookieMonster::COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME, 1);
+ CookieMonster::CookieSource::kSecureCookieCryptographicScheme, 1);
histograms.ExpectBucketCount(
cookie_source_histogram,
- CookieMonster::COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME, 0);
+ CookieMonster::CookieSource::kSecureCookieNoncryptographicScheme, 0);
// Test that attempting to clear a secure cookie on a http:// URL does
// nothing.
@@ -3368,7 +3398,7 @@ TEST_F(CookieMonsterTest, CookieSourceHistogram) {
histograms.ExpectTotalCount(cookie_source_histogram, 4);
histograms.ExpectBucketCount(
cookie_source_histogram,
- CookieMonster::COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME, 1);
+ CookieMonster::CookieSource::kNonsecureCookieNoncryptographicScheme, 1);
}
// Test that inserting the first cookie for a key and deleting the last cookie
@@ -3377,7 +3407,7 @@ TEST_F(CookieMonsterTest, NumKeysHistogram) {
const char kHistogramName[] = "Cookie.NumKeys";
// Test loading cookies from store.
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
std::vector<std::unique_ptr<CanonicalCookie>> initial_cookies;
initial_cookies.push_back(CanonicalCookie::Create(
GURL("http://domain1.test"), "A=1", base::Time::Now(),
@@ -3470,6 +3500,57 @@ TEST_F(CookieMonsterTest, NumKeysHistogram) {
}
}
+TEST_F(CookieMonsterTest, MaxSameSiteNoneCookiesPerKey) {
+ const char kHistogramName[] = "Cookie.MaxSameSiteNoneCookiesPerKey";
+
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
+ ASSERT_EQ(0u, GetAllCookies(cm.get()).size());
+
+ { // Only SameSite cookies should not log a sample.
+ base::HistogramTester histogram_tester;
+
+ ASSERT_TRUE(CreateAndSetCookie(cm.get(), GURL("https://domain1.test"),
+ "A=1;SameSite=Lax",
+ CookieOptions::MakeAllInclusive()));
+ ASSERT_EQ(1u, GetAllCookies(cm.get()).size());
+ ASSERT_TRUE(cm->DoRecordPeriodicStatsForTesting());
+ histogram_tester.ExpectUniqueSample(kHistogramName, 0 /* sample */,
+ 1 /* count */);
+ }
+
+ { // SameSite=None cookie should log a sample.
+ base::HistogramTester histogram_tester;
+
+ ASSERT_TRUE(CreateAndSetCookie(cm.get(), GURL("https://domain1.test"),
+ "B=2;SameSite=None;Secure",
+ CookieOptions::MakeAllInclusive()));
+ ASSERT_EQ(2u, GetAllCookies(cm.get()).size());
+ ASSERT_TRUE(cm->DoRecordPeriodicStatsForTesting());
+ histogram_tester.ExpectUniqueSample(kHistogramName, 1 /* sample */,
+ 1 /* count */);
+ }
+
+ { // Should log the maximum number of SameSite=None cookies.
+ base::HistogramTester histogram_tester;
+
+ ASSERT_TRUE(CreateAndSetCookie(cm.get(), GURL("https://domain2.test"),
+ "A=1;SameSite=None;Secure",
+ CookieOptions::MakeAllInclusive()));
+ ASSERT_TRUE(CreateAndSetCookie(cm.get(), GURL("https://domain2.test"),
+ "B=2;SameSite=None;Secure",
+ CookieOptions::MakeAllInclusive()));
+ ASSERT_TRUE(CreateAndSetCookie(cm.get(), GURL("https://domain3.test"),
+ "A=1;SameSite=None;Secure",
+ CookieOptions::MakeAllInclusive()));
+ ASSERT_EQ(5u, GetAllCookies(cm.get()).size());
+ ASSERT_TRUE(cm->DoRecordPeriodicStatsForTesting());
+ histogram_tester.ExpectUniqueSample(kHistogramName, 2 /* sample */,
+ 1 /* count */);
+ }
+}
+
// Test that localhost URLs can set and get secure cookies, even if
// non-cryptographic.
TEST_F(CookieMonsterTest, SecureCookieLocalhost) {
@@ -3547,9 +3628,9 @@ TEST_F(CookieMonsterTest, SecureCookieLocalhost) {
}
TEST_F(CookieMonsterTest, MaybeDeleteEquivalentCookieAndUpdateStatus) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
// Set a secure, httponly cookie from a secure origin
auto preexisting_cookie = CanonicalCookie::Create(
@@ -3654,9 +3735,9 @@ TEST_F(CookieMonsterTest, MaybeDeleteEquivalentCookieAndUpdateStatus) {
TEST_F(CookieMonsterTest,
MaybeDeleteEquivalentCookieAndUpdateStatus_PartitionedCookies) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
// Test adding two cookies with the same name, domain, and path but different
// partition keys.
@@ -3698,9 +3779,9 @@ TEST_F(CookieMonsterTest,
// Test skipping a cookie in MaybeDeleteEquivalentCookieAndUpdateStatus for
// multiple reasons (Secure and HttpOnly).
TEST_F(CookieMonsterTest, SkipDontOverwriteForMultipleReasons) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
// Set a secure, httponly cookie from a secure origin
auto preexisting_cookie = CanonicalCookie::Create(
@@ -3737,9 +3818,9 @@ TEST_F(CookieMonsterTest, SkipDontOverwriteForMultipleReasons) {
// Test that when we check for equivalent cookies, we don't remove any if the
// cookie should not be set.
TEST_F(CookieMonsterTest, DontDeleteEquivalentCookieIfSetIsRejected) {
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
auto preexisting_cookie = CanonicalCookie::Create(
http_www_foo_.url(), "cookie=foo", base::Time::Now(),
@@ -4387,8 +4468,8 @@ TEST_F(CookieMonsterTest, EvictSecureCookies) {
// Tests that strict secure cookies doesn't trip equivalent cookie checks
// accidentally. Regression test for https://crbug.com/569943.
TEST_F(CookieMonsterTest, EquivalentCookies) {
- std::unique_ptr<CookieMonster> cm(
- new CookieMonster(nullptr, nullptr, kFirstPartySetsDefault));
+ auto cm =
+ std::make_unique<CookieMonster>(nullptr, nullptr, kFirstPartySetsDefault);
GURL http_url("http://www.foo.com");
GURL http_superdomain_url("http://foo.com");
GURL https_url("https://www.foo.com");
@@ -4463,7 +4544,7 @@ TEST_F(CookieMonsterTest, DeleteDuplicateCTime) {
// This gets tested a few times with different deletion target, to make sure
// that the implementation doesn't just happen to pick the right one because
// of implementation details.
- for (size_t run = 0; run < std::size(kNames); ++run) {
+ for (const auto* name : kNames) {
CookieMonster cm(nullptr, nullptr, kFirstPartySetsDefault);
Time now = Time::Now();
GURL url("http://www.example.com");
@@ -4480,7 +4561,7 @@ TEST_F(CookieMonsterTest, DeleteDuplicateCTime) {
ASSERT_EQ(all_cookies.size(), std::size(kNames));
for (size_t i = 0; i < std::size(kNames); ++i) {
const CanonicalCookie& cookie = all_cookies[i];
- if (cookie.Name() == kNames[run]) {
+ if (cookie.Name() == name) {
EXPECT_TRUE(DeleteCanonicalCookie(&cm, cookie));
}
}
@@ -4491,7 +4572,7 @@ TEST_F(CookieMonsterTest, DeleteDuplicateCTime) {
ASSERT_EQ(all_cookies.size(), std::size(kNames) - 1);
for (size_t i = 0; i < std::size(kNames) - 1; ++i) {
const CanonicalCookie& cookie = all_cookies[i];
- EXPECT_NE(cookie.Name(), kNames[run]);
+ EXPECT_NE(cookie.Name(), name);
}
}
}
@@ -4639,9 +4720,7 @@ TEST_F(CookieMonsterTest, CookiesWithoutSameSiteMustBeSecure) {
{true, "A=B", // not-recently-set session cookie.
CookieInclusionStatus(), CookieEffectiveSameSite::LAX_MODE, kLongAge},
// Cookie set from a secure URL with SameSite=None and Secure is set.
- {true, "A=B; SameSite=None; Secure",
- CookieInclusionStatus(
- CookieInclusionStatus::WARN_SAMESITE_NONE_REQUIRED),
+ {true, "A=B; SameSite=None; Secure", CookieInclusionStatus(),
CookieEffectiveSameSite::NO_RESTRICTION},
// Cookie set from a secure URL with SameSite=None but not specifying
// Secure is rejected.
@@ -4699,9 +4778,10 @@ class CookieMonsterNotificationTest : public CookieMonsterTest {
public:
CookieMonsterNotificationTest()
: test_url_("http://www.foo.com/foo"),
- store_(new MockPersistentCookieStore),
- monster_(
- new CookieMonster(store_.get(), nullptr, kFirstPartySetsDefault)) {}
+ store_(base::MakeRefCounted<MockPersistentCookieStore>()),
+ monster_(std::make_unique<CookieMonster>(store_.get(),
+ nullptr,
+ kFirstPartySetsDefault)) {}
~CookieMonsterNotificationTest() override = default;
@@ -4729,7 +4809,7 @@ void RecordCookieChanges(std::vector<CanonicalCookie>* out_cookies,
TEST_F(CookieMonsterNotificationTest, NoNotificationOnLoad) {
// Create a persistent store that will not synchronously satisfy the
// loading requirement.
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
store->set_store_load_commands(true);
// Bind it to a CookieMonster
@@ -4983,9 +5063,9 @@ TEST_F(CookieMonsterTest, CookieDomainSetHistogram) {
base::HistogramTester histograms;
const char kHistogramName[] = "Cookie.DomainSet";
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
histograms.ExpectTotalCount(kHistogramName, 0);
@@ -5012,9 +5092,9 @@ TEST_F(CookieMonsterTest, CookiePortReadHistogram) {
const char kHistogramName[] = "Cookie.Port.Read.RemoteHost";
const char kHistogramNameLocal[] = "Cookie.Port.Read.Localhost";
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
histograms.ExpectTotalCount(kHistogramName, 0);
@@ -5066,9 +5146,9 @@ TEST_F(CookieMonsterTest, CookiePortSetHistogram) {
const char kHistogramName[] = "Cookie.Port.Set.RemoteHost";
const char kHistogramNameLocal[] = "Cookie.Port.Set.Localhost";
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
histograms.ExpectTotalCount(kHistogramName, 0);
@@ -5121,9 +5201,9 @@ TEST_F(CookieMonsterTest, CookiePortReadDiffersFromSetHistogram) {
const char kHistogramNameDomainSet[] =
"Cookie.Port.ReadDiffersFromSet.DomainSet";
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
histograms.ExpectTotalCount(kHistogramName, 0);
@@ -5221,9 +5301,9 @@ TEST_F(CookieMonsterTest, CookieSourceSchemeNameHistogram) {
base::HistogramTester histograms;
const char kHistogramName[] = "Cookie.CookieSourceSchemeName";
- scoped_refptr<MockPersistentCookieStore> store(new MockPersistentCookieStore);
- std::unique_ptr<CookieMonster> cm(new CookieMonster(
- store.get(), net::NetLog::Get(), kFirstPartySetsDefault));
+ auto store = base::MakeRefCounted<MockPersistentCookieStore>();
+ auto cm = std::make_unique<CookieMonster>(store.get(), net::NetLog::Get(),
+ kFirstPartySetsDefault);
histograms.ExpectTotalCount(kHistogramName, 0);
@@ -5302,23 +5382,22 @@ class FirstPartySetEnabledCookieMonsterTest : public CookieMonsterTest {
};
TEST_F(FirstPartySetEnabledCookieMonsterTest, RecordsPeriodicFPSSizes) {
+ net::SchemefulSite owner1(GURL("https://owner1.test"));
+ net::SchemefulSite owner2(GURL("https://owner2.test"));
+ net::SchemefulSite member1(GURL("https://member1.test"));
+ net::SchemefulSite member2(GURL("https://member2.test"));
+ net::SchemefulSite member3(GURL("https://member3.test"));
+ net::SchemefulSite member4(GURL("https://member4.test"));
+
access_delegate_->SetFirstPartySets({
- {
- SchemefulSite(GURL("https://owner1.test")),
- {
- SchemefulSite(GURL("https://owner1.test")),
- SchemefulSite(GURL("https://member1.test")),
- SchemefulSite(GURL("https://member2.test")),
- },
- },
- {
- SchemefulSite(GURL("https://owner2.test")),
- {
- SchemefulSite(GURL("https://owner2.test")),
- SchemefulSite(GURL("https://member3.test")),
- SchemefulSite(GURL("https://member4.test")),
- },
- },
+ {owner1,
+ net::FirstPartySetEntry(owner1, net::SiteType::kPrimary, absl::nullopt)},
+ {member1, net::FirstPartySetEntry(owner1, net::SiteType::kAssociated, 0)},
+ {member2, net::FirstPartySetEntry(owner1, net::SiteType::kAssociated, 1)},
+ {owner2,
+ net::FirstPartySetEntry(owner2, net::SiteType::kPrimary, absl::nullopt)},
+ {member3, net::FirstPartySetEntry(owner2, net::SiteType::kAssociated, 0)},
+ {member4, net::FirstPartySetEntry(owner2, net::SiteType::kAssociated, 1)},
});
ASSERT_TRUE(SetCookie(cm(), GURL("https://owner1.test"), kValidCookieLine));
@@ -5337,8 +5416,11 @@ TEST_F(FirstPartySetEnabledCookieMonsterTest, RecordsPeriodicFPSSizes) {
base::HistogramTester histogram_tester;
EXPECT_TRUE(cm()->DoRecordPeriodicStatsForTesting());
EXPECT_THAT(histogram_tester.GetAllSamples("Cookie.PerFirstPartySetCount"),
- testing::ElementsAre(base::Bucket(2 /* min */, 1 /* samples */),
- base::Bucket(3 /* min */, 1 /* samples */)));
+ testing::ElementsAre( //
+ // owner2.test & member3.test
+ base::Bucket(2 /* min */, 1 /* samples */),
+ // owner1.test, member1.test, & member2.test
+ base::Bucket(3 /* min */, 1 /* samples */)));
}
TEST_F(CookieMonsterTest, GetAllCookiesForURLNonce) {
@@ -5599,7 +5681,7 @@ INSTANTIATE_TEST_SUITE_P(/* no label */,
// creation and expiry dates expected given whether or not clamping is on.
TEST_P(CookieMonsterWithClampingTest,
FromStorageCookieCreated300DaysAgoThenUpdatedNow) {
- scoped_refptr<FlushablePersistentStore> store(new FlushablePersistentStore());
+ auto store = base::MakeRefCounted<FlushablePersistentStore>();
auto cookie_monster = std::make_unique<CookieMonster>(
store.get(), net::NetLog::Get(), kFirstPartySetsDefault);
cookie_monster->SetPersistSessionCookies(true);
@@ -5654,7 +5736,7 @@ TEST_P(CookieMonsterWithClampingTest,
// creation and expiry dates expected given whether or not clamping is on.
TEST_P(CookieMonsterWithClampingTest,
FromStorageCookieCreated500DaysAgoThenUpdatedNow) {
- scoped_refptr<FlushablePersistentStore> store(new FlushablePersistentStore());
+ auto store = base::MakeRefCounted<FlushablePersistentStore>();
auto cookie_monster = std::make_unique<CookieMonster>(
store.get(), net::NetLog::Get(), kFirstPartySetsDefault);
cookie_monster->SetPersistSessionCookies(true);
@@ -5709,7 +5791,7 @@ TEST_P(CookieMonsterWithClampingTest,
// expected given whether or not clamping is on.
TEST_P(CookieMonsterWithClampingTest,
SanitizedCookieCreated300DaysAgoThenUpdatedNow) {
- scoped_refptr<FlushablePersistentStore> store(new FlushablePersistentStore());
+ auto store = base::MakeRefCounted<FlushablePersistentStore>();
auto cookie_monster = std::make_unique<CookieMonster>(
store.get(), net::NetLog::Get(), kFirstPartySetsDefault);
cookie_monster->SetPersistSessionCookies(true);
@@ -5774,7 +5856,7 @@ TEST_P(CookieMonsterWithClampingTest,
// expected given whether or not clamping is on.
TEST_P(CookieMonsterWithClampingTest,
SanitizedCookieCreated500DaysAgoThenUpdatedNow) {
- scoped_refptr<FlushablePersistentStore> store(new FlushablePersistentStore());
+ auto store = base::MakeRefCounted<FlushablePersistentStore>();
auto cookie_monster = std::make_unique<CookieMonster>(
store.get(), net::NetLog::Get(), kFirstPartySetsDefault);
cookie_monster->SetPersistSessionCookies(true);
diff --git a/chromium/net/cookies/cookie_partition_key_collection.cc b/chromium/net/cookies/cookie_partition_key_collection.cc
index 907a4e68356..9a336885d0b 100644
--- a/chromium/net/cookies/cookie_partition_key_collection.cc
+++ b/chromium/net/cookies/cookie_partition_key_collection.cc
@@ -14,20 +14,21 @@
#include "net/base/schemeful_site.h"
#include "net/cookies/cookie_access_delegate.h"
#include "net/cookies/cookie_partition_key.h"
+#include "net/cookies/first_party_set_entry.h"
namespace net {
namespace {
-CookiePartitionKeyCollection TransformWithFirstPartySetOwners(
+CookiePartitionKeyCollection TransformWithFirstPartySetEntries(
const base::flat_set<CookiePartitionKey>& keys,
- base::flat_map<SchemefulSite, SchemefulSite> sites_to_owners) {
+ base::flat_map<SchemefulSite, FirstPartySetEntry> sites_to_entries) {
std::vector<CookiePartitionKey> canonicalized_keys;
canonicalized_keys.reserve(keys.size());
for (const CookiePartitionKey& key : keys) {
- const auto first_party_set_owner_iter = sites_to_owners.find(key.site());
+ const auto it = sites_to_entries.find(key.site());
canonicalized_keys.push_back(
- !key.nonce() && first_party_set_owner_iter != sites_to_owners.end()
- ? CookiePartitionKey::FromWire(first_party_set_owner_iter->second)
+ !key.nonce() && it != sites_to_entries.end()
+ ? CookiePartitionKey::FromWire(it->second.primary())
: key);
}
return CookiePartitionKeyCollection(canonicalized_keys);
@@ -80,15 +81,15 @@ CookiePartitionKeyCollection::FirstPartySetify(
}
if (sites.empty())
return *this;
- absl::optional<base::flat_map<SchemefulSite, SchemefulSite>>
- maybe_sites_to_owners = cookie_access_delegate->FindFirstPartySetOwners(
+ absl::optional<base::flat_map<SchemefulSite, FirstPartySetEntry>>
+ maybe_sites_to_entries = cookie_access_delegate->FindFirstPartySetOwners(
sites,
- base::BindOnce(&TransformWithFirstPartySetOwners, PartitionKeys())
+ base::BindOnce(&TransformWithFirstPartySetEntries, PartitionKeys())
.Then(std::move(callback)));
- if (maybe_sites_to_owners.has_value())
- return TransformWithFirstPartySetOwners(PartitionKeys(),
- maybe_sites_to_owners.value());
+ if (maybe_sites_to_entries.has_value())
+ return TransformWithFirstPartySetEntries(PartitionKeys(),
+ maybe_sites_to_entries.value());
return absl::nullopt;
}
diff --git a/chromium/net/cookies/cookie_partition_key_collection_unittest.cc b/chromium/net/cookies/cookie_partition_key_collection_unittest.cc
index 25b5b155504..01a9bad3d59 100644
--- a/chromium/net/cookies/cookie_partition_key_collection_unittest.cc
+++ b/chromium/net/cookies/cookie_partition_key_collection_unittest.cc
@@ -112,10 +112,12 @@ TEST(CookiePartitionKeyCollectionTest, FirstPartySetify) {
CookiePartitionKey::FromURLForTesting(kNonMemberURL);
TestCookieAccessDelegate delegate;
- base::flat_map<SchemefulSite, std::set<SchemefulSite>> first_party_sets;
- first_party_sets.insert(std::make_pair(
- kOwnerSite, std::set<SchemefulSite>({kOwnerSite, kMemberSite})));
- delegate.SetFirstPartySets(first_party_sets);
+ delegate.SetFirstPartySets({
+ {kOwnerSite, net::FirstPartySetEntry(kOwnerSite, net::SiteType::kPrimary,
+ absl::nullopt)},
+ {kMemberSite,
+ net::FirstPartySetEntry(kOwnerSite, net::SiteType::kAssociated, 0)},
+ });
CookiePartitionKeyCollection empty_key_collection;
EXPECT_TRUE(
diff --git a/chromium/net/cookies/cookie_partition_key_unittest.cc b/chromium/net/cookies/cookie_partition_key_unittest.cc
index 8a68fcf314f..4bbb7cfdc17 100644
--- a/chromium/net/cookies/cookie_partition_key_unittest.cc
+++ b/chromium/net/cookies/cookie_partition_key_unittest.cc
@@ -3,33 +3,39 @@
// found in the LICENSE file.
#include <string>
+#include <tuple>
-#include "net/cookies/cookie_partition_key.h"
#include "base/test/scoped_feature_list.h"
#include "net/base/features.h"
#include "net/cookies/cookie_constants.h"
+#include "net/cookies/cookie_partition_key.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
-class CookiePartitionKeyTest : public testing::TestWithParam<bool> {
+class CookiePartitionKeyTest
+ : public testing::TestWithParam<std::tuple<bool, bool>> {
protected:
// testing::Test
void SetUp() override {
- if (PartitionedCookiesEnabled())
- scoped_feature_list_.InitAndEnableFeature(features::kPartitionedCookies);
- testing::TestWithParam<bool>::SetUp();
+ scoped_feature_list_[0].InitWithFeatureState(features::kPartitionedCookies,
+ PartitionedCookiesEnabled());
+ scoped_feature_list_[1].InitWithFeatureState(
+ features::kNoncedPartitionedCookies, NoncedPartitionedCookiesEnabled());
}
- bool PartitionedCookiesEnabled() { return GetParam(); }
+ bool PartitionedCookiesEnabled() { return std::get<0>(GetParam()); }
+ bool NoncedPartitionedCookiesEnabled() { return std::get<1>(GetParam()); }
private:
- base::test::ScopedFeatureList scoped_feature_list_;
+ base::test::ScopedFeatureList scoped_feature_list_[2];
};
INSTANTIATE_TEST_SUITE_P(/* no label */,
CookiePartitionKeyTest,
- testing::Bool());
+ ::testing::Values(std::make_tuple(false, false),
+ std::make_tuple(false, true),
+ std::make_tuple(true, true)));
TEST_P(CookiePartitionKeyTest, Serialization) {
base::UnguessableToken nonce = base::UnguessableToken::Create();
@@ -261,7 +267,8 @@ TEST_P(CookiePartitionKeyTest, Equality_WithNonce) {
EXPECT_NE(nonce1, nonce2);
auto key1 = CookiePartitionKey::FromNetworkIsolationKey(
NetworkIsolationKey(top_level_site, frame_site, &nonce1));
- bool partitioned_cookies_enabled = PartitionedCookiesEnabled();
+ bool partitioned_cookies_enabled =
+ PartitionedCookiesEnabled() || NoncedPartitionedCookiesEnabled();
EXPECT_EQ(partitioned_cookies_enabled, key1.has_value());
if (!partitioned_cookies_enabled)
return;
diff --git a/chromium/net/cookies/cookie_store_test_callbacks.h b/chromium/net/cookies/cookie_store_test_callbacks.h
index ee319423e68..2387a94bbcb 100644
--- a/chromium/net/cookies/cookie_store_test_callbacks.h
+++ b/chromium/net/cookies/cookie_store_test_callbacks.h
@@ -62,8 +62,7 @@ class CookieCallback {
template <typename T>
class ResultSavingCookieCallback : public CookieCallback {
public:
- ResultSavingCookieCallback() {
- }
+ ResultSavingCookieCallback() = default;
explicit ResultSavingCookieCallback(base::Thread* run_in_thread)
: CookieCallback(run_in_thread) {
}
diff --git a/chromium/net/cookies/cookie_store_test_helpers.cc b/chromium/net/cookies/cookie_store_test_helpers.cc
index 31c95384063..3e7e5c4fb45 100644
--- a/chromium/net/cookies/cookie_store_test_helpers.cc
+++ b/chromium/net/cookies/cookie_store_test_helpers.cc
@@ -72,9 +72,10 @@ DelayedCookieMonsterChangeDispatcher::AddCallbackForAllChanges(
}
DelayedCookieMonster::DelayedCookieMonster()
- : cookie_monster_(new CookieMonster(nullptr /* store */,
- nullptr /* netlog */,
- false /* first_party_sets_enabled */)),
+ : cookie_monster_(std::make_unique<CookieMonster>(
+ nullptr /* store */,
+ nullptr /* netlog */,
+ false /* first_party_sets_enabled */)),
result_(CookieAccessResult(CookieInclusionStatus(
CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE))) {}
diff --git a/chromium/net/cookies/cookie_util.cc b/chromium/net/cookies/cookie_util.cc
index d91b562fc0f..13c70c26a33 100644
--- a/chromium/net/cookies/cookie_util.cc
+++ b/chromium/net/cookies/cookie_util.cc
@@ -27,6 +27,7 @@
#include "net/base/url_util.h"
#include "net/cookies/cookie_access_delegate.h"
#include "net/cookies/cookie_constants.h"
+#include "net/cookies/cookie_inclusion_status.h"
#include "net/cookies/cookie_monster.h"
#include "net/cookies/cookie_options.h"
#include "net/cookies/first_party_set_metadata.h"
@@ -35,8 +36,7 @@
#include "url/gurl.h"
#include "url/url_constants.h"
-namespace net {
-namespace cookie_util {
+namespace net::cookie_util {
namespace {
@@ -306,11 +306,16 @@ std::string GetEffectiveDomain(const std::string& scheme,
bool GetCookieDomainWithString(const GURL& url,
const std::string& domain_string,
+ CookieInclusionStatus& status,
std::string* result) {
// Disallow non-ASCII domain names.
- if (base::FeatureList::IsEnabled(features::kCookieDomainRejectNonASCII) &&
- !base::IsStringASCII(domain_string)) {
- return false;
+ if (!base::IsStringASCII(domain_string)) {
+ if (base::FeatureList::IsEnabled(features::kCookieDomainRejectNonASCII)) {
+ status.AddExclusionReason(
+ CookieInclusionStatus::EXCLUDE_DOMAIN_NON_ASCII);
+ return false;
+ }
+ status.AddWarningReason(CookieInclusionStatus::WARN_DOMAIN_NON_ASCII);
}
const std::string url_host(url.host());
@@ -614,12 +619,12 @@ void ParseRequestCookieLine(const std::string& header_value,
std::string SerializeRequestCookieLine(
const ParsedRequestCookies& parsed_cookies) {
std::string buffer;
- for (auto i = parsed_cookies.begin(); i != parsed_cookies.end(); ++i) {
+ for (const auto& parsed_cookie : parsed_cookies) {
if (!buffer.empty())
buffer.append("; ");
- buffer.append(i->first.begin(), i->first.end());
+ buffer.append(parsed_cookie.first.begin(), parsed_cookie.first.end());
buffer.push_back('=');
- buffer.append(i->second.begin(), i->second.end());
+ buffer.append(parsed_cookie.second.begin(), parsed_cookie.second.end());
}
return buffer;
}
@@ -891,5 +896,4 @@ NET_EXPORT void DCheckIncludedAndExcludedCookieLists(
base::ranges::is_sorted(included_cookies, CookieWithAccessResultSorter));
}
-} // namespace cookie_util
-} // namespace net
+} // namespace net::cookie_util
diff --git a/chromium/net/cookies/cookie_util.h b/chromium/net/cookies/cookie_util.h
index c869e8fbc0c..27dd1705652 100644
--- a/chromium/net/cookies/cookie_util.h
+++ b/chromium/net/cookies/cookie_util.h
@@ -27,6 +27,7 @@ namespace net {
class IsolationInfo;
class SchemefulSite;
class CookieAccessDelegate;
+class CookieInclusionStatus;
namespace cookie_util {
@@ -63,6 +64,7 @@ NET_EXPORT std::string GetEffectiveDomain(const std::string& scheme,
// begin with a '.' character.
NET_EXPORT bool GetCookieDomainWithString(const GURL& url,
const std::string& domain_string,
+ CookieInclusionStatus& status,
std::string* result);
// Returns true if a domain string represents a host-only cookie,
diff --git a/chromium/net/cookies/cookie_util_unittest.cc b/chromium/net/cookies/cookie_util_unittest.cc
index 6ab824e2666..bd028aa709f 100644
--- a/chromium/net/cookies/cookie_util_unittest.cc
+++ b/chromium/net/cookies/cookie_util_unittest.cc
@@ -209,26 +209,26 @@ TEST(CookieUtilTest, TestRequestCookieParsing) {
std::vector<RequestCookieParsingTest> tests;
// Simple case.
- tests.push_back(RequestCookieParsingTest());
+ tests.emplace_back();
tests.back().str = "key=value";
tests.back().parsed.push_back(std::make_pair(std::string("key"),
std::string("value")));
// Multiple key/value pairs.
- tests.push_back(RequestCookieParsingTest());
+ tests.emplace_back();
tests.back().str = "key1=value1; key2=value2";
tests.back().parsed.push_back(std::make_pair(std::string("key1"),
std::string("value1")));
tests.back().parsed.push_back(std::make_pair(std::string("key2"),
std::string("value2")));
// Empty value.
- tests.push_back(RequestCookieParsingTest());
+ tests.emplace_back();
tests.back().str = "key=; otherkey=1234";
tests.back().parsed.push_back(std::make_pair(std::string("key"),
std::string()));
tests.back().parsed.push_back(std::make_pair(std::string("otherkey"),
std::string("1234")));
// Special characters (including equals signs) in value.
- tests.push_back(RequestCookieParsingTest());
+ tests.emplace_back();
tests.back().str = "key=; a2=s=(./&t=:&u=a#$; a3=+~";
tests.back().parsed.push_back(std::make_pair(std::string("key"),
std::string()));
@@ -237,7 +237,7 @@ TEST(CookieUtilTest, TestRequestCookieParsing) {
tests.back().parsed.push_back(std::make_pair(std::string("a3"),
std::string("+~")));
// Quoted value.
- tests.push_back(RequestCookieParsingTest());
+ tests.emplace_back();
tests.back().str = "key=\"abcdef\"; otherkey=1234";
tests.back().parsed.push_back(std::make_pair(std::string("key"),
std::string("\"abcdef\"")));
diff --git a/chromium/net/cookies/first_party_set_entry.cc b/chromium/net/cookies/first_party_set_entry.cc
new file mode 100644
index 00000000000..0bb5cca7601
--- /dev/null
+++ b/chromium/net/cookies/first_party_set_entry.cc
@@ -0,0 +1,77 @@
+// Copyright 2022 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.
+
+#include "net/cookies/first_party_set_entry.h"
+
+#include <tuple>
+
+#include "net/base/schemeful_site.h"
+
+namespace net {
+
+FirstPartySetEntry::SiteIndex::SiteIndex() = default;
+
+FirstPartySetEntry::SiteIndex::SiteIndex(uint32_t value) : value_(value) {}
+
+bool FirstPartySetEntry::SiteIndex::operator==(const SiteIndex& other) const {
+ return value_ == other.value_;
+}
+
+FirstPartySetEntry::FirstPartySetEntry() = default;
+
+FirstPartySetEntry::FirstPartySetEntry(
+ SchemefulSite primary,
+ SiteType site_type,
+ absl::optional<FirstPartySetEntry::SiteIndex> site_index)
+ : primary_(primary), site_type_(site_type), site_index_(site_index) {
+ if (site_type_ == SiteType::kPrimary) {
+ DCHECK(!site_index_.has_value());
+ }
+}
+
+FirstPartySetEntry::FirstPartySetEntry(SchemefulSite primary,
+ SiteType site_type,
+ uint32_t site_index)
+ : FirstPartySetEntry(
+ primary,
+ site_type,
+ absl::make_optional(FirstPartySetEntry::SiteIndex(site_index))) {}
+
+FirstPartySetEntry::FirstPartySetEntry(const FirstPartySetEntry&) = default;
+FirstPartySetEntry& FirstPartySetEntry::operator=(const FirstPartySetEntry&) =
+ default;
+FirstPartySetEntry::FirstPartySetEntry(FirstPartySetEntry&&) = default;
+FirstPartySetEntry& FirstPartySetEntry::operator=(FirstPartySetEntry&&) =
+ default;
+
+FirstPartySetEntry::~FirstPartySetEntry() = default;
+
+bool FirstPartySetEntry::operator==(const FirstPartySetEntry& other) const {
+ return std::tie(primary_, site_type_, site_index_) ==
+ std::tie(other.primary_, other.site_type_, other.site_index_);
+}
+
+bool FirstPartySetEntry::operator!=(const FirstPartySetEntry& other) const {
+ return !(*this == other);
+}
+
+std::ostream& operator<<(std::ostream& os,
+ const FirstPartySetEntry::SiteIndex& index) {
+ os << index.value();
+ return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const FirstPartySetEntry& entry) {
+ os << "{" << entry.primary() << ", " << static_cast<int>(entry.site_type())
+ << ", ";
+ if (entry.site_index().has_value()) {
+ os << entry.site_index().value();
+ } else {
+ os << "{}";
+ }
+ os << "}";
+ return os;
+}
+
+} // namespace net
diff --git a/chromium/net/cookies/first_party_set_entry.h b/chromium/net/cookies/first_party_set_entry.h
new file mode 100644
index 00000000000..d4a8b7e8d12
--- /dev/null
+++ b/chromium/net/cookies/first_party_set_entry.h
@@ -0,0 +1,84 @@
+// Copyright 2022 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.
+
+#ifndef NET_COOKIES_FIRST_PARTY_SET_ENTRY_H_
+#define NET_COOKIES_FIRST_PARTY_SET_ENTRY_H_
+
+#include "net/base/net_export.h"
+#include "net/base/schemeful_site.h"
+
+namespace net {
+
+enum class SiteType {
+ // The First-Party Set declaration listed this site as the "primary" site for
+ // the set.
+ kPrimary,
+ // The First-Party Set declaration listed this site as an associated site in
+ // the set.
+ kAssociated,
+};
+
+// This class bundles together metadata associated with an entry in a
+// First-Party Set.
+class NET_EXPORT FirstPartySetEntry {
+ public:
+ class NET_EXPORT SiteIndex {
+ public:
+ SiteIndex();
+ explicit SiteIndex(uint32_t value);
+
+ bool operator==(const SiteIndex& other) const;
+
+ uint32_t value() const { return value_; }
+
+ private:
+ uint32_t value_;
+ };
+
+ FirstPartySetEntry();
+ // `primary` is the primary site in the First-Party Set associated with this
+ // entry.
+ FirstPartySetEntry(SchemefulSite primary,
+ SiteType site_type,
+ absl::optional<SiteIndex> site_index);
+ FirstPartySetEntry(SchemefulSite primary,
+ SiteType site_type,
+ uint32_t site_index);
+
+ FirstPartySetEntry(const FirstPartySetEntry&);
+ FirstPartySetEntry& operator=(const FirstPartySetEntry&);
+ FirstPartySetEntry(FirstPartySetEntry&&);
+ FirstPartySetEntry& operator=(FirstPartySetEntry&&);
+
+ ~FirstPartySetEntry();
+
+ bool operator==(const FirstPartySetEntry& other) const;
+ bool operator!=(const FirstPartySetEntry& other) const;
+
+ const SchemefulSite& primary() const { return primary_; }
+
+ SiteType site_type() const { return site_type_; }
+
+ const absl::optional<SiteIndex>& site_index() const { return site_index_; }
+
+ private:
+ // The primary site associated with this site's set.
+ SchemefulSite primary_;
+ // The type associated with this site.
+ SiteType site_type_;
+ // The index of this site in the set declaration, if a meaningful index
+ // exists. Primary sites do not have indices, nor do sites that were defined
+ // or affected by an enterprise policy set.
+ absl::optional<SiteIndex> site_index_;
+};
+
+NET_EXPORT std::ostream& operator<<(
+ std::ostream& os,
+ const FirstPartySetEntry::SiteIndex& site_index);
+NET_EXPORT std::ostream& operator<<(std::ostream& os,
+ const FirstPartySetEntry& fpse);
+
+} // namespace net
+
+#endif // NET_COOKIES_FIRST_PARTY_SET_ENTRY_H_
diff --git a/chromium/net/cookies/first_party_set_metadata.cc b/chromium/net/cookies/first_party_set_metadata.cc
index 60f1988bb0c..0937d897ee3 100644
--- a/chromium/net/cookies/first_party_set_metadata.cc
+++ b/chromium/net/cookies/first_party_set_metadata.cc
@@ -7,20 +7,18 @@
#include <tuple>
#include "base/stl_util.h"
-#include "net/cookies/cookie_constants.h"
+#include "net/cookies/first_party_set_entry.h"
namespace net {
FirstPartySetMetadata::FirstPartySetMetadata() = default;
FirstPartySetMetadata::FirstPartySetMetadata(
const SamePartyContext& context,
- const SchemefulSite* frame_owner,
- const SchemefulSite* top_frame_owner,
- FirstPartySetsContextType first_party_sets_context_type)
+ const FirstPartySetEntry* frame_entry,
+ const FirstPartySetEntry* top_frame_entry)
: context_(context),
- frame_owner_(base::OptionalFromPtr(frame_owner)),
- top_frame_owner_(base::OptionalFromPtr(top_frame_owner)),
- first_party_sets_context_type_(first_party_sets_context_type) {}
+ frame_entry_(base::OptionalFromPtr(frame_entry)),
+ top_frame_entry_(base::OptionalFromPtr(top_frame_entry)) {}
FirstPartySetMetadata::FirstPartySetMetadata(FirstPartySetMetadata&&) = default;
FirstPartySetMetadata& FirstPartySetMetadata::operator=(
@@ -30,18 +28,15 @@ FirstPartySetMetadata::~FirstPartySetMetadata() = default;
bool FirstPartySetMetadata::operator==(
const FirstPartySetMetadata& other) const {
- return std::tie(context_, frame_owner_, top_frame_owner_,
- first_party_sets_context_type_) ==
- std::tie(other.context_, other.frame_owner_, other.top_frame_owner_,
- other.first_party_sets_context_type_);
+ return std::tie(context_, frame_entry_, top_frame_entry_) ==
+ std::tie(other.context_, other.frame_entry_, other.top_frame_entry_);
}
std::ostream& operator<<(std::ostream& os,
const FirstPartySetMetadata& metadata) {
os << "{" << metadata.context() << ", "
- << base::OptionalOrNullptr(metadata.frame_owner()) << ", "
- << base::OptionalOrNullptr(metadata.top_frame_owner()) << ", "
- << static_cast<int>(metadata.first_party_sets_context_type()) << "}";
+ << base::OptionalOrNullptr(metadata.frame_entry()) << ", "
+ << base::OptionalOrNullptr(metadata.top_frame_entry()) << "}";
return os;
}
diff --git a/chromium/net/cookies/first_party_set_metadata.h b/chromium/net/cookies/first_party_set_metadata.h
index 1b6562d2713..5d54d5564ac 100644
--- a/chromium/net/cookies/first_party_set_metadata.h
+++ b/chromium/net/cookies/first_party_set_metadata.h
@@ -5,9 +5,8 @@
#ifndef NET_COOKIES_FIRST_PARTY_SET_METADATA_H_
#define NET_COOKIES_FIRST_PARTY_SET_METADATA_H_
-#include "base/stl_util.h"
#include "net/base/net_export.h"
-#include "net/base/schemeful_site.h"
+#include "net/cookies/first_party_set_entry.h"
#include "net/cookies/same_party_context.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -19,14 +18,12 @@ class NET_EXPORT FirstPartySetMetadata {
public:
FirstPartySetMetadata();
- // `frame_owner` and `top_frame_owner` must live for the duration of the ctor;
+ // `frame_entry` and `top_frame_entry` must live for the duration of the ctor;
// nullptr indicates that there's no First-Party Set that's associated with
// the current frame or the top frame, respectively, in the given context.
- FirstPartySetMetadata(
- const SamePartyContext& context,
- const SchemefulSite* frame_owner,
- const SchemefulSite* top_frame_owner,
- FirstPartySetsContextType first_party_sets_context_type);
+ FirstPartySetMetadata(const SamePartyContext& context,
+ const FirstPartySetEntry* frame_entry,
+ const FirstPartySetEntry* top_frame_entry);
FirstPartySetMetadata(FirstPartySetMetadata&&);
FirstPartySetMetadata& operator=(FirstPartySetMetadata&&);
@@ -39,23 +36,17 @@ class NET_EXPORT FirstPartySetMetadata {
// Returns a optional<T>& instead of a T* so that operator== can be defined
// more easily.
- const absl::optional<SchemefulSite>& frame_owner() const {
- return frame_owner_;
+ const absl::optional<FirstPartySetEntry>& frame_entry() const {
+ return frame_entry_;
}
- const absl::optional<SchemefulSite>& top_frame_owner() const {
- return top_frame_owner_;
- }
-
- FirstPartySetsContextType first_party_sets_context_type() const {
- return first_party_sets_context_type_;
+ const absl::optional<FirstPartySetEntry>& top_frame_entry() const {
+ return top_frame_entry_;
}
private:
SamePartyContext context_ = SamePartyContext();
- absl::optional<SchemefulSite> frame_owner_ = absl::nullopt;
- absl::optional<SchemefulSite> top_frame_owner_ = absl::nullopt;
- FirstPartySetsContextType first_party_sets_context_type_ =
- FirstPartySetsContextType::kUnknown;
+ absl::optional<FirstPartySetEntry> frame_entry_ = absl::nullopt;
+ absl::optional<FirstPartySetEntry> top_frame_entry_ = absl::nullopt;
};
NET_EXPORT std::ostream& operator<<(std::ostream& os,
diff --git a/chromium/net/cookies/first_party_sets_context_config.cc b/chromium/net/cookies/first_party_sets_context_config.cc
new file mode 100644
index 00000000000..e075437e0d3
--- /dev/null
+++ b/chromium/net/cookies/first_party_sets_context_config.cc
@@ -0,0 +1,24 @@
+// Copyright 2022 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.
+
+#include "net/cookies/first_party_sets_context_config.h"
+
+namespace net {
+
+FirstPartySetsContextConfig::FirstPartySetsContextConfig(bool enabled)
+ : enabled_(enabled) {}
+
+FirstPartySetsContextConfig::FirstPartySetsContextConfig(
+ const FirstPartySetsContextConfig& other) = default;
+
+FirstPartySetsContextConfig::~FirstPartySetsContextConfig() = default;
+
+void FirstPartySetsContextConfig::SetCustomizations(
+ OverrideSets customizations) {
+ DCHECK(customizations_.empty());
+ if (enabled_)
+ customizations_ = std::move(customizations);
+}
+
+} // namespace net
diff --git a/chromium/net/cookies/first_party_sets_context_config.h b/chromium/net/cookies/first_party_sets_context_config.h
new file mode 100644
index 00000000000..eb7ee732549
--- /dev/null
+++ b/chromium/net/cookies/first_party_sets_context_config.h
@@ -0,0 +1,42 @@
+// Copyright 2022 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.
+
+#ifndef NET_COOKIES_FIRST_PARTY_SETS_CONTEXT_CONFIG_H_
+#define NET_COOKIES_FIRST_PARTY_SETS_CONTEXT_CONFIG_H_
+
+#include "base/containers/flat_map.h"
+#include "net/base/schemeful_site.h"
+#include "net/cookies/first_party_set_entry.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace net {
+
+// This struct bundles together the customized settings to First-Party Sets
+// info in the given network context.
+class NET_EXPORT FirstPartySetsContextConfig {
+ public:
+ using OverrideSets =
+ base::flat_map<SchemefulSite, absl::optional<FirstPartySetEntry>>;
+
+ explicit FirstPartySetsContextConfig(bool enabled);
+
+ FirstPartySetsContextConfig(const FirstPartySetsContextConfig& other);
+
+ ~FirstPartySetsContextConfig();
+
+ bool is_enabled() const { return enabled_; }
+
+ void SetCustomizations(OverrideSets customizations);
+
+ const OverrideSets& customizations() const { return customizations_; }
+
+ private:
+ bool enabled_ = true;
+
+ OverrideSets customizations_;
+};
+
+} // namespace net
+
+#endif // NET_COOKIES_FIRST_PARTY_SETS_CONTEXT_CONFIG_H_ \ No newline at end of file
diff --git a/chromium/net/cookies/parsed_cookie.cc b/chromium/net/cookies/parsed_cookie.cc
index 17e64f13c9b..ebec5b77828 100644
--- a/chromium/net/cookies/parsed_cookie.cc
+++ b/chromium/net/cookies/parsed_cookie.cc
@@ -766,12 +766,7 @@ void ParsedCookie::SetupAttributes() {
if (pairs_[i].first == kPathTokenName) {
path_index_ = i;
} else if (pairs_[i].first == kDomainTokenName) {
- // Domain can be the empty string if the flag is enabled.
- if (base::FeatureList::IsEnabled(
- features::kCookieDomainAttributeEmptyString) ||
- pairs_[i].second != "") {
- domain_index_ = i;
- }
+ domain_index_ = i;
} else if (pairs_[i].first == kExpiresTokenName) {
expires_index_ = i;
} else if (pairs_[i].first == kMaxAgeTokenName) {
diff --git a/chromium/net/cookies/parsed_cookie_unittest.cc b/chromium/net/cookies/parsed_cookie_unittest.cc
index a2a265fa0fa..2d6c4bf119a 100644
--- a/chromium/net/cookies/parsed_cookie_unittest.cc
+++ b/chromium/net/cookies/parsed_cookie_unittest.cc
@@ -877,10 +877,6 @@ TEST(ParsedCookieTest, SetAttributes) {
// Setting the domain attribute to the empty string should be valid.
TEST(ParsedCookieTest, EmptyDomainAttributeValid) {
- // Enable the feature flag for this test.
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kCookieDomainAttributeEmptyString);
ParsedCookie pc("name=value; domain=");
EXPECT_TRUE(pc.IsValid());
}
@@ -888,10 +884,6 @@ TEST(ParsedCookieTest, EmptyDomainAttributeValid) {
// Set the domain attribute twice in a cookie line. If the second attribute's
// value is empty, it should equal the empty string.
TEST(ParsedCookieTest, MultipleDomainAttributes) {
- // Enable the feature flag for this test.
- base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(
- features::kCookieDomainAttributeEmptyString);
ParsedCookie pc1("name=value; domain=foo.com; domain=bar.com");
EXPECT_EQ("bar.com", pc1.Domain());
ParsedCookie pc2("name=value; domain=foo.com; domain=");
diff --git a/chromium/net/cookies/same_party_context.cc b/chromium/net/cookies/same_party_context.cc
index 93a14af7f47..1e97738b649 100644
--- a/chromium/net/cookies/same_party_context.cc
+++ b/chromium/net/cookies/same_party_context.cc
@@ -4,35 +4,19 @@
#include "net/cookies/same_party_context.h"
-#include <sstream>
-#include <tuple>
-
-#include "net/cookies/cookie_constants.h"
+#include <ostream>
namespace net {
-SamePartyContext::SamePartyContext(Type type)
- : SamePartyContext(type, type, type) {}
-
-SamePartyContext::SamePartyContext(Type context_type,
- Type ancestors_for_metrics,
- Type top_resource_for_metrics)
- : context_type_(context_type),
- ancestors_for_metrics_only_(ancestors_for_metrics),
- top_resource_for_metrics_only_(top_resource_for_metrics) {}
+SamePartyContext::SamePartyContext(Type context_type)
+ : context_type_(context_type) {}
bool SamePartyContext::operator==(const SamePartyContext& other) const {
- return std::make_tuple(context_type(), ancestors_for_metrics_only(),
- top_resource_for_metrics_only()) ==
- std::make_tuple(other.context_type(),
- other.ancestors_for_metrics_only(),
- other.top_resource_for_metrics_only());
+ return context_type_ == other.context_type_;
}
std::ostream& operator<<(std::ostream& os, const SamePartyContext& spc) {
- os << "{" << static_cast<int>(spc.context_type()) << ", "
- << static_cast<int>(spc.ancestors_for_metrics_only()) << ", "
- << static_cast<int>(spc.top_resource_for_metrics_only()) << "}";
+ os << "{" << static_cast<int>(spc.context_type()) << "}";
return os;
}
@@ -40,4 +24,5 @@ std::ostream& operator<<(std::ostream& os, const SamePartyContext& spc) {
SamePartyContext SamePartyContext::MakeInclusive() {
return SamePartyContext(Type::kSameParty);
}
+
} // namespace net
diff --git a/chromium/net/cookies/same_party_context.h b/chromium/net/cookies/same_party_context.h
index 2de8e2c0ac7..7235492281c 100644
--- a/chromium/net/cookies/same_party_context.h
+++ b/chromium/net/cookies/same_party_context.h
@@ -5,8 +5,9 @@
#ifndef NET_COOKIES_SAME_PARTY_CONTEXT_H_
#define NET_COOKIES_SAME_PARTY_CONTEXT_H_
+#include <ostream>
+
#include "net/base/net_export.h"
-#include "net/cookies/cookie_constants.h"
namespace net {
@@ -27,10 +28,7 @@ class NET_EXPORT SamePartyContext {
};
SamePartyContext() = default;
- explicit SamePartyContext(Type type);
- SamePartyContext(Type context_type,
- Type ancestors_for_metrics,
- Type top_resource_for_metrics);
+ explicit SamePartyContext(Type context_type);
bool operator==(const SamePartyContext& other) const;
@@ -38,25 +36,11 @@ class NET_EXPORT SamePartyContext {
// SameParty cookies. Default is not trusted, e.g. kCrossParty.
Type context_type() const { return context_type_; }
- // We store the type of the SameParty context if we inferred singleton sets,
- // for the purpose of metrics.
- Type ancestors_for_metrics_only() const {
- return ancestors_for_metrics_only_;
- }
- // We also store the type of the SameParty context if it were computed using
- // only the top frame and resource URL and inferred singleton sets, for the
- // purpose of metrics.
- Type top_resource_for_metrics_only() const {
- return top_resource_for_metrics_only_;
- }
-
// Creates a SamePartyContext that is as permissive as possible.
static SamePartyContext MakeInclusive();
private:
Type context_type_ = Type::kCrossParty;
- Type ancestors_for_metrics_only_ = Type::kCrossParty;
- Type top_resource_for_metrics_only_ = Type::kCrossParty;
};
NET_EXPORT std::ostream& operator<<(std::ostream& os,
diff --git a/chromium/net/cookies/test_cookie_access_delegate.cc b/chromium/net/cookies/test_cookie_access_delegate.cc
index b9b5af545c7..31451884f97 100644
--- a/chromium/net/cookies/test_cookie_access_delegate.cc
+++ b/chromium/net/cookies/test_cookie_access_delegate.cc
@@ -19,6 +19,7 @@
#include "net/base/schemeful_site.h"
#include "net/cookies/cookie_constants.h"
#include "net/cookies/cookie_util.h"
+#include "net/cookies/first_party_set_entry.h"
#include "net/cookies/first_party_set_metadata.h"
#include "net/cookies/same_party_context.h"
@@ -54,62 +55,42 @@ TestCookieAccessDelegate::ComputeFirstPartySetMetadataMaybeAsync(
const SchemefulSite* top_frame_site,
const std::set<SchemefulSite>& party_context,
base::OnceCallback<void(FirstPartySetMetadata)> callback) const {
- absl::optional<SchemefulSite> top_frame_owner =
+ absl::optional<FirstPartySetEntry> top_frame_owner =
top_frame_site ? FindFirstPartySetOwnerSync(*top_frame_site)
: absl::nullopt;
return RunMaybeAsync(
FirstPartySetMetadata(
SamePartyContext(),
base::OptionalOrNullptr(FindFirstPartySetOwnerSync(site)),
- base::OptionalOrNullptr(top_frame_owner),
- FirstPartySetsContextType::kUnknown),
+ base::OptionalOrNullptr(top_frame_owner)),
std::move(callback));
}
-absl::optional<SchemefulSite>
+absl::optional<FirstPartySetEntry>
TestCookieAccessDelegate::FindFirstPartySetOwnerSync(
const SchemefulSite& site) const {
- auto owner_set_iter =
- base::ranges::find_if(first_party_sets_, [&](const auto& set_iter) {
- return base::Contains(set_iter.second, site);
- });
-
- return owner_set_iter != first_party_sets_.end()
- ? absl::make_optional(owner_set_iter->first)
- : absl::nullopt;
-}
+ auto entry = first_party_sets_.find(site);
-absl::optional<absl::optional<SchemefulSite>>
-TestCookieAccessDelegate::FindFirstPartySetOwner(
- const SchemefulSite& site,
- base::OnceCallback<void(absl::optional<SchemefulSite>)> callback) const {
- return RunMaybeAsync(FindFirstPartySetOwnerSync(site), std::move(callback));
+ return entry != first_party_sets_.end() ? absl::make_optional(entry->second)
+ : absl::nullopt;
}
-absl::optional<base::flat_map<SchemefulSite, SchemefulSite>>
+absl::optional<base::flat_map<SchemefulSite, FirstPartySetEntry>>
TestCookieAccessDelegate::FindFirstPartySetOwners(
const base::flat_set<SchemefulSite>& sites,
- base::OnceCallback<void(base::flat_map<SchemefulSite, SchemefulSite>)>
+ base::OnceCallback<void(base::flat_map<SchemefulSite, FirstPartySetEntry>)>
callback) const {
- std::vector<std::pair<SchemefulSite, SchemefulSite>> mapping;
+ std::vector<std::pair<SchemefulSite, FirstPartySetEntry>> mapping;
for (const SchemefulSite& site : sites) {
- absl::optional<SchemefulSite> owner = FindFirstPartySetOwnerSync(site);
- if (owner)
- mapping.emplace_back(site, *owner);
+ absl::optional<FirstPartySetEntry> entry = FindFirstPartySetOwnerSync(site);
+ if (entry)
+ mapping.emplace_back(site, *entry);
}
- return RunMaybeAsync<base::flat_map<SchemefulSite, SchemefulSite>>(
+ return RunMaybeAsync<base::flat_map<SchemefulSite, FirstPartySetEntry>>(
mapping, std::move(callback));
}
-absl::optional<base::flat_map<SchemefulSite, std::set<SchemefulSite>>>
-TestCookieAccessDelegate::RetrieveFirstPartySets(
- base::OnceCallback<
- void(base::flat_map<SchemefulSite, std::set<SchemefulSite>>)> callback)
- const {
- return RunMaybeAsync(first_party_sets_, std::move(callback));
-}
-
template <class T>
absl::optional<T> TestCookieAccessDelegate::RunMaybeAsync(
T result,
@@ -142,7 +123,7 @@ std::string TestCookieAccessDelegate::GetKeyForDomainValue(
}
void TestCookieAccessDelegate::SetFirstPartySets(
- const base::flat_map<SchemefulSite, std::set<SchemefulSite>>& sets) {
+ const base::flat_map<SchemefulSite, FirstPartySetEntry>& sets) {
first_party_sets_ = sets;
}
diff --git a/chromium/net/cookies/test_cookie_access_delegate.h b/chromium/net/cookies/test_cookie_access_delegate.h
index 969447f7080..c07c887a415 100644
--- a/chromium/net/cookies/test_cookie_access_delegate.h
+++ b/chromium/net/cookies/test_cookie_access_delegate.h
@@ -15,8 +15,8 @@
#include "net/base/schemeful_site.h"
#include "net/cookies/cookie_access_delegate.h"
#include "net/cookies/cookie_constants.h"
+#include "net/cookies/first_party_set_entry.h"
#include "net/cookies/first_party_set_metadata.h"
-#include "net/cookies/same_party_context.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace net {
@@ -46,19 +46,11 @@ class TestCookieAccessDelegate : public CookieAccessDelegate {
const SchemefulSite* top_frame_site,
const std::set<SchemefulSite>& party_context,
base::OnceCallback<void(FirstPartySetMetadata)> callback) const override;
- absl::optional<absl::optional<SchemefulSite>> FindFirstPartySetOwner(
- const SchemefulSite& site,
- base::OnceCallback<void(absl::optional<SchemefulSite>)> callback)
- const override;
- absl::optional<base::flat_map<SchemefulSite, SchemefulSite>>
+ absl::optional<base::flat_map<SchemefulSite, FirstPartySetEntry>>
FindFirstPartySetOwners(
const base::flat_set<SchemefulSite>& sites,
- base::OnceCallback<void(base::flat_map<SchemefulSite, SchemefulSite>)>
- callback) const override;
- absl::optional<base::flat_map<SchemefulSite, std::set<SchemefulSite>>>
- RetrieveFirstPartySets(
- base::OnceCallback<void(
- base::flat_map<SchemefulSite, std::set<SchemefulSite>>)> callback)
+ base::OnceCallback<
+ void(base::flat_map<SchemefulSite, FirstPartySetEntry>)> callback)
const override;
// Sets the expected return value for any cookie whose Domain
@@ -74,11 +66,10 @@ class TestCookieAccessDelegate : public CookieAccessDelegate {
const std::string& site_for_cookies_scheme,
bool require_secure_origin);
- // Set the test delegate's First-Party Sets. The map is keyed on the set's
- // owner site. The owner site should still be included in the std::set stored
- // in the map.
+ // Set the test delegate's First-Party Sets. The map's keys are the sites in
+ // the sets. Owner sites must be included among the keys for a given set.
void SetFirstPartySets(
- const base::flat_map<SchemefulSite, std::set<SchemefulSite>>& sets);
+ const base::flat_map<SchemefulSite, FirstPartySetEntry>& sets);
void set_invoke_callbacks_asynchronously(bool async) {
invoke_callbacks_asynchronously_ = async;
@@ -86,7 +77,7 @@ class TestCookieAccessDelegate : public CookieAccessDelegate {
private:
// Synchronous version of FindFirstPartySetOwner, for convenience.
- absl::optional<SchemefulSite> FindFirstPartySetOwnerSync(
+ absl::optional<FirstPartySetEntry> FindFirstPartySetOwnerSync(
const SchemefulSite& site) const;
// Discard any leading dot in the domain string.
@@ -100,7 +91,7 @@ class TestCookieAccessDelegate : public CookieAccessDelegate {
std::map<std::string, CookieAccessSemantics> expectations_;
std::map<std::string, bool> ignore_samesite_restrictions_schemes_;
- base::flat_map<SchemefulSite, std::set<SchemefulSite>> first_party_sets_;
+ base::flat_map<SchemefulSite, FirstPartySetEntry> first_party_sets_;
bool invoke_callbacks_asynchronously_ = false;
};
diff --git a/chromium/net/data/cache_tests/good_2_0/contents.txt b/chromium/net/data/cache_tests/good_2_0/contents.txt
new file mode 100644
index 00000000000..4b987fc55e7
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_0/contents.txt
@@ -0,0 +1,38 @@
+This is a sample valid cache in 2.0 format.
+This was produced before the 3.0 format change by the following test:
+
+TEST_F(DiskCacheBackendTest, CreateCorrect) {
+ const char* kKey = "https://example.org/data";
+ cache_path_ = base::FilePath("/tmp/cache-correct-2.0");
+ CleanupCacheDir();
+ CHECK(base::CreateDirectory(cache_path_));
+
+ SetMaxSize(16*1024);
+ InitCache();
+
+ disk_cache::Entry* entry = nullptr;
+ ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
+
+ const int kBufSize = 1234;
+ scoped_refptr<net::IOBuffer> buffer =
+ base::MakeRefCounted<net::IOBuffer>(kBufSize);
+ CacheTestFillBuffer(buffer->data(), kBufSize, /*no_nulls=*/false);
+
+ EXPECT_EQ(kBufSize, WriteData(entry, /*index=*/1, /*offset=*/0, buffer.get(),
+ /*len=*/kBufSize, /*truncate=*/false));
+ entry->Close();
+}
+
+With the following patch applied:
+--- a/net/disk_cache/blockfile/block_files.cc
++++ b/net/disk_cache/blockfile/block_files.cc
+@@ -487,7 +487,7 @@ bool BlockFiles::GrowBlockFile(MappedFile* file, BlockFileHeader* header) {
+
+ ScopedFlush flush(file);
+ DCHECK(!header->empty[3]);
+- int new_size = header->max_entries + 1024;
++ int new_size = header->max_entries + 64;
+ if (new_size > kMaxBlocks)
+ new_size = kMaxBlocks;
+
+To keep the data_ file size down somewhat.
diff --git a/chromium/net/data/cache_tests/good_2_0/data_0 b/chromium/net/data/cache_tests/good_2_0/data_0
new file mode 100644
index 00000000000..8049b0c5558
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_0/data_0
Binary files differ
diff --git a/chromium/net/data/cache_tests/good_2_0/data_1 b/chromium/net/data/cache_tests/good_2_0/data_1
new file mode 100644
index 00000000000..6584d2d42ef
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_0/data_1
Binary files differ
diff --git a/chromium/net/data/cache_tests/good_2_0/data_2 b/chromium/net/data/cache_tests/good_2_0/data_2
new file mode 100644
index 00000000000..fc272a5e622
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_0/data_2
Binary files differ
diff --git a/chromium/net/data/cache_tests/good_2_0/data_3 b/chromium/net/data/cache_tests/good_2_0/data_3
new file mode 100644
index 00000000000..5eec97358cf
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_0/data_3
Binary files differ
diff --git a/chromium/net/data/cache_tests/good_2_0/index b/chromium/net/data/cache_tests/good_2_0/index
new file mode 100644
index 00000000000..3da72c44ad7
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_0/index
Binary files differ
diff --git a/chromium/net/data/cache_tests/good_2_1/contents.txt b/chromium/net/data/cache_tests/good_2_1/contents.txt
new file mode 100644
index 00000000000..fddaf89ae2d
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_1/contents.txt
@@ -0,0 +1,39 @@
+This is a sample valid cache in 2.1 format.
+This was produced before the 3.0 format change by the following test:
+
+TEST_F(DiskCacheBackendTest, CreateCorrect21) {
+ const char* kKey = "https://example.org/data";
+ cache_path_ = base::FilePath("/tmp/cache-correct-2.1");
+ CleanupCacheDir();
+ CHECK(base::CreateDirectory(cache_path_));
+
+ SetMaxSize(16*1024);
+ SetNewEviction();
+ InitCache();
+
+ disk_cache::Entry* entry = nullptr;
+ ASSERT_THAT(CreateEntry(kKey, &entry), IsOk());
+
+ const int kBufSize = 1234;
+ scoped_refptr<net::IOBuffer> buffer =
+ base::MakeRefCounted<net::IOBuffer>(kBufSize);
+ CacheTestFillBuffer(buffer->data(), kBufSize, /*no_nulls=*/false);
+
+ EXPECT_EQ(kBufSize, WriteData(entry, /*index=*/1, /*offset=*/0, buffer.get(),
+ /*len=*/kBufSize, /*truncate=*/false));
+ entry->Close();
+}
+
+With the following patch applied:
+--- a/net/disk_cache/blockfile/block_files.cc
++++ b/net/disk_cache/blockfile/block_files.cc
+@@ -487,7 +487,7 @@ bool BlockFiles::GrowBlockFile(MappedFile* file, BlockFileHeader* header) {
+
+ ScopedFlush flush(file);
+ DCHECK(!header->empty[3]);
+- int new_size = header->max_entries + 1024;
++ int new_size = header->max_entries + 64;
+ if (new_size > kMaxBlocks)
+ new_size = kMaxBlocks;
+
+To keep the data_ file size down somewhat.
diff --git a/chromium/net/data/cache_tests/good_2_1/data_0 b/chromium/net/data/cache_tests/good_2_1/data_0
new file mode 100644
index 00000000000..509eaec99a9
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_1/data_0
Binary files differ
diff --git a/chromium/net/data/cache_tests/good_2_1/data_1 b/chromium/net/data/cache_tests/good_2_1/data_1
new file mode 100644
index 00000000000..3a4beb1aa6a
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_1/data_1
Binary files differ
diff --git a/chromium/net/data/cache_tests/good_2_1/data_2 b/chromium/net/data/cache_tests/good_2_1/data_2
new file mode 100644
index 00000000000..c6148092fd0
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_1/data_2
Binary files differ
diff --git a/chromium/net/data/cache_tests/good_2_1/data_3 b/chromium/net/data/cache_tests/good_2_1/data_3
new file mode 100644
index 00000000000..5eec97358cf
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_1/data_3
Binary files differ
diff --git a/chromium/net/data/cache_tests/good_2_1/index b/chromium/net/data/cache_tests/good_2_1/index
new file mode 100644
index 00000000000..c0f3852df85
--- /dev/null
+++ b/chromium/net/data/cache_tests/good_2_1/index
Binary files differ
diff --git a/chromium/net/data/gencerts/__init__.py b/chromium/net/data/gencerts/__init__.py
index a02cfdaca8d..0df76913d82 100755
--- a/chromium/net/data/gencerts/__init__.py
+++ b/chromium/net/data/gencerts/__init__.py
@@ -17,7 +17,7 @@ import shutil
import subprocess
import sys
-import openssl_conf
+from . import openssl_conf
# Enum for the "type" of certificate that is to be created. This is used to
# select sane defaults for the .cnf file and command line flags, but they can
@@ -499,8 +499,10 @@ class Certificate(object):
def text_data_to_pem(block_header, text_data):
- return '%s\n-----BEGIN %s-----\n%s\n-----END %s-----\n' % (text_data,
- block_header, base64.b64encode(text_data), block_header)
+ # b64encode takes in bytes and returns bytes.
+ pem_data = base64.b64encode(text_data.encode('utf8')).decode('utf8')
+ return '%s\n-----BEGIN %s-----\n%s\n-----END %s-----\n' % (
+ text_data, block_header, pem_data, block_header)
def write_chain(description, chain, out_pem):
diff --git a/chromium/net/data/ssl/chrome_root_store/OWNERS b/chromium/net/data/ssl/chrome_root_store/OWNERS
index 7b81fc4020a..63ec9ca6dbc 100644
--- a/chromium/net/data/ssl/chrome_root_store/OWNERS
+++ b/chromium/net/data/ssl/chrome_root_store/OWNERS
@@ -1,3 +1,9 @@
# For bot updates to Chrome Root Store
+# TODO(crbug.com/1342998): Remove mdb.chrome-pki-metadata@google.com once the
+# pod batch migration is complete.
per-file root_store.certs=mdb.chrome-pki-metadata@google.com
per-file root_store.textproto=mdb.chrome-pki-metadata@google.com
+
+per-file root_store.certs=mdb.chrome-pki-metadata-release-jobs@google.com
+per-file root_store.textproto=mdb.chrome-pki-metadata-release-jobs@google.com
+per-file root_store.md=mdb.chrome-pki-metadata-release-jobs@google.com
diff --git a/chromium/net/data/ssl/chrome_root_store/README.md b/chromium/net/data/ssl/chrome_root_store/README.md
index 040f80e6a6d..d3cd6eb402e 100644
--- a/chromium/net/data/ssl/chrome_root_store/README.md
+++ b/chromium/net/data/ssl/chrome_root_store/README.md
@@ -4,11 +4,36 @@ This directory contains the in development definition of the
[Chrome Root Store](https://www.chromium.org/Home/chromium-security/root-ca-policy).
It is currently not used for trust decisions in Chrome.
-The root store is defined by `store/root_store.textproto` file, which is a
-`RootStore` [protobuf](https://developers.google.com/protocol-buffers) message,
-defined in
-[`//net/tools/root_store_tool/root_store.proto`](/net/tools/root_store_tool/root_store.proto).
-It references certificates in the `store/certs` directory. The
-[`root_store_tool`](/net/tools/root_store_tool/root_store_tool.cc) will
-files in this directory to eventually use this data for trust decisions in
-Chrome.
+The root store is defined by two files:
+
+* `root_store.textproto` file, which is a `RootStore`
+ [protobuf](https://developers.google.com/protocol-buffers) message, defined in
+ [`//net/cert/root_store.proto`](/net/cert/root_store.proto).
+
+* `root_store.certs` which stores the certificates referenced by
+ `root_store.textproto`
+
+The [`root_store_tool`](/net/tools/root_store_tool/root_store_tool.cc) uses the
+two files above to generate code that is included in Chrome. This generated code
+will eventually be used for trust decisions in Chrome.
+
+## Testing
+
+To test the Chrome Root store, do the following:
+
+* On M102 or higher on Windows, run Chrome with the following flag:
+
+ `--enable-features=ChromeRootStoreUsed`
+
+ As of 2022-06, an example of a web site that is trusted by Windows Root Store
+ but not by Chrome Root Store is https://rootcertificateprograms.edicom.es/.
+ This can be used to test if Chrome Root Store is turned on or not (for best
+ results use a fresh incognito window to avoid any caching issues).
+
+* On 105.0.5122.0 or higher on Mac, run Chrome with the following flag:
+
+ `--enable-features=ChromeRootStoreUsed,CertVerifierBuiltin:impl/4`
+
+If you're running 104.0.5110.0 or higher, the currently used Chrome Root Store
+version can be seen in a [NetLog
+dump](https://www.chromium.org/for-testers/providing-network-details/).
diff --git a/chromium/net/data/ssl/chrome_root_store/root_store.md b/chromium/net/data/ssl/chrome_root_store/root_store.md
new file mode 100644
index 00000000000..9efd6982e84
--- /dev/null
+++ b/chromium/net/data/ssl/chrome_root_store/root_store.md
@@ -0,0 +1,146 @@
+<!-- mdformat off(generated) -->
+<!-- mdlint off(generated) -->
+Version: 8
+
+SHA 256 Hash | Subject | NotBefore | NotAfter
+---|---|---|---
+55926084ec963a64b96e2abe01ce0ba86a64fbfebcc7aab5afc155b37fd76066 | CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT | 2011-09-22 | 2030-09-22
+18ce6cfe7bf14e60b2e347b8dfe868cb31d02ebb3ada271569f50343b46db3a4 | CN=Amazon Root CA 3,O=Amazon,C=US | 2015-05-26 | 2040-05-26
+1ba5b2aa8c65401a82960118f80bec4f62304d83cec4713a19c39c011ea46db4 | CN=Amazon Root CA 2,O=Amazon,C=US | 2015-05-26 | 2040-05-26
+568d6905a2c88708a4b3025190edcfedb1974a606a13c6e5290fcb2ae63edab5 | CN=Starfield Services Root Certificate Authority - G2,O=Starfield Technologies\, Inc.,L=Scottsdale,ST=Arizona,C=US | 2009-09-01 | 2037-12-31
+8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e | CN=Amazon Root CA 1,O=Amazon,C=US | 2015-05-26 | 2038-01-17
+e35d28419ed02025cfa69038cd623962458da5c695fbdea3c22b0bfb25897092 | CN=Amazon Root CA 4,O=Amazon,C=US | 2015-05-26 | 2040-05-26
+5c58468d55f58e497e743982d2b50010b6d165374acf83a7d4a32db768c4408e | CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL | 2008-10-22 | 2029-12-31
+b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804 | CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL | 2011-10-06 | 2046-10-06
+f356bea244b7a91eb35d53ca9ad7864ace018e2d35d5f8f96ddf68a6f41aa474 | CN=Atos TrustedRoot 2011,O=Atos,C=DE | 2011-07-07 | 2030-12-31
+57de0583efd2b26e0361da99da9df4648def7ee8441c3b728afa9bcde0f9b26a | CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES | 2014-09-23 | 2036-05-05
+9a114025197c5bb95d94e63d55cd43790847b646b23cdf11ada4a00eff15fb48 | CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO | 2010-10-26 | 2040-10-26
+edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d | CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO | 2010-10-26 | 2040-10-26
+657cfe2fa73faa38462571f332a2363a46fce7020951710702cdfbb6eeda3305 | OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO | 2017-02-06 | 2042-02-06
+eaa962c4fa4a6bafebe415196d351ccd888d4f53f3fa8ae6d7c466a94e6042bb | OU=certSIGN ROOT CA,O=certSIGN,C=RO | 2006-07-04 | 2031-07-04
+5cc3d78e4e1d5e45547a04e6873e64f90cf9536d1ccc2ef800f355c4c5fd70fd | CN=CFCA EV ROOT,O=China Financial Certification Authority,C=CN | 2012-08-08 | 2029-12-31
+c0a6f4dc63a24bfdcf54ef2a6a082a0a72de35803e2ff5ff527ae5d87206dfd5 | OU=ePKI Root Certification Authority,O=Chunghwa Telecom Co.\, Ltd.,C=TW | 2004-12-20 | 2034-12-20
+bf0feefb9e3a581ad5f9e9db7589985743d261085c4d314f6f5d7259aa421612 | CN=SecureSign RootCA11,O=Japan Certification Services\, Inc.,C=JP | 2009-04-08 | 2029-04-08
+49e7a442acf0ea6287050054b52564b650e4f49e42e348d6aa38e039e957b1c1 | CN=D-TRUST Root Class 3 CA 2 2009,O=D-Trust GmbH,C=DE | 2009-11-05 | 2029-11-05
+eec5496b988ce98625b934092eec2908bed0b0f316c2d4730c84eaf1f3d34881 | CN=D-TRUST Root Class 3 CA 2 EV 2009,O=D-Trust GmbH,C=DE | 2009-11-05 | 2029-11-05
+91e2f5788d5810eba7ba58737de1548a8ecacd014598bc0b143e041b17052552 | CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE | 2008-10-01 | 2033-10-01
+fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd | CN=T-TeleSec GlobalRoot Class 3,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE | 2008-10-01 | 2033-10-01
+d48d3d23eedb50a459e55197601c27774b9d7b18c94d5a059511a10250b93168 | CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR | 2013-10-01 | 2033-10-01
+e3b6a2db2ed7ce48842f7ac53241c7b71d54144bfb40c11f3f1d0b42f5eea12d | CN=Certigna,O=Dhimyotis,C=FR | 2007-06-29 | 2027-06-29
+16af57a9f676b0ab126095aa5ebadef22ab31119d644ac95cd4b93dbf3f26aeb | CN=Baltimore CyberTrust Root,OU=CyberTrust,O=Baltimore,C=IE | 2000-05-12 | 2025-05-12
+31ad6648f8104138c738f39ea4320133393e3a18cc02296ef97c2ac9ef6731d0 | CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US | 2013-08-01 | 2038-01-15
+3e9099b5015e8f486c00bcea9d111ee721faba355a89bcf1df69561e3dc6325c | CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US | 2006-11-10 | 2031-11-10
+4348a0e9444c78cb265e058d5e8944b4d84f9662bd26db257f8934a443c70161 | CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US | 2006-11-10 | 2031-11-10
+552f7bdcf1a7af9e6ce672017f4f12abf77240c78e761ac203d1d9d20ac89988 | CN=DigiCert Trusted Root G4,OU=www.digicert.com,O=DigiCert Inc,C=US | 2013-08-01 | 2038-01-15
+7431e5f4c3c1ce4690774f0b61e05440883ba9a01ed00ba6abd7806ed3b118cf | CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US | 2006-11-10 | 2031-11-10
+7d05ebb682339f8c9451ee094eebfefa7953a114edb2f44949452fab7d2fc185 | CN=DigiCert Assured ID Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US | 2013-08-01 | 2038-01-15
+7e37cb8b4c47090cab36551ba6f45db840680fba166a952db100717f43053fc2 | CN=DigiCert Assured ID Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US | 2013-08-01 | 2038-01-15
+cb3ccbb76031e5e0138f8dd39a23f9de47ffc35e43c1144cea27d46a5ab1cb5f | CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US | 2013-08-01 | 2038-01-15
+e23d4a036d7b70e9f595b1422079d2b91edfbb1fb651a0633eaa8a9dc5f80703 | CN=CA Disig Root R2,O=Disig a.s.,L=Bratislava,C=SK | 2012-07-19 | 2042-07-19
+b0bfd52bb0d7d9bd92bf5d4dc13da255c02c542f378365ea893911f55e55f23c | CN=E-Tugra Certification Authority,OU=E-Tugra Sertifikasyon Merkezi,O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.,L=Ankara,C=TR | 2013-03-05 | 2023-03-03
+125609aa301da0a249b97a8239cb6a34216f44dcac9f3954b14292f2e8c8608f | CN=emSign Root CA - C1,OU=emSign PKI,O=eMudhra Inc,C=US | 2018-02-18 | 2043-02-18
+40f6af0346a99aa1cd1d555a4e9cce62c7f9634603ee406615833dc8c8d00367 | CN=emSign Root CA - G1,OU=emSign PKI,O=eMudhra Technologies Limited,C=IN | 2018-02-18 | 2043-02-18
+86a1ecba089c4a8d3bbe2734c612ba341d813e043cf9e8a862cd5c57a36bbe6b | CN=emSign ECC Root CA - G3,OU=emSign PKI,O=eMudhra Technologies Limited,C=IN | 2018-02-18 | 2043-02-18
+bc4d809b15189d78db3e1d8cf4f9726a795da1643ca5f1358e1ddb0edc0d7eb3 | CN=emSign ECC Root CA - C3,OU=emSign PKI,O=eMudhra Inc,C=US | 2018-02-18 | 2043-02-18
+02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5 | CN=Entrust Root Certification Authority - EC1,OU=See www.entrust.net/legal-terms+OU=(c) 2012 Entrust\, Inc. - for authorized use only,O=Entrust\, Inc.,C=US | 2012-12-18 | 2037-12-18
+0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7 | CN=AffirmTrust Commercial,O=AffirmTrust,C=US | 2010-01-29 | 2030-12-31
+0a81ec5a929777f145904af38d5d509f66b5e2c58fcdb531058b0e17f3f0b41b | CN=AffirmTrust Networking,O=AffirmTrust,C=US | 2010-01-29 | 2030-12-31
+43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339 | CN=Entrust Root Certification Authority - G2,OU=See www.entrust.net/legal-terms+OU=(c) 2009 Entrust\, Inc. - for authorized use only,O=Entrust\, Inc.,C=US | 2009-07-07 | 2030-12-07
+6dc47172e01cbcb0bf62580d895fe2b8ac9ad4f873801e0c10b9c837d21eb177 | CN=Entrust.net Certification Authority (2048),OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)+OU=(c) 1999 Entrust.net Limited,O=Entrust.net | 1999-12-24 | 2029-07-24
+70a73f7f376b60074248904534b11482d5bf0e698ecc498df52577ebf2e93b9a | CN=AffirmTrust Premium,O=AffirmTrust,C=US | 2010-01-29 | 2040-12-31
+73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c | CN=Entrust Root Certification Authority,OU=www.entrust.net/CPS is incorporated by reference+OU=(c) 2006 Entrust\, Inc.,O=Entrust\, Inc.,C=US | 2006-11-27 | 2026-11-27
+bd71fdf6da97e4cf62d1647add2581b07d79adf8397eb4ecba9c5e8488821423 | CN=AffirmTrust Premium ECC,O=AffirmTrust,C=US | 2010-01-29 | 2040-12-31
+db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88 | CN=Entrust Root Certification Authority - G4,OU=See www.entrust.net/legal-terms+OU=(c) 2015 Entrust\, Inc. - for authorized use only,O=Entrust\, Inc.,C=US | 2015-05-27 | 2037-12-27
+bfff8fd04433487d6a8aa60c1a29767a9fc2bbb05e420f713a13b992891d3893 | CN=GDCA TrustAUTH R5 ROOT,O=GUANG DONG CERTIFICATE AUTHORITY CO.\,LTD.,C=CN | 2014-11-26 | 2040-12-31
+179fbc148a3dd00fd24ea13458cc43bfa7f59c8182d783a513f6ebec100c8924 | CN=GlobalSign,OU=GlobalSign ECC Root CA - R5,O=GlobalSign | 2012-11-13 | 2038-01-19
+2cabeafe37d06ca22aba7391c0033d25982952c453647349763a3ab5ad6ccf69 | CN=GlobalSign,OU=GlobalSign Root CA - R6,O=GlobalSign | 2014-12-10 | 2034-12-10
+cbb522d7b7f127ad6a0113865bdf1cd4102e7d0759af635a7cf4720dc963c53b | CN=GlobalSign,OU=GlobalSign Root CA - R3,O=GlobalSign | 2009-03-18 | 2029-03-18
+ebd41040e4bb3ec742c9e381d31ef2a41a48b6685c96e7cef3c1df6cd4331c99 | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 1998-09-01 | 2028-01-28
+1465fa205397b876faa6f0a9958e5590e40fcc7faa4fb7c2c8677521fb5fb658 | OU=Starfield Class 2 Certification Authority,O=Starfield Technologies\, Inc.,C=US | 2004-06-29 | 2034-06-29
+2ce1cb0bf9d2f9e102993fbe215152c3b2dd0cabde1c68e5319b839154dbb7f5 | CN=Starfield Root Certificate Authority - G2,O=Starfield Technologies\, Inc.,L=Scottsdale,ST=Arizona,C=US | 2009-09-01 | 2037-12-31
+45140b3247eb9cc8c5b4f0d7b53091f73292089e6e5a63e2749dd3aca9198eda | CN=Go Daddy Root Certificate Authority - G2,O=GoDaddy.com\, Inc.,L=Scottsdale,ST=Arizona,C=US | 2009-09-01 | 2037-12-31
+c3846bf24b9e93ca64274c0ec67c1ecc5e024ffcacd2d74019350e81fe546ae4 | OU=Go Daddy Class 2 Certification Authority,O=The Go Daddy Group\, Inc.,C=US | 2004-06-29 | 2034-06-29
+34d8a73ee208d9bcdb0d956520934b4e40e69482596e8b6f73c8426b010a6f48 | CN=GTS Root R3,O=Google Trust Services LLC,C=US | 2016-06-22 | 2036-06-22
+d947432abde7b7fa90fc2e6b59101b1280e0e1c7e4e40fa3c6887fff57a7f4cf | CN=GTS Root R1,O=Google Trust Services LLC,C=US | 2016-06-22 | 2036-06-22
+349dfa4058c5e263123b398ae795573c4e1313c83fe68f93556cd5e8031b3c7d | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 2016-06-22 | 2036-06-22
+b085d70b964f191a73e4af0d54ae7a0e07aafdaf9b71dd0862138ab7325a24a2 | CN=GlobalSign,OU=GlobalSign ECC Root CA - R4,O=GlobalSign | 2012-11-13 | 2038-01-19
+8d25cd97229dbf70356bda4eb3cc734031e24cf00fafcfd32dc76eb5841c7ea8 | CN=GTS Root R2,O=Google Trust Services LLC,C=US | 2016-06-22 | 2036-06-22
+5a2fc03f0c83b090bbfa40604b0988446c7636183df9846e17101a447fb8efd6 | CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK | 2017-06-03 | 2042-06-03
+f9e67d336c51002ac054c632022d66dda2e7e3fff10ad061ed31d8bbb410cfb2 | CN=Hongkong Post Root CA 1,O=Hongkong Post,C=HK | 2003-05-15 | 2023-05-15
+9a6ec012e1a7da9dbe34194d478ad7c0db1822fb071df12981496ed104384113 | CN=ACCVRAIZ1,OU=PKIACCV,O=ACCV,C=ES | 2011-05-05 | 2030-12-31
+ebc5570c29018c4d67b1aa127baf12f703b4611ebc17b7dab5573894179b93fa | OU=AC RAIZ FNMT-RCM,O=FNMT-RCM,C=ES | 2008-10-29 | 2030-01-01
+4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a | CN=Staat der Nederlanden EV Root CA,O=Staat der Nederlanden,C=NL | 2010-12-08 | 2022-12-08
+46edc3689046d53a453fb3104ab80dcaec658b2660ea1629dd7e867990648716 | CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1,OU=Kamu Sertifikasyon Merkezi - Kamu SM,O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK,L=Gebze - Kocaeli,C=TR | 2013-11-25 | 2043-10-25
+44b545aa8a25e65a73ca15dc27fc36d24c1cb9953a066539b11582dc487b4833 | CN=Hellenic Academic and Research Institutions ECC RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR | 2015-07-07 | 2040-06-30
+a040929a02ce53b4acf4f2ffc6981ce4496f755e6d45fe0b2a692bcd52523f36 | CN=Hellenic Academic and Research Institutions RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR | 2015-07-07 | 2040-06-30
+30d0895a9a448a262091635522d1f52010b5867acae12c78ef958fd4f4389f2f | CN=IdenTrust Public Sector Root CA 1,O=IdenTrust,C=US | 2014-01-16 | 2034-01-16
+5d56499be4d2e08bcfcad08a3e38723d50503bde706948e42f55603019e528ae | CN=IdenTrust Commercial Root CA 1,O=IdenTrust,C=US | 2014-01-16 | 2034-01-16
+96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6 | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 2015-06-04 | 2035-06-04
+2530cc8e98321502bad96f9b1fba1b099e2d299e0f4548bb914f363bc0d4531f | CN=Izenpe.com,O=IZENPE S.A.,C=ES | 2007-12-13 | 2037-12-13
+a1339d33281a0b56e557d3d32b1ce7f9367eb094bd5fa72a7e5004c8ded7cafe | CN=SZAFIR ROOT CA2,O=Krajowa Izba Rozliczeniowa S.A.,C=PL | 2015-10-19 | 2035-10-19
+3c5f81fea5fab82c64bfa2eaecafcde8e077fc8620a7cae537163df36edbf378 | CN=Microsec e-Szigno Root CA 2009,O=Microsec Ltd.,L=Budapest,C=HU,1.2.840.113549.1.9.1=#0c10696e666f40652d737a69676e6f2e6875 | 2009-06-16 | 2029-12-30
+beb00b30839b9bc32c32e4447905950641f26421b15ed089198b518ae2ea1b99 | CN=e-Szigno Root CA 2017,O=Microsec Ltd.,L=Budapest,C=HU,2.5.4.97=#130e56415448552d3233353834343937 | 2017-08-22 | 2042-08-22
+358df39d764af9e1b766e9c972df352ee15cfac227af6ad1d70e8e4a6edcba02 | CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US | 2019-12-18 | 2042-07-18
+c741f70f4b2a8d88bf2e71c14122ef53ef10eba0cfa5e64cfa20f418853073e0 | CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US | 2019-12-18 | 2042-07-18
+6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98 | CN=NetLock Arany (Class Gold) Főtanúsítvány,OU=Tanúsítványkiadók (Certification Services),O=NetLock Kft.,L=Budapest,C=HU | 2008-12-11 | 2028-12-06
+6b9c08e86eb0f767cfad65cd98b62149e5494a67f5845e7bd1ed019f27b86bd6 | CN=OISTE WISeKey Global Root GB CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH | 2014-12-01 | 2039-12-01
+8560f91c3624daba9570b5fea0dbe36ff11a8323be9486854fb3f34a5571198d | CN=OISTE WISeKey Global Root GC CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH | 2017-05-09 | 2042-05-09
+18f1fc7f205df8adddeb7fe007dd57e3af375a9c4d8d73546bf4f1fed1e18d35 | CN=QuoVadis Root CA 3,O=QuoVadis Limited,C=BM | 2006-11-24 | 2031-11-24
+85a0dd7dd720adb7ff05f83d542b209dc7ff4528f7d677b18389fea5e5c49e86 | CN=QuoVadis Root CA 2,O=QuoVadis Limited,C=BM | 2006-11-24 | 2031-11-24
+88ef81de202eb018452e43f864725cea5fbd1fc2d9d205730709c5d8b8690f46 | CN=QuoVadis Root CA 3 G3,O=QuoVadis Limited,C=BM | 2012-01-12 | 2042-01-12
+8a866fd1b276b57e578e921c65828a2bed58e9f2f288054134b7f1f4bfc9cc74 | CN=QuoVadis Root CA 1 G3,O=QuoVadis Limited,C=BM | 2012-01-12 | 2042-01-12
+8fe4fb0af93a4d0d67db0bebb23e37c71bf325dcbcdd240ea04daf58b47e1840 | CN=QuoVadis Root CA 2 G3,O=QuoVadis Limited,C=BM | 2012-01-12 | 2042-01-12
+513b2cecb810d4cde5dd85391adfc6c2dd60d87bb736d2b521484aa47a0ebef6 | OU=Security Communication RootCA2,O=SECOM Trust Systems CO.\,LTD.,C=JP | 2009-05-29 | 2029-05-29
+e75e72ed9f560eec6eb4800073a43fc3ad19195a392282017895974a99026b6c | OU=Security Communication RootCA1,O=SECOM Trust.net,C=JP | 2003-09-30 | 2023-09-30
+1a0d20445de5ba1862d19ef880858cbce50102b36e8f0a040c3c69e74522fe6e | CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB | 2011-01-01 | 2030-12-31
+1793927a0614549789adce2f8f34f7f0b66d0f3ae3a3b84d21ec15dbba4fadc7 | CN=COMODO ECC Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB | 2008-03-06 | 2038-01-18
+4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a | CN=USERTrust ECC Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US | 2010-02-01 | 2038-01-18
+52f0e1c4e58ec629291b60317f074671b85d7ea80d5b07273463534b32b40234 | CN=COMODO RSA Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB | 2010-01-19 | 2038-01-18
+d7a7a0fb5d7e2731d771e9484ebcdef71d5f0c3e0a2948782bc83ee0ea699ef4 | CN=AAA Certificate Services,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB | 2004-01-01 | 2028-12-31
+e793c9b02fd8aa13e21c31228accb08119643b749c898964b1746d46c3d4cbd2 | CN=USERTrust RSA Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US | 2010-02-01 | 2038-01-18
+4200f5043ac8590ebb527d209ed1503029fbcbd41ca1b506ec27f15ade7dac69 | CN=Secure Global CA,O=SecureTrust Corporation,C=US | 2006-11-07 | 2029-12-31
+55903859c8c0c3ebb8759ece4e2557225ff5758bbd38ebd48276601e1bd58097 | CN=Trustwave Global ECC P384 Certification Authority,O=Trustwave Holdings\, Inc.,L=Chicago,ST=Illinois,C=US | 2017-08-23 | 2042-08-23
+945bbc825ea554f489d1fd51a73ddf2ea624ac7019a05205225c22a78ccfa8b4 | CN=Trustwave Global ECC P256 Certification Authority,O=Trustwave Holdings\, Inc.,L=Chicago,ST=Illinois,C=US | 2017-08-23 | 2042-08-23
+97552015f5ddfc3c8788c006944555408894450084f100867086bc1a2bb58dc8 | CN=Trustwave Global Certification Authority,O=Trustwave Holdings\, Inc.,L=Chicago,ST=Illinois,C=US | 2017-08-23 | 2042-08-23
+cecddc905099d8dadfc5b1d209b737cbe2c18cfb2c10c0ff0bcf0d3286fc1aa2 | CN=XRamp Global Certification Authority,OU=www.xrampsecurity.com,O=XRamp Security Services Inc,C=US | 2004-11-01 | 2035-01-01
+f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73 | CN=SecureTrust CA,O=SecureTrust Corporation,C=US | 2006-11-07 | 2029-12-31
+9bea11c976fe014764c1be56a6f914b5a560317abd9988393382e5161aa0493c | CN=UCA Global G2 Root,O=UniTrust,C=CN | 2016-03-11 | 2040-12-31
+d43af9b35473755c9684fc06d7d8cb70ee5c28e773fb294eb41ee71722924d24 | CN=UCA Extended Validation Root,O=UniTrust,C=CN | 2015-03-13 | 2038-12-31
+22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8 | CN=SSL.com EV Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2016-02-12 | 2041-02-12
+2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c | CN=SSL.com EV Root Certification Authority RSA R2,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2017-05-31 | 2042-05-30
+3417bb06cc6007da1b961c920b8ab4ce3fad820e4aa30b9acbc4a74ebdcebc65 | CN=SSL.com Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2016-02-12 | 2041-02-12
+85666a562ee0be5ce925c1d8890a6f76a87ec16d4d7d5f29ea7419cf20123b69 | CN=SSL.com Root Certification Authority RSA,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2016-02-12 | 2041-02-12
+62dd0be9b9f50a163ea0f8e75c053b1eca57ea55c8688f647c6881f2c8357b95 | CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH | 2006-10-25 | 2036-10-25
+be6c4da2bbb9ba59b6f3939768374246c3c005993fa98f020d1dedbed48a81d5 | CN=SwissSign Silver CA - G2,O=SwissSign AG,C=CH | 2006-10-25 | 2036-10-25
+59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b | CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW | 2012-06-27 | 2030-12-31
+bfd88fe1101c41ae3e801bf8be56350ee9bad1a6b9bd515edc5c6d5b8711ac44 | CN=TWCA Root Certification Authority,OU=Root CA,O=TAIWAN-CA,C=TW | 2008-08-28 | 2030-12-31
+dd6936fe21f8f077c123a1a521c12224f72255b73e03a7260693e8a24b0fa389 | CN=TeliaSonera Root CA v1,O=TeliaSonera | 2007-10-18 | 2032-10-18
+0753e940378c1bd5e3836e395daea5cb839e5046f1bd0eae1951cf10fec7c965 | CN=TrustCor RootCert CA-2,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA | 2016-02-04 | 2034-12-31
+5a885db19c01d912c5759388938cafbbdf031ab2d48e91ee15589b42971d039c | CN=TrustCor ECA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA | 2016-02-04 | 2029-12-31
+d40e9c86cd8fe468c1776959f49ea774fa548684b6c406f3909261f4dce2575c | CN=TrustCor RootCert CA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA | 2016-02-04 | 2029-12-31
+001686cd181f83a1b1217d305b365c41e3470a78a1d37b134a98cd547b92dab3 | CN=Network Solutions Certificate Authority,O=Network Solutions L.L.C.,C=US | 2011-01-01 | 2030-12-31
+6b328085625318aa50d173c98d8bda09d57e27413d114cf787a0f5d06c030cf6 | CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL | 2018-03-26 | 2043-03-26
+fe7696573855773e37a95e7ad4d9cc96c30157c15d31765ba9b15704e1ae78fd | CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL | 2018-03-16 | 2043-03-16
+e59aaa816009c22bff5b25bad37df306f049797c1f81d85ab089e657bd8f0044 | CN=D-TRUST BR Root CA 1 2020,O=D-Trust GmbH,C=DE | 2020-02-11 | 2035-02-11
+08170d1aa36453901a2f959245e347db0c8d37abaabc56b81aa100dc958970db | CN=D-TRUST EV Root CA 1 2020,O=D-Trust GmbH,C=DE | 2020-02-11 | 2035-02-11
+cbb9c44d84b8043e1050ea31a69f514955d7bfd2e2c6b49301019ad61d9f5058 | CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE | 2019-03-20 | 2046-03-20
+4fa3126d8d3a11d1c4855a4f807cbad6cf919d3a5a88b03bea2c6372d93c40c9 | CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE | 2019-03-20 | 2046-03-20
+9a296a5182d1d451a2e37f439b74daafa267523329f90f9a0d2007c334e23c9a | CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT | 2020-02-10 | 2040-06-10
+3f99cc474acfce4dfed58794665e478d1547739f2e780f1bb4ca9b133097d401 | CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR | 2021-02-19 | 2045-02-13
+d95d0e8eda79525bf9beb11b14d2100d3294985f0c62d9fabd9cd999eccb7b1d | CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR | 2021-02-19 | 2045-02-13
+f015ce3cc239bfef064be9f1d2c417e1a0264a0a94be1f0c8d121864eb6949cc | CN=HiPKI Root CA - G1,O=Chunghwa Telecom Co.\, Ltd.,C=TW | 2019-02-22 | 2037-12-31
+69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470 | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 2020-09-04 | 2040-09-17
+88f438dcf8ffd1fa8f429115ffe5f82ae1e06e0c70c375faad717b34a49e7265 | CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR | 2017-08-18 | 2037-08-18
+242b69742fcb1e5b2abf98898b94572187544e5b4d9911786573621f6a74b82c | CN=Telia Root CA v2,O=Telia Finland Oyj,C=FI | 2018-11-29 | 2043-11-29
+018e13f0772532cf809bd1b17281867283fc48c6e13be9c69812854a490c1b05 | CN=DigiCert TLS ECC P384 Root G5,O=DigiCert\, Inc.,C=US | 2021-01-15 | 2046-01-14
+371a00dc0533b3721a7eeb40e8419e70799d2b0a0f2c1d80693165f7cec4ad75 | CN=DigiCert TLS RSA4096 Root G5,O=DigiCert\, Inc.,C=US | 2021-01-15 | 2046-01-14
+b4585f22e4ac756a4e8612a1361c5d9d031a93fd84febb778fa3068b0fc42dc2 | CN=Certainly Root E1,O=Certainly,C=US | 2021-04-01 | 2046-04-01
+77b82cd8644c4305f7acc5cb156b45675004033d51c60c6202a8e0c33467d3a0 | CN=Certainly Root R1,O=Certainly,C=US | 2021-04-01 | 2046-04-01
+554153b13d2cf9ddb753bfbe1a4e0ae08d0aa4187058fe60a2b862b2e4b87bcb | CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OU=Ceres,O=FNMT-RCM,C=ES,2.5.4.97=#130f56415445532d51323832363030344a | 2018-12-20 | 2043-12-20
+fb8fec759169b9106b1e511644c618c51304373f6c0643088d8beffd1b997599 | SERIALNUMBER=G63287510,CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES | 2019-09-04 | 2039-08-30
+873f4685fa7f563625252e6d36bcd7f16fc24951f264e47e1b954f4908cdca13 | CN=E-Tugra Global Root CA ECC v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR | 2020-03-18 | 2045-03-12
+ef66b0b10a3cdb9f2e3648c76bd2af18ead2bfe6f117655e28c4060da1a3f4c2 | CN=E-Tugra Global Root CA RSA v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR | 2020-03-18 | 2045-03-12
+e74fbda55bd564c473a36b441aa799c8a68e077440e8288b9fa1e50e4bbaca11 | CN=Security Communication ECC RootCA1,O=SECOM Trust Systems CO.\,LTD.,C=JP | 2016-06-16 | 2038-01-18
+2e44102ab58cb85419451c8e19d9acf3662cafbc614b6a53960a30f7d0e2eb41 | CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN | 2019-04-26 | 2044-04-26
+30fbba2c32238e2a98547af97931e550428b9b3f1c8eeb6633dcfa86c5b27dd3 | CN=vTrus ECC Root CA,O=iTrusChina Co.\,Ltd.,C=CN | 2018-07-31 | 2043-07-31
+8a71de6559336f426c26e53880d00d88a18da4c6a91f0dcb6194e206c5c96387 | CN=vTrus Root CA,O=iTrusChina Co.\,Ltd.,C=CN | 2018-07-31 | 2043-07-31
diff --git a/chromium/net/data/ssl/chrome_root_store/root_store.textproto b/chromium/net/data/ssl/chrome_root_store/root_store.textproto
index 48bd8c561c8..b013cf9c593 100644
--- a/chromium/net/data/ssl/chrome_root_store/root_store.textproto
+++ b/chromium/net/data/ssl/chrome_root_store/root_store.textproto
@@ -2,44 +2,63 @@
#
# proto-file: googleclient/chrome/security/pki_metadata/chrome_root_store/root_store.proto
# proto-message: chrome_browser_chrome_root_store.RootStore
+#
+# Comments before each entry list the certificate Subject, and for entries
+# containing EV policy OIDs, the URL for the EV test sites.
# Version # should always be incremented up whenever this (or any pem file that
# it references) is changed.
-version_major: 7
+version_major: 8
# CN=Actalis Authentication Root CA, O=Actalis S.p.A./03358520967, L=Milan, C=IT
+# https://ssltest-a.actalis.it:8443
trust_anchors {
sha256_hex: "55926084ec963a64b96e2abe01ce0ba86a64fbfebcc7aab5afc155b37fd76066"
+ ev_policy_oids: "1.3.159.1.17.1"
}
# CN=Amazon Root CA 3, O=Amazon, C=US
+# https://good.sca3a.amazontrust.com/
trust_anchors {
sha256_hex: "18ce6cfe7bf14e60b2e347b8dfe868cb31d02ebb3ada271569f50343b46db3a4"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=Amazon Root CA 2, O=Amazon, C=US
+# https://good.sca2a.amazontrust.com/
trust_anchors {
sha256_hex: "1ba5b2aa8c65401a82960118f80bec4f62304d83cec4713a19c39c011ea46db4"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=Starfield Services Root Certificate Authority - G2, O=Starfield Technologies, Inc., L=Scottsdale, ST=Arizona, C=US
+# https://valid.sfsg2.catest.starfieldtech.com/
trust_anchors {
sha256_hex: "568d6905a2c88708a4b3025190edcfedb1974a606a13c6e5290fcb2ae63edab5"
+
+ ev_policy_oids: "2.16.840.1.114414.1.7.24.3"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=Amazon Root CA 1, O=Amazon, C=US
+# https://good.sca1a.amazontrust.com/
trust_anchors {
sha256_hex: "8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=Amazon Root CA 4, O=Amazon, C=US
+# https://good.sca4a.amazontrust.com/
trust_anchors {
sha256_hex: "e35d28419ed02025cfa69038cd623962458da5c695fbdea3c22b0bfb25897092"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=Certum Trusted Network CA, OU=Certum Certification Authority, O=Unizeto Technologies S.A., C=PL
+# https://juice.certum.pl/
trust_anchors {
sha256_hex: "5c58468d55f58e497e743982d2b50010b6d165374acf83a7d4a32db768c4408e"
+ ev_policy_oids: "1.2.616.1.113527.2.5.1.1"
}
# CN=Certum Trusted Network CA 2, OU=Certum Certification Authority, O=Unizeto Technologies S.A., C=PL
@@ -53,8 +72,10 @@ trust_anchors {
}
# CN=Autoridad de Certificacion Firmaprofesional CIF A62634068, C=ES
+# https://publifirma.firmaprofesional.com/
trust_anchors {
sha256_hex: "57de0583efd2b26e0361da99da9df4648def7ee8441c3b728afa9bcde0f9b26a"
+ ev_policy_oids: "1.3.6.1.4.1.13177.10.1.3.10"
}
# CN=Buypass Class 2 Root CA, O=Buypass AS-983163327, C=NO
@@ -63,13 +84,17 @@ trust_anchors {
}
# CN=Buypass Class 3 Root CA, O=Buypass AS-983163327, C=NO
+# https://valid.evident.ca23.ssl.buypass.no/
trust_anchors {
sha256_hex: "edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d"
+ ev_policy_oids: "2.16.578.1.26.1.3.3"
}
# OU=certSIGN ROOT CA G2, O=CERTSIGN SA, C=RO
+# https://testssl-valid-evcp.certsign.ro/
trust_anchors {
sha256_hex: "657cfe2fa73faa38462571f332a2363a46fce7020951710702cdfbb6eeda3305"
+ ev_policy_oids: "2.23.140.1.1"
}
# OU=certSIGN ROOT CA, O=certSIGN, C=RO
@@ -78,8 +103,10 @@ trust_anchors {
}
# CN=CFCA EV ROOT, O=China Financial Certification Authority, C=CN
+# https://www.erenepu.com/
trust_anchors {
sha256_hex: "5cc3d78e4e1d5e45547a04e6873e64f90cf9536d1ccc2ef800f355c4c5fd70fd"
+ ev_policy_oids: "2.16.156.112554.3"
}
# OU=ePKI Root Certification Authority, O=Chunghwa Telecom Co., Ltd., C=TW
@@ -98,8 +125,11 @@ trust_anchors {
}
# CN=D-TRUST Root Class 3 CA 2 EV 2009, O=D-Trust GmbH, C=DE
+# https://certdemo-ev-valid.ssl.d-trust.net/
trust_anchors {
sha256_hex: "eec5496b988ce98625b934092eec2908bed0b0f316c2d4730c84eaf1f3d34881"
+
+ ev_policy_oids: "1.3.6.1.4.1.4788.2.202.1"
}
# CN=T-TeleSec GlobalRoot Class 2, OU=T-Systems Trust Center, O=T-Systems Enterprise Services GmbH, C=DE
@@ -108,8 +138,11 @@ trust_anchors {
}
# CN=T-TeleSec GlobalRoot Class 3, OU=T-Systems Trust Center, O=T-Systems Enterprise Services GmbH, C=DE
+# http://www.telesec.de/ / https://root-class3.test.telesec.de/
trust_anchors {
sha256_hex: "fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd"
+
+ ev_policy_oids: "1.3.6.1.4.1.7879.13.24.1"
}
# CN=Certigna Root CA, OU=0002 48146308100036, O=Dhimyotis, C=FR
@@ -128,8 +161,11 @@ trust_anchors {
}
# CN=DigiCert Global Root G3, OU=www.digicert.com, O=DigiCert Inc, C=US
+# https://global-root-g3.chain-demos.digicert.com/
trust_anchors {
sha256_hex: "31ad6648f8104138c738f39ea4320133393e3a18cc02296ef97c2ac9ef6731d0"
+
+ ev_policy_oids: "2.16.840.1.114412.2.1"
}
# CN=DigiCert Assured ID Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
@@ -143,28 +179,43 @@ trust_anchors {
}
# CN=DigiCert Trusted Root G4, OU=www.digicert.com, O=DigiCert Inc, C=US
+# https://trusted-root-g4.chain-demos.digicert.com/
trust_anchors {
sha256_hex: "552f7bdcf1a7af9e6ce672017f4f12abf77240c78e761ac203d1d9d20ac89988"
+
+ ev_policy_oids: "2.16.840.1.114412.2.1"
}
# CN=DigiCert High Assurance EV Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
+# https://www.digicert.com
trust_anchors {
sha256_hex: "7431e5f4c3c1ce4690774f0b61e05440883ba9a01ed00ba6abd7806ed3b118cf"
+
+ ev_policy_oids: "2.16.840.1.114412.2.1"
}
# CN=DigiCert Assured ID Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
+# https://assured-id-root-g2.chain-demos.digicert.com/
trust_anchors {
sha256_hex: "7d05ebb682339f8c9451ee094eebfefa7953a114edb2f44949452fab7d2fc185"
+
+ ev_policy_oids: "2.16.840.1.114412.2.1"
}
# CN=DigiCert Assured ID Root G3, OU=www.digicert.com, O=DigiCert Inc, C=US
+# https://assured-id-root-g3.chain-demos.digicert.com/
trust_anchors {
sha256_hex: "7e37cb8b4c47090cab36551ba6f45db840680fba166a952db100717f43053fc2"
+
+ ev_policy_oids: "2.16.840.1.114412.2.1"
}
# CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
+# https://global-root-g2.chain-demos.digicert.com/
trust_anchors {
sha256_hex: "cb3ccbb76031e5e0138f8dd39a23f9de47ffc35e43c1144cea27d46a5ab1cb5f"
+
+ ev_policy_oids: "2.16.840.1.114412.2.1"
}
# CN=CA Disig Root R2, O=Disig a.s., L=Bratislava, C=SK
@@ -173,8 +224,11 @@ trust_anchors {
}
# CN=E-Tugra Certification Authority, OU=E-Tugra Sertifikasyon Merkezi, O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş., L=Ankara, C=TR
+# https://sslev.e-tugra.com.tr
trust_anchors {
sha256_hex: "b0bfd52bb0d7d9bd92bf5d4dc13da255c02c542f378365ea893911f55e55f23c"
+
+ ev_policy_oids: "2.16.792.3.0.4.1.1.4"
}
# CN=emSign Root CA - C1, O=eMudhra Inc, OU=emSign PKI, C=US
@@ -183,8 +237,11 @@ trust_anchors {
}
# CN=emSign Root CA - G1, O=eMudhra Technologies Limited, OU=emSign PKI, C=IN
+# https://testevg1.emsign.com/
trust_anchors {
sha256_hex: "40f6af0346a99aa1cd1d555a4e9cce62c7f9634603ee406615833dc8c8d00367"
+
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=emSign ECC Root CA - G3, O=eMudhra Technologies Limited, OU=emSign PKI, C=IN
@@ -198,23 +255,33 @@ trust_anchors {
}
# CN=Entrust Root Certification Authority - EC1, OU=(c) 2012 Entrust, Inc. - for authorized use only, OU=See www.entrust.net/legal-terms, O=Entrust, Inc., C=US
+# https://validec.entrust.net
trust_anchors {
sha256_hex: "02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5"
+
+ ev_policy_oids: "2.16.840.1.114028.10.1.2"
}
# CN=AffirmTrust Commercial, O=AffirmTrust, C=US
+# https://commercial.affirmtrust.com/
trust_anchors {
sha256_hex: "0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7"
+ ev_policy_oids: "1.3.6.1.4.1.34697.2.1"
}
# CN=AffirmTrust Networking, O=AffirmTrust, C=US
+# https://networking.affirmtrust.com:4431
trust_anchors {
sha256_hex: "0a81ec5a929777f145904af38d5d509f66b5e2c58fcdb531058b0e17f3f0b41b"
+ ev_policy_oids: "1.3.6.1.4.1.34697.2.2"
}
# CN=Entrust Root Certification Authority - G2, OU=(c) 2009 Entrust, Inc. - for authorized use only, OU=See www.entrust.net/legal-terms, O=Entrust, Inc., C=US
+# https://validg2.entrust.net
trust_anchors {
sha256_hex: "43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339"
+
+ ev_policy_oids: "2.16.840.1.114028.10.1.2"
}
# CN=Entrust.net Certification Authority (2048), OU=(c) 1999 Entrust.net Limited, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), O=Entrust.net
@@ -223,23 +290,32 @@ trust_anchors {
}
# CN=AffirmTrust Premium, O=AffirmTrust, C=US
+# https://premium.affirmtrust.com:4432/
trust_anchors {
sha256_hex: "70a73f7f376b60074248904534b11482d5bf0e698ecc498df52577ebf2e93b9a"
+ ev_policy_oids: "1.3.6.1.4.1.34697.2.3"
}
# CN=Entrust Root Certification Authority, OU=(c) 2006 Entrust, Inc., OU=www.entrust.net/CPS is incorporated by reference, O=Entrust, Inc., C=US
+# https://www.entrust.net/
trust_anchors {
sha256_hex: "73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c"
+
+ ev_policy_oids: "2.16.840.1.114028.10.1.2"
}
# CN=AffirmTrust Premium ECC, O=AffirmTrust, C=US
+# https://premiumecc.affirmtrust.com:4433/
trust_anchors {
sha256_hex: "bd71fdf6da97e4cf62d1647add2581b07d79adf8397eb4ecba9c5e8488821423"
+ ev_policy_oids: "1.3.6.1.4.1.34697.2.4"
}
# CN=Entrust Root Certification Authority - G4, OU=(c) 2015 Entrust, Inc. - for authorized use only, OU=See www.entrust.net/legal-terms, O=Entrust, Inc., C=US
+# https://validg4.entrust.net
trust_anchors {
sha256_hex: "db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88"
+ ev_policy_oids: "2.16.840.1.114028.10.1.2"
}
# CN=GDCA TrustAUTH R5 ROOT, O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD., C=CN
@@ -248,8 +324,11 @@ trust_anchors {
}
# CN=GlobalSign, O=GlobalSign, OU=GlobalSign ECC Root CA - R5
+# https://2038r5.globalsign.com/
trust_anchors {
sha256_hex: "179fbc148a3dd00fd24ea13458cc43bfa7f59c8182d783a513f6ebec100c8924"
+
+ ev_policy_oids: "1.3.6.1.4.1.4146.1.1"
}
# CN=GlobalSign, O=GlobalSign, OU=GlobalSign Root CA - R6
@@ -258,33 +337,51 @@ trust_anchors {
}
# CN=GlobalSign, O=GlobalSign, OU=GlobalSign Root CA - R3
+# https://2029.globalsign.com/
trust_anchors {
sha256_hex: "cbb522d7b7f127ad6a0113865bdf1cd4102e7d0759af635a7cf4720dc963c53b"
+
+ ev_policy_oids: "1.3.6.1.4.1.4146.1.1"
}
# CN=GlobalSign Root CA, OU=Root CA, O=GlobalSign nv-sa, C=BE
+# GlobalSign Root CA
trust_anchors {
sha256_hex: "ebd41040e4bb3ec742c9e381d31ef2a41a48b6685c96e7cef3c1df6cd4331c99"
+
+ ev_policy_oids: "1.3.6.1.4.1.4146.1.1"
}
# OU=Starfield Class 2 Certification Authority, O=Starfield Technologies, Inc., C=US
+# https://www.starfieldtech.com/
trust_anchors {
sha256_hex: "1465fa205397b876faa6f0a9958e5590e40fcc7faa4fb7c2c8677521fb5fb658"
+
+ ev_policy_oids: "2.16.840.1.114414.1.7.23.3"
}
# CN=Starfield Root Certificate Authority - G2, O=Starfield Technologies, Inc., L=Scottsdale, ST=Arizona, C=US
+# https://valid.sfig2.catest.starfieldtech.com/
trust_anchors {
sha256_hex: "2ce1cb0bf9d2f9e102993fbe215152c3b2dd0cabde1c68e5319b839154dbb7f5"
+
+ ev_policy_oids: "2.16.840.1.114414.1.7.23.3"
}
# CN=Go Daddy Root Certificate Authority - G2, O=GoDaddy.com, Inc., L=Scottsdale, ST=Arizona, C=US
+# https://valid.gdig2.catest.godaddy.com/
trust_anchors {
sha256_hex: "45140b3247eb9cc8c5b4f0d7b53091f73292089e6e5a63e2749dd3aca9198eda"
+
+ ev_policy_oids: "2.16.840.1.114413.1.7.23.3"
}
# OU=Go Daddy Class 2 Certification Authority, O=The Go Daddy Group, Inc., C=US
+# https://www.godaddy.com/
trust_anchors {
sha256_hex: "c3846bf24b9e93ca64274c0ec67c1ecc5e024ffcacd2d74019350e81fe546ae4"
+
+ ev_policy_oids: "2.16.840.1.114413.1.7.23.3"
}
# CN=GTS Root R3, O=Google Trust Services LLC, C=US
@@ -313,8 +410,11 @@ trust_anchors {
}
# CN=Hongkong Post Root CA 3, O=Hongkong Post, L=Hong Kong, ST=Hong Kong, C=HK
+# https://valid-ev.ecert.gov.hk/
trust_anchors {
sha256_hex: "5a2fc03f0c83b090bbfa40604b0988446c7636183df9846e17101a447fb8efd6"
+
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=Hongkong Post Root CA 1, O=Hongkong Post, C=HK
@@ -333,8 +433,11 @@ trust_anchors {
}
# CN=Staat der Nederlanden EV Root CA, O=Staat der Nederlanden, C=NL
+# https://pkioevssl-v.quovadisglobal.com/
trust_anchors {
sha256_hex: "4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a"
+
+ ev_policy_oids: "2.16.528.1.1003.1.2.7"
}
# CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1, OU=Kamu Sertifikasyon Merkezi - Kamu SM, O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK, L=Gebze - Kocaeli, C=TR
@@ -343,13 +446,17 @@ trust_anchors {
}
# CN=Hellenic Academic and Research Institutions ECC RootCA 2015, O=Hellenic Academic and Research Institutions Cert. Authority, L=Athens, C=GR
+# https://haricaeccrootca2015-valid-ev.harica.gr
trust_anchors {
sha256_hex: "44b545aa8a25e65a73ca15dc27fc36d24c1cb9953a066539b11582dc487b4833"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=Hellenic Academic and Research Institutions RootCA 2015, O=Hellenic Academic and Research Institutions Cert. Authority, L=Athens, C=GR
+# https://haricarootca2015-valid-ev.harica.gr
trust_anchors {
sha256_hex: "a040929a02ce53b4acf4f2ffc6981ce4496f755e6d45fe0b2a692bcd52523f36"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=IdenTrust Public Sector Root CA 1, O=IdenTrust, C=US
@@ -358,8 +465,11 @@ trust_anchors {
}
# CN=IdenTrust Commercial Root CA 1, O=IdenTrust, C=US
+# https://identrust-commercial-ev-valid.identrustssl.com/
trust_anchors {
sha256_hex: "5d56499be4d2e08bcfcad08a3e38723d50503bde706948e42f55603019e528ae"
+ ev_policy_oids: "2.23.140.1.1"
+ ev_policy_oids: "2.16.840.1.113839.0.6.9"
}
# CN=ISRG Root X1, O=Internet Security Research Group, C=US
@@ -368,8 +478,15 @@ trust_anchors {
}
# CN=Izenpe.com, O=IZENPE S.A., C=ES
+# The first OID is for businesses and the second for government entities.
+# These are the test sites, respectively:
+# https://servicios.izenpe.com
+# https://servicios1.izenpe.com
trust_anchors {
sha256_hex: "2530cc8e98321502bad96f9b1fba1b099e2d299e0f4548bb914f363bc0d4531f"
+
+ ev_policy_oids: "1.3.6.1.4.1.14777.6.1.1",
+ ev_policy_oids: "1.3.6.1.4.1.14777.6.1.2"
}
# CN=SZAFIR ROOT CA2, O=Krajowa Izba Rozliczeniowa S.A., C=PL
@@ -398,13 +515,18 @@ trust_anchors {
}
# CN=NetLock Arany (Class Gold) Főtanúsítvány, OU=Tanúsítványkiadók (Certification Services), O=NetLock Kft., L=Budapest, C=HU
+# https://valid.ev.tanusitvany.hu
trust_anchors {
sha256_hex: "6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=OISTE WISeKey Global Root GB CA, OU=OISTE Foundation Endorsed, O=WISeKey, C=CH
+# https://goodevssl.wisekey.com
trust_anchors {
sha256_hex: "6b9c08e86eb0f767cfad65cd98b62149e5494a67f5845e7bd1ed019f27b86bd6"
+
+ ev_policy_oids: "2.16.756.5.14.7.4.8"
}
# CN=OISTE WISeKey Global Root GC CA, OU=OISTE Foundation Endorsed, O=WISeKey, C=CH
@@ -418,8 +540,11 @@ trust_anchors {
}
# CN=QuoVadis Root CA 2, O=QuoVadis Limited, C=BM
+# https://www.quovadis.bm/
trust_anchors {
sha256_hex: "85a0dd7dd720adb7ff05f83d542b209dc7ff4528f7d677b18389fea5e5c49e86"
+
+ ev_policy_oids: "1.3.6.1.4.1.8024.0.2.100.1.2"
}
# CN=QuoVadis Root CA 3 G3, O=QuoVadis Limited, C=BM
@@ -433,13 +558,19 @@ trust_anchors {
}
# CN=QuoVadis Root CA 2 G3, O=QuoVadis Limited, C=BM
+# https://evsslicag3-v.quovadisglobal.com/
trust_anchors {
sha256_hex: "8fe4fb0af93a4d0d67db0bebb23e37c71bf325dcbcdd240ea04daf58b47e1840"
+
+ ev_policy_oids: "1.3.6.1.4.1.8024.0.2.100.1.2"
}
# OU=Security Communication RootCA2, O=SECOM Trust Systems CO.,LTD., C=JP
+# https://www.secomtrust.net/contact/form.html
trust_anchors {
sha256_hex: "513b2cecb810d4cde5dd85391adfc6c2dd60d87bb736d2b521484aa47a0ebef6"
+
+ ev_policy_oids: "1.2.392.200091.100.721.1"
}
# OU=Security Communication RootCA1, O=SECOM Trust.net, C=JP
@@ -448,23 +579,35 @@ trust_anchors {
}
# CN=COMODO Certification Authority, O=COMODO CA Limited, L=Salford, ST=Greater Manchester, C=GB
+# https://secure.comodo.com/
trust_anchors {
sha256_hex: "1a0d20445de5ba1862d19ef880858cbce50102b36e8f0a040c3c69e74522fe6e"
+
+ ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
}
# CN=COMODO ECC Certification Authority, O=COMODO CA Limited, L=Salford, ST=Greater Manchester, C=GB
+# https://comodoecccertificationauthority-ev.comodoca.com/
trust_anchors {
sha256_hex: "1793927a0614549789adce2f8f34f7f0b66d0f3ae3a3b84d21ec15dbba4fadc7"
+
+ ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
}
# CN=USERTrust ECC Certification Authority, O=The USERTRUST Network, L=Jersey City, ST=New Jersey, C=US
+# https://usertrustecccertificationauthority-ev.comodoca.com/
trust_anchors {
sha256_hex: "4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a"
+
+ ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
}
# CN=COMODO RSA Certification Authority, O=COMODO CA Limited, L=Salford, ST=Greater Manchester, C=GB
+# https://comodorsacertificationauthority-ev.comodoca.com/
trust_anchors {
sha256_hex: "52f0e1c4e58ec629291b60317f074671b85d7ea80d5b07273463534b32b40234"
+
+ ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
}
# CN=AAA Certificate Services, O=Comodo CA Limited, L=Salford, ST=Greater Manchester, C=GB
@@ -473,13 +616,18 @@ trust_anchors {
}
# CN=USERTrust RSA Certification Authority, O=The USERTRUST Network, L=Jersey City, ST=New Jersey, C=US
+# https://usertrustrsacertificationauthority-ev.comodoca.com/
trust_anchors {
sha256_hex: "e793c9b02fd8aa13e21c31228accb08119643b749c898964b1746d46c3d4cbd2"
+
+ ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
}
# CN=Secure Global CA, O=SecureTrust Corporation, C=US
trust_anchors {
sha256_hex: "4200f5043ac8590ebb527d209ed1503029fbcbd41ca1b506ec27f15ade7dac69"
+
+ ev_policy_oids: "2.16.840.1.114404.1.1.2.4.1"
}
# CN=Trustwave Global ECC P384 Certification Authority, O=Trustwave Holdings, Inc., L=Chicago, ST=Illinois, C=US
@@ -500,11 +648,17 @@ trust_anchors {
# CN=XRamp Global Certification Authority, O=XRamp Security Services Inc, OU=www.xrampsecurity.com, C=US
trust_anchors {
sha256_hex: "cecddc905099d8dadfc5b1d209b737cbe2c18cfb2c10c0ff0bcf0d3286fc1aa2"
+
+ ev_policy_oids: "2.16.840.1.114404.1.1.2.4.1"
}
# CN=SecureTrust CA, O=SecureTrust Corporation, C=US
+# https://www.securetrust.com
+# https://www.trustwave.com/
trust_anchors {
sha256_hex: "f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73"
+
+ ev_policy_oids: "2.16.840.1.114404.1.1.2.4.1"
}
# CN=UCA Global G2 Root, O=UniTrust, C=CN
@@ -513,18 +667,27 @@ trust_anchors {
}
# CN=UCA Extended Validation Root, O=UniTrust, C=CN
+# https://rsaevg1.good.sheca.com/
trust_anchors {
sha256_hex: "d43af9b35473755c9684fc06d7d8cb70ee5c28e773fb294eb41ee71722924d24"
+
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=SSL.com EV Root Certification Authority ECC, O=SSL Corporation, L=Houston, ST=Texas, C=US
+# https://test-ev-ecc.ssl.com/
trust_anchors {
sha256_hex: "22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8"
+
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=SSL.com EV Root Certification Authority RSA R2, O=SSL Corporation, L=Houston, ST=Texas, C=US
+# https://test-ev-rsa.ssl.com/
trust_anchors {
sha256_hex: "2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c"
+
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=SSL.com Root Certification Authority ECC, O=SSL Corporation, L=Houston, ST=Texas, C=US
@@ -538,8 +701,11 @@ trust_anchors {
}
# CN=SwissSign Gold CA - G2, O=SwissSign AG, C=CH
+# https://testevg2.swisssign.net/
trust_anchors {
sha256_hex: "62dd0be9b9f50a163ea0f8e75c053b1eca57ea55c8688f647c6881f2c8357b95"
+
+ ev_policy_oids: "2.16.756.1.89.1.2.1.1"
}
# CN=SwissSign Silver CA - G2, O=SwissSign AG, C=CH
@@ -548,13 +714,19 @@ trust_anchors {
}
# CN=TWCA Global Root CA, OU=Root CA, O=TAIWAN-CA, C=TW
+# https://evssldemo3.twca.com.tw/index.html
trust_anchors {
sha256_hex: "59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b"
+
+ ev_policy_oids: "1.3.6.1.4.1.40869.1.1.22.3"
}
# CN=TWCA Root Certification Authority, OU=Root CA, O=TAIWAN-CA, C=TW
+# https://evssldemo.twca.com.tw/index.html
trust_anchors {
sha256_hex: "bfd88fe1101c41ae3e801bf8be56350ee9bad1a6b9bd515edc5c6d5b8711ac44"
+
+ ev_policy_oids: "1.3.6.1.4.1.40869.1.1.22.3"
}
# CN=TeliaSonera Root CA v1, O=TeliaSonera
@@ -578,8 +750,11 @@ trust_anchors {
}
# CN=Network Solutions Certificate Authority, O=Network Solutions L.L.C., C=US
+# https://www.networksolutions.com/website-packages/index.jsp
trust_anchors {
sha256_hex: "001686cd181f83a1b1217d305b365c41e3470a78a1d37b134a98cd547b92dab3"
+
+ ev_policy_oids: "1.3.6.1.4.1.782.1.2.1.8.1"
}
# CN=Certum EC-384 CA, OU=Certum Certification Authority, O=Asseco Data Systems S.A., C=PL
@@ -613,18 +788,24 @@ trust_anchors {
}
# CN=GLOBALTRUST 2020, O=e-commerce monitoring GmbH, C=AT
+# https://testok-2020-server-qualified-ev-1.e-monitoring.at/
trust_anchors {
sha256_hex: "9a296a5182d1d451a2e37f439b74daafa267523329f90f9a0d2007c334e23c9a"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=HARICA TLS ECC Root CA 2021, O=Hellenic Academic and Research Institutions CA, C=GR
+# https://tls-ecc-valid-ev.root2021.harica.gr
trust_anchors {
sha256_hex: "3f99cc474acfce4dfed58794665e478d1547739f2e780f1bb4ca9b133097d401"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=HARICA TLS RSA Root CA 2021, O=Hellenic Academic and Research Institutions CA, C=GR
+# https://tls-rsa-valid-ev.root2021.harica.gr
trust_anchors {
sha256_hex: "d95d0e8eda79525bf9beb11b14d2100d3294985f0c62d9fabd9cd999eccb7b1d"
+ ev_policy_oids: "2.23.140.1.1"
}
# CN=HiPKI Root CA - G1, O=Chunghwa Telecom Co., Ltd., C=TW
diff --git a/chromium/net/data/ssl/root_stores/root_stores.json b/chromium/net/data/ssl/root_stores/root_stores.json
index 632b2363832..5edb8db8b72 100644
--- a/chromium/net/data/ssl/root_stores/root_stores.json
+++ b/chromium/net/data/ssl/root_stores/root_stores.json
@@ -1,37983 +1,38258 @@
{
"certificates": {
"001686cd181f83a1b1217d305b365c41e3470a78a1d37b134a98cd547b92dab3": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"007e452fd5cf838946696dfe37a2db2ef3991436d27bcbab45922053c15a87a8": [
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"00ab444abd6bdba33da8de569ac4ecde326d1be1a61442d5eec3975a0c243f04": [
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"016e1dcd5f78841bbebbae9ddea08c8d7ec54e698e95bb778ecdd1e10d8bf4f9": [
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"03458b6abeecc214953d97149af45391691de9f9cdcc2647863a3d67c95c243b": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.9.0",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.9.0",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
"windows/130626232015"
- ],
+ ],
"0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0378b202ccabba99a12e569a11a077db1edb39482061c75d0073059d9ab5b513": [
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
"windows/120223022238"
- ],
+ ],
"03950fb49a531f3e1991942398dfa9e0ea32d7ba1cdd9bc85db57ed9400b434a": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"04048028bf1f2864d48f9ad4d83294366a828856553f3b14303f90147f5d40ef": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"04acfb3b24793f300f67ef87e44dd72cb9b28b204f389a7cd5ae28785c7d42cd": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"04f1bec36951bc1454a904ce32890c5da3cde1356b7900f6e62dfa2041ebad51": [
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0536801fbb443b3e905fd6d70d8c81eb88551be8061299110d2b4f82e64cade1": [
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"058a40323ec8c46262c3052a5d357b91ac24d3da26351b3ff4407e99f7a4e9b4": [
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"05d38c2a70bfc500ccb0cb509159b46b065c6ac9cb42d2e6f16167841434572a": [
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"063e4afac491dfd332f3089b8542e94617d893d7fe944e10a7937ee29d9693c0": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0687260331a72403d909f105e69bcf0d32e1bd2493ffc6d9206d11bcd6770739": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"06a2c9a3379ab3c156159a27ca9ecdbd4ef75309b409cf70aeca9a12330f380e": [
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"06db3af2db7baee00c03b9578288bbde541d906eb0069327413295ffb486008e": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"07453d53793bf41819a5251c69f88e2bb344b59ca828b5a543781599eaf3d602": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"0753e940378c1bd5e3836e395daea5cb839e5046f1bd0eae1951cf10fec7c965": [
- "android/android10-release",
- "android/pie-cts-release",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/pie-cts-release",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"075bfcca2d55ae6e35742c32afd0ca8ea4c958feefc23224999541c033d69c8d": [
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0771920c8cb874d5c5a4dc0d6a51a2d495d38c4de2cd5b83d2a06faa051935f6": [
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0791ca0749b20782aad3c7d7bd0cdfc9485835843eb2d7996009ce43ab6c6927": [
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
"mozilla/2.9"
- ],
+ ],
"08297a4047dba23680c731db6e317653ca7848e1bebd3a0b0179a707f92cf178": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0a81ec5a929777f145904af38d5d509f66b5e2c58fcdb531058b0e17f3f0b41b": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0b5eed4e846403cf55e065848440ed2a82758bf5b9aa1f253d4613cfa080ff3f": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"0b9f26dfca684c2cfce23e4e4dd567c886ba259e1db267f9806f0c5a099711f2": [
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0c0b6b2bd1edd7b27fead157f8e846b335b784a39f06c47216c8746f64c5ceda": [
- "windows/140912180251",
- "windows/150122021939",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0c258a12a5674aef25f28ba7dcfaeceea348e541e6f5cc4ee63b71b361606ac3": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0c2cd63df7806fa399ede809116b575bf87989f06518f9808c860503178baf66": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
"windows/110830153721"
- ],
+ ],
"0d83b611b648a1a75eb8558400795375cad92e264ed8e9d7a757c1f5ee2bb22d": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"0e88eb6ea256e19ef8d3abd61a24d38dbad632816dd957294427e4724d81a386": [
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"0ed3ffab6c149c8b4e71058e8668d429abfda681c2fff508207641f0d751a3e5": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"0f4e9cdd264b025550d170806340214fe94434c9b02f697ec710fc5feafb5e38": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.9",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.9",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
"windows/180326181210"
- ],
+ ],
"0f993c8aef97baaf5687140ed59ad1821bb4afacf0aa9a58b5d57a338a3afbcb": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"125609aa301da0a249b97a8239cb6a34216f44dcac9f3954b14292f2e8c8608f": [
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"126bf01c1094d2f0ca2e352380b3c724294546ccc65597bef7f12d8a171f1984": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"12d480c1a3c664781b99d9df0e9faf3f1cacee1b3c30c3123a337a4a454ffed2": [
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"136335439334a7698016a0d324de72284e079d7b5220bb8fbd747816eebebaca": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1465fa205397b876faa6f0a9958e5590e40fcc7faa4fb7c2c8677521fb5fb658": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1501f89c5c4dcf36cf588a17c9fd7cfceb9ee01e8729be355e25de80eb6284b4": [
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"152a402bfcdf2cd548054d2275b39c7fca3ec0978078b0f0ea76e561a6c7433e": [
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.9",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.9",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1594cb5b826c315de3bc932c56895ff23a3a988b5dc1f034d214dfd858d89ee8": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"15d5b8774619ea7d54ce1ca6d0b0c403e037a917f131e8a04e1e6b7a71babce5": [
- "android/android10-release",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"15f0ba00a3ac7af3ac884c072b1011a077bd77c097f40164b2f8598abd83860c": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
"windows/110830153721"
- ],
+ ],
"16af57a9f676b0ab126095aa5ebadef22ab31119d644ac95cd4b93dbf3f26aeb": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1793927a0614549789adce2f8f34f7f0b66d0f3ae3a3b84d21ec15dbba4fadc7": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"179fbc148a3dd00fd24ea13458cc43bfa7f59c8182d783a513f6ebec100c8924": [
- "android/android10-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"18ce6cfe7bf14e60b2e347b8dfe868cb31d02ebb3ada271569f50343b46db3a4": [
- "android/android10-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"18f1fc7f205df8adddeb7fe007dd57e3af375a9c4d8d73546bf4f1fed1e18d35": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"19abcdff3a74402fa8f0ca206bf7fab0dffff3ae2bbd719584d21090a4353207": [
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1a0d20445de5ba1862d19ef880858cbce50102b36e8f0a040c3c69e74522fe6e": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1a2512cda6744abea11432a2fdc9f8c088db5a98c89e13352574cde4d9e80cdd": [
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/161112005943",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/161112005943",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1aa980c8c0d316f25029978982f033cbb3a3f4188d669f2de6a8d84ee00a1575": [
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1ba5b2aa8c65401a82960118f80bec4f62304d83cec4713a19c39c011ea46db4": [
- "android/android10-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1ba622b36325544ae922afc22ef9d367943794f6e16874f368a733c65c9d5279": [
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1c01c6f4dbb2fefc22558b2bca32563f49844acfc32b7be4b0ff599f9e8c7af7": [
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.9",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.9",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1d4f0596fca2611d09f84c78f2ea565ef2eab9cfc272a1718bd336e6e0ae021a": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"1e1a6984b4e76bd709aee3e9c9cf3118eac096dab9cc20dc25faab67297e965a": [
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1e49ac5dc69e86d0565da2c1305c419330b0b781bfec50e54a1b35af7fddd501": [
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1e51942b84fd467bf77d1c89da241c04254dc8f3ef4c22451fe7a89978bdcd4f": [
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"1e910b40c08184c0ca20468e824502ff2485163f77b03bb73296823f03885621": [
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"209e956af04df3996507c887d356230d6eb49fdbdd2d8a058ff50b8f80f690aa": [
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2193cfea381211a1aeaa2de984e630643a87160b1208118145eafb8e1bc69958": [
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"21db20123660bb2ed418205da11ee7a85a65e2bc6e55b5af7e7899c8a266d92e": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"229ccc196d32c98421cc119e78486eebef603aecd525c6b88b47abb740692b96": [
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8": [
- "android/android10-release",
- "android/pie-cts-release",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/pie-cts-release",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"22e0d11dc9207e16c92b2ee18cfdb2c2e940626847921fc528cedd2f7932f714": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
"windows/140912180251"
- ],
+ ],
"23804203ca45d8cde716b8c13bf3b448457fa06cc10250997fa01458317c41e5": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2399561127a57125de8cefea610ddf2fa078b5c8067f4e828290bfb860e84b3c": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"248302a977f40f7dd6a2b770586adfaac3eb1e85fd1a102dbd7863c72b8f8ef2": [
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"24a55c2ab051442d0617766541239a4ad032d7c55175aa34ffde2fbc4f5c5294": [
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2530cc8e98321502bad96f9b1fba1b099e2d299e0f4548bb914f363bc0d4531f": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2602d21e81277a83f6048128f61d794a06f474e1f75e49740a817c2666f62211": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"2605875afcc176b2d66dd66a995d7f8d5ebb86ce120d0e7e9e7c6ef294a27d4c": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"27995829fe6a7515c1bfe848f9c4761db16c225929257bf40d0894f29ea8baf2": [
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.9",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.9",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2834991cf677466d22baac3b0055e5b911d9a9e55f5b85ba02dc566782c30e8a": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
"windows/130626232015"
- ],
+ ],
"2930bd09a07126bdc17288d4f2ad84645ec948607907a97b5ed0b0b05879ef69": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"2a575471e31340bc21581cbd2cf13e158463203ece94bcf9d3cc196bf09a5472": [
- "android/android10-release",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2a8da2f8d23e0cd3b5871ecfb0f42276ca73230667f474eede71c5ee32cc3ec6": [
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2a99f5bc1174b73cbb1d620884e01c34e51ccb3978da125f0e33268883bf4158": [
- "android/android10-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2cabeafe37d06ca22aba7391c0033d25982952c453647349763a3ab5ad6ccf69": [
- "android/android10-release",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2ce1cb0bf9d2f9e102993fbe215152c3b2dd0cabde1c68e5319b839154dbb7f5": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2d47437de17951215a12f3c58e51c729a58026ef1fcc0a5fb3d9dc012f600d19": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.9",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.9",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2d66a702ae81ba03af8cff55ab318afa919039d9f31b4d64388680f81311b65a": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2dc62c3f6c0cc9020bba77e1c511511024b943ee598856da5a22e222b7277a20": [
- "macos/10.9.0",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "macos/10.9.0",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"2dc70e588d340de5966ae32f6fc796bdb5de6d7c25cd249a4be64e9df9036323": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"2dde9d0c0a90e7b32b5abc01f41799d42e95a1e3c31c3b39373bb8141ea54471": [
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2dfcbacadf22a6ff107a51fd3e8b9e17858028879b13f7c3b57b3e1bd2315809": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"2e44102ab58cb85419451c8e19d9acf3662cafbc614b6a53960a30f7d0e2eb41": [
"windows/200421004343"
- ],
+ ],
"2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c": [
- "android/android10-release",
- "android/pie-cts-release",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/pie-cts-release",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"2f1062f8bf84e7eb83a0f64c98d891fbe2c811b17ffac0bce1a6dc9c7c3dcbb7": [
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"2f274e48aba4ac7b765933101775506dc30ee38ef6acd5c04932cfe041234220": [
- "android/kitkat-mr1-release",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-mr1-release",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"309b4a87f6ca56c93169aaa99c6d988854d7892bd5437e2d07b29cbeda55d35d": [
- "android/kitkat-mr1-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "android/kitkat-mr1-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"30d0895a9a448a262091635522d1f52010b5867acae12c78ef958fd4f4389f2f": [
- "android/android10-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"31ad6648f8104138c738f39ea4320133393e3a18cc02296ef97c2ac9ef6731d0": [
- "android/android10-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"31eace9b4c9c71734a185680bc24866ca6cbd82b3cb61bcc8706261b59ce1073": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"3266967e59cd68008d9dd320811185c704205e8d95fdd84f1c7b311e6704fc32": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"327a3d761abadea034eb998406275cb1a4776efdae2fdf6d0168ea1c4f5567d0": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"3417bb06cc6007da1b961c920b8ab4ce3fad820e4aa30b9acbc4a74ebdcebc65": [
- "android/android10-release",
- "android/pie-cts-release",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/pie-cts-release",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"341de98b1392abf7f4ab90a960cf25d4bd6ec65b9a51ce6ed067d00ec7ce9b7f": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"34bb34e14faed0d3392f2fc441c0ecd5fd88ad88118df2d1ba76cdec1eea10b8": [
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"34ff2a4409dc1383e9f8966e8adfe5719eba373fd0ad5e2f49f90ee07cf5d4c1": [
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"358df39d764af9e1b766e9c972df352ee15cfac227af6ad1d70e8e4a6edcba02": [
- "windows/200226213356",
+ "android/android12-release",
+ "windows/200226213356",
"windows/200421004343"
- ],
+ ],
"35ae5bddd8f7ae635cffba5682a8f00b95f48462c7108ee9a0e5292b074aafb2": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.9",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.9",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"363f3c849eab03b0a2a0f636d7b86d04d3ac7fcfe26a0a9121ab9795f6e176df": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"36544d2fce03c6c72b70eb1a8064264dc1511768c2d8f76a8b9f1f2bbd153b7d": [
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"37d51006c512eaab626421f1ec8c92013fc5f82ae98ee533eb4619b8deb4d06c": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"37d8dc8af7867845da3344a6b1bade448d8a80e47b5579f96bf631768f9f30f6": [
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"39c75caecee8920c909f132491641350b57e2702a65a991545b01d1be4a2220b": [
- "android/kitkat-mr1-release",
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
+ "android/kitkat-mr1-release",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
"windows/151119231843"
- ],
+ ],
"39df7b682b7b938f84715481ccde8d60d8f22ec598877d0aaac12b59182b0312": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"39f6033ca664cedb216744d3c6f2b2e8e3cebd6869f7dff47e0db91a79c416f8": [
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"3a43e220fe7f3ea9653d1e21742eac2b75c20fd8980305bc502caf8c2d9b41a1": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"3b222e566711e992300dc0b15ab9473dafdef8c84d0cef7d3317b4c1821d1436": [
- "android/kitkat-mr1-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-mr1-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"3c4fb0b95ab8b30032f432b86f535fe172c185d0fd39865837cf36187fa6f428": [
- "android/android10-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"3c5f81fea5fab82c64bfa2eaecafcde8e077fc8620a7cae537163df36edbf378": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"3ccc3ccfe45496d07b620dbf1328e8a1490018f48633c8a28a995ca60408b0be": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"3cfc3c14d1f684ff17e38c43ca440c00b967ec933e8bfe064ca1d72c90f2adb0": [
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
"mozilla/2.9"
- ],
+ ],
"3deae6ae975284e0e6fa2eb76ce46e12441869a2a7d4e67dc7ab8664fefdbbb0": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
"windows/090501224247"
- ],
+ ],
"3e84ba4342908516e77573c0992f0979ca084e4685681ff195ccba8a229b8a76": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"3e9099b5015e8f486c00bcea9d111ee721faba355a89bcf1df69561e3dc6325c": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"3f06e55681d496f5be169eb5389f9f2b8ff61e1708df6881724849cd5d27cb69": [
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
"windows/091013033632"
- ],
+ ],
"3f9da4744ec9676cd38b530e500a463fbcb18165977ff0da6d5993c3fe5fab7c": [
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
"windows/160128175153"
- ],
+ ],
"3f9f27d583204b9e09c8a3d2066c4b57d3a2479c3693650880505698105dbce9": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"3fd4be8baad2f26e1bde06c7584bb720dd1a972d111f5a4999bc44b08fb4960d": [
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"407c276bead2e4af0661ef6697341dec0a1f9434e4eafb2d3d32a90549d9de4a": [
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"40f6af0346a99aa1cd1d555a4e9cce62c7f9634603ee406615833dc8c8d00367": [
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"416b1f9e84e74c1d19b23d8d7191c6ad81246e641601f599132729f507beb3cc": [
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"417dcf3180f4ed1a3747acf1179316cd48cb05c5788435168aed98c98cdcb615": [
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"41c923866ab4cad6b7ad578081582e020797a6cbdf4fff78ce8396b38937d7f5": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"41d4f6dcf130b9843a3b9a9530953e925fdd84e8b7aeb8f205b8fae39352617d": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"4200f5043ac8590ebb527d209ed1503029fbcbd41ca1b506ec27f15ade7dac69": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"4210f199499a9ac33c8de02ba6dbaa14408bdd8a6e324689c1922d069715a332": [
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"42143a511a3afcdd80d555debb4191ec6bb285ee66e62ec657ed20adf7d55faa": [
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"4348a0e9444c78cb265e058d5e8944b4d84f9662bd26db257f8934a443c70161": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"43f257412d440d627476974f877da8f1fc2444565a367ae60eddc27a412531ae": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"4404e33b5e140dcf998051fdfc8028c7c81615c5ee737b111b588233a9b535a0": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
"windows/160128175153"
- ],
+ ],
"44640a0a0e4d000fbd574d2b8a07bdb4d1dfed3b45baaba76f785778c7011961": [
- "android/kitkat-mr1-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-mr1-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"44b545aa8a25e65a73ca15dc27fc36d24c1cb9953a066539b11582dc487b4833": [
- "android/android10-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"45140b3247eb9cc8c5b4f0d7b53091f73292089e6e5a63e2749dd3aca9198eda": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"46273285615d96e52da9fc2ed8c036f10af3d9f6280f8d288706c52b2011b4da": [
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"46edc3689046d53a453fb3104ab80dcaec658b2660ea1629dd7e867990648716": [
- "android/android10-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"488e134f30c5db56b76473e608086842bf21af8ab3cd7ac67ebdf125d531834e": [
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"488fca189eaadf54a3f920ed39e587183ba512232999fae3e4a285fe98e298d1": [
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
"windows/160128175153"
- ],
+ ],
"4898c6888c0cffb0d3e31aca8a37d4e3515ff746d02635d86646cfa0a3185ae7": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"49351b903444c185ccdc5c693d24d8555cb208d6a8141307699f4af063199d78": [
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"49c8175a9815e08bef129a929de1bacad04e4db67a8c839293953e5031c81ca0": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"49e7a442acf0ea6287050054b52564b650e4f49e42e348d6aa38e039e957b1c1": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"49f74f824f2e059fe99c98af3219ec0d9a004d1b64dd2fd1452616318ab806c0": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"4b03f45807ad70f21bfc2cae71c9fde4604c064cf5ffb686bae5dbaad7fdd34c": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"4b22d5a6aec99f3cdb79aa5ec06838479cd5ecba7164f7f22dc1d65f63d85708": [
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"4bdb7418bdf7ffe33ba0884afa7c0c61fd85a153972f65f7d01cb3ec7eb4073c": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"4be8b5a1c76c6aead0611918fccf9dbd398b67fb12294758bdf994d0f9682f60": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a": [
- "android/android10-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"4d9ebb28825c9643ab15d54e5f9614f13cb3e95de3cf4eac971301f320f9226e": [
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"4dbb0157a691fa7382289d65c0332ddb1dcb640b40ad10f010a43e20f3afed1e": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"4e7480ad702a379dc589adb4faa625e6a5993f87ef2375d5437ffe3b79be4e96": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a": [
- "android/android10-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"507941c74460a0b47086220d4e9932572ab5d1b5bbcb8980ab1cb17651a844d2": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"513b2cecb810d4cde5dd85391adfc6c2dd60d87bb736d2b521484aa47a0ebef6": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"51847c8cbd2e9a72c91e292d2ae247d7de1e3fd270547a20ef7d610f38b8842c": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
"windows/111018233154"
- ],
+ ],
"527a42267daea8d8f54e91d282d5c25b615bc0dc73dc63a58f916c4ed5bf59ac": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"527b050527df529c0f7ad00cef1e7ba421788182615c326c8b6d1a2061a0bd7c": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"52f0e1c4e58ec629291b60317f074671b85d7ea80d5b07273463534b32b40234": [
- "android/android10-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"53dfdfa4e297fcfe07594e8c62d5b8ab06b32c7549f38a163094fd6429d5da43": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"54455f7129c20b1447c418f997168f24c58fc5023bf5da5be2eb6e1dd8902ed5": [
- "android/android10-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"54ae8a683fe2d78ff1ef0e0b3f58425092953ba08c67fe4a95595d1cebcdcb30": [
- "windows/140912180251",
- "windows/150122021939",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"54b4fc43d44aa4ca9fc03ca7e9949fbae267a064d02da21852412a381b5d1537": [
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"552f7bdcf1a7af9e6ce672017f4f12abf77240c78e761ac203d1d9d20ac89988": [
- "android/android10-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5533a0401f612c688ebce5bf53f2ec14a734eb178bfae00e50e85dae6723078a": [
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"554153b13d2cf9ddb753bfbe1a4e0ae08d0aa4187058fe60a2b862b2e4b87bcb": [
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
"windows/200421004343"
- ],
+ ],
"55903859c8c0c3ebb8759ece4e2557225ff5758bbd38ebd48276601e1bd58097": [
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android12-release",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"55926084ec963a64b96e2abe01ce0ba86a64fbfebcc7aab5afc155b37fd76066": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5607e260163f49c8ea4175a1c0a53b13195cb7d07845611e943a2ff507036834": [
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"568d6905a2c88708a4b3025190edcfedb1974a606a13c6e5290fcb2ae63edab5": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"56c77128d98c18d91b4cfdffbc25ee9103d4758ea2abad826a90f3457d460eb4": [
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.9",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.9",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"56ce347cc6df4c35943dfdeaee023f9739a3f1cedeee0cd88dc2386bc8a91eaf": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
"windows/160128175153"
- ],
+ ],
"57014f3cbe1782aa9b7921c5e3a95afd26d5727d9475d0142e6b6d27798133c0": [
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"58d017279cd4dc63abddb196a6c9906c30c4e08783eae8c1609954d69355596b": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"59b3829f1ff443344958fae8bff621b684c848cfbf7ead6b63a6ca50f2794f89": [
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5a1b5d6bc65523b40a6deffa45b48e4288ae8dd86dd70a5b858d4a5affc94f71": [
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5a2fc03f0c83b090bbfa40604b0988446c7636183df9846e17101a447fb8efd6": [
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5a885db19c01d912c5759388938cafbbdf031ab2d48e91ee15589b42971d039c": [
- "android/android10-release",
- "android/pie-cts-release",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/pie-cts-release",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5ab4fcdb180b5b6af0d262a2375a2c77d25602015d96648756611e2e78c53ad3": [
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5adfa25013bed3710831572de51c4b9a21171c00313249c4cb4719d37fbb8d20": [
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5b1d9d24de0afea8b35ba04a1c3e25d0812cdf7c4625de0a89af9fe4bbd1bb15": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5b38bd129e83d5a0cad23921089490d50d4aae370428f8ddfffffa4c1564e184": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"5c58468d55f58e497e743982d2b50010b6d165374acf83a7d4a32db768c4408e": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5cc3d78e4e1d5e45547a04e6873e64f90cf9536d1ccc2ef800f355c4c5fd70fd": [
- "android/android10-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5d56499be4d2e08bcfcad08a3e38723d50503bde706948e42f55603019e528ae": [
- "android/android10-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5e3571f33f45a7df1537a68b5ffb9e036af9d2f5bc4c9717130dc43d7175aac7": [
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5edb7ac43b82a06a8761e8d7be4979ebf2611f7dd79bf91c1c6b566a219ed766": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5f0b62eab5e353ea6521651658fbb65359f443280a4afbd104d77d10f9f04c07": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"5f960eebd716dbcb4d8a78b996e680ec2547441e69b4e44e98a595502e28a002": [
- "android/kitkat-mr1-release",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-mr1-release",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"604d32d036895aed3bfefaeb727c009ec0f2b3cdfa42a1c71730e6a72c3be9d4": [
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"606223d9db80df3939601e74b7e828e2800cce4273f76f276aa62db0a8e3b6c1": [
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
"windows/151119231843"
- ],
+ ],
"608142da5c675dd47c1aa3a26ee329e24e81d5ff3b94017bc1c1a0c37db4c1a0": [
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
"windows/200421004343"
- ],
+ ],
"614fd18da1490560cdad1196e2492ab7062eab1a67b3a30f1d0585a7d6ba6824": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
"windows/130626232015"
- ],
+ ],
"61dc0c0391694c655200c1505ebcc9e4e216bc31a5c51a3611283423c1d89e37": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"62b9267266212832a8e22dab933d91c7011274acf71703f9cc97833751a6e94f": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.9.0",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.9.0",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"62dd0be9b9f50a163ea0f8e75c053b1eca57ea55c8688f647c6881f2c8357b95": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"62f240278c564c4dd8bf7d9d4f6f366ea894d22f5f34d989a983acec2fffed50": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"630419aec478cbb4bb8083de9d9cf279752f039def16e46471b679ca93002db0": [
- "android/kitkat-mr1-release",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-mr1-release",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"632d80bb096d209677d1734e5b35ea9d3019b9c44f8fcb2640c879039ac94ee8": [
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"63343abfb89a6a03ebb57e9b3f5fa7be7c4f5c756f3017b3a8c488c3653e9179": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"6468bf8cf3cf688ebb2a6841bd70e97b5229b49df8690d7b74193e9ce3886141": [
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
"windows/150223195544"
- ],
+ ],
"65353833cf234c79562164f90849c0d104dbabf8ee41064d83e8cbe03ba1c5a5": [
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"657cfe2fa73faa38462571f332a2363a46fce7020951710702cdfbb6eeda3305": [
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android12-release",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6639d13cab85df1ad9a23c443b3a60901e2b138d456fa71183578108884ec6bf": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"668c83947da63b724bece1743c31a0e6aed0db8ec5b31be377bb784f91b6716f": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"66960242db2ed5906e113295f2454f33d6fb418c4c65e8166d43be64d19ba4fa": [
"windows/200421004343"
- ],
+ ],
"67ec2059fbf52d2e6ab51a5a9b3fc2e1dcd658a1ef3a8f31107bc98028b494a2": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"6872586219c349d85aaa4586a14451f2451ae3b6092dbb1effb0147c33bf0fd4": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"687ea89089309d2cfe107db059fb10d676f45d3283aee056903eea0cf3c188f8": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"687fa451382278fff0c8b11f8d43d576671c6eb2bceab413fb83d965d06d2ff2": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"68ad50909b04363c605ef13581a939ff2c96372e3f12325b0a6861e1d59f6603": [
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"69ddd7ea90bb57c93e135dc85ea6fcd5480b603239bdc454fc758b2a26cf7f79": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"69fac9bd55fb0ac78d53bbee5cf1d597989fd0aaab20a25151bdf1733ee7d122": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6aea30bc02ca85afcfec2f65f60881893c926925fd0704bd8ada3f0f6eddb699": [
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
"windows/200226213356"
- ],
+ ],
"6b9c08e86eb0f767cfad65cd98b62149e5494a67f5845e7bd1ed019f27b86bd6": [
- "android/android10-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6baf50ae3467eff3c35fefdc76a02a97fab6267723eda91e99f1b3dc2b28f82e": [
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6cc05041e6445e74696c4cfbc9f80f543b7eabbb44b4ce6f787c6a9971c42f17": [
- "android/android10-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.9",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.9",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6ccfd302fc44bf4599329b9750878ea44e7e8566564bcbd586169762dd10c74e": [
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6cf5f658436d10507eba9df463987480bc8560a8e26ef4691e1d3c9a878a0952": [
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"6cfb09893dfdf9457e3303592aa4755bc859ab6ba6a2e11c11cddc2409abda02": [
"macos/10.9.0"
- ],
+ ],
"6d3795731a95f8b8a471b9aae5c4f05691b1c11a140fd4b981ad891c367fafd3": [
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"6dc47172e01cbcb0bf62580d895fe2b8ac9ad4f873801e0c10b9c837d21eb177": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6dea86a1e66620a040c3c5943cb215d2ca87fb6ac09b59707e29d2facbd66b4e": [
- "android/kitkat-mr1-release",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "android/kitkat-mr1-release",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"6e5e93ae867fd3e3e78304e054d1a6aeaed0295d58c0e3fc4c9ffe310a3488cc": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
"windows/130321194644"
- ],
+ ],
"6ea1db6719d6041a06fc0898e5b3cf349a8fa8ecee85edb005965628f617f7c8": [
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
"windows/150223195544"
- ],
+ ],
"6ea54741d004667eed1b4816634aa3a79e6e4b96950f8279dafc8d9bd8812137": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6ec6614e9a8efd47d6318ffdfd0bf65b493a141f77c38d0b319be1bbbc053dd2": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6f2bc4cb632c24eae6782c0f39758932d1e1dc9b3e070f9303073fff38b288e2": [
"macos/10.9.0"
- ],
+ ],
"6fdb3f76c8b801a75338d8a50a7c02879f6198b57e594d318d3832900fedcd79": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"6fff78e400a70c11011cd85977c459fb5af96a3df0540820d0f4b8607875e58f": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"70a73f7f376b60074248904534b11482d5bf0e698ecc498df52577ebf2e93b9a": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"70b922bfda0e3f4a342e4ee22d579ae598d071cc5ec9c30f123680340388aea5": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"71cca5391f9e794b04802530b363e121da8a3043bb26662fea4dca7fc951a4bd": [
- "android/android10-release",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"7286ce249fe9e32bd4752257c17cd8f6991a9c1e6f1a3cc73304ed023e6ae4eb": [
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"730b619eaa759863c65360b7412e1457eca96844ef2f16d91fcf2efe46a647e9": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
"windows/090501224247"
- ],
+ ],
"732ff5bc473c33efaad9b187fb459a732ffbeea59df0fdfb8e2fb5def4032afe": [
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
"windows/160916174005"
- ],
+ ],
"739710c5245e33ec8a243a1b20048fc9d5f4528599213845c164d004b8b667f9": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"7431e5f4c3c1ce4690774f0b61e05440883ba9a01ed00ba6abd7806ed3b118cf": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"744b1147b4a9a69c32785e9e37c3323241ef29f63e76f1603d6761a783d8a0fe": [
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
"windows/160113232859"
- ],
+ ],
"74cb3a4ea791afb0a2d1a0b13301b3bee0e50ad5c79a1a6f2c663e6f4ee7a484": [
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"75c9d4361cb96e993abd9620cf043be9407a4633f202f0f4c0e17851cc6089cd": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
"windows/140912180251"
- ],
+ ],
"7600295eefe85b9e1fd624db76062aaaae59818a54d2774cd4c0b2c01131e1b3": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"767c955a76412c89af688e90a1c70f556cfd6b6025dbea10416d7eb6831f8c40": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
"windows/180326181210"
- ],
+ ],
"76ef4762e573206006cbc338b17ca4bc200574a11928d90c3ef31c5e803e6c6f": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
"windows/140912180251"
- ],
+ ],
"7707bb2be9f7ce057060b8308c3bc087b56529b3638eaf5b2a8049c8e15ed720": [
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"77407312c63a153d5bc00b4e51759cdfdac237dc2a33b67946e98e9bfa680ae3": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"77a03f69e4f3955589acaca06f6773a0d98d16dea05c6d94ee3ef6fb2beb7605": [
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"77e04c9a751c73f23e2a1336112ec8d5153d382a152fed89d7532c3102771f3c": [
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"781d64dfa77b00f2c006700b1fda86bf68b865a603c7a656f92e90c042ca2873": [
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"7908b40314c138100b518d0735807ffbfcf8518a0095337105ba386b153dd927": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"793cbf4559b9fde38ab22df16869f69881ae14c4b0139ac788a78a1afcca02fb": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
"windows/150723231635"
- ],
+ ],
"796b93d0a3ba22e191f2495f150a5f9bfee2ce1503da217b74b8a984685110f1": [
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
"windows/140312052931"
- ],
+ ],
"797e51f883e855d021e5c770566692999407895593235def52a011f716f8b6bf": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"7a77c6c61eeeb9aa65c4ea410d65d895b26a81123283009db104b48de80b2479": [
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"7af6ea9f753a1e709bd64d0beb867c11e8c295a56e24a6e0471459dccdaa1558": [
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"7afc9d01a62f03a2de9637936d4afe68090d2de18d03f29c88cfb0b1ba63587f": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"7b1a15d7e5e130c579e68fca189257f837b5c188f1b2b2a791e967cc88cc6528": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"7b1f8d8eff5d7349fedb7eae89c29aacc41704f1503ae3c8c2eba10225d0f568": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"7c7ed4240bb253bb35c376e12e00b027f1659df9d8267422a93eed75edc7adfb": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"7d05ebb682339f8c9451ee094eebfefa7953a114edb2f44949452fab7d2fc185": [
- "android/android10-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"7d2bf3489ebc9ad3448b8b0827715a3cbfe3d523e3b56a9b5fc1d2a2da2f20fe": [
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"7d3b465a6014e526c0affcee2127d2311727ad811c26842d006af37306cc80bd": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"7d8ce822222b90c0b14342c7a8145d1f24351f4d1a1fe0edfd312ee73fb00149": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"7e37cb8b4c47090cab36551ba6f45db840680fba166a952db100717f43053fc2": [
- "android/android10-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"7f12cd5f7e5e290ec7d85179d5b72c20a5be7508ffdb5bf81ab9684a7fc9f667": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8095210805db4bbc355e4428d8fd6ec2cde3ab5fb97a9942988eb8f4dcd06016": [
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
"mozilla/2.9"
- ],
+ ],
"8177d1a82ba501afdd1e9483ad7da912ee1e9fcb2a5a061fa3c479fa804ce6ba": [
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"81c2568503eb3be5eec366653960e6d1be9448915e4605b793fbeb34ccb2470f": [
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"82d42db3d657f1944e65c192b1dd58db8df8417b89165b045f5c6a70c5f8939e": [
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
"windows/160128175153"
- ],
+ ],
"8327bc8c9d69947b3de3c27511537267f59c21b9fa7b613fafbccd53b7024000": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"83ce3c1229688a593d485f81973c0f9195431eda37cc5e36430e79c7a888638b": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"847df6a78497943f27fc72eb93f9a637320a02b561d0a91b09e87a7807ed7c61": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8560f91c3624daba9570b5fea0dbe36ff11a8323be9486854fb3f34a5571198d": [
- "android/android10-release",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"85666a562ee0be5ce925c1d8890a6f76a87ec16d4d7d5f29ea7419cf20123b69": [
- "android/android10-release",
- "android/pie-cts-release",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/pie-cts-release",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"85a0dd7dd720adb7ff05f83d542b209dc7ff4528f7d677b18389fea5e5c49e86": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"85e0dfae3e55a843195f8b08c8349050e4689372f6e133ad0d199af96e95cc08": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"85fb2f91dd12275a0145b636534f84024ad68b69b8ee88684ff711375805b348": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"8688e58f4c7a945fadce7f62bfef521b82da7dc38bfdb0163478a5fe42e57870": [
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"86a1ecba089c4a8d3bbe2734c612ba341d813e043cf9e8a862cd5c57a36bbe6b": [
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"87c678bfb8b25f38f7e97b336956bbcf144bbacaa53647e61a2325bc1055316b": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"88497f01602f3154246ae28c4d5aef10f1d87ebb76626f4ae0b7f95ba7968799": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"885de64c340e3ea70658f01e1145f957fcda27aabeea1ab9faa9fdb0102d4077": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"88ef81de202eb018452e43f864725cea5fbd1fc2d9d205730709c5d8b8690f46": [
- "android/android10-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"88f438dcf8ffd1fa8f429115ffe5f82ae1e06e0c70c375faad717b34a49e7265": [
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android12-release",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"894ce6ddb012cb3f736954668de63f436080e95f17b7a81bd924eb21bee9e440": [
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"894ebc0b23da2a50c0186b7f8f25ef1f6b2935af32a94584ef80aaf877a3a06e": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8a866fd1b276b57e578e921c65828a2bed58e9f2f288054134b7f1f4bfc9cc74": [
- "android/android10-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8a968aadd88b20519672a452a3d6e31eacb71c26bcaf65b32f9793bf2ffa54a9": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"8ac552ad577e37ad2c6808d72aa331d6a96b4b3febff34ce9bc0578e08055ec3": [
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
"windows/200421004343"
- ],
+ ],
"8b3fdb151af759c566143e07c950ede4f9e8c7cf808453d33bcb78e52a400af9": [
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8b45da1c06f791eb0cabf26be588f5fb23165c2e614bf885562d0dce50b29b02": [
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8ba1bd9c88efb3947e60ebe21137f81df7f09994cef27f097055018b8194c634": [
- "windows/140912180251",
- "windows/150122021939",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8c4edfd04348f322969e7e29a4cd4dca004655061c16e1b076422ef342ad630e": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "mozilla/2.10",
- "mozilla/2.9",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.9",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8c7209279ac04e275e16d07fd3b775e80154b5968046e31f52dd25766324e9a7": [
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
"mozilla/2.9"
- ],
+ ],
"8d722f81a9c113c0791df136a2966db26c950a971db46b4199f4ea54b78bfb9f": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8da084fcf99ce07722f89b3205939806fa5cb811e1c813f6a108c7d336b3408e": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"8da75f1327217c88060fd2529eff2816e50b0c74541ea4ea3dfcee66a71efe09": [
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8dbb5a7c06c20ef62dd912a36740992ff6e1e8583d42ede257c3affd7c769399": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"8de78655e1be7f7847800b93f694d21d368cc06e033e7fab04bb5eb99da6b700": [
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8e8c6ebf77dc73db3e38e93f4803e62b6b5933beb51ee4152f68d7aa14426b31": [
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
"windows/100719231554"
- ],
+ ],
"8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e": [
- "android/android10-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8f1ecdaf29bcd56eddd6b5d56a07fcac2b74d4bcd179179144a0365c27dcf14b": [
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"8f62d7736f99dbd33ee00e10c7e329339c988a5b47ef25f408293cf2426b4d44": [
- "android/kitkat-mr1-release",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-mr1-release",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"8f633df0191a417dcd4f6331f0e90eb947158c8a3ea59bfe81420041315eac6c": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
"windows/090501224247"
- ],
+ ],
"8f9adb6d895dab5adf5c3d3fab83927be0fb64ef82485c62280d584e8bd55d22": [
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"8f9e2751dcd574e9ba90e744ea92581fd0af640ae86ac1ce2198c90f96b44823": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"8fdd298d1c93b22bfc42aab1c3a15f0d01832ca0a1aef28d5680f06e6c7fd4ef": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"8fe4fb0af93a4d0d67db0bebb23e37c71bf325dcbcdd240ea04daf58b47e1840": [
- "android/android10-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/161112005943",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/161112005943",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"90f3e05396995ff20922c44592db62d7845e1bf64aef512cca75bc669caa2479": [
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"9111240747e1f652f66d1f712a11f698963b491702e312f7513da3d0fc1e5a28": [
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
"windows/160128175153"
- ],
+ ],
"91e2f5788d5810eba7ba58737de1548a8ecacd014598bc0b143e041b17052552": [
- "android/android10-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"92a9d9833fe1944db366e8bfae7a95b6480c2d6c6c2a1be65d4236b608fca1bb": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"92bf5119abeccad0b1332dc4e1d05fba75b5679044ee0ca26e931f744f2f33cf": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"92d8092ee77bc9208f0897dc05271894e63ef27933ae537fb983eef0eae3eec8": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"93e65ec762f055dc718a332582c41a04430d72e3cb87e8b897b67516f0d1aa39": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"940ef46536713d8e2eb4b501e80b6abd8eb4e9928dba44784ce7d7e98595dfe8": [
"macos/10.9.0"
- ],
+ ],
"944554239d91ed9efedcf906d5e8113160b46fc816dc6bdc77b89da29b6562b9": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"945bbc825ea554f489d1fd51a73ddf2ea624ac7019a05205225c22a78ccfa8b4": [
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android12-release",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"956057517ff3bb35049342288c1c9dce852daca652b465e9747253b5f93b1f5e": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"958abbaeff760f4fbf66ff0f2c2708f4739b2c686127239a2c4ec87a68a984c8": [
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"959dc5880c457cd92e5447aaa5609db09ed47bd02c17a0edefdc819e756c74e5": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"960adf0063e96356750c2965dd0a0867da0b9cbd6e77714aeafb2349ab393da3": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"9676f287356c89a12683d65234098cb77c4f1c18f23c0e541de0e196725b7ebe": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6": [
- "android/android10-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"97552015f5ddfc3c8788c006944555408894450084f100867086bc1a2bb58dc8": [
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android12-release",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"978cd966f2faa07ba7aa9500d9c02e9d77f2cdada6ad6ba74af4b91c66593c50": [
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
"windows/180326181210"
- ],
+ ],
"97f654859cbde586fd90311e82ec7902c238cba0d6e529564c9c88f44895ec50": [
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"9806ab8509e2f35e192f275f0c308b9409b42512f90c659598c22be613962272": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
"windows/090501224247"
- ],
+ ],
"997e15c5a4481a8598499753971ee2601d1047c3635aff21af4221a817fd2d96": [
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"9a114025197c5bb95d94e63d55cd43790847b646b23cdf11ada4a00eff15fb48": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"9a6ec012e1a7da9dbe34194d478ad7c0db1822fb071df12981496ed104384113": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"9a73929a500f1a0bf49dcb046e8039169696557345e9f813f10ff9380db22695": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"9acfab7e43c8d880d06b262a94deeee4b4659989c3d0caf19baf6405e41ab7df": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"9b14e8f5f6ea167666e76dcd6becc190861d5e8970b99a9470f0231236049704": [
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"9bea11c976fe014764c1be56a6f914b5a560317abd9988393382e5161aa0493c": [
- "android/android10-release",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"9cefb0cb7b74e642932532831e0dc8f4d68ad414261fc3f474b795e72a164e57": [
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"9d190b2e314566685be8a889e27aa8c7d7ae1d8aaddba3c1ecf9d24863cd34b9": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"9db930a7bced5a599da673d0bb12c4c6c7ab5b3f88f39c24ee20a24716b379df": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"9df0ec44f55b36d79d4b53c208bef8cb63d78dcc8fcafde1662312f212204a37": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"9f8b05137f20acde9b996410f4d0bf7971a1006dc99e094c346d279b93cff7ae": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"9f9744463be13714754e1a3becf98c08cc205e4ab32028f4e2830c4a1b2775b8": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"a0234f3bc8527ca5628eec81ad5d69895da5680dc91d1cb8477f33f878b95b0b": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a040929a02ce53b4acf4f2ffc6981ce4496f755e6d45fe0b2a692bcd52523f36": [
- "android/android10-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a0459b9f63b22559f5fa5d4c6db3f9f72ff19342033578f073bf1d1b46cbb912": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a1339d33281a0b56e557d3d32b1ce7f9367eb094bd5fa72a7e5004c8ded7cafe": [
- "android/android10-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a1a86d04121eb87f027c66f53303c28e5739f943fc84b38ad6af009035dd9457": [
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
"macos/10.15.2"
- ],
+ ],
"a1b2dbeb64e706c6169e3c4118b23baa09018a8427666d8bf0e28891ec051950": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a1f05ccb80c2d710ec7d479abdcbb879e58d7edb7149fe78a87884e3d0bad0f9": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a22dba681e97376e2d397d728aae3a9b6296b9fdba60bc2e11f647f2c675fb37": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.9",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.9",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a31f093053bd12c1f5c3c6efd498023fd2914d7758d05d698ce084b50626e0e5": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a3cc68595dfe7e86d8ad1772a8b5284add54ace3b8a798df47bccafb1fdb84df": [
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a3d7435a18c46b23b6a4f8929cd59050c9168b03a7fad532626f297cac5356e4": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a4310d50af18a6447190372a86afaf8b951ffb431d837f1e5688b45971ed1557": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a45ede3bbbf09c8ae15c72efc07268d693a21c996fd51e67ca079460fd6d8873": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a4b6b3996fc2f306b3fd8681bd63413d8c5009cc4fa329c2ccf0e2fa1b140305": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"a53125188d2110aa964b02c7b7c6da3203170894e5fb71fffb6667d5e6810a36": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a6c51e0da5ca0a9309d2e4c0e40c2af9107aae8203857fe198e3e769e343085c": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"a71272aeaaa3cfe8727f7fb39f0fb3d1e5426e9060b06ee6f13e9a3c5833cd43": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.9",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.9",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
"windows/171121202507"
- ],
+ ],
"a73563e859cbcfa173cf3285debf2578ede15d47a3bee385861ab7a4fb6d7b6e": [
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"a798a1c70e9b6d50eaa5724a26fac7991848edc61bf48d79816bcafb66972128": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"a9a9ca22890d694919c095bb8064cbc4a525a5dbfaf801ec935dbccc07c8baee": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"a9c77af1bcdfaa3739442b0b2734c68eaf2e9833f0d766fbcaa6f2aeb42dec02": [
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"aad9ceed5aa6b1cea28596a8e4e1abed9386d6ebc9d4aad9acde0fa36ba069d0": [
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ab7036365c7154aa29c2c29f5d4191163b162a2225011357d56d07ffa7bc1f72": [
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ac7f7862e685c7a7d9826a58ea32d183d4893fcc8f8fd6d900c9769a987e77f0": [
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ad016f958050e0e7e46fae7dcc50197ed8e3ff0a4b262e5ddcdb3edddc7d6578": [
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ad7539e5cdc985fa95244055a9202d63460ec921467d034cfdbe87ec6d00fedc": [
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
"windows/171121202507"
- ],
+ ],
"ae2fec829118a2455ad6a415e71823eb9b7b6e3578a51ac8a51446eadbb0979c": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
"windows/090501224247"
- ],
+ ],
"ae4457b40d9eda96677b0d3c92d57b5177abd7ac1037958356d1e094518be5f2": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ae92e90000541a9ebc101b70b6c33a62f5a53a55ba815e81d31abddf03507f5d": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"af6d08eef3cac4e1584abc63c8a9472ac529af99f3f791319a43776063f58dca": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"af71a3bca322e5224df546895696ce449a8bd2bd130f7a7ae457767f5c23d8f8": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"af8b6762a1e528228161a95d5c559ee266278f75d79e830189a503506abd6b4c": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
"windows/171121202507"
- ],
+ ],
"afe80a97ea11159190e927e08ec2e60c59a40559483a3fee838a85321b3aeaad": [
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b04d708f1ae0456265dd1b66907a2691a28680b853e031df3df9083af71614d7": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"b0877aee2d39274df831f66fdeeb7717557c258fc9eb55231a9f8a647a75433f": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b0b1730ecbc7ff4505142c49f1295e6eda6bcaed7e2c68c5be91b5a11001f024": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"b0bfd52bb0d7d9bd92bf5d4dc13da255c02c542f378365ea893911f55e55f23c": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b2259996fff735ab35014ef63f3d413190079dd03a0962432635a8695f995305": [
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"b2f3c4216af7aff72462466dc13cd2810db8eed853eabb9a063a608efc18fbe8": [
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b32396746453442f353e616292bb20bbaa5d23b546450fdb9c54b8386167d529": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b3c962d34019fb38ab9fe9c62399742ab26c43c2d18ce3f2b13c14321e52964b": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"b41b2fbfb93eeab3e0fa6b284adb932cdb3766ed4bc7d14837a8f2d9ae874a23": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"b41d516a5351d42deea191fa6edf2a67dee2f36dc969012c76669e616b900ddf": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
"windows/160916174005"
- ],
+ ],
"b4410b73e2e6eaca47fbc42f8fa4018af4381dc54cfaa84450461eed09454de9": [
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b478b812250df878635c2aa7ec7d155eaa625ee82916e2cd294361886cd1fbd4": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b5bd2cb79cbd1907298d6bdf4842e516d8c78fa6fc96d25f71af814e16cc245e": [
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b6191a50d0c3977f7da99bcdaac86a227daeb9679ec70ba3b0c9d92271c170d3": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b644d955fff29b74e3b5687e908ee7c3c9197ba3336cc6328531f6c057d677fd": [
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804": [
- "android/android10-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b7a7ec419454411761225ecf30d99585f851356077bf83274b11588fd05521b8": [
"macos/10.9.0"
- ],
+ ],
"b7b12b171f821daa990cd0fe5087b128448ba8e5184f84c51e02b5c8fb962b24": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
"windows/160916174005"
- ],
+ ],
"b7c36231706e81078c367cb896198f1e3208dd926949dd8f5709a410f75b6292": [
- "android/android10-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.9",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.9",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"b8bbe523bfca3b11d50f73f7f10b3ec8ec958aa1dc86f66d9541907ff1a110ef": [
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"b9bea7860a962ea3611dab97ab6da3e21c1068b97d55575ed0e11279c11c8932": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "mozilla/2.10",
- "mozilla/2.9",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.9",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ba7f1136389075b8e86c53c095fa14f5c83b6b017a0244ed7637114620d3a3b1": [
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"bc104f15a48be709dca542a7e1d4b9df6f054527e802eaa92d595444258afe71": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"bc23f98a313cb92de3bbfc3a5a9f4461ac39494c4ae15a9e9df131e99b73019a": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"bc4d809b15189d78db3e1d8cf4f9726a795da1643ca5f1358e1ddb0edc0d7eb3": [
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"bcdd8df4276366d7ff4b688dc81500d8e98252c049c8ff1e8c82f2baec9d5c16": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"bd469ff45faae7c54ccbd69d3f3b002255d9b06b10b1d0fa388bf96b918b2ce9": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"bd71fdf6da97e4cf62d1647add2581b07d79adf8397eb4ecba9c5e8488821423": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"bd81ce3b4f6591d11a67b5fc7a47fdef25521bf9aa4e18b9e3df2e34a7803be8": [
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
"mozilla/2.9"
- ],
+ ],
"be6c4da2bbb9ba59b6f3939768374246c3c005993fa98f020d1dedbed48a81d5": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
+ "beb00b30839b9bc32c32e4447905950641f26421b15ed089198b518ae2ea1b99": [
+ "android/android12-release"
+ ],
"bebce57dcb85f60a93bfa5019edb1a294bf6d81f82d9b4e71f502f0b15a1fc08": [
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
"windows/190723222703"
- ],
+ ],
"bec94911c2955676db6c0a550986d76e3ba005667c442c9762b4fbb773de228c": [
- "android/android10-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"bf0feefb9e3a581ad5f9e9db7589985743d261085c4d314f6f5d7259aa421612": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
"windows/151119231843"
- ],
+ ],
"bfd88fe1101c41ae3e801bf8be56350ee9bad1a6b9bd515edc5c6d5b8711ac44": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"bfff8fd04433487d6a8aa60c1a29767a9fc2bbb05e420f713a13b992891d3893": [
- "android/android10-release",
- "android/pie-cts-release",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/pie-cts-release",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c0a6f4dc63a24bfdcf54ef2a6a082a0a72de35803e2ff5ff527ae5d87206dfd5": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c0c05a8d8da55eaf27aa9b910b0a6ef0d8bbded346928db872e182c2073e9802": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
"windows/150223195544"
- ],
+ ],
"c109e0d1b64000b01e894bdaa955e1ff91b6d084a838d90e044b9e3fcd2a8bfa": [
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
"windows/151119231843"
- ],
+ ],
"c1727f3b673e6ae7f12f23d789a7be38b918223ef6911c592da1f583444a547e": [
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c1b12f480020336e5b04f520bc19c2e2e10ab42c9d9235f05cbec33ffa4d4dea": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c1b48299aba5208fe9630ace55ca68a03eda5a519c8802a0d3a673be8f8e557d": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c1cf0b52096435e3f1b71daaec455a2311c8404f5583a9e213c69d857d943305": [
- "android/kitkat-mr1-release",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "android/kitkat-mr1-release",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"c1d80ce474a51128b77e794a98aa2d62a0225da3f419e5c7ed73dfbf660e7109": [
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c2157309d9aee17bf34f4df5e88dbaeba57e0361eb814cbc239f4d54d329a38d": [
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c2959db8339e8dbcf6409ca92a66c49fd2e32494940a901143bd7eb72827dec2": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"c2b9b042dd57830e7d117dac55ac8ae19407d38e41d88f3215bc3a890444a050": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"c31eef5682abb551ebc828ded84098518a6768526d152ee164cfb972a1425d53": [
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c34c5df53080078ffe45b21a7f600469917204f4f0293f1d7209393e5265c04f": [
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c3846bf24b9e93ca64274c0ec67c1ecc5e024ffcacd2d74019350e81fe546ae4": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c38dcb38959393358691ea4d4f3ce495ce748996e64ed1891d897a0fc4dd55c6": [
- "android/kitkat-mr1-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
+ "android/kitkat-mr1-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
"windows/160916174005"
- ],
+ ],
"c45d7bb08e6d67e62e4235110b564e5f78fd92ef058c840aea4e6455d7585c60": [
- "android/android10-release",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c470cf547e2302b977fb29dd71a89a7b6c1f60777b0329f56017f328bf4f6be6": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
"windows/160128175153"
- ],
+ ],
"c499f6cecc5da4d61f14ed0405270c5249d0e79615b0da42659ed2d7ffef8a40": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
"windows/140912180251"
- ],
+ ],
"c57a3acbe8c06ba1988a83485bf326f2448775379849de01ca43571af357e74b": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c57bacf238f9336c3dfba62d12bcf5823603e5842c44e62f5448cc7e5f4cad59": [
"macos/10.9.0"
- ],
+ ],
"c741f70f4b2a8d88bf2e71c14122ef53ef10eba0cfa5e64cfa20f418853073e0": [
- "windows/200226213356",
+ "android/android12-release",
+ "windows/200226213356",
"windows/200421004343"
- ],
+ ],
"c766a9bef2d4071c863a31aa4920e813b2d198608cb7b7cfe21143b836df09ea": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c795ff8ff20c966688f064a1e091421d3110a3456c17ec2404b998738741f622": [
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"c7ba6567de93a798ae1faa791e712d378fae1f93c4397fea441bb7cbe6fd5995": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ca2d82a08677072f8ab6764ff035676cfe3e5e325e012172df3f92096db79b85": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ca42dd41745fd0b81eb902362cf9d8bf719da1bd1b1efc946f5b4c99f42c1b9e": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ca7a5e68c53d2c51f72f6b465d3ed753f5903ec7901c8d0f55d868337c81975a": [
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"caca93b9d23d2b6fa76e8b8471931e0df3ec6f63af3cdbb936c41954a1872326": [
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"cb3ccbb76031e5e0138f8dd39a23f9de47ffc35e43c1144cea27d46a5ab1cb5f": [
- "android/android10-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"cb627d18b58ad56dde331a30456bc65c601a4e9b18dedcea08e7daaa07815ff0": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"cb6b05d9e8e57cd882b10b4db70de4bb1de42ba48a7bd0318b635bf6e7781a9d": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"cbb522d7b7f127ad6a0113865bdf1cd4102e7d0759af635a7cf4720dc963c53b": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"cbb5af185e942a2402f9eacbc0ed5bb876eea3c1223623d00447e4f3ba554b65": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"cbd8ed38d4a2d677d453d70dd8890af4f6374cba6299943f1ab3a6936c6fd795": [
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ccc89489371bad111c90619bea240a2e6dadd99f9f6e1d4d41e58ed6de3d0285": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"cd0b3b2aa174b55f18c7502f3c3a76f2198175ce45637370cf4f48b9c2ce4fbf": [
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"cd201256fe5ced0bfff8df595fff36b1416d5313a999f532ef4a9915df96dee0": [
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"cd808284cf746ff2fd6eb58aa1d59c4ad4b3ca56fdc6274a8926a7835f32313d": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"ce7dd096c8fde2bf5c438edb574bd6454385334ee8ff106c0f93d5051be6bac3": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"cecddc905099d8dadfc5b1d209b737cbe2c18cfb2c10c0ff0bcf0d3286fc1aa2": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"cf56ff46a4a186109dd96584b5eeb58a510c4275b0e5f94f40bbae865e19f673": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
"windows/150223195544"
- ],
+ ],
"d17cd8ecd586b712238a482ce46fa5293970742f276d8ab6a9e46ee0288f3355": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"d1a0319098034e3aec729a0b5c3111229d9d26e3e623e8c5e6843fa06ee8e2e4": [
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d1c339ea2784eb870f934fc5634e4aa9ad5505016401f26465d37a574663359f": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
"windows/091029013045"
- ],
+ ],
"d3d607a9ff24a19523b6da9d2c649446f8788cb96d9fd130972e120c13677730": [
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d40e9c86cd8fe468c1776959f49ea774fa548684b6c406f3909261f4dce2575c": [
- "android/android10-release",
- "android/pie-cts-release",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160414222039",
- "windows/160916174005",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/pie-cts-release",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d41d829e8c1659822af93fce62bffcde264fc84e8b950c5ff275d052354695a3": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d43af9b35473755c9684fc06d7d8cb70ee5c28e773fb294eb41ee71722924d24": [
- "android/android10-release",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d487a56f83b07482e85e963394c1ecc2c9e51d0903ee946b02c301581ed99e16": [
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d48d3d23eedb50a459e55197601c27774b9d7b18c94d5a059511a10250b93168": [
- "android/android10-release",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d68f7730b1ec2b3fb698c96d76540c9997415a25737dcd61d44960db77d2723d": [
"macos/10.9.0"
- ],
+ ],
"d6f034bd94aa233f0297eca4245b283973e447aa590f310c77f48fdf83112254": [
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d7a7a0fb5d7e2731d771e9484ebcdef71d5f0c3e0a2948782bc83ee0ea699ef4": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d7ba3f4ff8ad05633451470dda3378a3491b90005e5c687d2b68d53647cfdd66": [
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d80fef910ae3f104723b045cec2d019f441ce6213adf156791e70c1790110a31": [
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d8e0febc1db2e38d00940f37d27d41344d993e734b99d5656d9778d4d8143624": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"d95fea3ca4eedce74cd76e75fc6d1ff62c441f0fa8bc77f034b19e5db258015d": [
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.9",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.9",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"da98f640194df128c7888bc8e3479a9dd31795ff087c649052fbafb02eaef184": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88": [
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android11-release",
+ "android/android12-release",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"dd6936fe21f8f077c123a1a521c12224f72255b73e03a7260693e8a24b0fa389": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ddbf149733bc2bf8a09d7f012b01a6dea11d7bae26713783ef6407a2495bf189": [
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ddff53ecd7743b60bb7b2795ff5732fa785f9a14df1120fb40a38cf84ca2a566": [
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"de1af143ffa160cf5fa86abfe577291633dc264da12c863c5738bea4afbb2cdb": [
"windows/200421004343"
- ],
+ ],
"df545bf919a2439c36983b54cdfc903dfa4f37d3996d8d84b4c31eec6f3c163e": [
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"dfb3c314740596ad5fb97960ef62ad7c1fcceead16e74054652d1032e6f140ef": [
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
"windows/200226213356"
- ],
+ ],
"e0e17aea06cf9ce12aae8190345a2c59720130a7d8ff72f3745ad75dbaa365b6": [
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e17890ee09a3fbf4f48b9c414a17d637b7a50647e9bc752322727fcc1742a911": [
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
"mozilla/2.9"
- ],
+ ],
"e23d4a036d7b70e9f595b1422079d2b91edfbb1fb651a0633eaa8a9dc5f80703": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e28097721a8cab8880af80fdef8902b1f15bc7473ad68ec22991257a910d9ea2": [
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
"windows/200421004343"
- ],
+ ],
"e28393773da845a679f2080cc7fb44a3b7a1c3792cb7eb7729fdcb6a8d99aea7": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.9",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.9",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e3268f6106ba8b665a1a962ddea1459d2a46972f1f2440329b390b895749ad45": [
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
"macos/10.15.2"
- ],
+ ],
"e35d28419ed02025cfa69038cd623962458da5c695fbdea3c22b0bfb25897092": [
- "android/android10-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e389360d0fdbaeb3d250584b4730314e222f39c156a020144e8d960561791506": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855": [
"windows/110901174705"
- ],
+ ],
"e3b6a2db2ed7ce48842f7ac53241c7b71d54144bfb40c11f3f1d0b42f5eea12d": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e3efb6118a92e3b858fd806f690e31d46b95ca1bd756da2b3037fe2f87cc9137": [
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"e4c73430d7a5b50925df43370a0d216e9a79b9d6db8373a0c69eb1cc31c7c52a": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e57210ab812c8df308267cb4291b98e956597ca36ec2b95189ef1723396bcac8": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"e5bda820e5ce15bfd07ba11ffb1c7c8a5910ce1b90175c34308bc2500453ccdc": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
"windows/151119231843"
- ],
+ ],
"e5c01cb4093279faa19fcfa24ea43eb1b26d07a615adf7240184a1e716b761c9": [
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"e606ddeee2ee7f5cdef5d9058ff8b7d0a9f042877f6a171ed8ff6960e4cc5ea5": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"e609078465a419780cb6ac4c1c0bfb4653d9d9cc6eb3946eb7f3d69997bad598": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e6b8f8766485f807ae7f8dac1670461f07c0a13eef3a1ff717538d7abad391b4": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"e6e4a951ecbf7d8edc01bc873f7b6fd35868bdb10ed786f3a1b1ee16d8cec3e9": [
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e74fbda55bd564c473a36b441aa799c8a68e077440e8288b9fa1e50e4bbaca11": [
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e75e72ed9f560eec6eb4800073a43fc3ad19195a392282017895974a99026b6c": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e7685634efacf69ace939a6b255b7b4fabef42935b50a265acb5cb6027e44e70": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e793c9b02fd8aa13e21c31228accb08119643b749c898964b1746d46c3d4cbd2": [
- "android/android10-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"e873d4082a7b4632934f48a5cc1ee500932f661e56c3467c5c84d31447476b0c": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"e8a2f441657678975f2b97d775719c7d49d92234554540ec14d92e16fe27d2cb": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"e8b28d2a3d81f63b4e4467c2190a631fc062353b5f2d25851dda6b644ac78b3f": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"e8c6aa6b5f58a8f2a6365cf98e65693563a38b7b2f32cf1be06f2d2229d4bf59": [
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"ea7e312ece487b4c0aa63cc80ab9fcb33c720573f8945f7761745fc63863d39d": [
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"eaa962c4fa4a6bafebe415196d351ccd888d4f53f3fa8ae6d7c466a94e6042bb": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"eac0220c5c9fecc5121d3720872d06707b5266be25d4ebb56ab804bbbf85fe03": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"eb04cf5eb1f39afa762f2bb120f296cba520c1b97db1589565b81cb9a17b7244": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"eb7e05aa58e7bd328a282bf8867033f3c035342b516ee85c01673dffffbbfe58": [
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ebc5570c29018c4d67b1aa127baf12f703b4611ebc17b7dab5573894179b93fa": [
- "android/android10-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ebd41040e4bb3ec742c9e381d31ef2a41a48b6685c96e7cef3c1df6cd4331c99": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ebf3c02a8789b1fb7d511995d663b72906d913ce0d5e10568a8a77e2586167e7": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
"windows/150820181119"
- ],
+ ],
"ecc3e9c3407503bee091aa952f41348ff88baa863b2264befac807901574e939": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ecdd47b5acbfa328211e1bff54adeac95e6991e3c1d50e27b527e903208040a1": [
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
"windows/200226213356"
- ],
+ ],
"edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"eec5496b988ce98625b934092eec2908bed0b0f316c2d4730c84eaf1f3d34881": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"eefca888db442cea1f03fac5de5b1af210ae03f5e1658ddb880c645e78624546": [
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"ef3cb417fc8ebf6f97876c9e4ece39de1ea5fe649141d1028b7d11c0b2298ced": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"efb5157e9c66caa1dcc63c9fac0127cde83b7a426c4579b7b43a41ba46a56deb": [
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f00355eef101c7df4e46cce6417dffce3db82dbb1369c3b439c4e33bee445c42": [
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f008733ec500dc498763cc9264c6fcea40ec22000e927d053ce9c90bfa046cb2": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f015ce3cc239bfef064be9f1d2c417e1a0264a0a94be1f0c8d121864eb6949cc": [
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
"windows/200421004343"
- ],
+ ],
"f09b122c7114f4a09bd4ea4f4a99d558b46e4c25cd81140d29c05613914c3841": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.9",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.9",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f1b13f5c9a326403b0f31bbe7699cd17c7d1c0b981586dd1a7b219c52508fe99": [
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f1f3cc207a6d47947b8cb9c30422229de0d71fb867e0b9a3eda08e0e1736bc28": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
"windows/140912180251"
- ],
+ ],
"f28630babf256e567b5821069fcf13148ab9a23e28fc0d70615aae6ed284f4c8": [
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f356bea244b7a91eb35d53ca9ad7864ace018e2d35d5f8f96ddf68a6f41aa474": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f375e2f77a108bacc4234894a9af308edeca1acd8fbde0e7aaa9634e9daf7e1c": [
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
"windows/150223195544"
- ],
+ ],
"f38406e540d7a9d90cb4a9479299640ffb6df9e224ecc7a01c0d9558d8dad77d": [
- "android/kitkat-mr1-release",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-mr1-release",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f4336bc2ac75950beccf1c1f2f9da6dddafd1f41161ca71f59c76889bd474033": [
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f4c149551a3013a35bc7bffe17a7f3449bc1ab5b5a0ae74b06c23b90004c0104": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
"windows/150220201450"
- ],
+ ],
"f5074a8f5b9a5b8142f34abe152f60364d770eae75ee3eeceb45b6b996509788": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"f563c5c3e512e63b97b5438f2bd4a9ae78a4f9ead92bcc34fe973bdc7c6d2148": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
"windows/090501224247"
- ],
+ ],
"f59db3f45d57fcec94ccd516e6c8ccb20dd4363feb2c44d8656e95f50fdd8df8": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"f657a633eeb9bc5d15a461751749ea4b316727dcf1a9f986b5458445f6485dde": [
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
"windows/171121202507"
- ],
+ ],
"f773bc65659f1bc59087bf214eead864010d5887cd2cd84e4f1ba7523fe55640": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
"windows/150122021939"
- ],
+ ],
"f96f23f4c3e79c077a46988d5af5900676a0f039cb645dd17549b216c82440ce": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.9",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.9",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"f9e67d336c51002ac054c632022d66dda2e7e3fff10ad061ed31d8bbb410cfb2": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"fabcf5197cdd7f458ac33832d3284021db2425fd6bea7a2e69b7486e8f51f9cc": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"fad540811afae0dc767cdf6572a088fa3ce8493dd82b3b869a67d10aab4e8124": [
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"fb47d92a9909fd4fa9bec02737543e1f3514ced747407a8d9cfa397b0915067c": [
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"fc0a0fe27c9dc13c81238a5913a1daf8184168beb7e5a4512a771fd4f453651d": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
"windows/090501224247"
- ],
+ ],
"fc50b26bdc4a8fdf1344cc80157ae13ac671e2706facfc0605fe34e249eb72d6": [
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"fcbfe2886206f72b27593c8b070297e12d769ed10ed7930705a8098effc14d17": [
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.9",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.9",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/android12-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"fe7114d07a147759891ff37b4f53eb43568296bc3bf89bc12cafb186985ef28d": [
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/160916174005",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/160916174005",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"fe863d0822fe7a2353fa484d5924e875656d3dc9fb58771f6f616f9d571bc592": [
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.9.2",
- "macos/10.9.4",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
"macos/10.9.5"
- ],
+ ],
"fea1884ab3aea6d0dbedbe4b9cd9fec8655116300a86a856488fc488bb4b44d2": [
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
"windows/200226213356"
- ],
+ ],
"ff856a2d251dcd88d36656f450126798cfabaade40799c722de4d2b5db36a73a": [
- "android/android10-release",
- "android/kitkat-cts-release",
- "android/kitkat-mr1-release",
- "android/kitkat-mr2-release",
- "android/lollipop-cts-release",
- "android/lollipop-mr1-cts-release",
- "android/marshmallow-cts-release",
- "android/marshmallow-mr1-release",
- "android/marshmallow-mr2-release",
- "android/marshmallow-mr3-release",
- "android/nougat-cts-release",
- "android/nougat-mr1-cts-release",
- "android/oreo-cts-release",
- "android/oreo-mr1-cts-release",
- "android/pie-cts-release",
- "macos/10.10.0",
- "macos/10.10.3",
- "macos/10.10.4",
- "macos/10.11.0",
- "macos/10.11.1",
- "macos/10.11.2",
- "macos/10.11.4",
- "macos/10.12.0",
- "macos/10.12.1",
- "macos/10.12.2",
- "macos/10.13.0",
- "macos/10.13.1",
- "macos/10.13.2",
- "macos/10.13.3",
- "macos/10.13.4",
- "macos/10.13.5",
- "macos/10.14.0",
- "macos/10.14.2",
- "macos/10.14.3",
- "macos/10.14.4",
- "macos/10.14.5",
- "macos/10.14.6",
- "macos/10.15.0",
- "macos/10.15.1",
- "macos/10.15.2",
- "macos/10.9.0",
- "macos/10.9.2",
- "macos/10.9.4",
- "macos/10.9.5",
- "mozilla/2.10",
- "mozilla/2.11",
- "mozilla/2.14",
- "mozilla/2.16",
- "mozilla/2.18",
- "mozilla/2.20",
- "mozilla/2.22",
- "mozilla/2.24",
- "mozilla/2.26",
- "mozilla/2.28",
- "mozilla/2.30",
- "mozilla/2.32",
- "mozilla/2.34",
- "mozilla/2.36",
- "mozilla/2.38",
- "mozilla/2.9",
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
- "windows/151119231843",
- "windows/160113232859",
- "windows/160123000836",
- "windows/160128175153",
- "windows/160414222039",
- "windows/161112005943",
- "windows/170228174808",
- "windows/170419224008",
- "windows/170613190204",
- "windows/170922155710",
- "windows/171121202507",
- "windows/180122185731",
- "windows/180326181210",
- "windows/180418163033",
- "windows/180427182935",
- "windows/180518182443",
- "windows/180619172254",
- "windows/180718210913",
- "windows/180821001257",
- "windows/180926205955",
- "windows/181012165448",
- "windows/181124234732",
- "windows/190115181058",
- "windows/190222164938",
- "windows/190315181653",
- "windows/190416222336",
- "windows/190517165903",
- "windows/190621214355",
- "windows/190710202938",
- "windows/190723222703",
- "windows/190821214431",
- "windows/191029183108",
- "windows/200111003235",
- "windows/200226213356",
- "windows/200421004343"
- ],
+ "android/android10-release",
+ "android/android11-release",
+ "android/kitkat-cts-release",
+ "android/kitkat-mr1-release",
+ "android/kitkat-mr2-release",
+ "android/lollipop-cts-release",
+ "android/lollipop-mr1-cts-release",
+ "android/marshmallow-cts-release",
+ "android/marshmallow-mr1-release",
+ "android/marshmallow-mr2-release",
+ "android/marshmallow-mr3-release",
+ "android/nougat-cts-release",
+ "android/nougat-mr1-cts-release",
+ "android/oreo-cts-release",
+ "android/oreo-mr1-cts-release",
+ "android/pie-cts-release",
+ "macos/10.10.0",
+ "macos/10.10.3",
+ "macos/10.10.4",
+ "macos/10.11.0",
+ "macos/10.11.1",
+ "macos/10.11.2",
+ "macos/10.11.4",
+ "macos/10.12.0",
+ "macos/10.12.1",
+ "macos/10.12.2",
+ "macos/10.13.0",
+ "macos/10.13.1",
+ "macos/10.13.2",
+ "macos/10.13.3",
+ "macos/10.13.4",
+ "macos/10.13.5",
+ "macos/10.14.0",
+ "macos/10.14.2",
+ "macos/10.14.3",
+ "macos/10.14.4",
+ "macos/10.14.5",
+ "macos/10.14.6",
+ "macos/10.15.0",
+ "macos/10.15.1",
+ "macos/10.15.2",
+ "macos/10.9.0",
+ "macos/10.9.2",
+ "macos/10.9.4",
+ "macos/10.9.5",
+ "mozilla/2.10",
+ "mozilla/2.11",
+ "mozilla/2.14",
+ "mozilla/2.16",
+ "mozilla/2.18",
+ "mozilla/2.20",
+ "mozilla/2.22",
+ "mozilla/2.24",
+ "mozilla/2.26",
+ "mozilla/2.28",
+ "mozilla/2.30",
+ "mozilla/2.32",
+ "mozilla/2.34",
+ "mozilla/2.36",
+ "mozilla/2.38",
+ "mozilla/2.9",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
+ "windows/151119231843",
+ "windows/160113232859",
+ "windows/160123000836",
+ "windows/160128175153",
+ "windows/160414222039",
+ "windows/161112005943",
+ "windows/170228174808",
+ "windows/170419224008",
+ "windows/170613190204",
+ "windows/170922155710",
+ "windows/171121202507",
+ "windows/180122185731",
+ "windows/180326181210",
+ "windows/180418163033",
+ "windows/180427182935",
+ "windows/180518182443",
+ "windows/180619172254",
+ "windows/180718210913",
+ "windows/180821001257",
+ "windows/180926205955",
+ "windows/181012165448",
+ "windows/181124234732",
+ "windows/190115181058",
+ "windows/190222164938",
+ "windows/190315181653",
+ "windows/190416222336",
+ "windows/190517165903",
+ "windows/190621214355",
+ "windows/190710202938",
+ "windows/190723222703",
+ "windows/190821214431",
+ "windows/191029183108",
+ "windows/200111003235",
+ "windows/200226213356",
+ "windows/200421004343"
+ ],
"ffcef2224e29b0b36ec8314e686822f3ac0f1c5e0c2d5c0eb2484ce7e2540fd0": [
- "windows/070109202240",
- "windows/070201011524",
- "windows/070522004642",
- "windows/070702210503",
- "windows/070821012656",
- "windows/071219233937",
- "windows/080328202117",
- "windows/080612204220",
- "windows/080828200829",
- "windows/081103235012",
- "windows/090203164005",
- "windows/090501224247",
- "windows/090825180842",
- "windows/091013033632",
- "windows/091029013045",
- "windows/100503224537",
- "windows/100719231554",
- "windows/100927165108",
- "windows/110125205412",
- "windows/110218005058",
- "windows/110627203812",
- "windows/110830002513",
- "windows/110830153721",
- "windows/110919210309",
- "windows/111018233154",
- "windows/120125230451",
- "windows/120223022238",
- "windows/120406192127",
- "windows/121102212406",
- "windows/130321194644",
- "windows/130420010442",
- "windows/130626232015",
- "windows/131003230417",
- "windows/140312052931",
- "windows/140912180251",
- "windows/150122021939",
- "windows/150220201450",
- "windows/150223195544",
- "windows/150618202535",
- "windows/150723231635",
- "windows/150820181119",
+ "windows/070109202240",
+ "windows/070201011524",
+ "windows/070522004642",
+ "windows/070702210503",
+ "windows/070821012656",
+ "windows/071219233937",
+ "windows/080328202117",
+ "windows/080612204220",
+ "windows/080828200829",
+ "windows/081103235012",
+ "windows/090203164005",
+ "windows/090501224247",
+ "windows/090825180842",
+ "windows/091013033632",
+ "windows/091029013045",
+ "windows/100503224537",
+ "windows/100719231554",
+ "windows/100927165108",
+ "windows/110125205412",
+ "windows/110218005058",
+ "windows/110627203812",
+ "windows/110830002513",
+ "windows/110830153721",
+ "windows/110919210309",
+ "windows/111018233154",
+ "windows/120125230451",
+ "windows/120223022238",
+ "windows/120406192127",
+ "windows/121102212406",
+ "windows/130321194644",
+ "windows/130420010442",
+ "windows/130626232015",
+ "windows/131003230417",
+ "windows/140312052931",
+ "windows/140912180251",
+ "windows/150122021939",
+ "windows/150220201450",
+ "windows/150223195544",
+ "windows/150618202535",
+ "windows/150723231635",
+ "windows/150820181119",
"windows/151119231843"
]
- },
- "last_spki_id": 520,
+ },
+ "last_spki_id": 521,
"spkis": {
"004124ad6037fd5f3319e7a23d4d9c811f5598d66c4754155b0aaa9e8f00621f": {
"fingerprints": [
"ddff53ecd7743b60bb7b2795ff5732fa785f9a14df1120fb40a38cf84ca2a566"
- ],
- "id": 357,
+ ],
+ "id": 357,
"legacy": true
- },
+ },
"006cb226a772c7182d7772383e373f0f229e7dfe3444810a8d6e50905d20d661": {
"fingerprints": [
"f008733ec500dc498763cc9264c6fcea40ec22000e927d053ce9c90bfa046cb2"
- ],
- "id": 251,
+ ],
+ "id": 251,
"legacy": true
- },
+ },
"006d7be7555dd82026442c4f1a27a80e89a1989cb87b34448ed2194c18196d5e": {
"fingerprints": [
- "0c2cd63df7806fa399ede809116b575bf87989f06518f9808c860503178baf66",
+ "0c2cd63df7806fa399ede809116b575bf87989f06518f9808c860503178baf66",
"1a0d20445de5ba1862d19ef880858cbce50102b36e8f0a040c3c69e74522fe6e"
- ],
+ ],
"id": 55
- },
+ },
"01d0d8e07bc5a92da7e7b81e9a569fe3a2d63a997dac596002c5dc810cad17bd": {
"fingerprints": [
"6f2bc4cb632c24eae6782c0f39758932d1e1dc9b3e070f9303073fff38b288e2"
- ],
- "id": 283,
+ ],
+ "id": 283,
"legacy": true
- },
+ },
"0206ead163b10ea2f8620868ebd7a15f64a20250d16cd57d6e87c4fff1a2197c": {
"fingerprints": [
"d80fef910ae3f104723b045cec2d019f441ce6213adf156791e70c1790110a31"
- ],
- "id": 456,
+ ],
+ "id": 456,
"legacy": true
- },
+ },
"02376d0908ac23041cc7d666d9daf192554f7fc36317aa9cb800908616b28af8": {
"fingerprints": [
"847df6a78497943f27fc72eb93f9a637320a02b561d0a91b09e87a7807ed7c61"
- ],
- "id": 411,
+ ],
+ "id": 411,
"legacy": true
- },
+ },
"023c81cce8e7c64fa942d3c15048707d35d9bb5b87f4f544c5bf1bc5643af2fa": {
"fingerprints": [
- "83ce3c1229688a593d485f81973c0f9195431eda37cc5e36430e79c7a888638b",
+ "83ce3c1229688a593d485f81973c0f9195431eda37cc5e36430e79c7a888638b",
"797e51f883e855d021e5c770566692999407895593235def52a011f716f8b6bf"
- ],
- "id": 69,
+ ],
+ "id": 69,
"legacy": true
- },
+ },
"04a6ea654b23658973c98198c64a3a691c0da72ebebd9aebf75324cde6960eaa": {
"fingerprints": [
"c1cf0b52096435e3f1b71daaec455a2311c8404f5583a9e213c69d857d943305"
- ],
- "id": 157,
+ ],
+ "id": 157,
"legacy": true
- },
+ },
"051cf9fa95e40e9b83edaeda6961f6168c7879c4660172479cdd51ab03cea62b": {
"fingerprints": [
"cecddc905099d8dadfc5b1d209b737cbe2c18cfb2c10c0ff0bcf0d3286fc1aa2"
- ],
+ ],
"id": 73
- },
+ },
"052b687107ec84e8730382452ec2a27451745d7485a57d6f464e0da7a1b6af2a": {
"fingerprints": [
"8c7209279ac04e275e16d07fd3b775e80154b5968046e31f52dd25766324e9a7"
- ],
- "id": 136,
+ ],
+ "id": 136,
"legacy": true
- },
+ },
"05570ae6eb0fceb4210e6db79486b7094caf200401e149b6677441b5f25e449b": {
"fingerprints": [
"9a6ec012e1a7da9dbe34194d478ad7c0db1822fb071df12981496ed104384113"
- ],
+ ],
"id": 36
- },
+ },
"05e77ef1fdfe05e2dca522cae64d8379a041b7b4f16c7cae36067a7f72a14872": {
"fingerprints": [
"668c83947da63b724bece1743c31a0e6aed0db8ec5b31be377bb784f91b6716f"
- ],
+ ],
"id": 37
- },
+ },
"05ec0897b21995a4a9899f8fcb06601ade61c04389969d138fe32cd6cfc746ab": {
"fingerprints": [
"3ccc3ccfe45496d07b620dbf1328e8a1490018f48633c8a28a995ca60408b0be"
- ],
- "id": 309,
+ ],
+ "id": 309,
"legacy": true
- },
+ },
"0656f5955204c8d2bc8b1ca475e2a4fa6e124d124512784157c858b55471141a": {
"fingerprints": [
"bc23f98a313cb92de3bbfc3a5a9f4461ac39494c4ae15a9e9df131e99b73019a"
- ],
- "id": 78,
+ ],
+ "id": 78,
"legacy": true
- },
+ },
"06c7bd9553f710e058eb27b15d47dd62d7fd4352d91da96e1efc50e15354b8d7": {
"fingerprints": [
"1594cb5b826c315de3bc932c56895ff23a3a988b5dc1f034d214dfd858d89ee8"
- ],
- "id": 302,
+ ],
+ "id": 302,
"legacy": true
- },
+ },
"07e854f26a7cbd389927aa041bfef1b6cd21dd143818ad947dc655a9e587fe88": {
"fingerprints": [
"5d56499be4d2e08bcfcad08a3e38723d50503bde706948e42f55603019e528ae"
- ],
+ ],
"id": 190
- },
+ },
"086dcd7bcf864aaad5ef8c1c577bb68a131e055c93f63b9c47ee26eef15be7ab": {
"fingerprints": [
- "07453d53793bf41819a5251c69f88e2bb344b59ca828b5a543781599eaf3d602",
+ "07453d53793bf41819a5251c69f88e2bb344b59ca828b5a543781599eaf3d602",
"39f6033ca664cedb216744d3c6f2b2e8e3cebd6869f7dff47e0db91a79c416f8"
- ],
- "id": 338,
+ ],
+ "id": 338,
"legacy": true
- },
+ },
"08b3a6335fce5ef48f8f0e543986c07fd18a3b1226129f61864bbd5bdd1f1cc9": {
"fingerprints": [
"bec94911c2955676db6c0a550986d76e3ba005667c442c9762b4fbb773de228c"
- ],
+ ],
"id": 180
- },
+ },
"093db767888f6b1327555dbd42bb5c93fedec5044c7a84bc6ea32a578c2235c0": {
"fingerprints": [
"58d017279cd4dc63abddb196a6c9906c30c4e08783eae8c1609954d69355596b"
- ],
- "id": 114,
+ ],
+ "id": 114,
"legacy": true
- },
+ },
"0999bf900bd5c297865e21e1aade6cf6bb3a94d11ae5ea798442a4e2f813241f": {
"fingerprints": [
"8dbb5a7c06c20ef62dd912a36740992ff6e1e8583d42ede257c3affd7c769399"
- ],
- "id": 329,
+ ],
+ "id": 329,
"legacy": true
- },
+ },
"0b9fa5a59eed715c26c1020c711b4f6ec42d58b0015e14337a39dad301c5afc3": {
"fingerprints": [
"96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6"
- ],
+ ],
"id": 200
- },
+ },
"0bdd5abe940caaabe8b2bba88348fb6f4aa4cc84436f880bece66b48bda913d8": {
"fingerprints": [
- "57014f3cbe1782aa9b7921c5e3a95afd26d5727d9475d0142e6b6d27798133c0",
+ "57014f3cbe1782aa9b7921c5e3a95afd26d5727d9475d0142e6b6d27798133c0",
"5b38bd129e83d5a0cad23921089490d50d4aae370428f8ddfffffa4c1564e184"
- ],
- "id": 250,
+ ],
+ "id": 250,
"legacy": true
- },
+ },
"0c7acaa710226720bbc940349ee2e6148652a89dbf406a232c895f6dc78ebb9a": {
"fingerprints": [
"18f1fc7f205df8adddeb7fe007dd57e3af375a9c4d8d73546bf4f1fed1e18d35"
- ],
+ ],
"id": 91
- },
+ },
"0d47e98588452cf0778af6af03d442721dc083660a4bb23c697441fe2bb84f9b": {
"fingerprints": [
"af71a3bca322e5224df546895696ce449a8bd2bd130f7a7ae457767f5c23d8f8"
- ],
- "id": 314,
+ ],
+ "id": 314,
"legacy": true
- },
+ },
"0f9c1299557598cf7521bcc8798420a155cec1bb23a57ac37f5120fc9a2057f8": {
"fingerprints": [
"a73563e859cbcfa173cf3285debf2578ede15d47a3bee385861ab7a4fb6d7b6e"
- ],
- "id": 433,
+ ],
+ "id": 433,
"legacy": true
- },
+ },
"0fe14c264b17bb6f0d653e7a70eb363dbf54be158039eddae5c25711df48c103": {
"fingerprints": [
"6fff78e400a70c11011cd85977c459fb5af96a3df0540820d0f4b8607875e58f"
- ],
- "id": 270,
+ ],
+ "id": 270,
"legacy": true
- },
+ },
"1069fa47a0aa4f8cf7111b1caea365eeaed10bfff32660def6e0614bfae70875": {
"fingerprints": [
"a53125188d2110aa964b02c7b7c6da3203170894e5fb71fffb6667d5e6810a36"
- ],
- "id": 45,
+ ],
+ "id": 45,
"legacy": true
- },
+ },
"10ba3485ca8bb6880ab9531a4063e4001555561c7f2e055165f49b2d74fc5f6b": {
"fingerprints": [
"dd6936fe21f8f077c123a1a521c12224f72255b73e03a7260693e8a24b0fa389"
- ],
+ ],
"id": 62
- },
+ },
"111c24a243061da76e57e3b1243eda90879ffb750552395443fa8c34dc0ed737": {
"fingerprints": [
"a9c77af1bcdfaa3739442b0b2734c68eaf2e9833f0d766fbcaa6f2aeb42dec02"
- ],
- "id": 442,
+ ],
+ "id": 442,
"legacy": true
- },
+ },
"112432e4bb848c45549fcbf0c710c566d0082bbbc4e9b38e6c76ad46448128fc": {
"fingerprints": [
"afe80a97ea11159190e927e08ec2e60c59a40559483a3fee838a85321b3aeaad"
- ],
- "id": 388,
+ ],
+ "id": 388,
"legacy": true
- },
+ },
"1134fd81561a2818eccfffc2e440a0cef9a40e2926c08299804d738b0a97f63d": {
"fingerprints": [
"e28097721a8cab8880af80fdef8902b1f15bc7473ad68ec22991257a910d9ea2"
- ],
- "id": 515,
+ ],
+ "id": 515,
"legacy": true
- },
+ },
"122312c081949106b7049f3febf199c010ada13e3281cd358a41e7bd09c829d7": {
"fingerprints": [
"34ff2a4409dc1383e9f8966e8adfe5719eba373fd0ad5e2f49f90ee07cf5d4c1"
- ],
- "id": 514,
+ ],
+ "id": 514,
"legacy": true
- },
+ },
"1255cabe8152fa64df942f7a47417e29f96c1ce11bf8c84ecbe2815cc1280810": {
"fingerprints": [
"9bea11c976fe014764c1be56a6f914b5a560317abd9988393382e5161aa0493c"
- ],
+ ],
"id": 469
- },
+ },
"1462009b2de65d6d4d39be892bd2c186490531ce6590e48fe196070d317b60b0": {
"fingerprints": [
"739710c5245e33ec8a243a1b20048fc9d5f4528599213845c164d004b8b667f9"
- ],
- "id": 330,
+ ],
+ "id": 330,
"legacy": true
- },
+ },
"149f2ee63b9a5e5803240a770dc991fc2e3445e62831c245a49bc4f1f738ff9c": {
"fingerprints": [
"6b9c08e86eb0f767cfad65cd98b62149e5494a67f5845e7bd1ed019f27b86bd6"
- ],
+ ],
"id": 196
- },
+ },
"1528397da212890a830b0b95a59968cef234773779df5181cf10fa647534bb65": {
"fingerprints": [
"c7ba6567de93a798ae1faa791e712d378fae1f93c4397fea441bb7cbe6fd5995"
- ],
- "id": 146,
+ ],
+ "id": 146,
"legacy": true
- },
+ },
"15bb28d9207e13f8bc9557dd785eba773bea944e04d7e08ff8aa55ef3194aa20": {
"fingerprints": [
"4210f199499a9ac33c8de02ba6dbaa14408bdd8a6e324689c1922d069715a332"
- ],
- "id": 400,
+ ],
+ "id": 400,
"legacy": true
- },
+ },
"15e7e717b428feee3af3afd9150dbad497008d3a3ff016964719907bdb01a645": {
"fingerprints": [
"e4c73430d7a5b50925df43370a0d216e9a79b9d6db8373a0c69eb1cc31c7c52a"
- ],
- "id": 40,
+ ],
+ "id": 40,
"legacy": true
- },
+ },
"15eed339594b304f8cf847b477371d8d6fec61f4db2b01af589e7c53b35cae4c": {
"fingerprints": [
"7e37cb8b4c47090cab36551ba6f45db840680fba166a952db100717f43053fc2"
- ],
+ ],
"id": 174
- },
+ },
"15f14ac45c9c7da233d3479164e8137fe35ee0f38ae858183f08410ea82ac4b4": {
"fingerprints": [
"1465fa205397b876faa6f0a9958e5590e40fcc7faa4fb7c2c8677521fb5fb658"
- ],
+ ],
"id": 22
- },
+ },
"161e83ea32d47641e23cbe0eb413a3e0b06859922a49d1a20cfa05a41e280cfc": {
"fingerprints": [
"f773bc65659f1bc59087bf214eead864010d5887cd2cd84e4f1ba7523fe55640"
- ],
- "id": 300,
+ ],
+ "id": 300,
"legacy": true
- },
+ },
"16a9e012d32329f282b10bbf57c7c0b42ae80f6ac9542eb409bc1c2cde50d322": {
"fingerprints": [
"341de98b1392abf7f4ab90a960cf25d4bd6ec65b9a51ce6ed067d00ec7ce9b7f"
- ],
- "id": 229,
+ ],
+ "id": 229,
"legacy": true
- },
+ },
"16d82d67a1ed8e89f9ab58f7d0fd3eb0d0017687fcaeecd40475f10083a5b593": {
"fingerprints": [
"5f960eebd716dbcb4d8a78b996e680ec2547441e69b4e44e98a595502e28a002"
- ],
- "id": 165,
+ ],
+ "id": 165,
"legacy": true
- },
+ },
"17755a5c295f3d2d72e6f031a1f07f400c588b9e582b22f17eae31a1590d1185": {
"fingerprints": [
"ca2d82a08677072f8ab6764ff035676cfe3e5e325e012172df3f92096db79b85"
- ],
- "id": 52,
+ ],
+ "id": 52,
"legacy": true
- },
+ },
"18cfa64518e916cafe985561513cab7a897a54bd23b8e26874c5c7cbd1249cfc": {
"fingerprints": [
"85e0dfae3e55a843195f8b08c8349050e4689372f6e133ad0d199af96e95cc08"
- ],
- "id": 317,
+ ],
+ "id": 317,
"legacy": true
- },
+ },
"1906c6124dbb438578d00e066d5054c6c37f0fa6028c05545e0994eddaec8629": {
"fingerprints": [
"4b03f45807ad70f21bfc2cae71c9fde4604c064cf5ffb686bae5dbaad7fdd34c"
- ],
+ ],
"id": 63
- },
+ },
"1916f3508ec3fad795f8dc4bd316f9c6085a64de3c4153ac6d62d5ea19515d39": {
"fingerprints": [
"2f274e48aba4ac7b765933101775506dc30ee38ef6acd5c04932cfe041234220"
- ],
- "id": 162,
+ ],
+ "id": 162,
"legacy": true
- },
+ },
"19ad98de02155d7e33e9dd21f0e45610fd11d28044b8318bbebf9f6337888df0": {
"fingerprints": [
"1e910b40c08184c0ca20468e824502ff2485163f77b03bb73296823f03885621"
- ],
- "id": 417,
+ ],
+ "id": 417,
"legacy": true
- },
+ },
"1a421223e89bd87c403b48fa616948470d0f2c21ce2ac7bdd22755061c62ba92": {
"fingerprints": [
"7b1a15d7e5e130c579e68fca189257f837b5c188f1b2b2a791e967cc88cc6528"
- ],
- "id": 304,
+ ],
+ "id": 304,
"legacy": true
- },
+ },
"1a7a3a1a68dd2361e3f3bb855f3b26fcd88b197d8dd4de06cf1b362ac89ec13b": {
"fingerprints": [
"bc104f15a48be709dca542a7e1d4b9df6f054527e802eaa92d595444258afe71"
- ],
+ ],
"id": 39
- },
+ },
"1b8a89531701608c9ef3c65f5d60a948b1badb9753622a2e81c0a4a284be63cc": {
"fingerprints": [
"1ba622b36325544ae922afc22ef9d367943794f6e16874f368a733c65c9d5279"
- ],
- "id": 419,
+ ],
+ "id": 419,
"legacy": true
- },
+ },
"1c294bc25243768913ed4ad5ed61cb02bfbae0bce6e6e72e5f9658f346b42496": {
"fingerprints": [
"6d3795731a95f8b8a471b9aae5c4f05691b1c11a140fd4b981ad891c367fafd3"
- ],
- "id": 244,
+ ],
+ "id": 244,
"legacy": true
- },
+ },
"1d75d0831b9e0885394d32c7a1bfdb3dbc1c28e2b0e8391fb135981dbc5ba936": {
"fingerprints": [
"8d722f81a9c113c0791df136a2966db26c950a971db46b4199f4ea54b78bfb9f"
- ],
+ ],
"id": 1
- },
+ },
"1ea3c5e43ed66c2da2983a42a4a79b1e906786ce9f1b58621419a00463a87d38": {
"fingerprints": [
- "6dc47172e01cbcb0bf62580d895fe2b8ac9ad4f873801e0c10b9c837d21eb177",
+ "6dc47172e01cbcb0bf62580d895fe2b8ac9ad4f873801e0c10b9c837d21eb177",
"d1c339ea2784eb870f934fc5634e4aa9ad5505016401f26465d37a574663359f"
- ],
+ ],
"id": 38
- },
+ },
"1eb9cf901f0858aa17c399babebbdd8cb303a4ef4e1220c493cca2f75a3f914e": {
"fingerprints": [
"4be8b5a1c76c6aead0611918fccf9dbd398b67fb12294758bdf994d0f9682f60"
- ],
- "id": 416,
+ ],
+ "id": 416,
"legacy": true
- },
+ },
"1f3c9fd4fdbb50a055bcca7fe5a581a92099cef1e9e476d6baef0c910831c7b3": {
"fingerprints": [
"8ac552ad577e37ad2c6808d72aa331d6a96b4b3febff34ce9bc0578e08055ec3"
- ],
- "id": 519,
+ ],
+ "id": 519,
"legacy": true
- },
+ },
"1f4224cec84fc99ced881ff6fcfd3e21f8c519c547aa6a5dd3de247302ce50d1": {
"fingerprints": [
"e28393773da845a679f2080cc7fb44a3b7a1c3792cb7eb7729fdcb6a8d99aea7"
- ],
- "id": 88,
+ ],
+ "id": 88,
"legacy": true
- },
+ },
"2021917e98263945c859c43f1d73cb4139053c414fa03ca3bc7ee88614298f3b": {
"fingerprints": [
"4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a"
- ],
+ ],
"id": 179
- },
+ },
"202665e4c5c380b4490a81773db5dba62a90db6f5be6e0e54d11992fb1e655fd": {
"fingerprints": [
"ad016f958050e0e7e46fae7dcc50197ed8e3ff0a4b262e5ddcdb3edddc7d6578"
- ],
- "id": 398,
+ ],
+ "id": 398,
"legacy": true
- },
+ },
"20e24a5a3393d6c3adc384faf95152e1f9aa7222774028b53c5a34ed0c6cb399": {
"fingerprints": [
"527b050527df529c0f7ad00cef1e7ba421788182615c326c8b6d1a2061a0bd7c"
- ],
- "id": 351,
+ ],
+ "id": 351,
"legacy": true
- },
+ },
"21ae412566324725ffefc1dccf88f16f8d6bf4dbbb37fe8caba47e8d66c2cdf9": {
"fingerprints": [
"fad540811afae0dc767cdf6572a088fa3ce8493dd82b3b869a67d10aab4e8124"
- ],
- "id": 477,
+ ],
+ "id": 477,
"legacy": true
- },
+ },
"22050a92836481c2f3c1f8417d37447a167007ac9ba64ea228cb6a1e14c64b8b": {
"fingerprints": [
"1aa980c8c0d316f25029978982f033cbb3a3f4188d669f2de6a8d84ee00a1575"
- ],
- "id": 379,
+ ],
+ "id": 379,
"legacy": true
- },
+ },
"22076e5aef44bb9a416a28b7d1c44322d7059f60feffa5caf6c5be8447891303": {
"fingerprints": [
"cbb5af185e942a2402f9eacbc0ed5bb876eea3c1223623d00447e4f3ba554b65"
- ],
- "id": 226,
+ ],
+ "id": 226,
"legacy": true
- },
+ },
"22a36994f28f2fa3b16ae872a79dbb12a982da5b824d7ae434f96178ac540351": {
"fingerprints": [
"016e1dcd5f78841bbebbae9ddea08c8d7ec54e698e95bb778ecdd1e10d8bf4f9"
- ],
- "id": 503,
+ ],
+ "id": 503,
"legacy": true
- },
+ },
"232cbe2d9e6994c1ceb7fbee23ab1657defb6b3564726f1e78951cef3a2b095d": {
"fingerprints": [
"fc0a0fe27c9dc13c81238a5913a1daf8184168beb7e5a4512a771fd4f453651d"
- ],
- "id": 339,
+ ],
+ "id": 339,
"legacy": true
- },
+ },
"2364d692dccae13da56ad4a07c1325dc575215ff1a071681dfca5dd6ed7c8452": {
"fingerprints": [
"1e1a6984b4e76bd709aee3e9c9cf3118eac096dab9cc20dc25faab67297e965a"
- ],
- "id": 422,
+ ],
+ "id": 422,
"legacy": true
- },
+ },
"23849d094923d44a4881b63ab185e9be15aac8ef2c3044d934bc7f26e2d2cd69": {
"fingerprints": [
"77407312c63a153d5bc00b4e51759cdfdac237dc2a33b67946e98e9bfa680ae3"
- ],
- "id": 115,
+ ],
+ "id": 115,
"legacy": true
- },
+ },
"23f2edff3ede90259a9e30f40af8f912a5e5b3694e6938440341f6060e014ffa": {
"fingerprints": [
"3e9099b5015e8f486c00bcea9d111ee721faba355a89bcf1df69561e3dc6325c"
- ],
+ ],
"id": 64
- },
+ },
"244803cfa35953385d06657ac4e5ab4f2bc0405277be662adb905e1498b1defd": {
"fingerprints": [
"2a8da2f8d23e0cd3b5871ecfb0f42276ca73230667f474eede71c5ee32cc3ec6"
- ],
- "id": 460,
+ ],
+ "id": 460,
"legacy": true
- },
+ },
"2541e53ba5b3b07acbe7097ac4a03e040c11cf7a6d4a67cb213d558b50167a06": {
"fingerprints": [
"5a2fc03f0c83b090bbfa40604b0988446c7636183df9846e17101a447fb8efd6"
- ],
+ ],
"id": 498
- },
+ },
"2596904dc4d699ae20c2cef4dce47f285937d77464ac370746f52dea76ba0c28": {
"fingerprints": [
"4200f5043ac8590ebb527d209ed1503029fbcbd41ca1b506ec27f15ade7dac69"
- ],
+ ],
"id": 116
- },
+ },
"25aeec63f3ccd73dd61cb4fbbd13603722e02cb54e03047737084211071d7850": {
"fingerprints": [
"0b5eed4e846403cf55e065848440ed2a82758bf5b9aa1f253d4613cfa080ff3f"
- ],
- "id": 61,
+ ],
+ "id": 61,
"legacy": true
- },
+ },
"25b41b506e4930952823a6eb9f1d31def645ea38a5c6c6a96d71957e384df058": {
"fingerprints": [
"9acfab7e43c8d880d06b262a94deeee4b4659989c3d0caf19baf6405e41ab7df"
- ],
+ ],
"id": 152
- },
+ },
"25d4913cf587097414d29d26f6c1b1942cd6d64eaf45d0fcf81526adba96d324": {
"fingerprints": [
"55926084ec963a64b96e2abe01ce0ba86a64fbfebcc7aab5afc155b37fd76066"
- ],
+ ],
"id": 59
- },
+ },
"26c18dc6eea6f632f676bceba1d8c2b48352f29c2d5fcda878e09dcb832dd6e5": {
"fingerprints": [
"cf56ff46a4a186109dd96584b5eeb58a510c4275b0e5f94f40bbae865e19f673"
- ],
- "id": 140,
+ ],
+ "id": 140,
"legacy": true
- },
+ },
"278a6391d3d36b49aa4080f56a36b3c10fba4e28aa6a9592a82e7535113a12d3": {
"fingerprints": [
"8f62d7736f99dbd33ee00e10c7e329339c988a5b47ef25f408293cf2426b4d44"
- ],
- "id": 163,
+ ],
+ "id": 163,
"legacy": true
- },
+ },
"282fb5cfbaf01518d9704de7884d7a25ff01cf882e994290d5995d5eb6c44988": {
"fingerprints": [
"c1727f3b673e6ae7f12f23d789a7be38b918223ef6911c592da1f583444a547e"
- ],
- "id": 489,
+ ],
+ "id": 489,
"legacy": true
- },
+ },
"283310819f5e09204995d8ad9ff6fc10746297b5c0ae06bdd1e1124b10a0d7ad": {
"fingerprints": [
"956057517ff3bb35049342288c1c9dce852daca652b465e9747253b5f93b1f5e"
- ],
- "id": 343,
+ ],
+ "id": 343,
"legacy": true
- },
+ },
"2896b4ddbe61457183cc7ed27bd78ac50a207f6901c5c52e53dc1676f9bb1e06": {
"fingerprints": [
"b0877aee2d39274df831f66fdeeb7717557c258fc9eb55231a9f8a647a75433f"
- ],
- "id": 241,
+ ],
+ "id": 241,
"legacy": true
- },
+ },
"29e7fdda489e46ee486efd75acc48f251932dc9da1872b31753cd64719567aa5": {
"fingerprints": [
"9b14e8f5f6ea167666e76dcd6becc190861d5e8970b99a9470f0231236049704"
- ],
- "id": 441,
+ ],
+ "id": 441,
"legacy": true
- },
+ },
"2a29337c3d6224cc53f0bb5e5d5820c0d8848b04871328f090fee3cd6bf821b4": {
"fingerprints": [
"4404e33b5e140dcf998051fdfc8028c7c81615c5ee737b111b588233a9b535a0"
- ],
- "id": 83,
+ ],
+ "id": 83,
"legacy": true
- },
+ },
"2a4212605aa3e8aecb0fc19806cf3b40b53b95f1a34dbbd6e3ed27230324abb3": {
"fingerprints": [
"e75e72ed9f560eec6eb4800073a43fc3ad19195a392282017895974a99026b6c"
- ],
+ ],
"id": 102
- },
+ },
"2a4f49ee7701a395ac932e444292671588ade21259ce296e194940368702ea7f": {
"fingerprints": [
"8177d1a82ba501afdd1e9483ad7da912ee1e9fcb2a5a061fa3c479fa804ce6ba"
- ],
- "id": 359,
+ ],
+ "id": 359,
"legacy": true
- },
+ },
"2a8bed32ae680d2d187b9a7afd171d83fd0b935eaf9e2c1b43e80278d2063e39": {
"fingerprints": [
"3b222e566711e992300dc0b15ab9473dafdef8c84d0cef7d3317b4c1821d1436"
- ],
- "id": 161,
+ ],
+ "id": 161,
"legacy": true
- },
+ },
"2a8f2d8af0eb123898f74c866ac3fa669054e23c17bc7a95bd0234192dc635d0": {
"fingerprints": [
"45140b3247eb9cc8c5b4f0d7b53091f73292089e6e5a63e2749dd3aca9198eda"
- ],
+ ],
"id": 113
- },
+ },
"2b071c59a0a0ae76b0eadb2bad23bad4580b69c3601b630c2eaf0613afa83f92": {
"fingerprints": [
"568d6905a2c88708a4b3025190edcfedb1974a606a13c6e5290fcb2ae63edab5"
- ],
+ ],
"id": 6
- },
+ },
"2bb5c28a34c9a37dd9604500ca9b3038d00528b474773a2732aea79e4905c234": {
"fingerprints": [
"56ce347cc6df4c35943dfdeaee023f9739a3f1cedeee0cd88dc2386bc8a91eaf"
- ],
- "id": 311,
+ ],
+ "id": 311,
"legacy": true
- },
+ },
"2bcee858158cf5465fc9d76f0dfa312fef25a4dca8501da9b46b67d1fbfa1b64": {
"fingerprints": [
- "ebd41040e4bb3ec742c9e381d31ef2a41a48b6685c96e7cef3c1df6cd4331c99",
+ "ebd41040e4bb3ec742c9e381d31ef2a41a48b6685c96e7cef3c1df6cd4331c99",
"b41b2fbfb93eeab3e0fa6b284adb932cdb3766ed4bc7d14837a8f2d9ae874a23"
- ],
+ ],
"id": 109
- },
+ },
"2d6d690c16b11853884bbea2723725267e3f9b54a6cf07ad4690ab1e7cfb75e8": {
"fingerprints": [
"ad7539e5cdc985fa95244055a9202d63460ec921467d034cfdbe87ec6d00fedc"
- ],
- "id": 438,
+ ],
+ "id": 438,
"legacy": true
- },
+ },
"2da8f9ea3454d21146464a3f9d028dc4c7fbb57b1c52c73c2b0572a2f599a2d3": {
"fingerprints": [
"43f257412d440d627476974f877da8f1fc2444565a367ae60eddc27a412531ae"
- ],
- "id": 269,
+ ],
+ "id": 269,
"legacy": true
- },
+ },
"2dc9470be63ef4acf1bd828609402bb7b87bd99638a643934e88682d1be8c308": {
"fingerprints": [
- "d17cd8ecd586b712238a482ce46fa5293970742f276d8ab6a9e46ee0288f3355",
+ "d17cd8ecd586b712238a482ce46fa5293970742f276d8ab6a9e46ee0288f3355",
"51847c8cbd2e9a72c91e292d2ae247d7de1e3fd270547a20ef7d610f38b8842c"
- ],
- "id": 248,
+ ],
+ "id": 248,
"legacy": true
- },
+ },
"2dee5171596ab8f3cd3c7635fea8e6c3006aa9e31db39d03a7480ddb2428a33e": {
"fingerprints": [
- "f5074a8f5b9a5b8142f34abe152f60364d770eae75ee3eeceb45b6b996509788",
+ "f5074a8f5b9a5b8142f34abe152f60364d770eae75ee3eeceb45b6b996509788",
"ba7f1136389075b8e86c53c095fa14f5c83b6b017a0244ed7637114620d3a3b1"
- ],
- "id": 264,
+ ],
+ "id": 264,
"legacy": true
- },
+ },
"2e00915a9f7be06ab2370c7b7c200c0a96d5ac6a50ce1874dbefde4022d4de8e": {
"fingerprints": [
"c57a3acbe8c06ba1988a83485bf326f2448775379849de01ca43571af357e74b"
- ],
- "id": 272,
+ ],
+ "id": 272,
"legacy": true
- },
+ },
"2e06cae1fc20b200e6fb748557a4444bec9317dfff2e4151669e0f7944f0a9e0": {
"fingerprints": [
"97552015f5ddfc3c8788c006944555408894450084f100867086bc1a2bb58dc8"
- ],
- "id": 513,
+ ],
+ "id": 513,
"legacy": true
- },
+ },
"2fc5667a4b9a2678ed6ac6ad25465fcbf6094bfcd9504097c7a8fa47ade5e888": {
"fingerprints": [
- "ebc5570c29018c4d67b1aa127baf12f703b4611ebc17b7dab5573894179b93fa",
+ "ebc5570c29018c4d67b1aa127baf12f703b4611ebc17b7dab5573894179b93fa",
"4d9ebb28825c9643ab15d54e5f9614f13cb3e95de3cf4eac971301f320f9226e"
- ],
+ ],
"id": 206
- },
+ },
"2fcc99f5c9d00f9a20da6131dea5c027d92636d68cd9cdbe95290a3c408919e0": {
"fingerprints": [
"407c276bead2e4af0661ef6697341dec0a1f9434e4eafb2d3d32a90549d9de4a"
- ],
- "id": 427,
+ ],
+ "id": 427,
"legacy": true
- },
+ },
"3027a298fa57314dc0e3dd1019411b8f404c43c3f934ce3bdf856512c80aa15c": {
"fingerprints": [
"fe863d0822fe7a2353fa484d5924e875656d3dc9fb58771f6f616f9d571bc592"
- ],
- "id": 256,
+ ],
+ "id": 256,
"legacy": true
- },
+ },
"309f13d49ea66f523241b55524744464e28cc1b82ef79b64e4d581880dcd771f": {
"fingerprints": [
"6639d13cab85df1ad9a23c443b3a60901e2b138d456fa71183578108884ec6bf"
- ],
- "id": 237,
+ ],
+ "id": 237,
"legacy": true
- },
+ },
"30ab1bcd7bed1ff2679f71228820420a7063c6cead7ec30d4a016154876dddb5": {
"fingerprints": [
"c57bacf238f9336c3dfba62d12bcf5823603e5842c44e62f5448cc7e5f4cad59"
- ],
- "id": 280,
+ ],
+ "id": 280,
"legacy": true
- },
+ },
"30b71c4f9122476e761e620eec42bfa5f84c493cd49bbb1834b26e555f60de40": {
"fingerprints": [
"00ab444abd6bdba33da8de569ac4ecde326d1be1a61442d5eec3975a0c243f04"
- ],
- "id": 360,
+ ],
+ "id": 360,
"legacy": true
- },
+ },
"31512680233f5f2a1f29437f56d4988cf0afc41cc6c5da6275928e9c0beade27": {
"fingerprints": [
"363f3c849eab03b0a2a0f636d7b86d04d3ac7fcfe26a0a9121ab9795f6e176df"
- ],
- "id": 254,
+ ],
+ "id": 254,
"legacy": true
- },
+ },
"31de0cb19f2adbb0d1cd7b1b31ef8ee3eb59b74459aef94b480beeeeb85c64c9": {
"fingerprints": [
"f4c149551a3013a35bc7bffe17a7f3449bc1ab5b5a0ae74b06c23b90004c0104"
- ],
- "id": 147,
+ ],
+ "id": 147,
"legacy": true
- },
+ },
"3219b09114ff495a3eb6eb00c2efeab34002ae5f0a56c7679ea087a3fa037e4f": {
"fingerprints": [
"bd71fdf6da97e4cf62d1647add2581b07d79adf8397eb4ecba9c5e8488821423"
- ],
+ ],
"id": 125
- },
+ },
"32d180ed31c935589ec9dbbb722123b883b5fc2dc10f9fca3a95d77e1bfcb534": {
"fingerprints": [
- "15f0ba00a3ac7af3ac884c072b1011a077bd77c097f40164b2f8598abd83860c",
+ "15f0ba00a3ac7af3ac884c072b1011a077bd77c097f40164b2f8598abd83860c",
"001686cd181f83a1b1217d305b365c41e3470a78a1d37b134a98cd547b92dab3"
- ],
+ ],
"id": 27
- },
+ },
"3329bfa13b6007ab5fc3713f0acb289426e2fbc99cc5c110a914b139571600b6": {
"fingerprints": [
"e74fbda55bd564c473a36b441aa799c8a68e077440e8288b9fa1e50e4bbaca11"
- ],
- "id": 471,
+ ],
+ "id": 471,
"legacy": true
- },
+ },
"3380709af3b096be3cc2a40548142c0a520028db09e2cb77ae2206616ab6cbb4": {
"fingerprints": [
"513b2cecb810d4cde5dd85391adfc6c2dd60d87bb736d2b521484aa47a0ebef6"
- ],
+ ],
"id": 130
- },
+ },
"33af58b5589ecea7926252477838ba40247ab37b6fb39e34fcbd552cd5a8c66d": {
"fingerprints": [
"959dc5880c457cd92e5447aaa5609db09ed47bd02c17a0edefdc819e756c74e5"
- ],
- "id": 233,
+ ],
+ "id": 233,
"legacy": true
- },
+ },
"33fa5a5300613d466e6f85c8051695bed5d1fad59f25e040acda0472a74f3c20": {
"fingerprints": [
"d3d607a9ff24a19523b6da9d2c649446f8788cb96d9fd130972e120c13677730"
- ],
- "id": 458,
+ ],
+ "id": 458,
"legacy": true
- },
+ },
"348767cdad3bdd28b2b8dd5351aec30c68cec5cd69d276df3827dbc4f5806464": {
"fingerprints": [
"22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8"
- ],
+ ],
"id": 295
- },
+ },
"3499f93fd394523bfb1ec4c3ad4dfb310131fbe9ee5476bde6295de808d5dd8f": {
"fingerprints": [
"21db20123660bb2ed418205da11ee7a85a65e2bc6e55b5af7e7899c8a266d92e"
- ],
- "id": 138,
+ ],
+ "id": 138,
"legacy": true
- },
+ },
"3551de58a7d79cd980283df81790d63a982c1a63b30482ec5821db7661554ef9": {
"fingerprints": [
"35ae5bddd8f7ae635cffba5682a8f00b95f48462c7108ee9a0e5292b074aafb2"
- ],
- "id": 150,
+ ],
+ "id": 150,
"legacy": true
- },
+ },
"35f53ce1264611e03340fe37e1ec7d4cc986c5613dca70fd04aa44545f2daf28": {
"fingerprints": [
- "fea1884ab3aea6d0dbedbe4b9cd9fec8655116300a86a856488fc488bb4b44d2",
+ "fea1884ab3aea6d0dbedbe4b9cd9fec8655116300a86a856488fc488bb4b44d2",
"358df39d764af9e1b766e9c972df352ee15cfac227af6ad1d70e8e4a6edcba02"
- ],
- "id": 508,
+ ],
+ "id": 508,
"legacy": true
- },
+ },
"36abc32656acfc645c61b71613c4bf21c787f5cabbee48348d58597803d7abc9": {
"fingerprints": [
"18ce6cfe7bf14e60b2e347b8dfe868cb31d02ebb3ada271569f50343b46db3a4"
- ],
+ ],
"id": 205
- },
+ },
"36c22314131a5fbf1b70ea4ccf4bc13a777d938ec65e1da24e3c2cfd01d3d163": {
"fingerprints": [
"f9e67d336c51002ac054c632022d66dda2e7e3fff10ad061ed31d8bbb410cfb2"
- ],
+ ],
"id": 94
- },
+ },
"36d7c79f3d089a0ff79972d90923dea5ca76b4ccbaf7c2751cb152e9494f52d0": {
"fingerprints": [
"db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88"
- ],
- "id": 500,
+ ],
+ "id": 500,
"legacy": true
- },
+ },
"36ecc61fc7e5f1923d167e67dfde34608549b34a63c7c6e60ffd5c1840381f5c": {
"fingerprints": [
"fcbfe2886206f72b27593c8b070297e12d769ed10ed7930705a8098effc14d17"
- ],
- "id": 74,
+ ],
+ "id": 74,
"legacy": true
- },
+ },
"376a1a7082a593dccc20d561d119e9ab8d30f11cc321d0a37fa41f0df284e01c": {
"fingerprints": [
"40f6af0346a99aa1cd1d555a4e9cce62c7f9634603ee406615833dc8c8d00367"
- ],
+ ],
"id": 494
- },
+ },
"380739620e13335805eada8f9f8b81554d3bd3c0017f3632c2677669cac7a2bf": {
"fingerprints": [
"8f9adb6d895dab5adf5c3d3fab83927be0fb64ef82485c62280d584e8bd55d22"
- ],
- "id": 459,
+ ],
+ "id": 459,
"legacy": true
- },
+ },
"381a3fc7a8b082fa28613a4d07f2c7553f4e1918ee07caa9e8b7cede5a9ca06a": {
"fingerprints": [
"d487a56f83b07482e85e963394c1ecc2c9e51d0903ee946b02c301581ed99e16"
- ],
- "id": 192,
+ ],
+ "id": 192,
"legacy": true
- },
+ },
"3861d7b6961fcdb2120456ff6fc2eb7704b1a741b4bd933a8376f5e1915ca698": {
"fingerprints": [
"0791ca0749b20782aad3c7d7bd0cdfc9485835843eb2d7996009ce43ab6c6927"
- ],
- "id": 101,
+ ],
+ "id": 101,
"legacy": true
- },
+ },
"3a0d885cb346d8f01fd300af1546f6355c00690e340ed98f346e77b574be3fd8": {
"fingerprints": [
"6e5e93ae867fd3e3e78304e054d1a6aeaed0295d58c0e3fc4c9ffe310a3488cc"
- ],
- "id": 303,
+ ],
+ "id": 303,
"legacy": true
- },
+ },
"3a6c24e80f681d8b1047cec051c27594f885ba0887a26379092dfef506160e9b": {
"fingerprints": [
"06a2c9a3379ab3c156159a27ca9ecdbd4ef75309b409cf70aeca9a12330f380e"
- ],
- "id": 279,
+ ],
+ "id": 279,
"legacy": true
- },
+ },
"3a803e7c0a43a29fd73672e3d0bb2c3653d948ede0b3cb1db4ce75a857e89af1": {
"fingerprints": [
"b7b12b171f821daa990cd0fe5087b128448ba8e5184f84c51e02b5c8fb962b24"
- ],
- "id": 143,
+ ],
+ "id": 143,
"legacy": true
- },
+ },
"3b0d73b4be4a854adc3e51d7ef9fa48aefbb2cdd824d67bdc7d7d09a2abc2d43": {
"fingerprints": [
"04048028bf1f2864d48f9ad4d83294366a828856553f3b14303f90147f5d40ef"
- ],
+ ],
"id": 128
- },
+ },
"3b45918205c591298a1922a58b4921d01f648fa9d28bdddfad24aeec5942cfbf": {
"fingerprints": [
"62b9267266212832a8e22dab933d91c7011274acf71703f9cc97833751a6e94f"
- ],
- "id": 14,
+ ],
+ "id": 14,
"legacy": true
- },
+ },
"3bde97686e3af51d3f572c4888c12bd1d1e097f12f49ec3c92896551e36f0085": {
"fingerprints": [
"6cf5f658436d10507eba9df463987480bc8560a8e26ef4691e1d3c9a878a0952"
- ],
- "id": 245,
+ ],
+ "id": 245,
"legacy": true
- },
+ },
"3c196f84e2a0c61fec18bacabd31783b574517aad8ebc6ce6d1d7dc82b3c50df": {
"fingerprints": [
"527a42267daea8d8f54e91d282d5c25b615bc0dc73dc63a58f916c4ed5bf59ac"
- ],
- "id": 318,
+ ],
+ "id": 318,
"legacy": true
- },
+ },
"3c35e164bedd2cf12beb83ecff78b5e80da8158d2830217e4ebffce8928899a6": {
"fingerprints": [
"767c955a76412c89af688e90a1c70f556cfd6b6025dbea10416d7eb6831f8c40"
- ],
- "id": 13,
+ ],
+ "id": 13,
"legacy": true
- },
+ },
"3c84d996722b3c1872f53ddd7717bb2fa50ebfa07b3f3b4a395335c56712fd69": {
"fingerprints": [
"67ec2059fbf52d2e6ab51a5a9b3fc2e1dcd658a1ef3a8f31107bc98028b494a2"
- ],
- "id": 315,
+ ],
+ "id": 315,
"legacy": true
- },
+ },
"3d8d061edcf7b3d45995ba4341328d1be7b7eb4e9d14fee70d2f18ad68bea7c5": {
"fingerprints": [
"732ff5bc473c33efaad9b187fb459a732ffbeea59df0fdfb8e2fb5def4032afe"
- ],
- "id": 436,
+ ],
+ "id": 436,
"legacy": true
- },
+ },
"3ea7b5c045a99a9771e2dea8e8098ba2732d17ceee82279552feee905530f35f": {
"fingerprints": [
"075bfcca2d55ae6e35742c32afd0ca8ea4c958feefc23224999541c033d69c8d"
- ],
- "id": 420,
+ ],
+ "id": 420,
"legacy": true
- },
+ },
"3ec18dfeb894a9ea20eb2cd40c693e2a29144fe2ec60b4f7b89026040b39aebe": {
"fingerprints": [
"a3cc68595dfe7e86d8ad1772a8b5284add54ace3b8a798df47bccafb1fdb84df"
- ],
- "id": 461,
+ ],
+ "id": 461,
"legacy": true
- },
+ },
"3ee6b341402851b27e64021a3023aac7c1a0d2def27d5bce5c2dbeb0b22dcc71": {
"fingerprints": [
"65353833cf234c79562164f90849c0d104dbabf8ee41064d83e8cbe03ba1c5a5"
- ],
- "id": 481,
+ ],
+ "id": 481,
"legacy": true
- },
+ },
"3fab784fc3c9ab9eedc12ecdc0db550f4c3dbfd3e86d78815333c5eba518cb9d": {
"fingerprints": [
"a31f093053bd12c1f5c3c6efd498023fd2914d7758d05d698ce084b50626e0e5"
- ],
- "id": 225,
+ ],
+ "id": 225,
"legacy": true
- },
+ },
"3fb63c29f47bcc4e6aadb3577ce7ca8543e0bbaba553676b8fd161295bdb9011": {
"fingerprints": [
"0b9f26dfca684c2cfce23e4e4dd567c886ba259e1db267f9806f0c5a099711f2"
- ],
- "id": 368,
+ ],
+ "id": 368,
"legacy": true
- },
+ },
"4002fcd311d07331567e71bcd971e46048c8dce8d1659711753b3daa2a269afa": {
"fingerprints": [
"85fb2f91dd12275a0145b636534f84024ad68b69b8ee88684ff711375805b348"
- ],
- "id": 47,
+ ],
+ "id": 47,
"legacy": true
- },
+ },
"40fcfc28875dccbfebcbdf6cd7433312da63c4efcf3bd7b1b505c22020ae0274": {
"fingerprints": [
"62dd0be9b9f50a163ea0f8e75c053b1eca57ea55c8688f647c6881f2c8357b95"
- ],
+ ],
"id": 35
- },
+ },
"4179edd981ef747477b49626408af43daa2ca7ab7f9e082c1060f84096774348": {
"fingerprints": [
"15d5b8774619ea7d54ce1ca6d0b0c403e037a917f131e8a04e1e6b7a71babce5"
- ],
+ ],
"id": 485
- },
+ },
"4223894003a881c5df6bab163db235c221a18d54bf759945820e670da82e3f39": {
"fingerprints": [
"3c4fb0b95ab8b30032f432b86f535fe172c185d0fd39865837cf36187fa6f428"
- ],
+ ],
"id": 187
- },
+ },
+ "42431627ea76cc78697f915e3455b1b2ec82ff2f6380ee6423ef3c0840b7e631": {
+ "fingerprints": [
+ "beb00b30839b9bc32c32e4447905950641f26421b15ed089198b518ae2ea1b99"
+ ],
+ "id": 521
+ },
"42a70984ffd399c4eaf0e702a44bef2ad8a79b8bf4648f6bb210e123fd075793": {
"fingerprints": [
"2d66a702ae81ba03af8cff55ab318afa919039d9f31b4d64388680f81311b65a"
- ],
- "id": 409,
+ ],
+ "id": 409,
"legacy": true
- },
+ },
"42a807cec5ae9c0f03b40ca043ac70468b5219bd75cc5bbea51d921dd100156f": {
"fingerprints": [
"5adfa25013bed3710831572de51c4b9a21171c00313249c4cb4719d37fbb8d20"
- ],
- "id": 466,
+ ],
+ "id": 466,
"legacy": true
- },
+ },
"431b79fd9355d10dc1b50dbf6a6b62d7a5b6d356541c27605255ca4ca79420c1": {
"fingerprints": [
"f563c5c3e512e63b97b5438f2bd4a9ae78a4f9ead92bcc34fe973bdc7c6d2148"
- ],
- "id": 340,
+ ],
+ "id": 340,
"legacy": true
- },
+ },
"4376a99396769fd487240ee8b573ad49706a5b9473616acef38409e91586dc1e": {
"fingerprints": [
"c2157309d9aee17bf34f4df5e88dbaeba57e0361eb814cbc239f4d54d329a38d"
- ],
- "id": 444,
+ ],
+ "id": 444,
"legacy": true
- },
+ },
"439c19ff3edb265ef1a920f74a4802d3dd95ace024e21e5a6ce8e064dc1566cd": {
"fingerprints": [
"34bb34e14faed0d3392f2fc441c0ecd5fd88ad88118df2d1ba76cdec1eea10b8"
- ],
- "id": 447,
+ ],
+ "id": 447,
"legacy": true
- },
+ },
"43c74262f7492662d2459bcc9899bac54a4ecc01e1a3f5e76558992b40152418": {
"fingerprints": [
"a3d7435a18c46b23b6a4f8929cd59050c9168b03a7fad532626f297cac5356e4"
- ],
- "id": 414,
+ ],
+ "id": 414,
"legacy": true
- },
+ },
"43cffc359f2e8caa57388ee9f6f1dbe93bf093682a699ac3852e6d1f8579e7f9": {
"fingerprints": [
"39df7b682b7b938f84715481ccde8d60d8f22ec598877d0aaac12b59182b0312"
- ],
- "id": 56,
+ ],
+ "id": 56,
"legacy": true
- },
+ },
"4462c107c485dd6a5443f5e7a1604416034a374c3f4d10875f1c3715027563af": {
"fingerprints": [
"f38406e540d7a9d90cb4a9479299640ffb6df9e224ecc7a01c0d9558d8dad77d"
- ],
- "id": 156,
+ ],
+ "id": 156,
"legacy": true
- },
+ },
"44a3d80d3f5348596d80a09842c23a39774439f8b0b919239d2a03dac5ce5213": {
"fingerprints": [
"b2f3c4216af7aff72462466dc13cd2810db8eed853eabb9a063a608efc18fbe8"
- ],
- "id": 403,
+ ],
+ "id": 403,
"legacy": true
- },
+ },
"44af8afcf1395d2a8e30ef812ce19ceb2e8948dfd21e00fbaa34689f9a24721f": {
"fingerprints": [
"c470cf547e2302b977fb29dd71a89a7b6c1f60777b0329f56017f328bf4f6be6"
- ],
- "id": 51,
+ ],
+ "id": 51,
"legacy": true
- },
+ },
"453b74809b69019627f2f843001db5950cdd1d45371053e7f3dfdbc3714113c6": {
"fingerprints": [
"554153b13d2cf9ddb753bfbe1a4e0ae08d0aa4187058fe60a2b862b2e4b87bcb"
- ],
- "id": 518,
+ ],
+ "id": 518,
"legacy": true
- },
+ },
"463dbb9b0a26ed2616397b643125fbd29b66cf3a46fdb4384b209e78237a1aff": {
"fingerprints": [
"2930bd09a07126bdc17288d4f2ad84645ec948607907a97b5ed0b0b05879ef69"
- ],
- "id": 353,
+ ],
+ "id": 353,
"legacy": true
- },
+ },
"4691cbfde84a6b6052ddbe152bb0c216ae25a86e5747813dbc0f147f338570be": {
"fingerprints": [
"bd81ce3b4f6591d11a67b5fc7a47fdef25521bf9aa4e18b9e3df2e34a7803be8"
- ],
- "id": 2,
+ ],
+ "id": 2,
"legacy": true
- },
+ },
"4697a5abea0070a395456fd358e91f72f227d5850933227f1e0bc79ff847bfac": {
"fingerprints": [
"2dfcbacadf22a6ff107a51fd3e8b9e17858028879b13f7c3b57b3e1bd2315809"
- ],
- "id": 352,
+ ],
+ "id": 352,
"legacy": true
- },
+ },
"479d130bf3fc61dc2f1d508d239a13276ae7b3c9841011a02c1402c7e677bd5f": {
"fingerprints": [
- "f59db3f45d57fcec94ccd516e6c8ccb20dd4363feb2c44d8656e95f50fdd8df8",
+ "f59db3f45d57fcec94ccd516e6c8ccb20dd4363feb2c44d8656e95f50fdd8df8",
"2f1062f8bf84e7eb83a0f64c98d891fbe2c811b17ffac0bce1a6dc9c7c3dcbb7"
- ],
- "id": 263,
+ ],
+ "id": 263,
"legacy": true
- },
+ },
"47c7a149ca82fa7ba940a4d711d010625c6cb0b748b17016c46e25ce7acd2b0c": {
"fingerprints": [
"92d8092ee77bc9208f0897dc05271894e63ef27933ae537fb983eef0eae3eec8"
- ],
- "id": 266,
+ ],
+ "id": 266,
"legacy": true
- },
+ },
"482f76a2a9346dbb077619bbe1efecd54107e992ff4e8f4d70a39e2405d939d4": {
"fingerprints": [
"e3efb6118a92e3b858fd806f690e31d46b95ca1bd756da2b3037fe2f87cc9137"
- ],
- "id": 278,
+ ],
+ "id": 278,
"legacy": true
- },
+ },
"4905466623ab4178be92ac5cbd6584f7a1e17f27652d5a85af89504ea239aaaa": {
"fingerprints": [
"37d51006c512eaab626421f1ec8c92013fc5f82ae98ee533eb4619b8deb4d06c"
- ],
+ ],
"id": 95
- },
+ },
"495a96ba6bad782407bd521a00bace657bb355555e4bb7f8146c71bba57e7ace": {
"fingerprints": [
"eb04cf5eb1f39afa762f2bb120f296cba520c1b97db1589565b81cb9a17b7244"
- ],
+ ],
"id": 79
- },
+ },
"497128fc90656b87290482b223efb72240fe9c421e79938de5f8110cb0be9056": {
"fingerprints": [
"945bbc825ea554f489d1fd51a73ddf2ea624ac7019a05205225c22a78ccfa8b4"
- ],
- "id": 512,
+ ],
+ "id": 512,
"legacy": true
- },
+ },
"498bc0cd5a49b714071ec76a41661ce2f27fc39fe4168bc7b7799a0ae25f6528": {
"fingerprints": [
"9db930a7bced5a599da673d0bb12c4c6c7ab5b3f88f39c24ee20a24716b379df"
- ],
- "id": 332,
+ ],
+ "id": 332,
"legacy": true
- },
+ },
"49b80685d332e072c0e7b720032647e842106104e0b1139ab9e811bfb11ec034": {
"fingerprints": [
"940ef46536713d8e2eb4b501e80b6abd8eb4e9928dba44784ce7d7e98595dfe8"
- ],
- "id": 285,
+ ],
+ "id": 285,
"legacy": true
- },
+ },
"49cbd83c03cabfa0713b97bc96481d035fd4ebe06f07fab5640ed9232d8110b2": {
"fingerprints": [
"c34c5df53080078ffe45b21a7f600469917204f4f0293f1d7209393e5265c04f"
- ],
- "id": 457,
+ ],
+ "id": 457,
"legacy": true
- },
+ },
"4a2659666dc0203b916f53d80ad8f61ac30bea161f485cc7527e6a5937e49216": {
"fingerprints": [
"8de78655e1be7f7847800b93f694d21d368cc06e033e7fab04bb5eb99da6b700"
- ],
- "id": 188,
+ ],
+ "id": 188,
"legacy": true
- },
+ },
"4a49edbd2f8f8230bd5592b313573fe1c172a45fa98011cc1eddbb36ade3fce5": {
"fingerprints": [
"8fe4fb0af93a4d0d67db0bebb23e37c71bf325dcbcdd240ea04daf58b47e1840"
- ],
+ ],
"id": 169
- },
+ },
"4b72dfed3edccb5f4945682e295731a0864ac6b5b85b193ecd2f06b4900c1cfd": {
"fingerprints": [
"49351b903444c185ccdc5c693d24d8555cb208d6a8141307699f4af063199d78"
- ],
- "id": 184,
+ ],
+ "id": 184,
"legacy": true
- },
+ },
"4ba24996ddee6f8e1fcec0aa9eccfd3aa5477b3ef8f5f85f0a06073f97522857": {
"fingerprints": [
"b5bd2cb79cbd1907298d6bdf4842e516d8c78fa6fc96d25f71af814e16cc245e"
- ],
- "id": 381,
+ ],
+ "id": 381,
"legacy": true
- },
+ },
"4ba6031ca305b09e53bde3705145481d0332b651fe30370dd5254cc4d2cb32f3": {
"fingerprints": [
"76ef4762e573206006cbc338b17ca4bc200574a11928d90c3ef31c5e803e6c6f"
- ],
- "id": 328,
+ ],
+ "id": 328,
"legacy": true
- },
+ },
"4bdc636f48d21fb68c5a3cd4a20685788043bdb524e7e84d4192c451ee3429b5": {
"fingerprints": [
"92bf5119abeccad0b1332dc4e1d05fba75b5679044ee0ca26e931f744f2f33cf"
- ],
- "id": 131,
+ ],
+ "id": 131,
"legacy": true
- },
+ },
"4cc29758a2cb9b50109987f37537cf0c55ba2e6798937307a00296b01dffe44a": {
"fingerprints": [
"6cfb09893dfdf9457e3303592aa4755bc859ab6ba6a2e11c11cddc2409abda02"
- ],
- "id": 284,
+ ],
+ "id": 284,
"legacy": true
- },
+ },
"4d40e7af4304a09de87fbf9896204c055141e3f809b2fe733bb2310fdf98a162": {
"fingerprints": [
"6ea54741d004667eed1b4816634aa3a79e6e4b96950f8279dafc8d9bd8812137"
- ],
- "id": 155,
+ ],
+ "id": 155,
"legacy": true
- },
+ },
"4e6c1616637199b5077a80ad0c2248c725e576fc8a719989456bc9cafddb7524": {
"fingerprints": [
"c795ff8ff20c966688f064a1e091421d3110a3456c17ec2404b998738741f622"
- ],
- "id": 454,
+ ],
+ "id": 454,
"legacy": true
- },
+ },
"4eada9b5311e718199d98ea82b95005cba93198ab1f97efcbe8dc6201628f8af": {
"fingerprints": [
"ef3cb417fc8ebf6f97876c9e4ece39de1ea5fe649141d1028b7d11c0b2298ced"
- ],
- "id": 100,
+ ],
+ "id": 100,
"legacy": true
- },
+ },
"4ef7dacf77edb751f704035fb5c6c442351ec7220af90bdf82fd047bd3c24187": {
"fingerprints": [
"209e956af04df3996507c887d356230d6eb49fdbdd2d8a058ff50b8f80f690aa"
- ],
- "id": 470,
+ ],
+ "id": 470,
"legacy": true
- },
+ },
"4f7162b974491c98585ec28fe759aa00c330d0b465190a896cc4b616231831fc": {
"fingerprints": [
"c1d80ce474a51128b77e794a98aa2d62a0225da3f419e5c7ed73dfbf660e7109"
- ],
- "id": 476,
+ ],
+ "id": 476,
"legacy": true
- },
+ },
"508f8c6178af329bb6bb753ab943d9023be796c3adbb6c5cd4664b66feeccae5": {
"fingerprints": [
"6ec6614e9a8efd47d6318ffdfd0bf65b493a141f77c38d0b319be1bbbc053dd2"
- ],
- "id": 413,
+ ],
+ "id": 413,
"legacy": true
- },
+ },
"5094b73b736adf73a0cbf43e27bf14407b4a36aa363a457fce33949ceba8e649": {
"fingerprints": [
"eb7e05aa58e7bd328a282bf8867033f3c035342b516ee85c01673dffffbbfe58"
- ],
- "id": 385,
+ ],
+ "id": 385,
"legacy": true
- },
+ },
"50cc86ba96db3263c79a43ead07553d9f56659e6907e72d8c026637a1cdc85dc": {
"fingerprints": [
"a040929a02ce53b4acf4f2ffc6981ce4496f755e6d45fe0b2a692bcd52523f36"
- ],
+ ],
"id": 204
- },
+ },
"510d20e5c47f63cf666b20f61af62bc099a42ac824ffa443a2da7c90b1808a91": {
"fingerprints": [
"e3b6a2db2ed7ce48842f7ac53241c7b71d54144bfb40c11f3f1d0b42f5eea12d"
- ],
+ ],
"id": 154
- },
+ },
"5143e47569a1d5fc867893e0cc412c41f55715da78e59e9f8e43770008ca42d2": {
"fingerprints": [
"b644d955fff29b74e3b5687e908ee7c3c9197ba3336cc6328531f6c057d677fd"
- ],
- "id": 406,
+ ],
+ "id": 406,
"legacy": true
- },
+ },
"5192438ec369d7ee0ce71f5c6db75f941efbf72e58441715e99eab04c2c8acee": {
"fingerprints": [
"69ddd7ea90bb57c93e135dc85ea6fcd5480b603239bdc454fc758b2a26cf7f79"
- ],
+ ],
"id": 58
- },
+ },
"51b6ea6478687b47d963b6149059780cf08a4f02f042d61b5bd52639095ee910": {
"fingerprints": [
"c2959db8339e8dbcf6409ca92a66c49fd2e32494940a901143bd7eb72827dec2"
- ],
- "id": 324,
+ ],
+ "id": 324,
"legacy": true
- },
+ },
"522c3960328026a1e322389a8a08fedc1b86d9c2b59b33484b77f7ce790635d7": {
"fingerprints": [
"687ea89089309d2cfe107db059fb10d676f45d3283aee056903eea0cf3c188f8"
- ],
- "id": 320,
+ ],
+ "id": 320,
"legacy": true
- },
+ },
"5375662628fa0a6840aec8c592bf5d8de564ed3efb62c7c932fca8d754d9bbd6": {
"fingerprints": [
"6cc05041e6445e74696c4cfbc9f80f543b7eabbb44b4ce6f787c6a9971c42f17"
- ],
+ ],
"id": 203
- },
+ },
"55e00be277ceb0545299f24fd9f877e2acf32852db43ffcd29bca74b39b4c9fa": {
"fingerprints": [
"46edc3689046d53a453fb3104ab80dcaec658b2660ea1629dd7e867990648716"
- ],
+ ],
"id": 287
- },
+ },
"55f77de41c03792428f8d518c55104225be43a5598d926a528ad653e1ccec7bf": {
"fingerprints": [
"c45d7bb08e6d67e62e4235110b564e5f78fd92ef058c840aea4e6455d7585c60"
- ],
+ ],
"id": 484
- },
+ },
"56174d3ad971a8944964b189811f3008493a6a90422e3c5804ec838d4f94f622": {
"fingerprints": [
"3e84ba4342908516e77573c0992f0979ca084e4685681ff195ccba8a229b8a76"
- ],
+ ],
"id": 90
- },
+ },
"5632d97bfa775bf3c99ddea52fc2553410864016729c52dd6524c8a9c3b4489f": {
"fingerprints": [
"c3846bf24b9e93ca64274c0ec67c1ecc5e024ffcacd2d74019350e81fe546ae4"
- ],
+ ],
"id": 21
- },
+ },
"563b3caf8cfef34c2335caf560a7a95906e8488462eb75ac59784830df9e5b2b": {
"fingerprints": [
"0687260331a72403d909f105e69bcf0d32e1bd2493ffc6d9206d11bcd6770739"
- ],
+ ],
"id": 10
- },
+ },
"567b8211fd20d3d283ee0cd7ce0672cb9d99bc5b487a58c9d54ec67f77d4a8f5": {
"fingerprints": [
"e389360d0fdbaeb3d250584b4730314e222f39c156a020144e8d960561791506"
- ],
- "id": 121,
+ ],
+ "id": 121,
"legacy": true
- },
+ },
"57a742a88d3e18fc0bc611bc7976c22edc50011757512b1a7e2e1d069b3ecba0": {
"fingerprints": [
"bebce57dcb85f60a93bfa5019edb1a294bf6d81f82d9b4e71f502f0b15a1fc08"
- ],
- "id": 464,
+ ],
+ "id": 464,
"legacy": true
- },
+ },
"58044626c34c1a7b158ddb676d9e2e65443d818dab3116231e2d62ab6426a0b7": {
"fingerprints": [
"7286ce249fe9e32bd4752257c17cd8f6991a9c1e6f1a3cc73304ed023e6ae4eb"
- ],
- "id": 440,
+ ],
+ "id": 440,
"legacy": true
- },
+ },
"5899d913ead119b9cdb7ba2f30efe0df68ad2cd225bdf493e8323a25aa4dbe23": {
"fingerprints": [
"d7ba3f4ff8ad05633451470dda3378a3491b90005e5c687d2b68d53647cfdd66"
- ],
- "id": 482,
+ ],
+ "id": 482,
"legacy": true
- },
+ },
"58a2a698d86fd8497d41f68e4caeb4a98874f433da913dd26c5ca44d08ff72fe": {
"fingerprints": [
"0536801fbb443b3e905fd6d70d8c81eb88551be8061299110d2b4f82e64cade1"
- ],
- "id": 401,
+ ],
+ "id": 401,
"legacy": true
- },
+ },
"58dd61feb36ea7d258724371709149cb121337864cacb2d0999ad20739d06477": {
"fingerprints": [
"30d0895a9a448a262091635522d1f52010b5867acae12c78ef958fd4f4389f2f"
- ],
+ ],
"id": 186
- },
+ },
"5955ae291574a931342cf7450e16652ede1e0fb3097e1571dfac11c915601564": {
"fingerprints": [
"9a114025197c5bb95d94e63d55cd43790847b646b23cdf11ada4a00eff15fb48"
- ],
+ ],
"id": 81
- },
+ },
"59df317bfa9f4f0ab7ca514d7772296aa2c765b87664d08b96e57399e364729c": {
"fingerprints": [
"552f7bdcf1a7af9e6ce672017f4f12abf77240c78e761ac203d1d9d20ac89988"
- ],
+ ],
"id": 173
- },
+ },
"5a889647220e54d6bd8a16817224520bb5c78e58984bd570506388b9de0f075f": {
"fingerprints": [
"7431e5f4c3c1ce4690774f0b61e05440883ba9a01ed00ba6abd7806ed3b118cf"
- ],
+ ],
"id": 80
- },
+ },
"5aacf1b965e853010fcb2a110317d5fce3ee351e9cc95bf444a571d7b8ef9162": {
"fingerprints": [
"1d4f0596fca2611d09f84c78f2ea565ef2eab9cfc272a1718bd336e6e0ae021a"
- ],
- "id": 346,
+ ],
+ "id": 346,
"legacy": true
- },
+ },
"5c41a73ab2c35dfcd771f6fd6e3e8fac9b469d386cadda56a95b646eb48cca34": {
"fingerprints": [
"d43af9b35473755c9684fc06d7d8cb70ee5c28e773fb294eb41ee71722924d24"
- ],
+ ],
"id": 468
- },
+ },
"5dee74cc343db93f8deaf9e41fbc65b334254b5b23b568fa2814db8b7321ac85": {
"fingerprints": [
"4dbb0157a691fa7382289d65c0332ddb1dcb640b40ad10f010a43e20f3afed1e"
- ],
- "id": 296,
+ ],
+ "id": 296,
"legacy": true
- },
+ },
"5e7673a17a08d61413cd51b57dbaacbebfe5acb915e3966e5321b13eb9efaaeb": {
"fingerprints": [
"6dea86a1e66620a040c3c5943cb215d2ca87fb6ac09b59707e29d2facbd66b4e"
- ],
- "id": 159,
+ ],
+ "id": 159,
"legacy": true
- },
+ },
"5efa073f49426344483ab0ddbbdda5e35972f9c47c74ddf98ec42290b251ca97": {
"fingerprints": [
"aad9ceed5aa6b1cea28596a8e4e1abed9386d6ebc9d4aad9acde0fa36ba069d0"
- ],
- "id": 271,
+ ],
+ "id": 271,
"legacy": true
- },
+ },
"5f665b4060be9efaf6ad739f6b39a1db9847277eb8dc144045376de1009e3127": {
"fingerprints": [
"630419aec478cbb4bb8083de9d9cf279752f039def16e46471b679ca93002db0"
- ],
- "id": 164,
+ ],
+ "id": 164,
"legacy": true
- },
+ },
"6046136879e56450400f7db2ecd0df1b88f667c1e3fffc52964ff9e2e48e85f5": {
"fingerprints": [
"730b619eaa759863c65360b7412e1457eca96844ef2f16d91fcf2efe46a647e9"
- ],
- "id": 344,
+ ],
+ "id": 344,
"legacy": true
- },
+ },
"6106c0e3a0a299831875127bd7d3cc1859803d511cac11eb6e0840dd166fc10e": {
"fingerprints": [
"91e2f5788d5810eba7ba58737de1548a8ecacd014598bc0b143e041b17052552"
- ],
+ ],
"id": 176
- },
+ },
"616167201433aea6c8e5e3070afcaf6749188f814bd1abb179ae8dad3abf26ec": {
"fingerprints": [
- "3c5f81fea5fab82c64bfa2eaecafcde8e077fc8620a7cae537163df36edbf378",
+ "3c5f81fea5fab82c64bfa2eaecafcde8e077fc8620a7cae537163df36edbf378",
"8e8c6ebf77dc73db3e38e93f4803e62b6b5933beb51ee4152f68d7aa14426b31"
- ],
+ ],
"id": 141
- },
+ },
"62554c17005543b237215f04268dcd2fd1c470240ad3c8660e25ae2c59630f55": {
"fingerprints": [
"c0a6f4dc63a24bfdcf54ef2a6a082a0a72de35803e2ff5ff527ae5d87206dfd5"
- ],
+ ],
"id": 97
- },
+ },
"628e3a1156f6faa92f94b409258d4cba3f2047480d30194faf3fbed05eaeb5b2": {
"fingerprints": [
"e609078465a419780cb6ac4c1c0bfb4653d9d9cc6eb3946eb7f3d69997bad598"
- ],
- "id": 5,
+ ],
+ "id": 5,
"legacy": true
- },
+ },
"62a31a5c730dba674ddb25de33df143644375b49af07878a667b813491c73971": {
"fingerprints": [
"31eace9b4c9c71734a185680bc24866ca6cbd82b3cb61bcc8706261b59ce1073"
- ],
- "id": 323,
+ ],
+ "id": 323,
"legacy": true
- },
+ },
"63d9af9b47b1064d49a10e7b7fd566dbc8caa399459bfc2829c571ad8c6ef34a": {
"fingerprints": [
"16af57a9f676b0ab126095aa5ebadef22ab31119d644ac95cd4b93dbf3f26aeb"
- ],
+ ],
"id": 33
- },
+ },
"63f1a6f79d6e730d10432e6308194ff7bc28850adf2badf789d971385d8512ee": {
"fingerprints": [
"0c0b6b2bd1edd7b27fead157f8e846b335b784a39f06c47216c8746f64c5ceda"
- ],
- "id": 448,
+ ],
+ "id": 448,
"legacy": true
- },
+ },
"651bd66f5c3dc637957ef5185e4fa671c21654b1c0ea49384f44bcb256a5084c": {
"fingerprints": [
"3f9da4744ec9676cd38b530e500a463fbcb18165977ff0da6d5993c3fe5fab7c"
- ],
- "id": 362,
+ ],
+ "id": 362,
"legacy": true
- },
+ },
"6544ff9adb642c4c3698a60d8143b6b93bcef01365b540f614dcc2a45ab94d31": {
"fingerprints": [
"a22dba681e97376e2d397d728aae3a9b6296b9fdba60bc2e11f647f2c675fb37"
- ],
- "id": 98,
+ ],
+ "id": 98,
"legacy": true
- },
+ },
"659cb368ac56998bd07af2cafc5fb93f8e79474accc2a6cf1ac9f2192d136360": {
"fingerprints": [
- "0ed3ffab6c149c8b4e71058e8668d429abfda681c2fff508207641f0d751a3e5",
+ "0ed3ffab6c149c8b4e71058e8668d429abfda681c2fff508207641f0d751a3e5",
"ca7a5e68c53d2c51f72f6b465d3ed753f5903ec7901c8d0f55d868337c81975a"
- ],
- "id": 221,
+ ],
+ "id": 221,
"legacy": true
- },
+ },
"66b00539826a37484930191e028f62dab1cbc89b3acd472dc4e5905e47bf7364": {
"fingerprints": [
"6ea1db6719d6041a06fc0898e5b3cf349a8fa8ecee85edb005965628f617f7c8"
- ],
- "id": 428,
+ ],
+ "id": 428,
"legacy": true
- },
+ },
"674039e472561963c8cb00d21a97a90a18bb8a1c4c317ac67e382a652bb573c0": {
"fingerprints": [
"c2b9b042dd57830e7d117dac55ac8ae19407d38e41d88f3215bc3a890444a050"
- ],
- "id": 216,
+ ],
+ "id": 216,
"legacy": true
- },
+ },
"675605f1567e25fbd2526befea2aefbdb2279f3e1baa3a303ae7555d1bda3ee4": {
"fingerprints": [
"27995829fe6a7515c1bfe848f9c4761db16c225929257bf40d0894f29ea8baf2"
- ],
- "id": 198,
+ ],
+ "id": 198,
"legacy": true
- },
+ },
"676b9ff303ede180fb95a4736fb4d3153032c014444f63a2074c41b98b51e0bd": {
"fingerprints": [
"604d32d036895aed3bfefaeb727c009ec0f2b3cdfa42a1c71730e6a72c3be9d4"
- ],
- "id": 452,
+ ],
+ "id": 452,
"legacy": true
- },
+ },
"67a84264d42e204a9a5b0a3667b951db22c505df95ed983b5e8c4d1fce77af43": {
"fingerprints": [
"19abcdff3a74402fa8f0ca206bf7fab0dffff3ae2bbd719584d21090a4353207"
- ],
- "id": 480,
+ ],
+ "id": 480,
"legacy": true
- },
+ },
"67dc4f32fa10e7d01a79a073aa0c9e0212ec2ffc3d779e0aa7f9c0f0e1c2c893": {
"fingerprints": [
"a4310d50af18a6447190372a86afaf8b951ffb431d837f1e5688b45971ed1557"
- ],
+ ],
"id": 104
- },
+ },
"67ea193243ae383939b5ad9e356a6b2bf93a93bcdcf828a47082497883083f86": {
"fingerprints": [
"d41d829e8c1659822af93fce62bffcde264fc84e8b950c5ff275d052354695a3"
- ],
- "id": 126,
+ ],
+ "id": 126,
"legacy": true
- },
+ },
"682747f8ba621b87cdd3bc295ed5cabce722a1c0c0363d1d68b38928d2787f1e": {
"fingerprints": [
"2cabeafe37d06ca22aba7391c0033d25982952c453647349763a3ab5ad6ccf69"
- ],
+ ],
"id": 487
- },
+ },
"689bf45b3083fdead55f147fd105e3cf218ad58edf3e4b301c0c5eeea6cf210d": {
"fingerprints": [
"417dcf3180f4ed1a3747acf1179316cd48cb05c5788435168aed98c98cdcb615"
- ],
- "id": 429,
+ ],
+ "id": 429,
"legacy": true
- },
+ },
"68aa635451d83962167e88fb08f8678d73aec66fc559462137cff9d1bc3d3871": {
"fingerprints": [
- "dfb3c314740596ad5fb97960ef62ad7c1fcceead16e74054652d1032e6f140ef",
+ "dfb3c314740596ad5fb97960ef62ad7c1fcceead16e74054652d1032e6f140ef",
"66960242db2ed5906e113295f2454f33d6fb418c4c65e8166d43be64d19ba4fa"
- ],
- "id": 506,
+ ],
+ "id": 506,
"legacy": true
- },
+ },
"68c3692214724d4b55a760f470b4fca8b5e0fe1d729cff22feb4ca88acd39809": {
"fingerprints": [
"ae4457b40d9eda96677b0d3c92d57b5177abd7ac1037958356d1e094518be5f2"
- ],
- "id": 231,
+ ],
+ "id": 231,
"legacy": true
- },
+ },
"68ded9a203ff6e367e12aa49977cd200f7127a800faa6f859f0bafed8286a4fb": {
"fingerprints": [
"caca93b9d23d2b6fa76e8b8471931e0df3ec6f63af3cdbb936c41954a1872326"
- ],
- "id": 499,
+ ],
+ "id": 499,
"legacy": true
- },
+ },
"6a436b58d9d830e8d5b8a642505ad6b41406adcd6894d9414f7be0a1467badb7": {
"fingerprints": [
"05d38c2a70bfc500ccb0cb509159b46b065c6ac9cb42d2e6f16167841434572a"
- ],
- "id": 426,
+ ],
+ "id": 426,
"legacy": true
- },
+ },
"6a7b1482127002f9005a87356e1dc3e00b70bbbfa795024ff8beff74c4259b75": {
"fingerprints": [
"f657a633eeb9bc5d15a461751749ea4b316727dcf1a9f986b5458445f6485dde"
- ],
- "id": 421,
+ ],
+ "id": 421,
"legacy": true
- },
+ },
"6b1a505e0246f2f60c490ff0c097a7be27210cbb7500237f88b0cd48298bc9b8": {
"fingerprints": [
"2a99f5bc1174b73cbb1d620884e01c34e51ccb3978da125f0e33268883bf4158"
- ],
+ ],
"id": 191
- },
+ },
"6b3b57e9ec88d1bb3d01637ff33c7698b3c9758255e9f01ea9178f3e7f3b2b52": {
"fingerprints": [
- "b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804",
+ "b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804",
"9f8b05137f20acde9b996410f4d0bf7971a1006dc99e094c346d279b93cff7ae"
- ],
+ ],
"id": 194
- },
+ },
"6b86de96a658a56820a4f35d90db6c3efdd574ce94b909cb0d7ff17c3c189d83": {
"fingerprints": [
"3266967e59cd68008d9dd320811185c704205e8d95fdd84f1c7b311e6704fc32"
- ],
- "id": 261,
+ ],
+ "id": 261,
"legacy": true
- },
+ },
"6bcfc86c8ddc2af2e6a1180a2ddabb37b7ea3755316b64b9b8951bf0ca351f06": {
"fingerprints": [
"f96f23f4c3e79c077a46988d5af5900676a0f039cb645dd17549b216c82440ce"
- ],
+ ],
"id": 20
- },
+ },
"6c464b9a5b233a5e874da765c26f045010d2ddcff45794f0b4c7e4aafa501495": {
"fingerprints": [
"0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7"
- ],
+ ],
"id": 137
- },
+ },
"6c5cbf02c1849166278f1cd1c83583a147fb7bc95e289b276366935e3153f302": {
"fingerprints": [
"2dc62c3f6c0cc9020bba77e1c511511024b943ee598856da5a22e222b7277a20"
- ],
- "id": 277,
+ ],
+ "id": 277,
"legacy": true
- },
+ },
"6cae87c558d2441568e38270a8dd8ff484a259dc4f3ce94ccf434c1fa99811f6": {
"fingerprints": [
"9806ab8509e2f35e192f275f0c308b9409b42512f90c659598c22be613962272"
- ],
- "id": 325,
+ ],
+ "id": 325,
"legacy": true
- },
+ },
"6d28f9e405148b69027da990815211c858841c543feced008c238021983c095a": {
"fingerprints": [
- "0378b202ccabba99a12e569a11a077db1edb39482061c75d0073059d9ab5b513",
+ "0378b202ccabba99a12e569a11a077db1edb39482061c75d0073059d9ab5b513",
"e5c01cb4093279faa19fcfa24ea43eb1b26d07a615adf7240184a1e716b761c9"
- ],
- "id": 376,
+ ],
+ "id": 376,
"legacy": true
- },
+ },
"6d6f0c340971a218a31d10330ea9ae7c7a6550534c6eefeddd2118e114db473e": {
"fingerprints": [
"56c77128d98c18d91b4cfdffbc25ee9103d4758ea2abad826a90f3457d460eb4"
- ],
- "id": 202,
+ ],
+ "id": 202,
"legacy": true
- },
+ },
"6dbfae00d37b9cd73f8fb47de65917af00e0dddf42dbceac20c17c0275ee2095": {
"fingerprints": [
"73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c"
- ],
+ ],
"id": 117
- },
+ },
"6e364b6133deefdcbb21273c5f445a20afbc05038d5b021c0c2153039016345b": {
"fingerprints": [
"a1339d33281a0b56e557d3d32b1ce7f9367eb094bd5fa72a7e5004c8ded7cafe"
- ],
+ ],
"id": 193
- },
+ },
"6f3e077fe5504646c0191afce494e4eb68183e398f5a4dc05669f8b6e6e682fe": {
"fingerprints": [
"2d47437de17951215a12f3c58e51c729a58026ef1fcc0a5fb3d9dc012f600d19"
- ],
- "id": 151,
+ ],
+ "id": 151,
"legacy": true
- },
+ },
"7006a38311e58fb193484233218210c66125a0e4a826aed539ac561dfbfbd903": {
"fingerprints": [
"92a9d9833fe1944db366e8bfae7a95b6480c2d6c6c2a1be65d4236b608fca1bb"
- ],
- "id": 227,
+ ],
+ "id": 227,
"legacy": true
- },
+ },
"7016270b60b28c6e177edebd718007dfd3310c64a737b7db01a07690c343bc27": {
"fingerprints": [
"cd0b3b2aa174b55f18c7502f3c3a76f2198175ce45637370cf4f48b9c2ce4fbf"
- ],
- "id": 389,
+ ],
+ "id": 389,
"legacy": true
- },
+ },
"702116ccd8bf23e16466f0e0dba0ed6a239a9c1cd6a8f5a66b39af3595020385": {
"fingerprints": [
"e23d4a036d7b70e9f595b1422079d2b91edfbb1fb651a0633eaa8a9dc5f80703"
- ],
+ ],
"id": 92
- },
+ },
"706bb1017c855c59169bad5c1781cf597f12d2cad2f63d1a4aa37493800ffb80": {
"fingerprints": [
"cbb522d7b7f127ad6a0113865bdf1cd4102e7d0759af635a7cf4720dc963c53b"
- ],
+ ],
"id": 18
- },
+ },
"719cf5b36192e7bde650cc91341e6f649dbb8c3ee48bacaa97fa0e05b6374b41": {
"fingerprints": [
"126bf01c1094d2f0ca2e352380b3c724294546ccc65597bef7f12d8a171f1984"
- ],
- "id": 242,
+ ],
+ "id": 242,
"legacy": true
- },
+ },
"71ed918a7ac6d17b3849c20180b3e7334691bc5fb73377f0070afa0be789b2d1": {
"fingerprints": [
"c31eef5682abb551ebc828ded84098518a6768526d152ee164cfb972a1425d53"
- ],
- "id": 446,
+ ],
+ "id": 446,
"legacy": true
- },
+ },
"76ee8590374c715437bbca6bba6028eadde2dc6dbbb8c3f610e851f11d1ab7f5": {
"fingerprints": [
"43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339"
- ],
+ ],
"id": 42
- },
+ },
"77290717614b25f12964ebdb38b5f83caadc0f6c36b0777f880fc6dee1d339cc": {
"fingerprints": [
"f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73"
- ],
+ ],
"id": 127
- },
+ },
"772fccca7d1646d60628134ff2e6e7f5ba095898be59698bce9d15f96f69a9f3": {
"fingerprints": [
"0f993c8aef97baaf5687140ed59ad1821bb4afacf0aa9a58b5d57a338a3afbcb"
- ],
+ ],
"id": 12
- },
+ },
"782d7e61e1323d2aafb877be34ee1de0c1345136d4fcb3c945937f6a67b412fe": {
"fingerprints": [
"6ccfd302fc44bf4599329b9750878ea44e7e8566564bcbd586169762dd10c74e"
- ],
- "id": 435,
+ ],
+ "id": 435,
"legacy": true
- },
+ },
"786ffa578618c3b9a311175e50816f4dda0605c3869f296ebc5943bf09f4e904": {
"fingerprints": [
"88f438dcf8ffd1fa8f429115ffe5f82ae1e06e0c70c375faad717b34a49e7265"
- ],
- "id": 510,
+ ],
+ "id": 510,
"legacy": true
- },
+ },
"78cf3d3c72daf91cc51b871357a551cf95b837d074c270b08facd463a8d39bb3": {
"fingerprints": [
"82d42db3d657f1944e65c192b1dd58db8df8417b89165b045f5c6a70c5f8939e"
- ],
- "id": 437,
+ ],
+ "id": 437,
"legacy": true
- },
+ },
"79caaf5347e6e4a94c8e78a98496fc74020f809ede13f220fab6104c8ded329f": {
"fingerprints": [
"f015ce3cc239bfef064be9f1d2c417e1a0264a0a94be1f0c8d121864eb6949cc"
- ],
- "id": 516,
+ ],
+ "id": 516,
"legacy": true
- },
+ },
"7aedddf36b18f8acb7379fe1ce183212b2350d0788abe0e82457be9badad6d54": {
"fingerprints": [
"8b45da1c06f791eb0cabf26be588f5fb23165c2e614bf885562d0dce50b29b02"
- ],
- "id": 195,
+ ],
+ "id": 195,
"legacy": true
- },
+ },
"7afe4b071a2f1f46f8ba944a26d584d5960b92fb48c3ba1b7cab84905f32aacd": {
"fingerprints": [
- "5a885db19c01d912c5759388938cafbbdf031ab2d48e91ee15589b42971d039c",
+ "5a885db19c01d912c5759388938cafbbdf031ab2d48e91ee15589b42971d039c",
"744b1147b4a9a69c32785e9e37c3323241ef29f63e76f1603d6761a783d8a0fe"
- ],
+ ],
"id": 291
- },
+ },
"7c3b46d9be8f2741f980039521858e4cdd30774fb32b3b21ceea06aa79c6aac6": {
"fingerprints": [
"af6d08eef3cac4e1584abc63c8a9472ac529af99f3f791319a43776063f58dca"
- ],
- "id": 341,
+ ],
+ "id": 341,
"legacy": true
- },
+ },
"7caa03465124590c601e567e52148e952c0cffe89000530fe0d95b6d50eaae41": {
"fingerprints": [
"a0234f3bc8527ca5628eec81ad5d69895da5680dc91d1cb8477f33f878b95b0b"
- ],
+ ],
"id": 86
- },
+ },
"7cd67c248f69d83fc2f9bb01dcb1f7ad67a363d046043796d0984c3a231f6bb0": {
"fingerprints": [
"2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c"
- ],
+ ],
"id": 294
- },
+ },
"7d434d1dada2a154d49f473e381310b83ee58d290a13455182d77f1962df55ee": {
"fingerprints": [
"e57210ab812c8df308267cb4291b98e956597ca36ec2b95189ef1723396bcac8"
- ],
- "id": 306,
+ ],
+ "id": 306,
"legacy": true
- },
+ },
"7d6c3ebf9ea735d1854beea7cb941ab1e3503515e087bbb5be695d05f2f556e4": {
"fingerprints": [
"2193cfea381211a1aeaa2de984e630643a87160b1208118145eafb8e1bc69958"
- ],
- "id": 473,
+ ],
+ "id": 473,
"legacy": true
- },
+ },
"7e0ead76bb6819dc2f54511a84354f6e8b307b9dd82058ea6c004f01d9dda5df": {
"fingerprints": [
"179fbc148a3dd00fd24ea13458cc43bfa7f59c8182d783a513f6ebec100c8924"
- ],
+ ],
"id": 181
- },
+ },
"7e6acd853cacc6932e9b519fdad1beb515ed2a2d0025cfd398c3ac1f0dbb754b": {
"fingerprints": [
"f375e2f77a108bacc4234894a9af308edeca1acd8fbde0e7aaa9634e9daf7e1c"
- ],
- "id": 395,
+ ],
+ "id": 395,
"legacy": true
- },
+ },
"7e8782c150ce3952f802e636023a5d3e95bb5d68e33e85adb2ba178125cebf15": {
"fingerprints": [
"960adf0063e96356750c2965dd0a0867da0b9cbd6e77714aeafb2349ab393da3"
- ],
+ ],
"id": 30
- },
+ },
"7f1dec8b0319548a056de5bb521bd93eb74e6a76f28dffb75b45a53b775af7ab": {
"fingerprints": [
"7af6ea9f753a1e709bd64d0beb867c11e8c295a56e24a6e0471459dccdaa1558"
- ],
- "id": 274,
+ ],
+ "id": 274,
"legacy": true
- },
+ },
"7f4296fc5b6a4e3b35d3c369623e364ab1af381d8fa7121533c9d6c633ea2461": {
"fingerprints": [
"1ba5b2aa8c65401a82960118f80bec4f62304d83cec4713a19c39c011ea46db4"
- ],
+ ],
"id": 209
- },
+ },
"7f7c88a77d4d3b44c33b3c030bc83f1a26c20d49177ca7745d91d9de17e08f14": {
"fingerprints": [
"22e0d11dc9207e16c92b2ee18cfdb2c2e940626847921fc528cedd2f7932f714"
- ],
- "id": 349,
+ ],
+ "id": 349,
"legacy": true
- },
+ },
"805c6696266b96b147468a321eba9eb8b5968f2c477cdd95fdadd1fc63dd614b": {
"fingerprints": [
"a9a9ca22890d694919c095bb8064cbc4a525a5dbfaf801ec935dbccc07c8baee"
- ],
- "id": 298,
+ ],
+ "id": 298,
"legacy": true
- },
+ },
"808d68b3fab4884a5f971ace7d10550d7a95a163774f3ec36afffb213fbe4c74": {
"fingerprints": [
"2ce1cb0bf9d2f9e102993fbe215152c3b2dd0cabde1c68e5319b839154dbb7f5"
- ],
+ ],
"id": 84
- },
+ },
"809f2baae35afb4f36bd6476ce75c2001077901b6af5c4dab82e188c6b95c1a1": {
"fingerprints": [
"53dfdfa4e297fcfe07594e8c62d5b8ab06b32c7549f38a163094fd6429d5da43"
- ],
- "id": 258,
+ ],
+ "id": 258,
"legacy": true
- },
+ },
"80dbfb97bdd3926baee41f73c5588faa17d707b03adf4907a2bc677f3ef1717c": {
"fingerprints": [
"7afc9d01a62f03a2de9637936d4afe68090d2de18d03f29c88cfb0b1ba63587f"
- ],
- "id": 214,
+ ],
+ "id": 214,
"legacy": true
- },
+ },
"816ba0bfdf5fd64d568ec0d052f71164d9e2ccae12e0219ed6cd81e7e845fb84": {
"fingerprints": [
"fb47d92a9909fd4fa9bec02737543e1f3514ced747407a8d9cfa397b0915067c"
- ],
- "id": 423,
+ ],
+ "id": 423,
"legacy": true
- },
+ },
"81a98fc788c35f557645a95224e50cd1dac8ffb209dc1e5688aa29205f132218": {
"fingerprints": [
"c38dcb38959393358691ea4d4f3ce495ce748996e64ed1891d897a0fc4dd55c6"
- ],
- "id": 166,
+ ],
+ "id": 166,
"legacy": true
- },
+ },
"828b0eeff24654e8ff5841a29dd5d4e3ed30952ca43425a79283407208d39d16": {
"fingerprints": [
"55903859c8c0c3ebb8759ece4e2557225ff5758bbd38ebd48276601e1bd58097"
- ],
- "id": 511,
+ ],
+ "id": 511,
"legacy": true
- },
+ },
"82b5f84daf47a59c7ab521e4982aefa40a53406a3aec26039efa6b2e0e7244c1": {
"fingerprints": [
"52f0e1c4e58ec629291b60317f074671b85d7ea80d5b07273463534b32b40234"
- ],
+ ],
"id": 183
- },
+ },
"84aac093e08c49dbfff8e560759248dbe67135b372b23d2a881d5f99cbb191e8": {
"fingerprints": [
"1e49ac5dc69e86d0565da2c1305c419330b0b781bfec50e54a1b35af7fddd501"
- ],
- "id": 276,
+ ],
+ "id": 276,
"legacy": true
- },
+ },
"85a3d81d2ad0c79df0a79684e0e2666009a09de15760ea1d76cf0ee7b2825dbd": {
"fingerprints": [
"a1b2dbeb64e706c6169e3c4118b23baa09018a8427666d8bf0e28891ec051950"
- ],
- "id": 410,
+ ],
+ "id": 410,
"legacy": true
- },
+ },
"85d26be90d934fccdb4ff7b38d8c79ca7652b816d6a52446ca8428a6b85dc57c": {
"fingerprints": [
- "e3268f6106ba8b665a1a962ddea1459d2a46972f1f2440329b390b895749ad45",
+ "e3268f6106ba8b665a1a962ddea1459d2a46972f1f2440329b390b895749ad45",
"e0e17aea06cf9ce12aae8190345a2c59720130a7d8ff72f3745ad75dbaa365b6"
- ],
- "id": 273,
+ ],
+ "id": 273,
"legacy": true
- },
+ },
"860a7f19210d5ead057a78532b80951453cb2907315f3ba7aa47b69897d70f3f": {
"fingerprints": [
- "bd469ff45faae7c54ccbd69d3f3b002255d9b06b10b1d0fa388bf96b918b2ce9",
+ "bd469ff45faae7c54ccbd69d3f3b002255d9b06b10b1d0fa388bf96b918b2ce9",
"944554239d91ed9efedcf906d5e8113160b46fc816dc6bdc77b89da29b6562b9"
- ],
- "id": 249,
+ ],
+ "id": 249,
"legacy": true
- },
+ },
"86a68f050034126a540d39db2c5f917ef66a94fb9619fa1ecd827cea46ba0cb0": {
"fingerprints": [
"8a866fd1b276b57e578e921c65828a2bed58e9f2f288054134b7f1f4bfc9cc74"
- ],
+ ],
"id": 170
- },
+ },
"86c13a3408dd1aa77ee8b6947c03958772f531248c1627befb2c4f4b04d04496": {
"fingerprints": [
"b9bea7860a962ea3611dab97ab6da3e21c1068b97d55575ed0e11279c11c8932"
- ],
- "id": 53,
+ ],
+ "id": 53,
"legacy": true
- },
+ },
"86c84b1c3a66f4285af797052467e3ed236fd2986f033c02c4771be0b970482a": {
"fingerprints": [
"90f3e05396995ff20922c44592db62d7845e1bf64aef512cca75bc669caa2479"
- ],
- "id": 366,
+ ],
+ "id": 366,
"legacy": true
- },
+ },
"87157a7585f4d03b00a398461e164e4806e1b3f46d03afbdc9def4e4778be2e9": {
"fingerprints": [
"007e452fd5cf838946696dfe37a2db2ef3991436d27bcbab45922053c15a87a8"
- ],
- "id": 378,
+ ],
+ "id": 378,
"legacy": true
- },
+ },
"871a9194f4eed5b312ff40c84c1d524aed2f778bbff25f138cf81f680a7adc67": {
"fingerprints": [
"2a575471e31340bc21581cbd2cf13e158463203ece94bcf9d3cc196bf09a5472"
- ],
+ ],
"id": 483
- },
+ },
"87af34d66fb3f2fdf36e09111e9aba2f6f44b207f3863f3d0b54b25023909aa5": {
"fingerprints": [
"ff856a2d251dcd88d36656f450126798cfabaade40799c722de4d2b5db36a73a"
- ],
+ ],
"id": 75
- },
+ },
"881a1b9edf69ade141839ae8673d31b4f4d47f126ca08a79ff065dc9a690f4a3": {
"fingerprints": [
"e5bda820e5ce15bfd07ba11ffb1c7c8a5910ce1b90175c34308bc2500453ccdc"
- ],
- "id": 322,
+ ],
+ "id": 322,
"legacy": true
- },
+ },
"891ff898e4a8d555140056e3176eea91f4d808ee7f6d1bfbcce6f84807639f91": {
"fingerprints": [
"b7c36231706e81078c367cb896198f1e3208dd926949dd8f5709a410f75b6292"
- ],
+ ],
"id": 199
- },
+ },
"8991e219ce9f74479eafedb3535836121dd233ea768afb9d9ac8b4a22381a8d5": {
"fingerprints": [
"ffcef2224e29b0b36ec8314e686822f3ac0f1c5e0c2d5c0eb2484ce7e2540fd0"
- ],
- "id": 321,
+ ],
+ "id": 321,
"legacy": true
- },
+ },
"8a27b5557b4bec7cc0305fbf3d53d1f71cd3f34910c5d65e27ecddb82077ba3d": {
"fingerprints": [
"ca42dd41745fd0b81eb902362cf9d8bf719da1bd1b1efc946f5b4c99f42c1b9e"
- ],
+ ],
"id": 7
- },
+ },
"8a2affbd1a1c5d1bdccbb7f548ba995f966806b3fd0c3a00fae2e52f3c853989": {
"fingerprints": [
"0c258a12a5674aef25f28ba7dcfaeceea348e541e6f5cc4ee63b71b361606ac3"
- ],
- "id": 145,
+ ],
+ "id": 145,
"legacy": true
- },
+ },
"8a42eeadbc8b21a35c4b3aadd7dfbcbd2ed1b1da12e8c45a534da90607e564fd": {
"fingerprints": [
"cd201256fe5ced0bfff8df595fff36b1416d5313a999f532ef4a9915df96dee0"
- ],
- "id": 392,
+ ],
+ "id": 392,
"legacy": true
- },
+ },
"8a903b600a080b38dfe20dfb6acd23122f64620e5808b9fc8688952fc1a3559c": {
"fingerprints": [
"59b3829f1ff443344958fae8bff621b684c848cfbf7ead6b63a6ca50f2794f89"
- ],
- "id": 275,
+ ],
+ "id": 275,
"legacy": true
- },
+ },
"8ab4e88556cbf864a5e9fd50171cd4ed8424e8f0801b99e236c810915950ae4b": {
"fingerprints": [
"894ce6ddb012cb3f736954668de63f436080e95f17b7a81bd924eb21bee9e440"
- ],
- "id": 370,
+ ],
+ "id": 370,
"legacy": true
- },
+ },
"8adb238554a0cbfc3a11fecc183e3cd2c23d25e7894cf2bbae58eb70a44e7cf3": {
"fingerprints": [
"9676f287356c89a12683d65234098cb77c4f1c18f23c0e541de0e196725b7ebe"
- ],
- "id": 234,
+ ],
+ "id": 234,
"legacy": true
- },
+ },
"8b49506a3461063ea8cc13ffce2b581de15a94b957092a93123467b89ed802e2": {
"fingerprints": [
"606223d9db80df3939601e74b7e828e2800cce4273f76f276aa62db0a8e3b6c1"
- ],
- "id": 375,
+ ],
+ "id": 375,
"legacy": true
- },
+ },
"8bb593a93be1d0e8a822bb887c547890c3e706aad2dab76254f97fb36b82fc26": {
"fingerprints": [
"cb3ccbb76031e5e0138f8dd39a23f9de47ffc35e43c1144cea27d46a5ab1cb5f"
- ],
+ ],
"id": 175
- },
+ },
"8bea76ebd6137aff9f1ecc3c08caf1dec47db91690d5754c4e9f15232c0a2e78": {
"fingerprints": [
"efb5157e9c66caa1dcc63c9fac0127cde83b7a426c4579b7b43a41ba46a56deb"
- ],
- "id": 418,
+ ],
+ "id": 418,
"legacy": true
- },
+ },
"8d417db2dd8bf5e3084d1e3f196d583849d81bdd4c00c70b9d39369e96b8c782": {
"fingerprints": [
"86a1ecba089c4a8d3bbe2734c612ba341d813e043cf9e8a862cd5c57a36bbe6b"
- ],
+ ],
"id": 495
- },
+ },
"8d767764b3cbda08929d072a22a561f4dcdd1bc57d3cbddc948c47d2b47f9122": {
"fingerprints": [
"fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd"
- ],
+ ],
"id": 17
- },
+ },
"8d775a4f93cd20c18306144f42b569fc2a897eaeaec3d3ea3cb025d1ad4d28e7": {
"fingerprints": [
"b8bbe523bfca3b11d50f73f7f10b3ec8ec958aa1dc86f66d9541907ff1a110ef"
- ],
- "id": 384,
+ ],
+ "id": 384,
"legacy": true
- },
+ },
"8e15d426cd04898f218be2e5fe3784f375094cc435dc61ad86c4a3c01511dbe1": {
"fingerprints": [
"7a77c6c61eeeb9aa65c4ea410d65d895b26a81123283009db104b48de80b2479"
- ],
- "id": 439,
+ ],
+ "id": 439,
"legacy": true
- },
+ },
"8e8046ec4cac015a507ce0d2d0154a4b40e8e42b3165cfa546571435112d17e5": {
"fingerprints": [
"d48d3d23eedb50a459e55197601c27774b9d7b18c94d5a059511a10250b93168"
- ],
+ ],
"id": 463
- },
+ },
"8e8b56f5918a25bd85dce76663fd94cc23690f10ea9586613171c6f8378890d5": {
"fingerprints": [
"894ebc0b23da2a50c0186b7f8f25ef1f6b2935af32a94584ef80aaf877a3a06e"
- ],
- "id": 239,
+ ],
+ "id": 239,
"legacy": true
- },
+ },
"8ed5b4c041b6b293c0e6413015066d318483c901ff69e86a521d0cb25569f3e8": {
"fingerprints": [
"8327bc8c9d69947b3de3c27511537267f59c21b9fa7b613fafbccd53b7024000"
- ],
- "id": 228,
+ ],
+ "id": 228,
"legacy": true
- },
+ },
"8fd112c3c8370f147d5ccd3a7d865eb8dd540783bac69fc60088e3743ff33378": {
"fingerprints": [
"85a0dd7dd720adb7ff05f83d542b209dc7ff4528f7d677b18389fea5e5c49e86"
- ],
+ ],
"id": 77
- },
+ },
"9091e31fe92546a5f5e1b3ed4071f4440b840c1e80dbfcba7a7ec6d5825f0b24": {
"fingerprints": [
"7707bb2be9f7ce057060b8308c3bc087b56529b3638eaf5b2a8049c8e15ed720"
- ],
- "id": 509,
+ ],
+ "id": 509,
"legacy": true
- },
+ },
"9119e2f413579777954991703eee23a04523a312b5c65f7f9374aa3100ebd8e7": {
"fingerprints": [
"ce7dd096c8fde2bf5c438edb574bd6454385334ee8ff106c0f93d5051be6bac3"
- ],
- "id": 336,
+ ],
+ "id": 336,
"legacy": true
- },
+ },
"913119f2cd3f48aca74ea6443ee50e0de1202d9c54f336dc9300affe97d4577c": {
"fingerprints": [
"eefca888db442cea1f03fac5de5b1af210ae03f5e1658ddb880c645e78624546"
- ],
- "id": 394,
+ ],
+ "id": 394,
"legacy": true
- },
+ },
"915086ccd4ed1ea749b427f6b0ceb4a0ef5b4a1cf18070539c0f2a758185a382": {
"fingerprints": [
"eac0220c5c9fecc5121d3720872d06707b5266be25d4ebb56ab804bbbf85fe03"
- ],
- "id": 224,
+ ],
+ "id": 224,
"legacy": true
- },
+ },
"927a1b8562280576d048c50321ada43d8703d2d9521a18c28b8c46cc6aae4efd": {
"fingerprints": [
"136335439334a7698016a0d324de72284e079d7b5220bb8fbd747816eebebaca"
- ],
+ ],
"id": 99
- },
+ },
"92c46879626ef2cc1ecea50c72fb5e385844095f21cbf3b283cb82e6b9fc6a58": {
"fingerprints": [
"bfd88fe1101c41ae3e801bf8be56350ee9bad1a6b9bd515edc5c6d5b8711ac44"
- ],
+ ],
"id": 111
- },
+ },
"9318226f8c83afe47f5f47c24f59ce12dba8c73b181bee6b2ea1f40a06bc1869": {
"fingerprints": [
"be6c4da2bbb9ba59b6f3939768374246c3c005993fa98f020d1dedbed48a81d5"
- ],
+ ],
"id": 49
- },
+ },
"931f1cf03a6f84c30ff3ad869be3c21a410191cc98ac0afc9d4e8b89bd869ddc": {
"fingerprints": [
- "b41d516a5351d42deea191fa6edf2a67dee2f36dc969012c76669e616b900ddf",
+ "b41d516a5351d42deea191fa6edf2a67dee2f36dc969012c76669e616b900ddf",
"77e04c9a751c73f23e2a1336112ec8d5153d382a152fed89d7532c3102771f3c"
- ],
- "id": 319,
+ ],
+ "id": 319,
"legacy": true
- },
+ },
"93657f8530c596bf909e50da7d8d9cbb36b824cc16ab589137e1438011bc9901": {
"fingerprints": [
"d68f7730b1ec2b3fb698c96d76540c9997415a25737dcd61d44960db77d2723d"
- ],
- "id": 282,
+ ],
+ "id": 282,
"legacy": true
- },
+ },
"9392ae2149924ade37e645dba1ff4bdddcda2b291b6097669d2afa5c7a372619": {
"fingerprints": [
"8da084fcf99ce07722f89b3205939806fa5cb811e1c813f6a108c7d336b3408e"
- ],
- "id": 76,
+ ],
+ "id": 76,
"legacy": true
- },
+ },
"93a9b3c96aae1cd661215d0c2a065da963d7160d1c694621bcb28c406df64db2": {
"fingerprints": [
"8a968aadd88b20519672a452a3d6e31eacb71c26bcaf65b32f9793bf2ffa54a9"
- ],
- "id": 246,
+ ],
+ "id": 246,
"legacy": true
- },
+ },
"94072ad3f58f70f93098e5a5f6c04c96c710bd849d83184919ae90eb890ae400": {
"fingerprints": [
"0a81ec5a929777f145904af38d5d509f66b5e2c58fcdb531058b0e17f3f0b41b"
- ],
+ ],
"id": 85
- },
+ },
"9415b25dba3bbd711439e2a9964b7a5256aff3b05c772c8a34e6c93566aba63a": {
"fingerprints": [
"958abbaeff760f4fbf66ff0f2c2708f4739b2c686127239a2c4ec87a68a984c8"
- ],
- "id": 478,
+ ],
+ "id": 478,
"legacy": true
- },
+ },
"942a6916a6e4ae527711c5450247a2a74fb8e156a8254ca66e739a11493bb445": {
"fingerprints": [
"687fa451382278fff0c8b11f8d43d576671c6eb2bceab413fb83d965d06d2ff2"
- ],
+ ],
"id": 34
- },
+ },
"94b94bbf9a0726f17b0973af6d41e9fb2e7099651bcbefddd97b0a5f2aabb0dd": {
"fingerprints": [
"632d80bb096d209677d1734e5b35ea9d3019b9c44f8fcb2640c879039ac94ee8"
- ],
- "id": 391,
+ ],
+ "id": 391,
"legacy": true
- },
+ },
"951ee046fa83316e6786c08c44f13b4ca2ead2d2644d63314391c0cc70887d0d": {
"fingerprints": [
"4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a"
- ],
+ ],
"id": 185
- },
+ },
"952c2039c0243eb515dd73d83fc3643184874feb0862a9837731ed9b4742e17a": {
"fingerprints": [
- "2530cc8e98321502bad96f9b1fba1b099e2d299e0f4548bb914f363bc0d4531f",
+ "2530cc8e98321502bad96f9b1fba1b099e2d299e0f4548bb914f363bc0d4531f",
"23804203ca45d8cde716b8c13bf3b448457fa06cc10250997fa01458317c41e5"
- ],
+ ],
"id": 44
- },
+ },
"9546ce00e03dd61aca58c5c8dbf38a111bad6406c91d7422e7f4c40a0cb58f18": {
"fingerprints": [
"49f74f824f2e059fe99c98af3219ec0d9a004d1b64dd2fd1452616318ab806c0"
- ],
- "id": 347,
+ ],
+ "id": 347,
"legacy": true
- },
+ },
"95735473bd67a3b95a8d5f90c5a21ace1e0d7947320674d4ab847972b91544d2": {
"fingerprints": [
"b32396746453442f353e616292bb20bbaa5d23b546450fdb9c54b8386167d529"
- ],
- "id": 259,
+ ],
+ "id": 259,
"legacy": true
- },
+ },
"96475b35acb1c9303a90bd1dbf57418f78e29af11c4de8c8cba2e5f9309e38d4": {
"fingerprints": [
"b04d708f1ae0456265dd1b66907a2691a28680b853e031df3df9083af71614d7"
- ],
- "id": 316,
+ ],
+ "id": 316,
"legacy": true
- },
+ },
"967b0cd93fcef7f27ce2c245767ae9b05a776b0649f9965b6290968469686872": {
"fingerprints": [
"2399561127a57125de8cefea610ddf2fa078b5c8067f4e828290bfb860e84b3c"
- ],
+ ],
"id": 50
- },
+ },
"9699225c5de52e56cdd32df2e96d1cfea5aa3ca0bb52cd8933c23b5c27443820": {
"fingerprints": [
"a0459b9f63b22559f5fa5d4c6db3f9f72ff19342033578f073bf1d1b46cbb912"
- ],
+ ],
"id": 139
- },
+ },
"972fbc6d55bfefb1abe3758ad7d67a349bbef80c06f1d85001dfb9101b9abc1b": {
"fingerprints": [
"997e15c5a4481a8598499753971ee2601d1047c3635aff21af4221a817fd2d96"
- ],
- "id": 425,
+ ],
+ "id": 425,
"legacy": true
- },
+ },
"9736ac3b25d16c45a45418a964578156480a8cc434541ddc5dd59233229868de": {
"fingerprints": [
"d8e0febc1db2e38d00940f37d27d41344d993e734b99d5656d9778d4d8143624"
- ],
- "id": 66,
+ ],
+ "id": 66,
"legacy": true
- },
+ },
"979f6f6a8a41c421cc673473d58a6379817be73d2e524698c80ffb66a149d089": {
"fingerprints": [
"cbd8ed38d4a2d677d453d70dd8890af4f6374cba6299943f1ab3a6936c6fd795"
- ],
- "id": 396,
+ ],
+ "id": 396,
"legacy": true
- },
+ },
"98008e2edbb72bad42da2fcb06ac1aaa0b2e6e0c72e8ca204fbafd1bb4879441": {
"fingerprints": [
"04acfb3b24793f300f67ef87e44dd72cb9b28b204f389a7cd5ae28785c7d42cd"
- ],
- "id": 238,
+ ],
+ "id": 238,
"legacy": true
- },
+ },
"980922eee07f86bc7f5e5e95d57db8bdae68e17a421c4e72a96a708a87920124": {
"fingerprints": [
"327a3d761abadea034eb998406275cb1a4776efdae2fdf6d0168ea1c4f5567d0"
- ],
- "id": 149,
+ ],
+ "id": 149,
"legacy": true
- },
+ },
"9847e5653e5e9e847516e5cb818606aa7544a19be67fd7366d506988e8d84347": {
"fingerprints": [
"71cca5391f9e794b04802530b363e121da8a3043bb26662fea4dca7fc951a4bd"
- ],
+ ],
"id": 486
- },
+ },
"98b3f10a025041910f197cf17ca0fcdfed75fb2c8c14a843e04d5656c9ebac1a": {
"fingerprints": [
"9a73929a500f1a0bf49dcb046e8039169696557345e9f813f10ff9380db22695"
- ],
- "id": 235,
+ ],
+ "id": 235,
"legacy": true
- },
+ },
"98ca29f313386721afbf5d14f1abcaa1dc63cc8d1fd7dc361f6b01368938f24b": {
"fingerprints": [
"7c7ed4240bb253bb35c376e12e00b027f1659df9d8267422a93eed75edc7adfb"
- ],
- "id": 223,
+ ],
+ "id": 223,
"legacy": true
- },
+ },
"991b5ed1b2fd364b9f634b624b305203f29908be318ef6399222d8a3ef7990e5": {
"fingerprints": [
"2602d21e81277a83f6048128f61d794a06f474e1f75e49740a817c2666f62211"
- ],
- "id": 299,
+ ],
+ "id": 299,
"legacy": true
- },
+ },
"99333c3a665cf0efbb7488b3807b8b65f87b5b29d6880f028edc28442eeae669": {
"fingerprints": [
"8b3fdb151af759c566143e07c950ede4f9e8c7cf808453d33bcb78e52a400af9"
- ],
- "id": 434,
+ ],
+ "id": 434,
"legacy": true
- },
+ },
"9962ab1699b0eb7c7e8a578bc79893042031c1158c633613199a90b9652a2a75": {
"fingerprints": [
"1501f89c5c4dcf36cf588a17c9fd7cfceb9ee01e8729be355e25de80eb6284b4"
- ],
- "id": 462,
+ ],
+ "id": 462,
"legacy": true
- },
+ },
"9adb99c93ab256ecca2b5350c75048a8584c12dfc248e3f60ea9354c34ebfcce": {
"fingerprints": [
"03458b6abeecc214953d97149af45391691de9f9cdcc2647863a3d67c95c243b"
- ],
- "id": 65,
+ ],
+ "id": 65,
"legacy": true
- },
+ },
"9b219d0fbff36a5fb32090571906bceea68617c833a3f61b81e962a8e64db8af": {
"fingerprints": [
"63343abfb89a6a03ebb57e9b3f5fa7be7c4f5c756f3017b3a8c488c3653e9179"
- ],
- "id": 217,
+ ],
+ "id": 217,
"legacy": true
- },
+ },
"9c6f6a123cbaa4ee34dbeceee24c97d738878cb423f3c2273903424f5d1f6dd5": {
"fingerprints": [
- "87c678bfb8b25f38f7e97b336956bbcf144bbacaa53647e61a2325bc1055316b",
+ "87c678bfb8b25f38f7e97b336956bbcf144bbacaa53647e61a2325bc1055316b",
"b4410b73e2e6eaca47fbc42f8fa4018af4381dc54cfaa84450461eed09454de9"
- ],
- "id": 135,
+ ],
+ "id": 135,
"legacy": true
- },
+ },
"9d98a1fb60538c4cc4857ff1a8c8034faf6fc592093f619994b2c813d250b864": {
"fingerprints": [
"7d8ce822222b90c0b14342c7a8145d1f24351f4d1a1fe0edfd312ee73fb00149"
- ],
- "id": 333,
+ ],
+ "id": 333,
"legacy": true
- },
+ },
"9dc38a9edcf82842b674da186b6d6215ab9e2ec6d72f57b08a892728c31431f3": {
"fingerprints": [
"ae92e90000541a9ebc101b70b6c33a62f5a53a55ba815e81d31abddf03507f5d"
- ],
- "id": 342,
+ ],
+ "id": 342,
"legacy": true
- },
+ },
"9dd55fc573f546cb6a3831d1112d8710a6f4f82dc87f5fae9d3a1a028dd36e4b": {
"fingerprints": [
"1c01c6f4dbb2fefc22558b2bca32563f49844acfc32b7be4b0ff599f9e8c7af7"
- ],
- "id": 11,
+ ],
+ "id": 11,
"legacy": true
- },
+ },
"9e5a34b08929bc0a581c8936aafd6ab7517bb15188b4f6fc02c45906f71595b0": {
"fingerprints": [
"5e3571f33f45a7df1537a68b5ffb9e036af9d2f5bc4c9717130dc43d7175aac7"
- ],
- "id": 354,
+ ],
+ "id": 354,
"legacy": true
- },
+ },
"9ea9fe274537f4f935642cde824fd77eb0e125cf118ab9b4c219f6cbf959b18d": {
"fingerprints": [
"8f1ecdaf29bcd56eddd6b5d56a07fcac2b74d4bcd179179144a0365c27dcf14b"
- ],
- "id": 431,
+ ],
+ "id": 431,
"legacy": true
- },
+ },
"9ecc51368e86e3460f66c295e4942dd53080f27b1e410aff2d1aa9d4e6bc7e7c": {
"fingerprints": [
"62f240278c564c4dd8bf7d9d4f6f366ea894d22f5f34d989a983acec2fffed50"
- ],
- "id": 144,
+ ],
+ "id": 144,
"legacy": true
- },
+ },
"9efd911d6ff46f1831111df3c54cd2611cae2398ff7386d1cb6b4f32e3337ed6": {
"fingerprints": [
"b2259996fff735ab35014ef63f3d413190079dd03a0962432635a8695f995305"
- ],
- "id": 407,
+ ],
+ "id": 407,
"legacy": true
- },
+ },
"a12574f4eb7395cc630a15fec8db1c7c828f66699d984c8c897eca44c808f55d": {
"fingerprints": [
"c499f6cecc5da4d61f14ed0405270c5249d0e79615b0da42659ed2d7ffef8a40"
- ],
- "id": 310,
+ ],
+ "id": 310,
"legacy": true
- },
+ },
"a1d45d06297341b1f3a735cfa38f283e6879fec06281a361e5f417cc70d29dc9": {
"fingerprints": [
"81c2568503eb3be5eec366653960e6d1be9448915e4605b793fbeb34ccb2470f"
- ],
- "id": 424,
+ ],
+ "id": 424,
"legacy": true
- },
+ },
"a25a7214c2b6c86142ada39dff2d73d865aa57843fdd2db77b3febf82683de2d": {
"fingerprints": [
"c0c05a8d8da55eaf27aa9b910b0a6ef0d8bbded346928db872e182c2073e9802"
- ],
- "id": 240,
+ ],
+ "id": 240,
"legacy": true
- },
+ },
"a2dc98ca7cbbee1822b25b267bd5ca502fa7b0cf4fff0703ee6a416703f3c7ea": {
"fingerprints": [
"c1b12f480020336e5b04f520bc19c2e2e10ab42c9d9235f05cbec33ffa4d4dea"
- ],
- "id": 334,
+ ],
+ "id": 334,
"legacy": true
- },
+ },
"a320f4d534d7be97c1ae8dd0499735bc895c323add2d388bfccf662c23d7f99a": {
"fingerprints": [
"3417bb06cc6007da1b961c920b8ab4ce3fad820e4aa30b9acbc4a74ebdcebc65"
- ],
+ ],
"id": 293
- },
+ },
"a378419d1ae9ebd27b22948044c684ba29bc084b98f965be73262f0f6aaa1c6f": {
"fingerprints": [
"49c8175a9815e08bef129a929de1bacad04e4db67a8c839293953e5031c81ca0"
- ],
- "id": 307,
+ ],
+ "id": 307,
"legacy": true
- },
+ },
"a4003bd5bdd894e01a8e01e06b62c7aa82f03de5253133570aad4fd0e7d81d3c": {
"fingerprints": [
"7f12cd5f7e5e290ec7d85179d5b72c20a5be7508ffdb5bf81ab9684a7fc9f667"
- ],
- "id": 106,
+ ],
+ "id": 106,
"legacy": true
- },
+ },
"a4b89bb70656ea498f2d9e00a497fdb9dcd20b81b8938e952bba2df9f65729c3": {
"fingerprints": [
"5a1b5d6bc65523b40a6deffa45b48e4288ae8dd86dd70a5b858d4a5affc94f71"
- ],
- "id": 371,
+ ],
+ "id": 371,
"legacy": true
- },
+ },
"a4cbf48516af3160ebc62acac6e7f258609ed0891535010c16692493a9fe1fbf": {
"fingerprints": [
"8ba1bd9c88efb3947e60ebe21137f81df7f09994cef27f097055018b8194c634"
- ],
- "id": 449,
+ ],
+ "id": 449,
"legacy": true
- },
+ },
"a51a2f3a050e838a5050696578dbbedaac1a107ee2d9d48fae505d18d0da5cf8": {
"fingerprints": [
"70b922bfda0e3f4a342e4ee22d579ae598d071cc5ec9c30f123680340388aea5"
- ],
- "id": 260,
+ ],
+ "id": 260,
"legacy": true
- },
+ },
"a5204dbb2754b97e3c8a104eacb374a6498a438773c75077f0063c2ceb25d2a2": {
"fingerprints": [
"e8b28d2a3d81f63b4e4467c2190a631fc062353b5f2d25851dda6b644ac78b3f"
- ],
- "id": 305,
+ ],
+ "id": 305,
"legacy": true
- },
+ },
"a59d2f09c8b168cd9afa3bc3eb4db0d7a43588d523287f2b83a822eb33709170": {
"fingerprints": [
"9cefb0cb7b74e642932532831e0dc8f4d68ad414261fc3f474b795e72a164e57"
- ],
- "id": 453,
+ ],
+ "id": 453,
"legacy": true
- },
+ },
"a6e11ff15ec326a5e3f18ad33a056694dc84c699766d028a5ad0efe1a8e53ac7": {
"fingerprints": [
"69fac9bd55fb0ac78d53bbee5cf1d597989fd0aaab20a25151bdf1733ee7d122"
- ],
- "id": 67,
+ ],
+ "id": 67,
"legacy": true
- },
+ },
"a6f1f9bf8a0a9ddc080fb49b1efc3d1a1c2c32dc0e136a5b00c97316f2a3dc11": {
"fingerprints": [
"5f0b62eab5e353ea6521651658fbb65359f443280a4afbd104d77d10f9f04c07"
- ],
- "id": 70,
+ ],
+ "id": 70,
"legacy": true
- },
+ },
"a74b4b6a2eb55b9864c04ecb16003ff5db5b51e42cf859f95e9d0a1dd4644096": {
"fingerprints": [
"e8c6aa6b5f58a8f2a6365cf98e65693563a38b7b2f32cf1be06f2d2229d4bf59"
- ],
- "id": 364,
+ ],
+ "id": 364,
"legacy": true
- },
+ },
"a76e2949cb87f6236b5f68c690747587d6448ea21cfead7950084ac015190b25": {
"fingerprints": [
"229ccc196d32c98421cc119e78486eebef603aecd525c6b88b47abb740692b96"
- ],
- "id": 455,
+ ],
+ "id": 455,
"legacy": true
- },
+ },
"a798d92f76c9c6755e5f55f86cd14aedcc0655371e27ccde0377745ce3c50013": {
"fingerprints": [
"058a40323ec8c46262c3052a5d357b91ac24d3da26351b3ff4407e99f7a4e9b4"
- ],
- "id": 356,
+ ],
+ "id": 356,
"legacy": true
- },
+ },
"a7a8f039894f5f675e92a778e008e424c9417dba06a1738b45b4e08d36fc2d7c": {
"fingerprints": [
- "75c9d4361cb96e993abd9620cf043be9407a4633f202f0f4c0e17851cc6089cd",
+ "75c9d4361cb96e993abd9620cf043be9407a4633f202f0f4c0e17851cc6089cd",
"f28630babf256e567b5821069fcf13148ab9a23e28fc0d70615aae6ed284f4c8"
- ],
- "id": 220,
+ ],
+ "id": 220,
"legacy": true
- },
+ },
"a7e39bd7df609bef3262bf3db4dc8f3814e0db5a7a52156a6d0c35b4dae8a6ad": {
"fingerprints": [
"b3c962d34019fb38ab9fe9c62399742ab26c43c2d18ce3f2b13c14321e52964b"
- ],
- "id": 301,
+ ],
+ "id": 301,
"legacy": true
- },
+ },
"a81293445db196a2030f9e455fe3c74a9a4f8317b02b01406027a8708174434c": {
"fingerprints": [
"7600295eefe85b9e1fd624db76062aaaae59818a54d2774cd4c0b2c01131e1b3"
- ],
+ ],
"id": 15
- },
+ },
"a86bdab8f480b6eb8942ab9170bdd0991971a7ad135dfbbcb7285f07a7d1e38a": {
"fingerprints": [
"93e65ec762f055dc718a332582c41a04430d72e3cb87e8b897b67516f0d1aa39"
- ],
- "id": 268,
+ ],
+ "id": 268,
"legacy": true
- },
+ },
"a87443b3d896eb257ccce99b95ada9bc81b9db4e3142aa9a99af0942cb0a4a3a": {
"fingerprints": [
"c1b48299aba5208fe9630ace55ca68a03eda5a519c8802a0d3a673be8f8e557d"
- ],
+ ],
"id": 120
- },
+ },
"a99972ce1f6c581d0097f62618062e53157b5276e1ec6651a3157057f057b339": {
"fingerprints": [
"a71272aeaaa3cfe8727f7fb39f0fb3d1e5426e9060b06ee6f13e9a3c5833cd43"
- ],
- "id": 4,
+ ],
+ "id": 4,
"legacy": true
- },
+ },
"aa1c2bedb1a508baad7fb3f5e02897b907c748dea9b7908904aadbd0497aab6a": {
"fingerprints": [
"cd808284cf746ff2fd6eb58aa1d59c4ad4b3ca56fdc6274a8926a7835f32313d"
- ],
- "id": 252,
+ ],
+ "id": 252,
"legacy": true
- },
+ },
"aa2630a7b617b04d0a294bab7a8caaa5016e6dbe604837a83a85719fab667eb5": {
"fingerprints": [
"5c58468d55f58e497e743982d2b50010b6d165374acf83a7d4a32db768c4408e"
- ],
+ ],
"id": 93
- },
+ },
"ab3876c3da5de0c9cf6736868ee5b88bf9ba1dff9c9d72d2fe5a8d2f78302166": {
"fingerprints": [
"cb6b05d9e8e57cd882b10b4db70de4bb1de42ba48a7bd0318b635bf6e7781a9d"
- ],
- "id": 265,
+ ],
+ "id": 265,
"legacy": true
- },
+ },
"ab39a4b025955691a40269f353fa1d5cb94eaf6c7ea9808484bbbb62fd9f68f3": {
"fingerprints": [
"2834991cf677466d22baac3b0055e5b911d9a9e55f5b85ba02dc566782c30e8a"
- ],
- "id": 262,
+ ],
+ "id": 262,
"legacy": true
- },
+ },
"ab5cdb3356397356d6e691973c25b8618b65d76a90486ea7a8a5c17767f4673a": {
"fingerprints": [
"309b4a87f6ca56c93169aaa99c6d988854d7892bd5437e2d07b29cbeda55d35d"
- ],
- "id": 160,
+ ],
+ "id": 160,
"legacy": true
- },
+ },
"ab98495276adf1ecaff28f35c53048781e5c1718dab9c8e67a504f4f6a51328f": {
"fingerprints": [
"b478b812250df878635c2aa7ec7d155eaa625ee82916e2cd294361886cd1fbd4"
- ],
+ ],
"id": 122
- },
+ },
"abcadfa35ff835cb3a0a0b86400622b80d5e80c765bc027f1b1c4e0a620f5e1c": {
"fingerprints": [
"2dde9d0c0a90e7b32b5abc01f41799d42e95a1e3c31c3b39373bb8141ea54471"
- ],
- "id": 451,
+ ],
+ "id": 451,
"legacy": true
- },
+ },
"ac447dedd0432aab9c070f2cca01b6dab09bef07cf4ca6aaa755634f857b315a": {
"fingerprints": [
"d1a0319098034e3aec729a0b5c3111229d9d26e3e623e8c5e6843fa06ee8e2e4"
- ],
- "id": 479,
+ ],
+ "id": 479,
"legacy": true
- },
+ },
"acf65e1d62cb58a2bafd6ffab40fb88699c47397cf5cb483d42d69cad34cd48b": {
"fingerprints": [
"e6b8f8766485f807ae7f8dac1670461f07c0a13eef3a1ff717538d7abad391b4"
- ],
- "id": 24,
+ ],
+ "id": 24,
"legacy": true
- },
+ },
"acf7ad98e6f065866e6f8cdf0ceb6f7481f6957b6dff823f6b94d79f01a61c39": {
"fingerprints": [
"ea7e312ece487b4c0aa63cc80ab9fcb33c720573f8945f7761745fc63863d39d"
- ],
- "id": 382,
+ ],
+ "id": 382,
"legacy": true
- },
+ },
"ad304c884a5d376bd195209a14c39e07f0d3f5cf893d802b053e1b926e55d774": {
"fingerprints": [
"488e134f30c5db56b76473e608086842bf21af8ab3cd7ac67ebdf125d531834e"
- ],
- "id": 390,
+ ],
+ "id": 390,
"legacy": true
- },
+ },
"ae2033b3082825a703e5a6adc3221a86854aa411db047dd5f53eb84aa14bdc01": {
"fingerprints": [
"c109e0d1b64000b01e894bdaa955e1ff91b6d084a838d90e044b9e3fcd2a8bfa"
- ],
- "id": 383,
+ ],
+ "id": 383,
"legacy": true
- },
+ },
"ae56d847973d199390e66e4024c9f87d87371e8ba8876af83d1e644f54664738": {
"fingerprints": [
"b7a7ec419454411761225ecf30d99585f851356077bf83274b11588fd05521b8"
- ],
- "id": 281,
+ ],
+ "id": 281,
"legacy": true
- },
+ },
"af110f6b5ae8b767eac6e0aa273f3816e7a40a644edacb4398146356e77509d6": {
"fingerprints": [
"46273285615d96e52da9fc2ed8c036f10af3d9f6280f8d288706c52b2011b4da"
- ],
- "id": 386,
+ ],
+ "id": 386,
"legacy": true
- },
+ },
"af207c61fd9c7cf92c2afe8154282dc3f2cbf32f75cd172814c52b03b7ebc258": {
"fingerprints": [
"cb627d18b58ad56dde331a30456bc65c601a4e9b18dedcea08e7daaa07815ff0"
- ],
- "id": 257,
+ ],
+ "id": 257,
"legacy": true
- },
+ },
"af6ab51b7bad1dedd533eb59332b6227d6557f20b4443216db735b92280c7a44": {
"fingerprints": [
"bcdd8df4276366d7ff4b688dc81500d8e98252c049c8ff1e8c82f2baec9d5c16"
- ],
- "id": 337,
+ ],
+ "id": 337,
"legacy": true
- },
+ },
"aff988906dde12955d9bebbf928fdcc31cce328d5b9384f21c8941ca26e20391": {
"fingerprints": [
"4348a0e9444c78cb265e058d5e8944b4d84f9662bd26db257f8934a443c70161"
- ],
+ ],
"id": 31
- },
+ },
"b03d87b056d08cc9d4e675ef19ca83ab53532168a8258598be72e6d85c7dd7c1": {
"fingerprints": [
"edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d"
- ],
+ ],
"id": 25
- },
+ },
"b083ff536f7f48a9081e294a0187b53e819771402d9d4810306de031024e5f46": {
"fingerprints": [
"5b1d9d24de0afea8b35ba04a1c3e25d0812cdf7c4625de0a89af9fe4bbd1bb15"
- ],
- "id": 412,
+ ],
+ "id": 412,
"legacy": true
- },
+ },
"b0f6f15b4817ebe6fe0b4bfcd7d3ace4c758b0ab6f8a9da2ed92e618239d9c98": {
"fingerprints": [
"03950fb49a531f3e1991942398dfa9e0ea32d7ba1cdd9bc85db57ed9400b434a"
- ],
- "id": 142,
+ ],
+ "id": 142,
"legacy": true
- },
+ },
"b1124142a5a1a5a28819c735340eff8c9e2f8168fee3ba187f253bc1a392d7e2": {
"fingerprints": [
- "a4b6b3996fc2f306b3fd8681bd63413d8c5009cc4fa329c2ccf0e2fa1b140305",
- "e7685634efacf69ace939a6b255b7b4fabef42935b50a265acb5cb6027e44e70",
+ "a4b6b3996fc2f306b3fd8681bd63413d8c5009cc4fa329c2ccf0e2fa1b140305",
+ "e7685634efacf69ace939a6b255b7b4fabef42935b50a265acb5cb6027e44e70",
"6872586219c349d85aaa4586a14451f2451ae3b6092dbb1effb0147c33bf0fd4"
- ],
- "id": 72,
+ ],
+ "id": 72,
"legacy": true
- },
+ },
"b16cb1ba529a39e2dfd53b3ff5a79f1904614d83e31304f0278bb40b38cf7824": {
"fingerprints": [
"0771920c8cb874d5c5a4dc0d6a51a2d495d38c4de2cd5b83d2a06faa051935f6"
- ],
- "id": 432,
+ ],
+ "id": 432,
"legacy": true
- },
+ },
"b1be0f7a5e638b559d8b521fef6017ad8fa16eb0548e846b2ac4b41d89b41f14": {
"fingerprints": [
"da98f640194df128c7888bc8e3479a9dd31795ff087c649052fbafb02eaef184"
- ],
- "id": 211,
+ ],
+ "id": 211,
"legacy": true
- },
+ },
"b213a9cbaa9a8831ac0b3aa80e9d15856cd43a7cc2e0bac5fcb84a24751a8a78": {
"fingerprints": [
"54ae8a683fe2d78ff1ef0e0b3f58425092953ba08c67fe4a95595d1cebcdcb30"
- ],
- "id": 450,
+ ],
+ "id": 450,
"legacy": true
- },
+ },
"b21d2a743318712ba16f39919d961a4bafba3bca9a43a75b1fcfe22c5d70caba": {
"fingerprints": [
"88497f01602f3154246ae28c4d5aef10f1d87ebb76626f4ae0b7f95ba7968799"
- ],
+ ],
"id": 107
- },
+ },
"b2def5362ad3facd04bd29047a43844f767034ea4892f80e56bee690243e2502": {
"fingerprints": [
"ebf3c02a8789b1fb7d511995d663b72906d913ce0d5e10568a8a77e2586167e7"
- ],
- "id": 48,
+ ],
+ "id": 48,
"legacy": true
- },
+ },
"b2f7298b52bf2c3cac4ddfe72de4d682ac58957595982f2b62301af597c699c5": {
"fingerprints": [
- "ecdd47b5acbfa328211e1bff54adeac95e6991e3c1d50e27b527e903208040a1",
+ "ecdd47b5acbfa328211e1bff54adeac95e6991e3c1d50e27b527e903208040a1",
"c741f70f4b2a8d88bf2e71c14122ef53ef10eba0cfa5e64cfa20f418853073e0"
- ],
- "id": 507,
+ ],
+ "id": 507,
"legacy": true
- },
+ },
"b3182e289ae34ddf2be643ab79c244301605fa0f1eaae6d10fb929600af84df0": {
"fingerprints": [
"f00355eef101c7df4e46cce6417dffce3db82dbb1369c3b439c4e33bee445c42"
- ],
- "id": 355,
+ ],
+ "id": 355,
"legacy": true
- },
+ },
"b4296d5fe60e52f3f0ff99da75af5e7e62599f99ebe0fa413f66e6b425c3d09f": {
"fingerprints": [
"9df0ec44f55b36d79d4b53c208bef8cb63d78dcc8fcafde1662312f212204a37"
- ],
- "id": 348,
+ ],
+ "id": 348,
"legacy": true
- },
+ },
"b489ccb224b9a6b81dd274ceaf5209c252998c9a76af48e4f4c50a0728461825": {
"fingerprints": [
"1e51942b84fd467bf77d1c89da241c04254dc8f3ef4c22451fe7a89978bdcd4f"
- ],
- "id": 465,
+ ],
+ "id": 465,
"legacy": true
- },
+ },
"b4a039eafc4310ba9bde093edb8f9d9d0b3d4c7c004d48288c35dbcc19467d18": {
"fingerprints": [
"af8b6762a1e528228161a95d5c559ee266278f75d79e830189a503506abd6b4c"
- ],
- "id": 82,
+ ],
+ "id": 82,
"legacy": true
- },
+ },
"b5ec35baab538884cfa8dd97376b102f03e53b482c64100c250722ae9b042cbc": {
"fingerprints": [
"fc50b26bdc4a8fdf1344cc80157ae13ac671e2706facfc0605fe34e249eb72d6"
- ],
- "id": 430,
+ ],
+ "id": 430,
"legacy": true
- },
+ },
"b638cff05c8a832758edc3028af9e2d55514568bc6bb34ab36d140b97ac6b12d": {
"fingerprints": [
"0f4e9cdd264b025550d170806340214fe94434c9b02f697ec710fc5feafb5e38"
- ],
- "id": 68,
+ ],
+ "id": 68,
"legacy": true
- },
+ },
"b656a4343831a2acf11eeabc3a44b97025fffba2b910da8714cf827d81be10c9": {
"fingerprints": [
- "796b93d0a3ba22e191f2495f150a5f9bfee2ce1503da217b74b8a984685110f1",
+ "796b93d0a3ba22e191f2495f150a5f9bfee2ce1503da217b74b8a984685110f1",
"1a2512cda6744abea11432a2fdc9f8c088db5a98c89e13352574cde4d9e80cdd"
- ],
- "id": 408,
+ ],
+ "id": 408,
"legacy": true
- },
+ },
"b738290cc08547e79ac67f831ebb33547c4e7db4514e2d2988c23c441340eb41": {
"fingerprints": [
"54455f7129c20b1447c418f997168f24c58fc5023bf5da5be2eb6e1dd8902ed5"
- ],
+ ],
"id": 207
- },
+ },
"b7408b4d2be0238ba37004dd34e276c6019bd2f24c9db7d4980f5f6c359a4bcc": {
"fingerprints": [
"125609aa301da0a249b97a8239cb6a34216f44dcac9f3954b14292f2e8c8608f"
- ],
+ ],
"id": 496
- },
+ },
"b89bcbb8acd474c1bea7dad65037f48dcecc9dfaa0612c3c2445956419df32fe": {
"fingerprints": [
"04f1bec36951bc1454a904ce32890c5da3cde1356b7900f6e62dfa2041ebad51"
- ],
- "id": 475,
+ ],
+ "id": 475,
"legacy": true
- },
+ },
"b9182f52af0dd18e3a99ebbae7883d4e4cc7fe2f81fad0d36ca661efc32d0a92": {
"fingerprints": [
"4bdb7418bdf7ffe33ba0884afa7c0c61fd85a153972f65f7d01cb3ec7eb4073c"
- ],
- "id": 312,
+ ],
+ "id": 312,
"legacy": true
- },
+ },
"b94c198300cec5c057ad0727b70bbe91816992256439a7b32f4598119dda9c97": {
"fingerprints": [
"31ad6648f8104138c738f39ea4320133393e3a18cc02296ef97c2ac9ef6731d0"
- ],
+ ],
"id": 178
- },
+ },
"bb4128ec9620f2d2a49ce8e2c4e257aebad93a0f11c56b5fa4b00e23759fa39d": {
"fingerprints": [
"bf0feefb9e3a581ad5f9e9db7589985743d261085c4d314f6f5d7259aa421612"
- ],
+ ],
"id": 105
- },
+ },
"bb52086d0639e8db332775ac8f4e8435d92ceb00f4e24f28fc0eabe240772e80": {
"fingerprints": [
"44b545aa8a25e65a73ca15dc27fc36d24c1cb9953a066539b11582dc487b4833"
- ],
+ ],
"id": 201
- },
+ },
"bcce8e2bbaee71b6358ddd641cbbfc25de454003006271f75b50b726d67c3bc9": {
"fingerprints": [
"fabcf5197cdd7f458ac33832d3284021db2425fd6bea7a2e69b7486e8f51f9cc"
- ],
- "id": 243,
+ ],
+ "id": 243,
"legacy": true
- },
+ },
"bcfb44aab9ad021015706b4121ea761c81c9e88967590f6f94ae744dc88b78fb": {
"fingerprints": [
"5edb7ac43b82a06a8761e8d7be4979ebf2611f7dd79bf91c1c6b566a219ed766"
- ],
+ ],
"id": 23
- },
+ },
"bd153ed7b0434f6886b17bce8bbe84ed340c7132d702a8f4fa318f756ecbd6f3": {
"fingerprints": [
"d7a7a0fb5d7e2731d771e9484ebcdef71d5f0c3e0a2948782bc83ee0ea699ef4"
- ],
+ ],
"id": 71
- },
+ },
"be3280c6863c770a33c9040bd97d5540b216d1d91db8b088ceac1197dae1d660": {
"fingerprints": [
"5ab4fcdb180b5b6af0d262a2375a2c77d25602015d96648756611e2e78c53ad3"
- ],
- "id": 501,
+ ],
+ "id": 501,
"legacy": true
- },
+ },
"be3db7b79bfe579dcf9b07ca4cad75aff16975568e5b45cfcae4d61fb63175a8": {
"fingerprints": [
"a45ede3bbbf09c8ae15c72efc07268d693a21c996fd51e67ca079460fd6d8873"
- ],
+ ],
"id": 57
- },
+ },
"bedd8bc97ea86497195a078a999a237a060aebae07bc0a0b9b778982ba5f62f4": {
"fingerprints": [
"fe7114d07a147759891ff37b4f53eb43568296bc3bf89bc12cafb186985ef28d"
- ],
- "id": 372,
+ ],
+ "id": 372,
"legacy": true
- },
+ },
"bf01c35f337113f167b4a50186765e7b1e3890af586328f185cd0d6bae813521": {
"fingerprints": [
"f4336bc2ac75950beccf1c1f2f9da6dddafd1f41161ca71f59c76889bd474033"
- ],
- "id": 415,
+ ],
+ "id": 415,
"legacy": true
- },
+ },
"bfe82909872e4434f115c51a56168019594d0e03dca363d9f3b4839d0babcde5": {
"fingerprints": [
"68ad50909b04363c605ef13581a939ff2c96372e3f12325b0a6861e1d59f6603"
- ],
- "id": 404,
+ ],
+ "id": 404,
"legacy": true
- },
+ },
"c06c872fc2d0ac08d78d421981fbda4e35500d0946f79894edd21ac29dec0719": {
"fingerprints": [
"2605875afcc176b2d66dd66a995d7f8d5ebb86ce120d0e7e9e7c6ef294a27d4c"
- ],
- "id": 232,
+ ],
+ "id": 232,
"legacy": true
- },
+ },
"c07135f6b452398264a4776dbd0a6a307c60a36f967bd26321dcb817b5c0c481": {
"fingerprints": [
- "44640a0a0e4d000fbd574d2b8a07bdb4d1dfed3b45baaba76f785778c7011961",
+ "44640a0a0e4d000fbd574d2b8a07bdb4d1dfed3b45baaba76f785778c7011961",
"61dc0c0391694c655200c1505ebcc9e4e216bc31a5c51a3611283423c1d89e37"
- ],
- "id": 167,
+ ],
+ "id": 167,
"legacy": true
- },
+ },
"c1ad1b1898ec395048df070bfa217e25c913bed8ca6b73de085528846a0103c1": {
"fingerprints": [
"b0bfd52bb0d7d9bd92bf5d4dc13da255c02c542f378365ea893911f55e55f23c"
- ],
+ ],
"id": 124
- },
+ },
"c372f6d18ebee5aa23d9e919f3e6be98488ec01607df3162fc192e4b1346afb3": {
"fingerprints": [
"ac7f7862e685c7a7d9826a58ea32d183d4893fcc8f8fd6d900c9769a987e77f0"
- ],
- "id": 505,
+ ],
+ "id": 505,
"legacy": true
- },
+ },
"c3bc6100f57e320d8659f22584677e56860aab1014e0084a496fff8c880b6ba3": {
"fingerprints": [
"8fdd298d1c93b22bfc42aab1c3a15f0d01832ca0a1aef28d5680f06e6c7fd4ef"
- ],
- "id": 26,
+ ],
+ "id": 26,
"legacy": true
- },
+ },
"c42533d3af4998f5ad9f072521d85d472fa7ffdcfc588c8247b337dc77109389": {
"fingerprints": [
"12d480c1a3c664781b99d9df0e9faf3f1cacee1b3c30c3123a337a4a454ffed2"
- ],
- "id": 373,
+ ],
+ "id": 373,
"legacy": true
- },
+ },
"c444b5b66ce5d71e1b5e40f27385c95cbfd24a05b56f70cac0992f0f50c3379c": {
"fingerprints": [
"59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b"
- ],
+ ],
"id": 108
- },
+ },
"c53dad9e53ae27ed95f0ea7a9203f7bf56eff0f8e1ce960cb4761b968342e34e": {
"fingerprints": [
"5533a0401f612c688ebce5bf53f2ec14a734eb178bfae00e50e85dae6723078a"
- ],
- "id": 443,
+ ],
+ "id": 443,
"legacy": true
- },
+ },
"c5697be91cd655539b560758e91b6e085461623741034c485e47d7e9d25a03c0": {
"fingerprints": [
"06db3af2db7baee00c03b9578288bbde541d906eb0069327413295ffb486008e"
- ],
- "id": 213,
+ ],
+ "id": 213,
"legacy": true
- },
+ },
"c5750bf85f459fb70e2b6cd1898d375e92d7938e47a6e034cce0c12d30372ccd": {
"fingerprints": [
"3fd4be8baad2f26e1bde06c7584bb720dd1a972d111f5a4999bc44b08fb4960d"
- ],
- "id": 502,
+ ],
+ "id": 502,
"legacy": true
- },
+ },
"c5ea259c629803508649f02177f63c32fa85cc4ad5c35f0d541c45df10a49fd7": {
"fingerprints": [
"3cfc3c14d1f684ff17e38c43ca440c00b967ec933e8bfe064ca1d72c90f2adb0"
- ],
- "id": 286,
+ ],
+ "id": 286,
"legacy": true
- },
+ },
"c63d68c648a18b77641c427a669d61c9768a55f4fcd0322eac96c57700299cf1": {
"fingerprints": [
- "0753e940378c1bd5e3836e395daea5cb839e5046f1bd0eae1951cf10fec7c965",
+ "0753e940378c1bd5e3836e395daea5cb839e5046f1bd0eae1951cf10fec7c965",
"9111240747e1f652f66d1f712a11f698963b491702e312f7513da3d0fc1e5a28"
- ],
+ ],
"id": 290
- },
+ },
"c73afc2eba770d0cbc1ee41f252b52e8a93d12b72dccec031d8d839cbf818a79": {
"fingerprints": [
"8095210805db4bbc355e4428d8fd6ec2cde3ab5fb97a9942988eb8f4dcd06016"
- ],
- "id": 3,
+ ],
+ "id": 3,
"legacy": true
- },
+ },
"c746127c5f6b529ce9e2948efd9465444089319acf03f34d0bf37eadc77db22f": {
"fingerprints": [
"6fdb3f76c8b801a75338d8a50a7c02879f6198b57e594d318d3832900fedcd79"
- ],
- "id": 43,
+ ],
+ "id": 43,
"legacy": true
- },
+ },
"c784333d20bcd742b9fdc3236f4e509b8937070e73067e254dd3bf9c45bf4dde": {
"fingerprints": [
"e793c9b02fd8aa13e21c31228accb08119643b749c898964b1746d46c3d4cbd2"
- ],
+ ],
"id": 182
- },
+ },
"c7f43b4cf5b71568294f822b53762605f6ddd15cadece739e9e2c3cba61e9d67": {
"fingerprints": [
"70a73f7f376b60074248904534b11482d5bf0e698ecc498df52577ebf2e93b9a"
- ],
+ ],
"id": 134
- },
+ },
"c7f584236d86395e8f6f82c010886a2c56e071a6a1c3ed2876b8a3a72c5efbb5": {
"fingerprints": [
"6468bf8cf3cf688ebb2a6841bd70e97b5229b49df8690d7b74193e9ce3886141"
- ],
- "id": 397,
+ ],
+ "id": 397,
"legacy": true
- },
+ },
"c90d009c47eeb9f2a29ae848f5d930f2b41ef5edbc5c5695c1414345c1dd67b4": {
"fingerprints": [
"37d8dc8af7867845da3344a6b1bade448d8a80e47b5579f96bf631768f9f30f6"
- ],
- "id": 358,
+ ],
+ "id": 358,
"legacy": true
- },
+ },
"c942262c0c7c0a95bb152b71c42556ddbe9a04fa8378373550d2b7ce27d952a3": {
"fingerprints": [
"2e44102ab58cb85419451c8e19d9acf3662cafbc614b6a53960a30f7d0e2eb41"
- ],
- "id": 520,
+ ],
+ "id": 520,
"legacy": true
- },
+ },
"c954c2c0b189825bb65ddb3ddca080b7dbcfe6b17cade1022bada818336677d0": {
"fingerprints": [
"e873d4082a7b4632934f48a5cc1ee500932f661e56c3467c5c84d31447476b0c"
- ],
- "id": 308,
+ ],
+ "id": 308,
"legacy": true
- },
+ },
"c9905b0ee01202293ca026e64f08412442c5504c06e44ca7e9726d61f20e4089": {
"fingerprints": [
"df545bf919a2439c36983b54cdfc903dfa4f37d3996d8d84b4c31eec6f3c163e"
- ],
- "id": 402,
+ ],
+ "id": 402,
"legacy": true
- },
+ },
"cb6e91711ad6d55c8906f379cb071fb5c47933654a7415612eee6629f26fbcd7": {
"fingerprints": [
"f09b122c7114f4a09bd4ea4f4a99d558b46e4c25cd81140d29c05613914c3841"
- ],
- "id": 41,
+ ],
+ "id": 41,
"legacy": true
- },
+ },
"cbad7b1d384849df0946b7ee8e7f5f7ce3aed876fda7bc9d30d8b16f29ff2c53": {
"fingerprints": [
"657cfe2fa73faa38462571f332a2363a46fce7020951710702cdfbb6eeda3305"
- ],
- "id": 492,
+ ],
+ "id": 492,
"legacy": true
- },
+ },
"cbe5ac15d88b5cac3f81e6df3bfb57bea60958813a47b77f3c5cb6b98191bdb5": {
"fingerprints": [
"ecc3e9c3407503bee091aa952f41348ff88baa863b2264befac807901574e939"
- ],
- "id": 8,
+ ],
+ "id": 8,
"legacy": true
- },
+ },
"cc4997863c8c48a4cb5c3e6537dc06028d8638be49f5f8a2ba56f2f2c8a8c779": {
"fingerprints": [
"a1f05ccb80c2d710ec7d479abdcbb879e58d7edb7149fe78a87884e3d0bad0f9"
- ],
- "id": 267,
+ ],
+ "id": 267,
"legacy": true
- },
+ },
"ce24eb0626defd8168c96a7701f09301600fe5dd0dbce58e9c97b830af02ef28": {
"fingerprints": [
"41c923866ab4cad6b7ad578081582e020797a6cbdf4fff78ce8396b38937d7f5"
- ],
+ ],
"id": 32
- },
+ },
"ceb19411c65052c757f941eb826c96941e4d08d096c7db7e7ea3c4f8c13f1a13": {
"fingerprints": [
"bfff8fd04433487d6a8aa60c1a29767a9fc2bbb05e420f713a13b992891d3893"
- ],
+ ],
"id": 288
- },
+ },
"ced43902ab5fb57b442322dc0e172a4fb55f7178b808f94e780a6fd6cc6bd818": {
"fingerprints": [
"063e4afac491dfd332f3089b8542e94617d893d7fe944e10a7937ee29d9693c0"
- ],
+ ],
"id": 19
- },
+ },
"cf0b474ace8469faba402f02eebdf9e1700d9cbe8be4e4348407b69dd3196e94": {
"fingerprints": [
"507941c74460a0b47086220d4e9932572ab5d1b5bbcb8980ab1cb17651a844d2"
- ],
- "id": 148,
+ ],
+ "id": 148,
"legacy": true
- },
+ },
"d0773adb60043e954309d9714fe053eaad8aa5b9586edba468e276df82065adf": {
"fingerprints": [
"978cd966f2faa07ba7aa9500d9c02e9d77f2cdada6ad6ba74af4b91c66593c50"
- ],
- "id": 132,
+ ],
+ "id": 132,
"legacy": true
- },
+ },
"d1c45377ebdcd618cd1651dc2e02c21d751e5aa9fcd1b3431ff6ecf6a31348fa": {
"fingerprints": [
"85666a562ee0be5ce925c1d8890a6f76a87ec16d4d7d5f29ea7419cf20123b69"
- ],
+ ],
"id": 292
- },
+ },
"d1de2ae61c8df2fa623966163d4c73d460bfc428e57585be6bfeb9a56323d1b6": {
"fingerprints": [
"b6191a50d0c3977f7da99bcdaac86a227daeb9679ec70ba3b0c9d92271c170d3"
- ],
+ ],
"id": 46
- },
+ },
"d1ecacca44012c3e1e6d1b39dd2968fc7fd3127aaa57ab5182a3beabccd7a3a9": {
"fingerprints": [
"f1b13f5c9a326403b0f31bbe7699cd17c7d1c0b981586dd1a7b219c52508fe99"
- ],
- "id": 367,
+ ],
+ "id": 367,
"legacy": true
- },
+ },
"d2a5f32f0e01b910ef4e3b46bf84e5af5fb5689e7d1507e929e368ac88c6cc76": {
"fingerprints": [
"7908b40314c138100b518d0735807ffbfcf8518a0095337105ba386b153dd927"
- ],
+ ],
"id": 103
- },
+ },
"d2f91a04e3a61d4ead7848c8d43b5e1152d885727489bc65738b67c0a22785a7": {
"fingerprints": [
"9d190b2e314566685be8a889e27aa8c7d7ae1d8aaddba3c1ecf9d24863cd34b9"
- ],
- "id": 255,
+ ],
+ "id": 255,
"legacy": true
- },
+ },
"d3980aadd21638c70d74a4bb1f8ab5e11724e62ed408f9fa8d3d4d916900286b": {
"fingerprints": [
"24a55c2ab051442d0617766541239a4ad032d7c55175aa34ffde2fbc4f5c5294"
- ],
- "id": 472,
+ ],
+ "id": 472,
"legacy": true
- },
+ },
"d49c6f289cd056519492480f192f00a6fc7c1862dab2e7b5d8e05f6678fae141": {
"fingerprints": [
"a1a86d04121eb87f027c66f53303c28e5739f943fc84b38ad6af009035dd9457"
- ],
- "id": 491,
+ ],
+ "id": 491,
"legacy": true
- },
+ },
"d4af6c0a482310bd7c54bb7ab121916f86c0c07cd52fcac32d3844c26005115f": {
"fingerprints": [
"614fd18da1490560cdad1196e2492ab7062eab1a67b3a30f1d0585a7d6ba6824"
- ],
- "id": 326,
+ ],
+ "id": 326,
"legacy": true
- },
+ },
"d5597ea3453a6261f5d42eb9caf5bdb4e38a1edebdb5bea6d7c0bc1a8abecab2": {
"fingerprints": [
"0e88eb6ea256e19ef8d3abd61a24d38dbad632816dd957294427e4724d81a386"
- ],
- "id": 405,
+ ],
+ "id": 405,
"legacy": true
- },
+ },
"d646f3ea2d7003fcaa77ad219136c78e024a6f2e2307dfb8cfa97a171373ecdf": {
"fingerprints": [
"74cb3a4ea791afb0a2d1a0b13301b3bee0e50ad5c79a1a6f2c663e6f4ee7a484"
- ],
- "id": 374,
+ ],
+ "id": 374,
"legacy": true
- },
+ },
"d6a18443d348db994f934ccd8e635d833a27ac1e56f8afaf7c97cb4f43eab68b": {
"fingerprints": [
"4b22d5a6aec99f3cdb79aa5ec06838479cd5ecba7164f7f22dc1d65f63d85708"
- ],
- "id": 172,
+ ],
+ "id": 172,
"legacy": true
- },
+ },
"d8fb33e385c9c2da729a84706ba927dcbb79273e122ffd9673363b70b7f36cbb": {
"fingerprints": [
"8c4edfd04348f322969e7e29a4cd4dca004655061c16e1b076422ef342ad630e"
- ],
- "id": 153,
+ ],
+ "id": 153,
"legacy": true
- },
+ },
"d92405c46d912a563e43287f56cd410a1cdf6367c57c9ea7c5cae039dcbcce50": {
"fingerprints": [
"8da75f1327217c88060fd2529eff2816e50b0c74541ea4ea3dfcee66a71efe09"
- ],
- "id": 365,
+ ],
+ "id": 365,
"legacy": true
- },
+ },
"d9c473cee25f94d1bc6062bd62911477276f064b827a944e064f85d0912d2c5e": {
"fingerprints": [
"248302a977f40f7dd6a2b770586adfaac3eb1e85fd1a102dbd7863c72b8f8ef2"
- ],
- "id": 253,
+ ],
+ "id": 253,
"legacy": true
- },
+ },
"da800b80b2a87d399e66fa19d72fdf49983b47d8cf322c7c79503a0c7e28feaf": {
"fingerprints": [
"3a43e220fe7f3ea9653d1e21742eac2b75c20fd8980305bc502caf8c2d9b41a1"
- ],
- "id": 230,
+ ],
+ "id": 230,
"legacy": true
- },
+ },
"da8796be34cc81abee7304c4d2bca0ac984c5b24b61b13e2285e1d27ad8cebf0": {
"fingerprints": [
- "7b1f8d8eff5d7349fedb7eae89c29aacc41704f1503ae3c8c2eba10225d0f568",
+ "7b1f8d8eff5d7349fedb7eae89c29aacc41704f1503ae3c8c2eba10225d0f568",
"ae2fec829118a2455ad6a415e71823eb9b7b6e3578a51ac8a51446eadbb0979c"
- ],
- "id": 218,
+ ],
+ "id": 218,
"legacy": true
- },
+ },
"db15c0062b520f318a19dacfecd64f9e7a3fbe609fd586796f20ae028e8e3058": {
"fingerprints": [
"d6f034bd94aa233f0297eca4245b283973e447aa590f310c77f48fdf83112254"
- ],
- "id": 168,
+ ],
+ "id": 168,
"legacy": true
- },
+ },
"dbc1e3a15238a0483bcdb8fdec616e03e705a48e2a501157cadf3b9c7311c5e5": {
"fingerprints": [
"eaa962c4fa4a6bafebe415196d351ccd888d4f53f3fa8ae6d7c466a94e6042bb"
- ],
+ ],
"id": 87
- },
+ },
"dc053d027fc186e7c41cd193af30fc09794eb9f3d9e6736dce041440d876a801": {
"fingerprints": [
"7d2bf3489ebc9ad3448b8b0827715a3cbfe3d523e3b56a9b5fc1d2a2da2f20fe"
- ],
- "id": 399,
+ ],
+ "id": 399,
"legacy": true
- },
+ },
"dd5ed1c090f9f448061baa94a6bb11017544e9eefaa20cc714ce6c633f5dc629": {
"fingerprints": [
"5cc3d78e4e1d5e45547a04e6873e64f90cf9536d1ccc2ef800f355c4c5fd70fd"
- ],
+ ],
"id": 189
- },
+ },
"dd9a6bfbf44e17a27f368ac8e067b307396269a747f92e8f2acf2b451e3ffc72": {
"fingerprints": [
"41d4f6dcf130b9843a3b9a9530953e925fdd84e8b7aeb8f205b8fae39352617d"
- ],
- "id": 236,
+ ],
+ "id": 236,
"legacy": true
- },
+ },
"df530bac9fcd914c252c2fbdceddc6183d4ae8c680ad65f03e204861dd7b1c73": {
"fingerprints": [
"885de64c340e3ea70658f01e1145f957fcda27aabeea1ab9faa9fdb0102d4077"
- ],
- "id": 313,
+ ],
+ "id": 313,
"legacy": true
- },
+ },
"e0c780c629903e126f1d919570dce7c496f85f33aae66b9a3147ee75f8d1620a": {
"fingerprints": [
"416b1f9e84e74c1d19b23d8d7191c6ad81246e641601f599132729f507beb3cc"
- ],
- "id": 493,
+ ],
+ "id": 493,
"legacy": true
- },
+ },
"e0ef882da48ab0b7efb0d9ba15b2717dd08f043c25ac09b56b8b57fceeb5a35d": {
"fingerprints": [
"e6e4a951ecbf7d8edc01bc873f7b6fd35868bdb10ed786f3a1b1ee16d8cec3e9"
- ],
- "id": 369,
+ ],
+ "id": 369,
"legacy": true
- },
+ },
"e156445fa20c32ad00937b27d096b8963bcc863950333a877e68fa69707a03af": {
"fingerprints": [
"54b4fc43d44aa4ca9fc03ca7e9949fbae267a064d02da21852412a381b5d1537"
- ],
- "id": 445,
+ ],
+ "id": 445,
"legacy": true
- },
+ },
"e26613a578e158c2a44e4fec41e6f37a0a991fe1a5fe736c303f4420a90fb50a": {
"fingerprints": [
"f1f3cc207a6d47947b8cb9c30422229de0d71fb867e0b9a3eda08e0e1736bc28"
- ],
- "id": 331,
+ ],
+ "id": 331,
"legacy": true
- },
+ },
"e2d891efb738669105d530de5ed72e2b2ac3f4a67078b5349b3fdaca496f5eb8": {
"fingerprints": [
"3f06e55681d496f5be169eb5389f9f2b8ff61e1708df6881724849cd5d27cb69"
- ],
- "id": 9,
+ ],
+ "id": 9,
"legacy": true
- },
+ },
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855": {
"fingerprints": [
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
- ],
- "id": 488,
+ ],
+ "id": 488,
"legacy": true
- },
+ },
"e42f24bd4d37f4aa2e56b979d83d1e65219fe0e9e3a382a1b3cb66c93955de75": {
"fingerprints": [
- "c766a9bef2d4071c863a31aa4920e813b2d198608cb7b7cfe21143b836df09ea",
+ "c766a9bef2d4071c863a31aa4920e813b2d198608cb7b7cfe21143b836df09ea",
"e17890ee09a3fbf4f48b9c414a17d637b7a50647e9bc752322727fcc1742a911"
- ],
- "id": 29,
+ ],
+ "id": 29,
"legacy": true
- },
+ },
"e43dea894f42cecf4a1dd60ed1dab82f7c0a308ae32a3d49a7aa1a3e957015f7": {
"fingerprints": [
"2dc70e588d340de5966ae32f6fc796bdb5de6d7c25cd249a4be64e9df9036323"
- ],
- "id": 212,
+ ],
+ "id": 212,
"legacy": true
- },
+ },
"e5ca37bc7b6c361979bc6b123ca9a1db019046d7ff5f57dfb854b19d10b0682f": {
"fingerprints": [
"f356bea244b7a91eb35d53ca9ad7864ace018e2d35d5f8f96ddf68a6f41aa474"
- ],
+ ],
"id": 112
- },
+ },
"e7ca91bbfbb18788057b3a8070446ea5291160194102f7dcc3b9848c63cb9cd5": {
"fingerprints": [
"1793927a0614549789adce2f8f34f7f0b66d0f3ae3a3b84d21ec15dbba4fadc7"
- ],
+ ],
"id": 89
- },
+ },
"e85fbf8b9a2ea4909dce0fb5b2fe5f5877343d27d58a410a8b237ab675a2ddaf": {
"fingerprints": [
"a798a1c70e9b6d50eaa5724a26fac7991848edc61bf48d79816bcafb66972128"
- ],
- "id": 345,
+ ],
+ "id": 345,
"legacy": true
- },
+ },
"ea2f9e087eaebbdfc0569eca18364e5236254624854f92e37871b5ee36744883": {
"fingerprints": [
"4e7480ad702a379dc589adb4faa625e6a5993f87ef2375d5437ffe3b79be4e96"
- ],
- "id": 297,
+ ],
+ "id": 297,
"legacy": true
- },
+ },
"ea87f462deefffbd7775aa2a4b7e0fcb91c22eee6df69ed90100ccc73b311476": {
"fingerprints": [
- "d40e9c86cd8fe468c1776959f49ea774fa548684b6c406f3909261f4dce2575c",
+ "d40e9c86cd8fe468c1776959f49ea774fa548684b6c406f3909261f4dce2575c",
"488fca189eaadf54a3f920ed39e587183ba512232999fae3e4a285fe98e298d1"
- ],
+ ],
"id": 289
- },
+ },
"eabc185c4e82d942b1a5978ba3c0181487d6b3b9974e5c49f72f6d0bd9637150": {
"fingerprints": [
"bc4d809b15189d78db3e1d8cf4f9726a795da1643ca5f1358e1ddb0edc0d7eb3"
- ],
+ ],
"id": 497
- },
+ },
"eb4993efa9b089e593418aa893f8e93a7374d810e52fcbe01e7f1d7e92a6d024": {
"fingerprints": [
- "b0b1730ecbc7ff4505142c49f1295e6eda6bcaed7e2c68c5be91b5a11001f024",
+ "b0b1730ecbc7ff4505142c49f1295e6eda6bcaed7e2c68c5be91b5a11001f024",
"0d83b611b648a1a75eb8558400795375cad92e264ed8e9d7a757c1f5ee2bb22d"
- ],
- "id": 215,
+ ],
+ "id": 215,
"legacy": true
- },
+ },
"ec9056fe9509411609763aee831ef37c832b75b3d727528fc7c75201c1ff28e6": {
"fingerprints": [
"152a402bfcdf2cd548054d2275b39c7fca3ec0978078b0f0ea76e561a6c7433e"
- ],
- "id": 197,
+ ],
+ "id": 197,
"legacy": true
- },
+ },
"eca0f181402ce7a8652b31b4d036df247e3a30b7f41a50d91ec4f90b006b43a1": {
"fingerprints": [
"49e7a442acf0ea6287050054b52564b650e4f49e42e348d6aa38e039e957b1c1"
- ],
+ ],
"id": 16
- },
+ },
"ed1b229e0e0875021c1f1760c3407fb1d6608eda7add71a3e3275ced09690f7c": {
"fingerprints": [
"781d64dfa77b00f2c006700b1fda86bf68b865a603c7a656f92e90c042ca2873"
- ],
- "id": 377,
+ ],
+ "id": 377,
"legacy": true
- },
+ },
"ede4b1535a529bf1606bc6ff757b91470aa30aeaffd2d6df2eba340dae302fca": {
"fingerprints": [
- "e8a2f441657678975f2b97d775719c7d49d92234554540ec14d92e16fe27d2cb",
+ "e8a2f441657678975f2b97d775719c7d49d92234554540ec14d92e16fe27d2cb",
"3deae6ae975284e0e6fa2eb76ce46e12441869a2a7d4e67dc7ab8664fefdbbb0"
- ],
- "id": 219,
+ ],
+ "id": 219,
"legacy": true
- },
+ },
"ef4fa1c630f04950e0e2d10dc19f149d08ab46dec95da3131cbaea8af8ea3027": {
"fingerprints": [
"42143a511a3afcdd80d555debb4191ec6bb285ee66e62ec657ed20adf7d55faa"
- ],
- "id": 393,
+ ],
+ "id": 393,
"legacy": true
- },
+ },
"ef53ffaf0ceb040d077f5bd80a9deef6d4507fdb6f9bcf8c3594bece7ebdb025": {
"fingerprints": [
"36544d2fce03c6c72b70eb1a8064264dc1511768c2d8f76a8b9f1f2bbd153b7d"
- ],
- "id": 361,
+ ],
+ "id": 361,
"legacy": true
- },
+ },
"effee1f1e5f39f42ff80d471c9c5a799a8c843f9b676315f9eab3f4c7a2f7fc8": {
"fingerprints": [
"4898c6888c0cffb0d3e31aca8a37d4e3515ff746d02635d86646cfa0a3185ae7"
- ],
- "id": 129,
+ ],
+ "id": 129,
"legacy": true
- },
+ },
"f1c6ba670cfc88e4df52973cae420f0a089dd474144fe5806c420064e1591229": {
"fingerprints": [
"7d05ebb682339f8c9451ee094eebfefa7953a114edb2f44949452fab7d2fc185"
- ],
+ ],
"id": 171
- },
+ },
"f26cdaa1c48e2d369eaf24993a424f8290983af7094a5bde9c7d44341f2e2428": {
"fingerprints": [
- "6aea30bc02ca85afcfec2f65f60881893c926925fd0704bd8ada3f0f6eddb699",
+ "6aea30bc02ca85afcfec2f65f60881893c926925fd0704bd8ada3f0f6eddb699",
"de1af143ffa160cf5fa86abfe577291633dc264da12c863c5738bea4afbb2cdb"
- ],
- "id": 504,
+ ],
+ "id": 504,
"legacy": true
- },
+ },
"f2a4e6b263d0a552adff5d85dc96b5820fd66aa0b18228f48fdb087c8db34133": {
"fingerprints": [
"ddbf149733bc2bf8a09d7f012b01a6dea11d7bae26713783ef6407a2495bf189"
- ],
- "id": 474,
+ ],
+ "id": 474,
"legacy": true
- },
+ },
"f3438e23b3ce532522facf307923f58fd18608e9ba7addc30e952b43c49616c3": {
"fingerprints": [
"88ef81de202eb018452e43f864725cea5fbd1fc2d9d205730709c5d8b8690f46"
- ],
+ ],
"id": 177
- },
+ },
"f42352c3cc3d84b8518989d647c88ca301c88fb991938bbcecc9ee60e565d377": {
"fingerprints": [
"97f654859cbde586fd90311e82ec7902c238cba0d6e529564c9c88f44895ec50"
- ],
- "id": 467,
+ ],
+ "id": 467,
"legacy": true
- },
+ },
"f463c54d9f1a047aed52656ac785e07ebec528e0207bfd3f55d893237668f6ae": {
"fingerprints": [
"d95fea3ca4eedce74cd76e75fc6d1ff62c441f0fa8bc77f034b19e5db258015d"
- ],
- "id": 96,
+ ],
+ "id": 96,
"legacy": true
- },
+ },
"f48badd7df6a06690d0ae31373b12855f8dedb14517f362a313101cc98cc6b35": {
"fingerprints": [
"6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98"
- ],
+ ],
"id": 60
- },
+ },
"f53c22059817dd96f400651639d2f857e21070a59abed9079400d9f695506900": {
"fingerprints": [
- "3f9f27d583204b9e09c8a3d2066c4b57d3a2479c3693650880505698105dbce9",
+ "3f9f27d583204b9e09c8a3d2066c4b57d3a2479c3693650880505698105dbce9",
"ab7036365c7154aa29c2c29f5d4191163b162a2225011357d56d07ffa7bc1f72"
- ],
- "id": 118,
+ ],
+ "id": 118,
"legacy": true
- },
+ },
"f5857d8862bc2ba3c9ddca3f84146dc8d81f4d579d2b387bf60065381ee641dd": {
"fingerprints": [
"ccc89489371bad111c90619bea240a2e6dadd99f9f6e1d4d41e58ed6de3d0285"
- ],
- "id": 335,
+ ],
+ "id": 335,
"legacy": true
- },
+ },
"f5e19c8e14fe755f551cec2b7113e7c98023b176ebe6c1abcf872b2a7b932304": {
"fingerprints": [
"5607e260163f49c8ea4175a1c0a53b13195cb7d07845611e943a2ff507036834"
- ],
- "id": 363,
+ ],
+ "id": 363,
"legacy": true
- },
+ },
"f6146bc238e8fce0d47b7074c9a26b1aa0f883528510f06d9cfec41ff6ca1968": {
"fingerprints": [
"e606ddeee2ee7f5cdef5d9058ff8b7d0a9f042877f6a171ed8ff6960e4cc5ea5"
- ],
- "id": 247,
+ ],
+ "id": 247,
"legacy": true
- },
+ },
"f6b59c8e2789a1fd5d5b253742feadc6925cb93edc345e53166e12c52ba2a601": {
"fingerprints": [
"8f9e2751dcd574e9ba90e744ea92581fd0af640ae86ac1ce2198c90f96b44823"
- ],
- "id": 327,
+ ],
+ "id": 327,
"legacy": true
- },
+ },
"f73be5eba536912c557fb855517ad1ee0487bd8f63498c3949164177ba06c5de": {
"fingerprints": [
"77a03f69e4f3955589acaca06f6773a0d98d16dea05c6d94ee3ef6fb2beb7605"
- ],
- "id": 380,
+ ],
+ "id": 380,
"legacy": true
- },
+ },
"f7aff41b2709f175f8aba17e567b27046b2dd54bf6e7e263d3295873437b9cff": {
"fingerprints": [
"6baf50ae3467eff3c35fefdc76a02a97fab6267723eda91e99f1b3dc2b28f82e"
- ],
- "id": 387,
+ ],
+ "id": 387,
"legacy": true
- },
+ },
"f7ecded5c66047d28ed6466b543c40e0743abe81d109254dcf845d4c2c7853c5": {
"fingerprints": [
"e35d28419ed02025cfa69038cd623962458da5c695fbdea3c22b0bfb25897092"
- ],
+ ],
"id": 208
- },
+ },
"f8e5f905bc939911267b83d50814a90323b51e183629db52d4fc2d5468a5a578": {
"fingerprints": [
"9f9744463be13714754e1a3becf98c08cc205e4ab32028f4e2830c4a1b2775b8"
- ],
- "id": 222,
+ ],
+ "id": 222,
"legacy": true
- },
+ },
"fac95de3c24a174194800cffaa3ca51d7116630664a9b60c8758b4ef0dc58f88": {
"fingerprints": [
- "793cbf4559b9fde38ab22df16869f69881ae14c4b0139ac788a78a1afcca02fb",
+ "793cbf4559b9fde38ab22df16869f69881ae14c4b0139ac788a78a1afcca02fb",
"8688e58f4c7a945fadce7f62bfef521b82da7dc38bfdb0163478a5fe42e57870"
- ],
- "id": 119,
+ ],
+ "id": 119,
"legacy": true
- },
+ },
"faddde04bcf08ca8f4e22efd2afeade6bf3d850ae47be96a82d539494f120cbd": {
"fingerprints": [
"8f633df0191a417dcd4f6331f0e90eb947158c8a3ea59bfe81420041315eac6c"
- ],
- "id": 350,
+ ],
+ "id": 350,
"legacy": true
- },
+ },
"fbe3018031f9586bcbf41727e417b7d1c45c2f47f93be372a17b96b50757d5a2": {
"fingerprints": [
"8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e"
- ],
+ ],
"id": 210
- },
+ },
"fc3b82796b572ca9731993635db8cf07c2bf01e199b2f273a3f953bd185de3c0": {
"fingerprints": [
"39c75caecee8920c909f132491641350b57e2702a65a991545b01d1be4a2220b"
- ],
- "id": 158,
+ ],
+ "id": 158,
"legacy": true
- },
+ },
"fcf7da983603e88862030d96137d8e13031badfb4d56c1fd4cacc339f6bdbb2a": {
"fingerprints": [
"7d3b465a6014e526c0affcee2127d2311727ad811c26842d006af37306cc80bd"
- ],
- "id": 28,
+ ],
+ "id": 28,
"legacy": true
- },
+ },
"fd371bea9755ff60c8828c849b8e5215de532d61b009855fa0ad630d90eef82e": {
"fingerprints": [
"8560f91c3624daba9570b5fea0dbe36ff11a8323be9486854fb3f34a5571198d"
- ],
+ ],
"id": 490
- },
+ },
"fd872d176617e50c266119d0fdb047b0732da2048b121af7b9860ca3e2f2f2be": {
"fingerprints": [
"a6c51e0da5ca0a9309d2e4c0e40c2af9107aae8203857fe198e3e769e343085c"
- ],
- "id": 123,
+ ],
+ "id": 123,
"legacy": true
- },
+ },
"fde8999a5e427319835c89a17d64a2dcd13a851c0916c4c547b6d8f7a6437d94": {
"fingerprints": [
"608142da5c675dd47c1aa3a26ee329e24e81d5ff3b94017bc1c1a0c37db4c1a0"
- ],
- "id": 517,
+ ],
+ "id": 517,
"legacy": true
- },
+ },
"fea2b7d645fba73d753c1ec9a7870c40e1f7b0c561e927b985bf711866e36f22": {
"fingerprints": [
"02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5"
- ],
+ ],
"id": 110
- },
+ },
"ff342fb6c4c8bd30a4706f73489539f19e6e48cc05f46254654f6610dbc540e9": {
"fingerprints": [
"eec5496b988ce98625b934092eec2908bed0b0f316c2d4730c84eaf1f3d34881"
- ],
+ ],
"id": 133
- },
+ },
"ff5680cd73a5703da04817a075fd462506a73506c4b81a1583ef549478d26476": {
"fingerprints": [
"08297a4047dba23680c731db6e317653ca7848e1bebd3a0b0179a707f92cf178"
- ],
- "id": 54,
+ ],
+ "id": 54,
"legacy": true
}
}
-} \ No newline at end of file
+}
diff --git a/chromium/net/data/ssl/root_stores/update_root_stores.py b/chromium/net/data/ssl/root_stores/update_root_stores.py
index 8aca424fc36..f9f58d99c48 100755
--- a/chromium/net/data/ssl/root_stores/update_root_stores.py
+++ b/chromium/net/data/ssl/root_stores/update_root_stores.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
# 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.
@@ -22,7 +22,7 @@ SRC_DIR = os.path.normpath(os.path.join(THIS_DIR, '..', '..', '..', '..'))
ROOT_CERT_LIST_PATH = 'net/cert/root_cert_list_generated.h'
ROOT_STORE_FILE_PATH = 'net/data/ssl/root_stores/root_stores.json'
-LICENSE_AND_HEADER = """\
+LICENSE_AND_HEADER = b"""\
// 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.
@@ -57,7 +57,7 @@ const struct RootCertData {
} kRootCerts[] = {
"""
-FOOTER = """\
+FOOTER = b"""\
};
@@ -93,8 +93,9 @@ def main():
cpp_str = ''.join('0x{:02X}, '.format(x) for x in bytearray.fromhex(spki))
log_id = int(data['id'])
legacy = 'legacy' in data and data['legacy']
- header_file.write('{ { %s },\n%d, %s }, ' %
- (cpp_str, log_id, "true" if legacy else "false"))
+ header_file.write(
+ ('{ { %s },\n%d, %s }, ' %
+ (cpp_str, log_id, "true" if legacy else "false")).encode('utf-8'))
header_file.write(FOOTER)
diff --git a/chromium/net/der/encode_values.cc b/chromium/net/der/encode_values.cc
index 6207f25d5b7..ef67fd54aed 100644
--- a/chromium/net/der/encode_values.cc
+++ b/chromium/net/der/encode_values.cc
@@ -7,9 +7,7 @@
#include "base/time/time.h"
#include "net/der/parse_values.h"
-namespace net {
-
-namespace der {
+namespace net::der {
namespace {
@@ -114,6 +112,4 @@ bool EncodeUTCTime(const GeneralizedTime& time, uint8_t out[kUTCTimeLength]) {
return true;
}
-} // namespace der
-
-} // namespace net
+} // namespace net::der
diff --git a/chromium/net/der/encode_values.h b/chromium/net/der/encode_values.h
index 297b7d76ca5..b8d6b75800b 100644
--- a/chromium/net/der/encode_values.h
+++ b/chromium/net/der/encode_values.h
@@ -14,9 +14,7 @@ namespace base {
class Time;
}
-namespace net {
-
-namespace der {
+namespace net::der {
struct GeneralizedTime;
@@ -45,8 +43,6 @@ static const size_t kUTCTimeLength = 13;
NET_EXPORT bool EncodeUTCTime(const GeneralizedTime& time,
uint8_t out[kUTCTimeLength]);
-} // namespace der
-
-} // namespace net
+} // namespace net::der
#endif // NET_DER_ENCODE_VALUES_H_
diff --git a/chromium/net/der/encode_values_unittest.cc b/chromium/net/der/encode_values_unittest.cc
index 1a089ff2626..b8fd2edf453 100644
--- a/chromium/net/der/encode_values_unittest.cc
+++ b/chromium/net/der/encode_values_unittest.cc
@@ -9,9 +9,7 @@
#include "net/der/parse_values.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace der {
-namespace test {
+namespace net::der::test {
namespace {
@@ -273,8 +271,4 @@ TEST(EncodeValuesTest, EncodeUTCTime) {
EXPECT_FALSE(EncodeUTCTime(time, out));
}
-} // namespace test
-
-} // namespace der
-
-} // namespace net
+} // namespace net::der::test
diff --git a/chromium/net/der/input.cc b/chromium/net/der/input.cc
index c816d50b521..c2c7557f1ad 100644
--- a/chromium/net/der/input.cc
+++ b/chromium/net/der/input.cc
@@ -8,9 +8,7 @@
#include "base/check_op.h"
-namespace net {
-
-namespace der {
+namespace net::der {
Input::Input(const base::StringPiece& in)
: data_(reinterpret_cast<const uint8_t*>(in.data())), len_(in.length()) {}
@@ -70,6 +68,4 @@ void ByteReader::Advance(size_t len) {
len_ -= len;
}
-} // namespace der
-
-} // namespace net
+} // namespace net::der
diff --git a/chromium/net/der/input.h b/chromium/net/der/input.h
index dd8403ec1b1..9293694412e 100644
--- a/chromium/net/der/input.h
+++ b/chromium/net/der/input.h
@@ -14,9 +14,7 @@
#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
-namespace net {
-
-namespace der {
+namespace net::der {
// An opaque class that represents a fixed buffer of data of a fixed length,
// to be used as an input to other operations. An Input object does not own
@@ -47,7 +45,7 @@ class NET_EXPORT_PRIVATE Input {
// Creates an Input from a std::string. The lifetimes are a bit subtle when
// using this function: The constructed Input is only valid so long as |s| is
// still alive and not mutated.
- Input(const std::string* s);
+ explicit Input(const std::string* s);
// Returns the length in bytes of an Input's data.
constexpr size_t Length() const { return len_; }
@@ -153,8 +151,6 @@ class NET_EXPORT_PRIVATE ByteReader {
size_t len_;
};
-} // namespace der
-
-} // namespace net
+} // namespace net::der
#endif // NET_DER_INPUT_H_
diff --git a/chromium/net/der/input_unittest.cc b/chromium/net/der/input_unittest.cc
index 73f74591cba..11da23eb4b9 100644
--- a/chromium/net/der/input_unittest.cc
+++ b/chromium/net/der/input_unittest.cc
@@ -6,9 +6,7 @@
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace der {
-namespace test {
+namespace net::der::test {
constexpr uint8_t kInput[] = {'t', 'e', 's', 't'};
const uint8_t kInput2[] = {'t', 'e', 'a', 'l'};
@@ -106,6 +104,4 @@ TEST(ByteReaderTest, HasMore) {
ASSERT_FALSE(reader.HasMore());
}
-} // namespace test
-} // namespace der
-} // namespace net
+} // namespace net::der::test
diff --git a/chromium/net/der/parse_values.cc b/chromium/net/der/parse_values.cc
index 68bfa3761cd..2609e0e5c9a 100644
--- a/chromium/net/der/parse_values.cc
+++ b/chromium/net/der/parse_values.cc
@@ -15,9 +15,7 @@
#include "base/third_party/icu/icu_utf.h"
#include "third_party/boringssl/src/include/openssl/bytestring.h"
-namespace net {
-
-namespace der {
+namespace net::der {
namespace {
@@ -298,48 +296,6 @@ bool operator>=(const GeneralizedTime& lhs, const GeneralizedTime& rhs) {
return !(lhs < rhs);
}
-// A UTC Time in DER encoding should be YYMMDDHHMMSSZ, but some CAs encode
-// the time following BER rules, which allows for YYMMDDHHMMZ. If the length
-// is 11, assume it's YYMMDDHHMMZ, and in converting it to a GeneralizedTime,
-// add in the seconds (set to 0).
-bool ParseUTCTimeRelaxed(const Input& in, GeneralizedTime* value) {
- ByteReader reader(in);
- GeneralizedTime time;
- if (!DecimalStringToUint(reader, 2, &time.year) ||
- !DecimalStringToUint(reader, 2, &time.month) ||
- !DecimalStringToUint(reader, 2, &time.day) ||
- !DecimalStringToUint(reader, 2, &time.hours) ||
- !DecimalStringToUint(reader, 2, &time.minutes)) {
- return false;
- }
-
- // Try to read the 'Z' at the end. If we read something else, then for it to
- // be valid the next bytes should be seconds (and then followed by 'Z').
- uint8_t zulu;
- ByteReader zulu_reader = reader;
- if (!zulu_reader.ReadByte(&zulu))
- return false;
- if (zulu == 'Z' && !zulu_reader.HasMore()) {
- time.seconds = 0;
- *value = time;
- } else {
- if (!DecimalStringToUint(reader, 2, &time.seconds))
- return false;
- if (!reader.ReadByte(&zulu) || zulu != 'Z' || reader.HasMore())
- return false;
- }
-
- if (time.year < 50) {
- time.year += 2000;
- } else {
- time.year += 1900;
- }
- if (!ValidateGeneralizedTime(time))
- return false;
- *value = time;
- return true;
-}
-
bool ParseUTCTime(const Input& in, GeneralizedTime* value) {
ByteReader reader(in);
GeneralizedTime time;
@@ -452,7 +408,7 @@ bool ParseUniversalString(Input in, std::string* out) {
memcpy(in_32bit.data(), in.UnsafeData(), in.Length());
for (const uint32_t c : in_32bit) {
// UniversalString is UCS-4 in big-endian order.
- uint32_t codepoint = base::NetToHost32(c);
+ auto codepoint = static_cast<base_icu::UChar32>(base::NetToHost32(c));
if (!CBU_IS_UNICODE_CHAR(codepoint))
return false;
@@ -471,7 +427,7 @@ bool ParseBmpString(Input in, std::string* out) {
memcpy(in_16bit.data(), in.UnsafeData(), in.Length());
for (const uint16_t c : in_16bit) {
// BMPString is UCS-2 in big-endian order.
- uint32_t codepoint = base::NetToHost16(c);
+ base_icu::UChar32 codepoint = base::NetToHost16(c);
// BMPString only supports codepoints in the Basic Multilingual Plane;
// surrogates are not allowed. CBU_IS_UNICODE_CHAR excludes the surrogate
@@ -484,6 +440,4 @@ bool ParseBmpString(Input in, std::string* out) {
return true;
}
-} // namespace der
-
-} // namespace net
+} // namespace net::der
diff --git a/chromium/net/der/parse_values.h b/chromium/net/der/parse_values.h
index 51307c8706f..12cf4550618 100644
--- a/chromium/net/der/parse_values.h
+++ b/chromium/net/der/parse_values.h
@@ -11,9 +11,7 @@
#include "net/der/input.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
-namespace net {
-
-namespace der {
+namespace net::der {
// Reads a DER-encoded ASN.1 BOOLEAN value from |in| and puts the resulting
// value in |out|. Returns whether the encoded value could successfully be
@@ -111,13 +109,6 @@ NET_EXPORT_PRIVATE bool operator>=(const GeneralizedTime& lhs,
[[nodiscard]] NET_EXPORT bool ParseUTCTime(const Input& in,
GeneralizedTime* out);
-// Like ParseUTCTime, but it is more lenient in what is accepted. DER requires
-// a UTCTime to be in the format YYMMDDhhmmssZ; this function will accept both
-// that and YYMMDDhhmmZ, which is a valid BER encoding of a UTCTime which
-// sometimes incorrectly appears in X.509 certificates.
-[[nodiscard]] NET_EXPORT bool ParseUTCTimeRelaxed(const Input& in,
- GeneralizedTime* out);
-
// Reads a DER-encoded ASN.1 GeneralizedTime value from |in| and puts the
// resulting value in |out|, returning true if the GeneralizedTime could
// be parsed successfully. This function is even more restrictive than the
@@ -155,8 +146,6 @@ NET_EXPORT_PRIVATE bool operator>=(const GeneralizedTime& lhs,
// result in |out| as UTF-8, returning true if successful.
[[nodiscard]] NET_EXPORT bool ParseBmpString(Input in, std::string* out);
-} // namespace der
-
-} // namespace net
+} // namespace net::der
#endif // NET_DER_PARSE_VALUES_H_
diff --git a/chromium/net/der/parse_values_unittest.cc b/chromium/net/der/parse_values_unittest.cc
index 5f629babacc..22e4a4f0581 100644
--- a/chromium/net/der/parse_values_unittest.cc
+++ b/chromium/net/der/parse_values_unittest.cc
@@ -8,9 +8,7 @@
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace der {
-namespace test {
+namespace net::der::test {
namespace {
@@ -65,18 +63,9 @@ TEST(ParseValuesTest, ParseTimes) {
// Check that the length is validated.
EXPECT_FALSE(ParseUTCTime(FromStringLiteral("140218161200"), &out));
EXPECT_FALSE(ParseUTCTime(FromStringLiteral("140218161200Z0"), &out));
- EXPECT_FALSE(ParseUTCTimeRelaxed(FromStringLiteral("140218161200"), &out));
- EXPECT_FALSE(ParseUTCTimeRelaxed(FromStringLiteral("140218161200Z0"), &out));
// Check strictness of UTCTime parsers.
EXPECT_FALSE(ParseUTCTime(FromStringLiteral("1402181612Z"), &out));
- EXPECT_TRUE(ParseUTCTimeRelaxed(FromStringLiteral("1402181612Z"), &out));
-
- // Check that the time ends in Z.
- EXPECT_FALSE(ParseUTCTimeRelaxed(FromStringLiteral("1402181612Z0"), &out));
-
- // Check that ParseUTCTimeRelaxed calls ValidateGeneralizedTime.
- EXPECT_FALSE(ParseUTCTimeRelaxed(FromStringLiteral("1402181662Z"), &out));
// Check format of GeneralizedTime.
@@ -161,22 +150,19 @@ TEST(ParseValuesTest, TimesCompare) {
GeneralizedTime time1;
GeneralizedTime time2;
GeneralizedTime time3;
- GeneralizedTime time4;
ASSERT_TRUE(
ParseGeneralizedTime(FromStringLiteral("20140218161200Z"), &time1));
// Test that ParseUTCTime correctly normalizes the year.
ASSERT_TRUE(ParseUTCTime(FromStringLiteral("150218161200Z"), &time2));
- ASSERT_TRUE(ParseUTCTimeRelaxed(FromStringLiteral("1503070000Z"), &time3));
ASSERT_TRUE(
- ParseGeneralizedTime(FromStringLiteral("20160218161200Z"), &time4));
+ ParseGeneralizedTime(FromStringLiteral("20160218161200Z"), &time3));
EXPECT_TRUE(time1 < time2);
EXPECT_TRUE(time2 < time3);
- EXPECT_TRUE(time3 < time4);
EXPECT_TRUE(time2 > time1);
EXPECT_TRUE(time2 >= time1);
- EXPECT_TRUE(time3 <= time4);
+ EXPECT_TRUE(time2 <= time3);
EXPECT_TRUE(time1 <= time1);
EXPECT_TRUE(time1 >= time1);
}
@@ -468,6 +454,4 @@ TEST(ParseValuesTest, ParseUniversalString) {
EXPECT_FALSE(ParseUniversalString(invalid_non_4_multiple_der, &s));
}
-} // namespace test
-} // namespace der
-} // namespace net
+} // namespace net::der::test
diff --git a/chromium/net/der/parser.cc b/chromium/net/der/parser.cc
index 94c36000cd6..927f5fbbcb1 100644
--- a/chromium/net/der/parser.cc
+++ b/chromium/net/der/parser.cc
@@ -7,9 +7,7 @@
#include "base/check.h"
#include "net/der/parse_values.h"
-namespace net {
-
-namespace der {
+namespace net::der {
Parser::Parser() {
CBS_init(&cbs_, nullptr, 0);
@@ -155,6 +153,4 @@ bool Parser::ReadGeneralizedTime(GeneralizedTime* out) {
return ParseGeneralizedTime(value, out);
}
-} // namespace der
-
-} // namespace net
+} // namespace net::der
diff --git a/chromium/net/der/parser.h b/chromium/net/der/parser.h
index c5deaa6eee5..04541c251bb 100644
--- a/chromium/net/der/parser.h
+++ b/chromium/net/der/parser.h
@@ -13,9 +13,7 @@
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/boringssl/src/include/openssl/bytestring.h"
-namespace net {
-
-namespace der {
+namespace net::der {
class BitString;
struct GeneralizedTime;
@@ -208,8 +206,6 @@ class NET_EXPORT Parser {
size_t advance_len_ = 0;
};
-} // namespace der
-
-} // namespace net
+} // namespace net::der
#endif // NET_DER_PARSER_H_
diff --git a/chromium/net/der/parser_unittest.cc b/chromium/net/der/parser_unittest.cc
index 7561bc48c6b..09017f9f0bd 100644
--- a/chromium/net/der/parser_unittest.cc
+++ b/chromium/net/der/parser_unittest.cc
@@ -8,9 +8,7 @@
#include "net/der/parse_values.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace der {
-namespace test {
+namespace net::der::test {
TEST(ParserTest, ConsumesAllBytesOfTLV) {
const uint8_t der[] = {0x04 /* OCTET STRING */, 0x00};
@@ -364,6 +362,4 @@ TEST(ParserTest, ReadBitStringBadTag) {
EXPECT_FALSE(bit_string.has_value());
}
-} // namespace test
-} // namespace der
-} // namespace net
+} // namespace net::der::test
diff --git a/chromium/net/der/tag.cc b/chromium/net/der/tag.cc
index f4ef8461555..1820551ce3b 100644
--- a/chromium/net/der/tag.cc
+++ b/chromium/net/der/tag.cc
@@ -6,9 +6,7 @@
#include "base/check_op.h"
-namespace net {
-
-namespace der {
+namespace net::der {
Tag ContextSpecificConstructed(uint8_t tag_number) {
DCHECK_EQ(tag_number, tag_number & kTagNumberMask);
@@ -24,6 +22,4 @@ bool IsConstructed(Tag tag) {
return (tag & kTagConstructionMask) == kTagConstructed;
}
-} // namespace der
-
-} // namespace net
+} // namespace net::der
diff --git a/chromium/net/der/tag.h b/chromium/net/der/tag.h
index ed99efd985b..1a98f9f0a80 100644
--- a/chromium/net/der/tag.h
+++ b/chromium/net/der/tag.h
@@ -10,9 +10,7 @@
#include "net/base/net_export.h"
#include "third_party/boringssl/src/include/openssl/bytestring.h"
-namespace net {
-
-namespace der {
+namespace net::der {
// This Tag type represents the identifier for an ASN.1 tag as encoded with
// DER. It matches the BoringSSL CBS and CBB in-memory representation for a
@@ -74,8 +72,6 @@ NET_EXPORT Tag ContextSpecificPrimitive(uint8_t base);
NET_EXPORT bool IsConstructed(Tag tag);
-} // namespace der
-
-} // namespace net
+} // namespace net::der
#endif // NET_DER_TAG_H_
diff --git a/chromium/net/disk_cache/backend_cleanup_tracker.cc b/chromium/net/disk_cache/backend_cleanup_tracker.cc
index f01ecec8f6e..d4c44913f9e 100644
--- a/chromium/net/disk_cache/backend_cleanup_tracker.cc
+++ b/chromium/net/disk_cache/backend_cleanup_tracker.cc
@@ -49,8 +49,9 @@ scoped_refptr<BackendCleanupTracker> BackendCleanupTracker::TryCreate(
all_trackers->map.insert(
std::pair<base::FilePath, BackendCleanupTracker*>(path, nullptr));
if (insert_result.second) {
- insert_result.first->second = new BackendCleanupTracker(path);
- return insert_result.first->second;
+ auto tracker = base::WrapRefCounted(new BackendCleanupTracker(path));
+ insert_result.first->second = tracker.get();
+ return tracker;
} else {
insert_result.first->second->AddPostCleanupCallbackImpl(
std::move(retry_closure));
@@ -67,8 +68,8 @@ void BackendCleanupTracker::AddPostCleanupCallback(base::OnceClosure cb) {
}
void BackendCleanupTracker::AddPostCleanupCallbackImpl(base::OnceClosure cb) {
- post_cleanup_cbs_.push_back(
- std::make_pair(base::SequencedTaskRunnerHandle::Get(), std::move(cb)));
+ post_cleanup_cbs_.emplace_back(base::SequencedTaskRunnerHandle::Get(),
+ std::move(cb));
}
BackendCleanupTracker::BackendCleanupTracker(const base::FilePath& path)
diff --git a/chromium/net/disk_cache/backend_unittest.cc b/chromium/net/disk_cache/backend_unittest.cc
index 9be7d47ccf5..16ac64f3042 100644
--- a/chromium/net/disk_cache/backend_unittest.cc
+++ b/chromium/net/disk_cache/backend_unittest.cc
@@ -107,8 +107,8 @@ std::unique_ptr<disk_cache::BackendImpl> CreateExistingEntryCache(
/* cache_thread = */ nullptr,
net::DISK_CACHE,
/* net_log = */ nullptr));
- int rv = cache->Init(cb.callback());
- if (cb.GetResult(rv) != net::OK)
+ cache->Init(cb.callback());
+ if (cb.WaitForResult() != net::OK)
return nullptr;
TestEntryResultCompletionCallback cb2;
@@ -222,6 +222,7 @@ class DiskCacheBackendTest : public DiskCacheTestWithCache {
void BackendOpenOrCreateEntry();
void BackendDeadOpenNextEntry();
void BackendIteratorConcurrentDoom();
+ void BackendValidateMigrated();
};
void DiskCacheBackendTest::CreateKeyAndCheck(disk_cache::Backend* cache,
@@ -584,7 +585,7 @@ TEST_F(DiskCacheBackendTest, ShaderCacheKeying) {
}
TEST_F(DiskCacheTest, CreateBackend) {
- net::TestCompletionCallback cb;
+ TestBackendResultCompletionCallback cb;
{
ASSERT_TRUE(CleanupCacheDir());
@@ -596,44 +597,47 @@ TEST_F(DiskCacheTest, CreateBackend) {
cache.reset();
// Now test the public API.
- int rv = disk_cache::CreateCacheBackend(
+
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT,
/*file_operations=*/nullptr, cache_path_, 0,
- disk_cache::ResetHandling::kNeverReset, nullptr, &cache, cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
- ASSERT_TRUE(cache.get());
- cache.reset();
+ disk_cache::ResetHandling::kNeverReset, nullptr, cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ ASSERT_THAT(rv.net_error, IsOk());
+ ASSERT_TRUE(rv.backend);
+ rv.backend.reset();
rv = disk_cache::CreateCacheBackend(
net::MEMORY_CACHE, net::CACHE_BACKEND_DEFAULT,
/*file_operations=*/nullptr, base::FilePath(), 0,
- disk_cache::ResetHandling::kNeverReset, nullptr, &cache, cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
- ASSERT_TRUE(cache.get());
- cache.reset();
+ disk_cache::ResetHandling::kNeverReset, nullptr, cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ ASSERT_THAT(rv.net_error, IsOk());
+ ASSERT_TRUE(rv.backend);
+ rv.backend.reset();
}
base::RunLoop().RunUntilIdle();
}
TEST_F(DiskCacheTest, MemBackendPostCleanupCallback) {
- net::TestCompletionCallback cb;
+ TestBackendResultCompletionCallback cb;
net::TestClosure on_cleanup;
- std::unique_ptr<disk_cache::Backend> cache;
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::MEMORY_CACHE, net::CACHE_BACKEND_DEFAULT,
/*file_operations=*/nullptr, base::FilePath(), 0,
- disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- on_cleanup.closure(), cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
- ASSERT_TRUE(cache.get());
+ disk_cache::ResetHandling::kNeverReset, nullptr, on_cleanup.closure(),
+ cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ ASSERT_THAT(rv.net_error, IsOk());
+ ASSERT_TRUE(rv.backend);
// The callback should be posted after backend is destroyed.
base::RunLoop().RunUntilIdle();
EXPECT_FALSE(on_cleanup.have_result());
- cache.reset();
+ rv.backend.reset();
EXPECT_FALSE(on_cleanup.have_result());
base::RunLoop().RunUntilIdle();
@@ -643,33 +647,34 @@ TEST_F(DiskCacheTest, MemBackendPostCleanupCallback) {
TEST_F(DiskCacheTest, CreateBackendDouble) {
// Make sure that creation for the second backend for same path happens
// after the first one completes.
- net::TestCompletionCallback cb, cb2;
+ TestBackendResultCompletionCallback cb, cb2;
- std::unique_ptr<disk_cache::Backend> cache, cache2;
-
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_DEFAULT, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- cb.callback());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb.callback());
- int rv2 = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv2 = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_DEFAULT, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache2,
- cb2.callback());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb2.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
- EXPECT_TRUE(cache.get());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsOk());
+ EXPECT_TRUE(rv.backend);
disk_cache::FlushCacheThreadForTesting();
- // No cache 2 yet.
- EXPECT_EQ(net::ERR_IO_PENDING, rv2);
+ // No rv2.backend yet.
+ EXPECT_EQ(net::ERR_IO_PENDING, rv2.net_error);
+ EXPECT_FALSE(rv2.backend);
EXPECT_FALSE(cb2.have_result());
- cache.reset();
+ rv.backend.reset();
- // Now cache2 should exist.
- EXPECT_THAT(cb2.GetResult(rv2), IsOk());
- EXPECT_TRUE(cache2.get());
+ // Now rv2.backend should exist.
+ rv2 = cb2.GetResult(std::move(rv2));
+ EXPECT_THAT(rv2.net_error, IsOk());
+ EXPECT_TRUE(rv2.backend);
}
TEST_F(DiskCacheBackendTest, CreateBackendDoubleOpenEntry) {
@@ -682,35 +687,35 @@ TEST_F(DiskCacheBackendTest, CreateBackendDoubleOpenEntry) {
// Make sure that creation for the second backend for same path happens
// after the first one completes, and all of its ops complete.
- net::TestCompletionCallback cb, cb2;
-
- std::unique_ptr<disk_cache::Backend> cache, cache2;
+ TestBackendResultCompletionCallback cb, cb2;
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- cb.callback());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb.callback());
- int rv2 = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv2 = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache2,
- cb2.callback());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb2.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
- ASSERT_TRUE(cache.get());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsOk());
+ ASSERT_TRUE(rv.backend);
disk_cache::FlushCacheThreadForTesting();
// No cache 2 yet.
- EXPECT_EQ(net::ERR_IO_PENDING, rv2);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv2.net_error);
+ EXPECT_FALSE(rv2.backend);
EXPECT_FALSE(cb2.have_result());
TestEntryResultCompletionCallback cb3;
EntryResult entry_result =
- cache->CreateEntry("key", net::HIGHEST, cb3.callback());
+ rv.backend->CreateEntry("key", net::HIGHEST, cb3.callback());
entry_result = cb3.GetResult(std::move(entry_result));
ASSERT_EQ(net::OK, entry_result.net_error());
- cache.reset();
+ rv.backend.reset();
// Still doesn't exist.
EXPECT_FALSE(cb2.have_result());
@@ -718,8 +723,9 @@ TEST_F(DiskCacheBackendTest, CreateBackendDoubleOpenEntry) {
entry_result.ReleaseEntry()->Close();
// Now should exist.
- EXPECT_THAT(cb2.GetResult(rv2), IsOk());
- EXPECT_TRUE(cache2.get());
+ rv2 = cb2.GetResult(std::move(rv2));
+ EXPECT_THAT(rv2.net_error, IsOk());
+ EXPECT_TRUE(rv2.backend);
}
TEST_F(DiskCacheBackendTest, CreateBackendPostCleanup) {
@@ -735,25 +741,26 @@ TEST_F(DiskCacheBackendTest, CreateBackendPostCleanup) {
CleanupCacheDir();
base::RunLoop run_loop;
- net::TestCompletionCallback cb;
- std::unique_ptr<disk_cache::Backend> cache;
+ TestBackendResultCompletionCallback cb;
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- run_loop.QuitClosure(), cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
- ASSERT_TRUE(cache.get());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, run_loop.QuitClosure(), cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsOk());
+ ASSERT_TRUE(rv.backend);
TestEntryResultCompletionCallback cb2;
- EntryResult result = cache->CreateEntry("key", net::HIGHEST, cb2.callback());
+ EntryResult result =
+ rv.backend->CreateEntry("key", net::HIGHEST, cb2.callback());
result = cb2.GetResult(std::move(result));
ASSERT_EQ(net::OK, result.net_error());
disk_cache::Entry* entry = result.ReleaseEntry();
EXPECT_EQ(kBufSize, WriteData(entry, 0, 0, buffer.get(), kBufSize, false));
entry->Close();
- cache.reset();
+ rv.backend.reset();
// Wait till the post-cleanup callback.
run_loop.Run();
@@ -781,29 +788,29 @@ TEST_F(DiskCacheBackendTest, SimpleCreateBackendRecoveryAppCache) {
CleanupCacheDir();
base::RunLoop run_loop;
- net::TestCompletionCallback cb;
- std::unique_ptr<disk_cache::Backend> cache;
+ TestBackendResultCompletionCallback cb;
// Create a backend with post-cleanup callback specified, in order to know
// when the index has been written back (so it can be deleted race-free).
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- run_loop.QuitClosure(), cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
- ASSERT_TRUE(cache.get());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, run_loop.QuitClosure(), cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsOk());
+ ASSERT_TRUE(rv.backend);
// Create an entry.
TestEntryResultCompletionCallback cb2;
disk_cache::EntryResult result =
- cache->CreateEntry("key", net::HIGHEST, cb2.callback());
+ rv.backend->CreateEntry("key", net::HIGHEST, cb2.callback());
result = cb2.GetResult(std::move(result));
ASSERT_EQ(net::OK, result.net_error());
disk_cache::Entry* entry = result.ReleaseEntry();
EXPECT_EQ(kBufSize, WriteData(entry, 0, 0, buffer.get(), kBufSize, false));
entry->Close();
- cache.reset();
+ rv.backend.reset();
// Wait till the post-cleanup callback.
run_loop.Run();
@@ -835,8 +842,8 @@ TEST_F(DiskCacheBackendTest, CreateBackend_MissingFile) {
std::unique_ptr<disk_cache::BackendImpl> cache(
std::make_unique<disk_cache::BackendImpl>(cache_path_, nullptr, nullptr,
net::DISK_CACHE, nullptr));
- int rv = cache->Init(cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsError(net::ERR_FAILED));
+ cache->Init(cb.callback());
+ EXPECT_THAT(cb.WaitForResult(), IsError(net::ERR_FAILED));
disallow_blocking.reset();
cache.reset();
@@ -960,23 +967,24 @@ TEST_F(DiskCacheBackendTest, MultipleInstancesWithPendingFileIO) {
ASSERT_TRUE(store.CreateUniqueTempDir());
net::TestCompletionCallback cb;
- std::unique_ptr<disk_cache::Backend> extra_cache;
- int rv = disk_cache::CreateCacheBackend(
+ TestBackendResultCompletionCallback create_cb;
+ disk_cache::BackendResult backend_rv = disk_cache::CreateCacheBackend(
net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, /*file_operations=*/nullptr,
store.GetPath(), 0, disk_cache::ResetHandling::kNeverReset,
- /* net_log = */ nullptr, &extra_cache, cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
- ASSERT_TRUE(extra_cache.get() != nullptr);
+ /* net_log = */ nullptr, create_cb.callback());
+ backend_rv = create_cb.GetResult(std::move(backend_rv));
+ ASSERT_THAT(backend_rv.net_error, IsOk());
+ ASSERT_TRUE(backend_rv.backend);
ASSERT_TRUE(CleanupCacheDir());
SetNewEviction(); // Match the expected behavior for integrity verification.
UseCurrentThread();
CreateBackend(disk_cache::kNoBuffering);
- rv = GeneratePendingIO(&cb);
+ int rv = GeneratePendingIO(&cb);
- // cache_ has a pending operation, and extra_cache will go away.
- extra_cache.reset();
+ // cache_ has a pending operation, and backend_rv.backend will go away.
+ backend_rv.backend.reset();
if (rv == net::ERR_IO_PENDING)
EXPECT_FALSE(cb.have_result());
@@ -1107,16 +1115,16 @@ TEST_F(DiskCacheTest, TruncatedIndex) {
base::FilePath index = cache_path_.AppendASCII("index");
ASSERT_EQ(5, base::WriteFile(index, "hello", 5));
- net::TestCompletionCallback cb;
+ TestBackendResultCompletionCallback cb;
- std::unique_ptr<disk_cache::Backend> backend;
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE,
/*file_operations=*/nullptr, cache_path_, 0,
- disk_cache::ResetHandling::kNeverReset, nullptr, &backend, cb.callback());
- ASSERT_NE(net::OK, cb.GetResult(rv));
-
- ASSERT_FALSE(backend);
+ disk_cache::ResetHandling::kNeverReset, /*net_log=*/nullptr,
+ cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ ASSERT_NE(net::OK, rv.net_error);
+ ASSERT_FALSE(rv.backend);
}
#endif
@@ -1198,9 +1206,9 @@ void DiskCacheBackendTest::BackendLoad() {
srand(seed);
disk_cache::Entry* entries[kLargeNumEntries];
- for (int i = 0; i < kLargeNumEntries; i++) {
+ for (auto*& entry : entries) {
std::string key = GenerateKey(true);
- ASSERT_THAT(CreateEntry(key, &entries[i]), IsOk());
+ ASSERT_THAT(CreateEntry(key, &entry), IsOk());
}
EXPECT_EQ(kLargeNumEntries, cache_->GetEntryCount());
@@ -1212,13 +1220,13 @@ void DiskCacheBackendTest::BackendLoad() {
entries[source2] = temp;
}
- for (int i = 0; i < kLargeNumEntries; i++) {
- disk_cache::Entry* entry;
- ASSERT_THAT(OpenEntry(entries[i]->GetKey(), &entry), IsOk());
- EXPECT_TRUE(entry == entries[i]);
+ for (auto* entry : entries) {
+ disk_cache::Entry* new_entry;
+ ASSERT_THAT(OpenEntry(entry->GetKey(), &new_entry), IsOk());
+ EXPECT_TRUE(new_entry == entry);
+ new_entry->Close();
+ entry->Doom();
entry->Close();
- entries[i]->Doom();
- entries[i]->Close();
}
FlushQueueForTest();
EXPECT_EQ(0, cache_->GetEntryCount());
@@ -1472,9 +1480,9 @@ void DiskCacheBackendTest::BackendInvalidEntryWithLoad() {
const int kNumEntries = 100;
disk_cache::Entry* entries[kNumEntries];
- for (int i = 0; i < kNumEntries; i++) {
+ for (auto*& entry : entries) {
std::string key = GenerateKey(true);
- ASSERT_THAT(CreateEntry(key, &entries[i]), IsOk());
+ ASSERT_THAT(CreateEntry(key, &entry), IsOk());
}
EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
@@ -2519,8 +2527,8 @@ TEST_F(DiskCacheTest, WrongVersion) {
std::unique_ptr<disk_cache::BackendImpl> cache(
std::make_unique<disk_cache::BackendImpl>(cache_path_, nullptr, nullptr,
net::DISK_CACHE, nullptr));
- int rv = cache->Init(cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsError(net::ERR_FAILED));
+ cache->Init(cb.callback());
+ ASSERT_THAT(cb.WaitForResult(), IsError(net::ERR_FAILED));
}
// Tests that the disk cache successfully joins the control group, dropping the
@@ -2538,15 +2546,15 @@ TEST_F(DiskCacheTest, SimpleCacheControlJoin) {
// ExperimentControl group.
base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial",
"ExperimentControl");
- net::TestCompletionCallback cb;
- std::unique_ptr<disk_cache::Backend> base_cache;
- int rv = disk_cache::CreateCacheBackend(
+ TestBackendResultCompletionCallback cb;
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE,
/*file_operations=*/nullptr, cache_path_, 0,
- disk_cache::ResetHandling::kResetOnError, nullptr, &base_cache,
+ disk_cache::ResetHandling::kResetOnError, /*net_log=*/nullptr,
cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
- EXPECT_EQ(0, base_cache->GetEntryCount());
+ rv = cb.GetResult(std::move(rv));
+ ASSERT_THAT(rv.net_error, IsOk());
+ EXPECT_EQ(0, rv.backend->GetEntryCount());
}
#endif
@@ -2568,8 +2576,8 @@ TEST_F(DiskCacheTest, SimpleCacheControlRestart) {
for (int i = 0; i < kRestartCount; ++i) {
cache = std::make_unique<disk_cache::BackendImpl>(
cache_path_, nullptr, nullptr, net::DISK_CACHE, nullptr);
- int rv = cache->Init(cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
+ cache->Init(cb.callback());
+ ASSERT_THAT(cb.WaitForResult(), IsOk());
EXPECT_EQ(1, cache->GetEntryCount());
TestEntryResultCompletionCallback cb2;
@@ -2604,8 +2612,8 @@ TEST_F(DiskCacheTest, SimpleCacheControlLeave) {
std::unique_ptr<disk_cache::BackendImpl> cache(
std::make_unique<disk_cache::BackendImpl>(cache_path_, nullptr, nullptr,
net::DISK_CACHE, nullptr));
- int rv = cache->Init(cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
+ cache->Init(cb.callback());
+ ASSERT_THAT(cb.WaitForResult(), IsOk());
EXPECT_EQ(1, cache->GetEntryCount());
TestEntryResultCompletionCallback cb2;
@@ -2625,19 +2633,19 @@ TEST_F(DiskCacheBackendTest, DeleteOld) {
ASSERT_TRUE(CopyTestCache("wrong_version"));
SetNewEviction();
- net::TestCompletionCallback cb;
+ TestBackendResultCompletionCallback cb;
{
base::ScopedDisallowBlocking disallow_blocking;
base::FilePath path(cache_path_);
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE,
/*file_operations=*/nullptr, path, 0,
- disk_cache::ResetHandling::kResetOnError, nullptr, &cache_,
+ disk_cache::ResetHandling::kResetOnError, /*net_log=*/nullptr,
cb.callback());
path.clear(); // Make sure path was captured by the previous call.
- ASSERT_THAT(cb.GetResult(rv), IsOk());
+ rv = cb.GetResult(std::move(rv));
+ ASSERT_THAT(rv.net_error, IsOk());
}
- cache_.reset();
EXPECT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, /*max_size = */ 0,
mask_));
}
@@ -3727,30 +3735,33 @@ TEST_F(DiskCacheTest, MultipleInstances) {
ASSERT_TRUE(store1.CreateUniqueTempDir());
ASSERT_TRUE(store2.CreateUniqueTempDir());
- net::TestCompletionCallback cb;
+ TestBackendResultCompletionCallback cb;
const int kNumberOfCaches = 2;
- std::unique_ptr<disk_cache::Backend> cache[kNumberOfCaches];
+ std::unique_ptr<disk_cache::Backend> caches[kNumberOfCaches];
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, /*file_operations=*/nullptr,
- store1.GetPath(), 0, disk_cache::ResetHandling::kNeverReset, nullptr,
- &cache[0], cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
+ store1.GetPath(), 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ ASSERT_THAT(rv.net_error, IsOk());
+ caches[0] = std::move(rv.backend);
rv = disk_cache::CreateCacheBackend(
net::GENERATED_BYTE_CODE_CACHE, net::CACHE_BACKEND_DEFAULT,
/*file_operations=*/nullptr, store2.GetPath(), 0,
- disk_cache::ResetHandling::kNeverReset, nullptr, &cache[1],
+ disk_cache::ResetHandling::kNeverReset, /*net_log=*/nullptr,
cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
+ rv = cb.GetResult(std::move(rv));
+ ASSERT_THAT(rv.net_error, IsOk());
+ caches[1] = std::move(rv.backend);
- ASSERT_TRUE(cache[0].get() != nullptr && cache[1].get() != nullptr);
+ ASSERT_TRUE(caches[0].get() != nullptr && caches[1].get() != nullptr);
std::string key("the first key");
- for (int i = 0; i < kNumberOfCaches; i++) {
+ for (auto& cache : caches) {
TestEntryResultCompletionCallback cb2;
- EntryResult result =
- cache[i]->CreateEntry(key, net::HIGHEST, cb2.callback());
+ EntryResult result = cache->CreateEntry(key, net::HIGHEST, cb2.callback());
result = cb2.GetResult(std::move(result));
ASSERT_THAT(result.net_error(), IsOk());
result.ReleaseEntry()->Close();
@@ -3886,7 +3897,7 @@ TEST_F(DiskCacheBackendTest, FileSharing) {
base::FilePath name = cache_impl_->GetFileName(address);
{
- scoped_refptr<disk_cache::File> file(new disk_cache::File(false));
+ auto file = base::MakeRefCounted<disk_cache::File>(false);
file->Init(name);
#if BUILDFLAG(IS_WIN)
@@ -4135,8 +4146,8 @@ TEST_F(DiskCacheBackendTest, SimpleCacheOverBlockfileCache) {
/*file_operations_factory=*/nullptr, cache_path_, nullptr, nullptr, 0,
net::DISK_CACHE, nullptr);
net::TestCompletionCallback cb;
- int rv = simple_cache->Init(cb.callback());
- EXPECT_NE(net::OK, cb.GetResult(rv));
+ simple_cache->Init(cb.callback());
+ EXPECT_NE(net::OK, cb.WaitForResult());
simple_cache.reset();
DisableIntegrityCheck();
}
@@ -4158,13 +4169,13 @@ TEST_F(DiskCacheBackendTest, BlockfileCacheOverSimpleCache) {
cache_.reset();
// Check that the |BackendImpl| does not favor this structure.
- disk_cache::BackendImpl* cache = new disk_cache::BackendImpl(
+ auto cache = std::make_unique<disk_cache::BackendImpl>(
cache_path_, nullptr, nullptr, net::DISK_CACHE, nullptr);
cache->SetUnitTestMode();
net::TestCompletionCallback cb;
- int rv = cache->Init(cb.callback());
- EXPECT_NE(net::OK, cb.GetResult(rv));
- delete cache;
+ cache->Init(cb.callback());
+ EXPECT_NE(net::OK, cb.WaitForResult());
+ cache.reset();
DisableIntegrityCheck();
}
@@ -4630,8 +4641,8 @@ TEST_F(DiskCacheBackendTest, SimpleFdLimit) {
histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
disk_cache::FD_LIMIT_FAIL_REOPEN_FILE, 0);
- for (int i = 0; i < kLargeNumEntries; ++i) {
- entries[i]->Close();
+ for (auto* entry : entries) {
+ entry->Close();
RunUntilIdle();
}
alt_entry->Close();
@@ -4914,16 +4925,15 @@ TEST_F(DiskCacheBackendTest, EmptyCorruptSimpleCacheRecovery) {
ASSERT_EQ(static_cast<int>(kCorruptData.length()),
base::WriteFile(index, kCorruptData.data(), kCorruptData.length()));
- base::RunLoop run_loop;
- std::unique_ptr<disk_cache::Backend> cache;
- net::TestCompletionCallback cb;
+ TestBackendResultCompletionCallback cb;
// Simple cache should be able to recover.
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsOk());
}
TEST_F(DiskCacheBackendTest, MAYBE_NonEmptyCorruptSimpleCacheDoesNotRecover) {
@@ -4938,16 +4948,15 @@ TEST_F(DiskCacheBackendTest, MAYBE_NonEmptyCorruptSimpleCacheDoesNotRecover) {
ASSERT_EQ(static_cast<int>(kCorruptData.length()),
base::WriteFile(index, kCorruptData.data(), kCorruptData.length()));
- base::RunLoop run_loop;
- std::unique_ptr<disk_cache::Backend> cache;
- net::TestCompletionCallback cb;
+ TestBackendResultCompletionCallback cb;
// Simple cache should not be able to recover when there are entry files.
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsError(net::ERR_FAILED));
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsError(net::ERR_FAILED));
}
TEST_F(DiskCacheBackendTest, SimpleOwnershipTransferBackendDestroyRace) {
@@ -5014,15 +5023,16 @@ TEST_F(DiskCacheBackendTest, SimpleCacheSoftResetKeepsValues) {
CleanupCacheDir();
{ // Do the initial cache creation then delete the values.
- std::unique_ptr<disk_cache::Backend> cache;
- net::TestCompletionCallback cb;
+ TestBackendResultCompletionCallback cb;
// Create an initial back-end and wait for indexing
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsOk());
+ std::unique_ptr<disk_cache::Backend> cache = std::move(rv.backend);
ASSERT_TRUE(cache.get());
WaitForSimpleCacheIndexAndCheck(cache.get());
@@ -5033,14 +5043,15 @@ TEST_F(DiskCacheBackendTest, SimpleCacheSoftResetKeepsValues) {
RunUntilIdle();
{ // Do the second cache creation with no reset flag, preserving entries.
- std::unique_ptr<disk_cache::Backend> cache;
- net::TestCompletionCallback cb;
+ TestBackendResultCompletionCallback cb;
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsOk());
+ std::unique_ptr<disk_cache::Backend> cache = std::move(rv.backend);
ASSERT_TRUE(cache.get());
WaitForSimpleCacheIndexAndCheck(cache.get());
@@ -5059,14 +5070,15 @@ TEST_F(DiskCacheBackendTest, SimpleCacheHardResetDropsValues) {
CleanupCacheDir();
{ // Create the initial back-end.
- net::TestCompletionCallback cb;
- std::unique_ptr<disk_cache::Backend> cache;
+ TestBackendResultCompletionCallback cb;
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &cache,
- cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
+ cache_path_, 0, disk_cache::ResetHandling::kNeverReset,
+ /*net_log=*/nullptr, cb.callback());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsOk());
+ std::unique_ptr<disk_cache::Backend> cache = std::move(rv.backend);
ASSERT_TRUE(cache.get());
WaitForSimpleCacheIndexAndCheck(cache.get());
@@ -5077,14 +5089,15 @@ TEST_F(DiskCacheBackendTest, SimpleCacheHardResetDropsValues) {
RunUntilIdle();
{ // Re-load cache with a reset flag, which should ignore existing entries.
- net::TestCompletionCallback cb;
- std::unique_ptr<disk_cache::Backend> cache;
+ TestBackendResultCompletionCallback cb;
- int rv = disk_cache::CreateCacheBackend(
+ disk_cache::BackendResult rv = disk_cache::CreateCacheBackend(
net::APP_CACHE, net::CACHE_BACKEND_SIMPLE, /*file_operations=*/nullptr,
- cache_path_, 0, disk_cache::ResetHandling::kReset, nullptr, &cache,
+ cache_path_, 0, disk_cache::ResetHandling::kReset, /*net_log=*/nullptr,
cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
+ rv = cb.GetResult(std::move(rv));
+ EXPECT_THAT(rv.net_error, IsOk());
+ std::unique_ptr<disk_cache::Backend> cache = std::move(rv.backend);
ASSERT_TRUE(cache.get());
WaitForSimpleCacheIndexAndCheck(cache.get());
@@ -5435,3 +5448,44 @@ TEST_F(DiskCacheBackendTest, SimpleDoomAfterBackendDestruction) {
entry->Doom();
entry->Close();
}
+
+void DiskCacheBackendTest::BackendValidateMigrated() {
+ // Blockfile 3.0 migration test.
+ DisableFirstCleanup(); // started from copied dir, not cleaned dir.
+ InitCache();
+
+ // The total size comes straight from the headers, and is expected to be 1258
+ // for either set of testdata.
+ EXPECT_EQ(1258, CalculateSizeOfAllEntries());
+ EXPECT_EQ(1, cache_->GetEntryCount());
+
+ disk_cache::Entry* entry = nullptr;
+ ASSERT_THAT(OpenEntry("https://example.org/data", &entry), IsOk());
+
+ // Size of the actual payload.
+ EXPECT_EQ(1234, entry->GetDataSize(1));
+
+ entry->Close();
+}
+
+TEST_F(DiskCacheBackendTest, BlockfileMigrate20) {
+ ASSERT_TRUE(CopyTestCache("good_2_0"));
+ BackendValidateMigrated();
+}
+
+TEST_F(DiskCacheBackendTest, BlockfileMigrate21) {
+ ASSERT_TRUE(CopyTestCache("good_2_1"));
+ BackendValidateMigrated();
+}
+
+TEST_F(DiskCacheBackendTest, BlockfileMigrateNewEviction20) {
+ ASSERT_TRUE(CopyTestCache("good_2_0"));
+ SetNewEviction();
+ BackendValidateMigrated();
+}
+
+TEST_F(DiskCacheBackendTest, BlockfileMigrateNewEviction21) {
+ ASSERT_TRUE(CopyTestCache("good_2_1"));
+ SetNewEviction();
+ BackendValidateMigrated();
+}
diff --git a/chromium/net/disk_cache/blockfile/backend_impl.cc b/chromium/net/disk_cache/blockfile/backend_impl.cc
index 171551db4b2..25d81dce762 100644
--- a/chromium/net/disk_cache/blockfile/backend_impl.cc
+++ b/chromium/net/disk_cache/blockfile/backend_impl.cc
@@ -207,9 +207,8 @@ BackendImpl::~BackendImpl() {
}
}
-net::Error BackendImpl::Init(CompletionOnceCallback callback) {
+void BackendImpl::Init(CompletionOnceCallback callback) {
background_queue_.Init(std::move(callback));
- return net::ERR_IO_PENDING;
}
int BackendImpl::SyncInit() {
@@ -412,7 +411,7 @@ int BackendImpl::SyncDoomEntriesBetween(const base::Time initial_time,
return net::ERR_FAILED;
scoped_refptr<EntryImpl> node;
- std::unique_ptr<Rankings::Iterator> iterator(new Rankings::Iterator());
+ auto iterator = std::make_unique<Rankings::Iterator>();
scoped_refptr<EntryImpl> next = OpenNextEntryImpl(iterator.get());
if (!next)
return net::OK;
@@ -454,7 +453,7 @@ int BackendImpl::SyncDoomEntriesSince(const base::Time initial_time) {
stats_.OnEvent(Stats::DOOM_RECENT);
for (;;) {
- std::unique_ptr<Rankings::Iterator> iterator(new Rankings::Iterator());
+ auto iterator = std::make_unique<Rankings::Iterator>();
scoped_refptr<EntryImpl> entry = OpenNextEntryImpl(iterator.get());
if (!entry)
return net::OK;
@@ -514,7 +513,7 @@ scoped_refptr<EntryImpl> BackendImpl::OpenEntryImpl(const std::string& key) {
cache_entry = nullptr;
}
- int current_size = data_->header.num_bytes / (1024 * 1024);
+ int64_t current_size = data_->header.num_bytes / (1024 * 1024);
int64_t total_hours = stats_.GetCounter(Stats::TIMER) / 120;
int64_t no_use_hours = stats_.GetCounter(Stats::LAST_REPORT_TIMER) / 120;
int64_t use_hours = total_hours - no_use_hours;
@@ -594,8 +593,8 @@ scoped_refptr<EntryImpl> BackendImpl::CreateEntryImpl(const std::string& key) {
return nullptr;
}
- scoped_refptr<EntryImpl> cache_entry(
- new EntryImpl(this, entry_address, false));
+ auto cache_entry =
+ base::MakeRefCounted<EntryImpl>(this, entry_address, false);
IncreaseNumRefs();
if (!cache_entry->CreateEntry(node_address, key, hash)) {
@@ -1297,8 +1296,7 @@ class BackendImpl::IteratorImpl : public Backend::Iterator {
public:
explicit IteratorImpl(base::WeakPtr<InFlightBackendIO> background_queue)
: background_queue_(background_queue),
- iterator_(new Rankings::Iterator()) {
- }
+ iterator_(std::make_unique<Rankings::Iterator>()) {}
~IteratorImpl() override {
if (background_queue_)
@@ -1318,8 +1316,7 @@ class BackendImpl::IteratorImpl : public Backend::Iterator {
};
std::unique_ptr<Backend::Iterator> BackendImpl::CreateIterator() {
- return std::unique_ptr<Backend::Iterator>(
- new IteratorImpl(GetBackgroundQueue()));
+ return std::make_unique<IteratorImpl>(GetBackgroundQueue());
}
void BackendImpl::GetStats(StatsItems* stats) {
@@ -1364,11 +1361,6 @@ bool BackendImpl::CreateBackingStore(disk_cache::File* file) {
IndexHeader header;
header.table_len = DesiredIndexTableLen(max_size_);
-
- // We need file version 2.1 for the new eviction algorithm.
- if (new_eviction_)
- header.version = 0x20001;
-
header.create_time = Time::Now().ToInternalValue();
if (!file->Write(&header, sizeof(header), 0))
@@ -1390,7 +1382,7 @@ bool BackendImpl::CreateBackingStore(disk_cache::File* file) {
static_assert(sizeof(disk_cache::IndexHeader) < kPageSize,
"Code below assumes it wouldn't overwrite header by starting "
"at kPageSize");
- std::unique_ptr<char[]> page(new char[kPageSize]);
+ auto page = std::make_unique<char[]>(kPageSize);
memset(page.get(), 0, kPageSize);
for (size_t offset = kPageSize; offset < size; offset += kPageSize) {
@@ -1417,8 +1409,7 @@ bool BackendImpl::InitBackingStore(bool* file_created) {
bool ret = true;
*file_created = base_file.created();
- scoped_refptr<disk_cache::File> file(
- new disk_cache::File(std::move(base_file)));
+ auto file = base::MakeRefCounted<disk_cache::File>(std::move(base_file));
if (*file_created)
ret = CreateBackingStore(file.get());
@@ -1426,7 +1417,7 @@ bool BackendImpl::InitBackingStore(bool* file_created) {
if (!ret)
return false;
- index_ = new MappedFile();
+ index_ = base::MakeRefCounted<MappedFile>();
data_ = static_cast<Index*>(index_->Init(index_name, 0));
if (!data_) {
LOG(ERROR) << "Unable to map Index file";
@@ -1498,7 +1489,7 @@ bool BackendImpl::InitStats() {
if (!file)
return false;
- std::unique_ptr<char[]> data(new char[size]);
+ auto data = std::make_unique<char[]>(size);
size_t offset = address.start_block() * address.BlockSize() +
kBlockHeaderSize;
if (!file->Read(data.get(), size, offset))
@@ -1513,7 +1504,7 @@ bool BackendImpl::InitStats() {
void BackendImpl::StoreStats() {
int size = stats_.StorageSize();
- std::unique_ptr<char[]> data(new char[size]);
+ auto data = std::make_unique<char[]>(size);
Addr address;
size = stats_.SerializeStats(data.get(), size, &address);
DCHECK(size);
@@ -1593,8 +1584,7 @@ int BackendImpl::NewEntry(Addr address, scoped_refptr<EntryImpl>* entry) {
return ERR_INVALID_ADDRESS;
}
- scoped_refptr<EntryImpl> cache_entry(
- new EntryImpl(this, address, read_only_));
+ auto cache_entry = base::MakeRefCounted<EntryImpl>(this, address, read_only_);
IncreaseNumRefs();
*entry = nullptr;
@@ -1878,14 +1868,14 @@ void BackendImpl::LogStats() {
StatsItems stats;
GetStats(&stats);
- for (size_t index = 0; index < stats.size(); index++)
- VLOG(1) << stats[index].first << ": " << stats[index].second;
+ for (const auto& stat : stats)
+ VLOG(1) << stat.first << ": " << stat.second;
}
void BackendImpl::ReportStats() {
CACHE_UMA(COUNTS, "Entries", 0, data_->header.num_entries);
- int current_size = data_->header.num_bytes / (1024 * 1024);
+ int64_t current_size = data_->header.num_bytes / (1024 * 1024);
int max_size = max_size_ / (1024 * 1024);
int hit_ratio_as_percentage = stats_.GetHitRatio();
@@ -1958,7 +1948,7 @@ void BackendImpl::ReportStats() {
int64_t trim_rate = stats_.GetCounter(Stats::TRIM_ENTRY) / use_hours;
CACHE_UMA(COUNTS, "TrimRate", 0, static_cast<int>(trim_rate));
- int avg_size = data_->header.num_bytes / GetEntryCount();
+ int64_t avg_size = data_->header.num_bytes / GetEntryCount();
CACHE_UMA(COUNTS, "EntrySize", 0, avg_size);
CACHE_UMA(COUNTS, "EntriesFull", 0, data_->header.num_entries);
@@ -1988,11 +1978,19 @@ void BackendImpl::ReportStats() {
void BackendImpl::UpgradeTo2_1() {
// 2.1 is basically the same as 2.0, except that new fields are actually
// updated by the new eviction algorithm.
- DCHECK(0x20000 == data_->header.version);
- data_->header.version = 0x20001;
+ DCHECK_EQ(kVersion2_0, data_->header.version);
+ data_->header.version = kVersion2_1;
data_->header.lru.sizes[Rankings::NO_USE] = data_->header.num_entries;
}
+void BackendImpl::UpgradeTo3_0() {
+ // 3.0 uses a 64-bit size field.
+ DCHECK(kVersion2_0 == data_->header.version ||
+ kVersion2_1 == data_->header.version);
+ data_->header.version = kVersion3_0;
+ data_->header.num_bytes = data_->header.old_v2_num_bytes;
+}
+
bool BackendImpl::CheckIndex() {
DCHECK(data_);
@@ -2002,23 +2000,25 @@ bool BackendImpl::CheckIndex() {
return false;
}
- if (new_eviction_) {
- // We support versions 2.0 and 2.1, upgrading 2.0 to 2.1.
- if (kIndexMagic != data_->header.magic ||
- kCurrentVersion >> 16 != data_->header.version >> 16) {
- LOG(ERROR) << "Invalid file version or magic";
- return false;
- }
- if (kCurrentVersion == data_->header.version) {
- // We need file version 2.1 for the new eviction algorithm.
- UpgradeTo2_1();
- }
- } else {
- if (kIndexMagic != data_->header.magic ||
- kCurrentVersion != data_->header.version) {
- LOG(ERROR) << "Invalid file version or magic";
- return false;
- }
+ if (data_->header.magic != kIndexMagic) {
+ LOG(ERROR) << "Invalid file magic";
+ return false;
+ }
+
+ // 2.0 + new_eviction needs conversion to 2.1.
+ if (data_->header.version == kVersion2_0 && new_eviction_) {
+ UpgradeTo2_1();
+ }
+
+ // 2.0 or 2.1 can be upgraded to 3.0
+ if (data_->header.version == kVersion2_0 ||
+ data_->header.version == kVersion2_1) {
+ UpgradeTo3_0();
+ }
+
+ if (kCurrentVersion != data_->header.version) {
+ LOG(ERROR) << "Invalid file version";
+ return false;
}
if (!data_->header.table_len) {
@@ -2111,18 +2111,17 @@ bool BackendImpl::CheckEntry(EntryImpl* cache_entry) {
}
int BackendImpl::MaxBuffersSize() {
- static int64_t total_memory = base::SysInfo::AmountOfPhysicalMemory();
+ static uint64_t total_memory = base::SysInfo::AmountOfPhysicalMemory();
static bool done = false;
if (!done) {
- const int kMaxBuffersSize = 30 * 1024 * 1024;
+ done = true;
- // We want to use up to 2% of the computer's memory.
+ // We want to use up to 2% of the computer's memory, limit 30 MB.
total_memory = total_memory * 2 / 100;
- if (total_memory > kMaxBuffersSize || total_memory <= 0)
+ constexpr uint64_t kMaxBuffersSize = 30 * 1024 * 1024;
+ if (total_memory > kMaxBuffersSize || total_memory == 0)
total_memory = kMaxBuffersSize;
-
- done = true;
}
return static_cast<int>(total_memory);
diff --git a/chromium/net/disk_cache/blockfile/backend_impl.h b/chromium/net/disk_cache/blockfile/backend_impl.h
index 30129114e94..7190c3bd8c9 100644
--- a/chromium/net/disk_cache/blockfile/backend_impl.h
+++ b/chromium/net/disk_cache/blockfile/backend_impl.h
@@ -73,7 +73,8 @@ class NET_EXPORT_PRIVATE BackendImpl : public Backend {
~BackendImpl() override;
// Performs general initialization for this current instance of the cache.
- net::Error Init(CompletionOnceCallback callback);
+ // `callback` is always invoked asynchronously.
+ void Init(CompletionOnceCallback callback);
// Performs the actual initialization and final cleanup on destruction.
int SyncInit();
@@ -374,9 +375,13 @@ class NET_EXPORT_PRIVATE BackendImpl : public Backend {
// Send UMA stats.
void ReportStats();
- // Upgrades the index file to version 2.1.
+ // Upgrades the index file to version 2.1 (from 2.0)
void UpgradeTo2_1();
+ // Upgrades the index file to version 3.0
+ // (from 2.1/2.0 depending on eviction algorithm)
+ void UpgradeTo3_0();
+
// Performs basic checks on the index file. Returns false on failure.
bool CheckIndex();
diff --git a/chromium/net/disk_cache/blockfile/bitmap.cc b/chromium/net/disk_cache/blockfile/bitmap.cc
index a78dedac206..245d3df33f7 100644
--- a/chromium/net/disk_cache/blockfile/bitmap.cc
+++ b/chromium/net/disk_cache/blockfile/bitmap.cc
@@ -24,11 +24,13 @@ int FindLSBNonEmpty(uint32_t word, bool value) {
namespace disk_cache {
+Bitmap::Bitmap() = default;
+
Bitmap::Bitmap(int num_bits, bool clear_bits)
: num_bits_(num_bits),
array_size_(RequiredArraySize(num_bits)),
- alloc_(true) {
- map_ = new uint32_t[array_size_];
+ allocated_map_(std::make_unique<uint32_t[]>(array_size_)) {
+ map_ = allocated_map_.get();
// Initialize all of the bits.
if (clear_bits)
@@ -36,34 +38,28 @@ Bitmap::Bitmap(int num_bits, bool clear_bits)
}
Bitmap::Bitmap(uint32_t* map, int num_bits, int num_words)
- : map_(map),
- num_bits_(num_bits),
+ : num_bits_(num_bits),
// If size is larger than necessary, trim because array_size_ is used
// as a bound by various methods.
array_size_(std::min(RequiredArraySize(num_bits), num_words)),
- alloc_(false) {}
+ map_(map) {}
-Bitmap::~Bitmap() {
- if (alloc_)
- delete [] map_;
-}
+Bitmap::~Bitmap() = default;
void Bitmap::Resize(int num_bits, bool clear_bits) {
- DCHECK(alloc_ || !map_);
+ DCHECK(allocated_map_ || !map_);
const int old_maxsize = num_bits_;
const int old_array_size = array_size_;
array_size_ = RequiredArraySize(num_bits);
if (array_size_ != old_array_size) {
- uint32_t* new_map = new uint32_t[array_size_];
+ auto new_map = std::make_unique<uint32_t[]>(array_size_);
// Always clear the unused bits in the last word.
new_map[array_size_ - 1] = 0;
- memcpy(new_map, map_,
+ memcpy(new_map.get(), map_,
sizeof(*map_) * std::min(array_size_, old_array_size));
- if (alloc_)
- delete[] map_; // No need to check for NULL.
- map_ = new_map;
- alloc_ = true;
+ allocated_map_ = std::move(new_map);
+ map_ = allocated_map_.get();
}
num_bits_ = num_bits;
diff --git a/chromium/net/disk_cache/blockfile/bitmap.h b/chromium/net/disk_cache/blockfile/bitmap.h
index 71c5a4f9d75..9ffa98b9864 100644
--- a/chromium/net/disk_cache/blockfile/bitmap.h
+++ b/chromium/net/disk_cache/blockfile/bitmap.h
@@ -8,6 +8,8 @@
#include <stdint.h>
#include <string.h>
+#include <memory>
+
#include "base/memory/raw_ptr.h"
#include "net/base/net_export.h"
@@ -16,7 +18,7 @@ namespace disk_cache {
// This class provides support for simple maps of bits.
class NET_EXPORT_PRIVATE Bitmap {
public:
- Bitmap() : map_(nullptr), num_bits_(0), array_size_(0), alloc_(false) {}
+ Bitmap();
// This constructor will allocate on a uint32_t boundary. If |clear_bits| is
// false, the bitmap bits will not be initialized.
@@ -129,10 +131,10 @@ class NET_EXPORT_PRIVATE Bitmap {
// stored in the same word, and len < kIntBits.
void SetWordBits(int start, int len, bool value);
- raw_ptr<uint32_t> map_; // The bitmap.
- int num_bits_; // The upper bound of the bitmap.
- int array_size_; // The physical size (in uint32s) of the bitmap.
- bool alloc_; // Whether or not we allocated the memory.
+ int num_bits_ = 0; // The upper bound of the bitmap.
+ int array_size_ = 0; // The physical size (in uint32s) of the bitmap.
+ std::unique_ptr<uint32_t[]> allocated_map_; // The allocated data.
+ raw_ptr<uint32_t> map_ = nullptr; // The bitmap.
};
} // namespace disk_cache
diff --git a/chromium/net/disk_cache/blockfile/block_files.cc b/chromium/net/disk_cache/blockfile/block_files.cc
index 0297e67e3ed..afb9a5f95b2 100644
--- a/chromium/net/disk_cache/blockfile/block_files.cc
+++ b/chromium/net/disk_cache/blockfile/block_files.cc
@@ -394,8 +394,8 @@ bool BlockFiles::IsValid(Addr address) {
static bool read_contents = false;
if (read_contents) {
- std::unique_ptr<char[]> buffer;
- buffer.reset(new char[Addr::BlockSizeForFileType(BLOCK_4K) * 4]);
+ auto buffer =
+ std::make_unique<char[]>(Addr::BlockSizeForFileType(BLOCK_4K) * 4);
size_t size = address.BlockSize() * address.num_blocks();
size_t offset = address.start_block() * address.BlockSize() +
kBlockHeaderSize;
@@ -412,7 +412,7 @@ bool BlockFiles::CreateBlockFile(int index, FileType file_type, bool force) {
int flags = force ? base::File::FLAG_CREATE_ALWAYS : base::File::FLAG_CREATE;
flags |= base::File::FLAG_WRITE | base::File::FLAG_WIN_EXCLUSIVE_WRITE;
- scoped_refptr<File> file(new File(base::File(name, flags)));
+ auto file = base::MakeRefCounted<File>(base::File(name, flags));
if (!file->IsValid())
return false;
@@ -435,7 +435,7 @@ bool BlockFiles::OpenBlockFile(int index) {
}
base::FilePath name = Name(index);
- scoped_refptr<MappedFile> file(new MappedFile());
+ auto file = base::MakeRefCounted<MappedFile>();
if (!file->Init(name, kBlockHeaderSize)) {
LOG(ERROR) << "Failed to open " << name.value();
@@ -593,7 +593,7 @@ bool BlockFiles::RemoveEmptyFile(FileType block_type) {
// We get a new handle to the file and release the old one so that the
// file gets unmmaped... so we can delete it.
base::FilePath name = Name(file_index);
- scoped_refptr<File> this_file(new File(false));
+ auto this_file = base::MakeRefCounted<File>(false);
this_file->Init(name);
block_files_[file_index] = nullptr;
diff --git a/chromium/net/disk_cache/blockfile/block_files_unittest.cc b/chromium/net/disk_cache/blockfile/block_files_unittest.cc
index f674383381a..a2168ea9c86 100644
--- a/chromium/net/disk_cache/blockfile/block_files_unittest.cc
+++ b/chromium/net/disk_cache/blockfile/block_files_unittest.cc
@@ -47,8 +47,8 @@ TEST_F(DiskCacheTest, MAYBE_BlockFiles_Grow) {
Addr address[kMaxSize];
// Fill up the 32-byte block file (use three files).
- for (int i = 0; i < kMaxSize; i++) {
- EXPECT_TRUE(files.CreateBlock(RANKINGS, 4, &address[i]));
+ for (auto& addr : address) {
+ EXPECT_TRUE(files.CreateBlock(RANKINGS, 4, &addr));
}
EXPECT_EQ(6, NumberOfFiles(cache_path_));
@@ -73,13 +73,13 @@ TEST_F(DiskCacheTest, BlockFiles_Shrink) {
Addr address[kMaxSize];
// Fill up the 32-byte block file (use three files).
- for (int i = 0; i < kMaxSize; i++) {
- EXPECT_TRUE(files.CreateBlock(RANKINGS, 4, &address[i]));
+ for (auto& addr : address) {
+ EXPECT_TRUE(files.CreateBlock(RANKINGS, 4, &addr));
}
// Now delete all the blocks, so that we can delete the two extra files.
- for (int i = 0; i < kMaxSize; i++) {
- files.DeleteBlock(address[i], false);
+ for (const auto& addr : address) {
+ files.DeleteBlock(addr, false);
}
EXPECT_EQ(4, NumberOfFiles(cache_path_));
}
@@ -97,11 +97,11 @@ TEST_F(DiskCacheTest, BlockFiles_Recover) {
int seed = static_cast<int>(Time::Now().ToInternalValue());
srand(seed);
- for (int i = 0; i < kNumEntries; i++) {
+ for (auto& entry : entries) {
Addr address(0);
int size = (rand() % 4) + 1;
EXPECT_TRUE(files.CreateBlock(RANKINGS, size, &address));
- entries[i] = address.value();
+ entry = address.value();
}
for (int i = 0; i < kNumEntries; i++) {
@@ -173,7 +173,7 @@ TEST_F(DiskCacheTest, BlockFiles_ZeroSizeFile) {
files.CloseFiles();
// Truncate one of the files.
{
- scoped_refptr<File> file(new File);
+ auto file = base::MakeRefCounted<File>();
ASSERT_TRUE(file->Init(filename));
EXPECT_TRUE(file->SetLength(0));
}
@@ -196,7 +196,7 @@ TEST_F(DiskCacheTest, BlockFiles_TruncatedFile) {
files.CloseFiles();
// Truncate one of the files.
{
- scoped_refptr<File> file(new File);
+ auto file = base::MakeRefCounted<File>();
ASSERT_TRUE(file->Init(filename));
EXPECT_TRUE(file->SetLength(15000));
}
diff --git a/chromium/net/disk_cache/blockfile/disk_format.cc b/chromium/net/disk_cache/blockfile/disk_format.cc
index 4d398c28aa6..475c57f2cc4 100644
--- a/chromium/net/disk_cache/blockfile/disk_format.cc
+++ b/chromium/net/disk_cache/blockfile/disk_format.cc
@@ -6,6 +6,8 @@
namespace disk_cache {
+static_assert(sizeof(IndexHeader) == 368);
+
IndexHeader::IndexHeader() {
memset(this, 0, sizeof(*this));
magic = kIndexMagic;
diff --git a/chromium/net/disk_cache/blockfile/disk_format.h b/chromium/net/disk_cache/blockfile/disk_format.h
index a621ec17c56..94786f05279 100644
--- a/chromium/net/disk_cache/blockfile/disk_format.h
+++ b/chromium/net/disk_cache/blockfile/disk_format.h
@@ -56,7 +56,10 @@ namespace disk_cache {
const int kIndexTablesize = 0x10000;
const uint32_t kIndexMagic = 0xC103CAC3;
-const uint32_t kCurrentVersion = 0x20000; // Version 2.0.
+const uint32_t kVersion2_0 = 0x20000;
+const uint32_t kVersion2_1 = 0x20001;
+const uint32_t kVersion3_0 = 0x30000;
+const uint32_t kCurrentVersion = kVersion3_0;
struct LruData {
int32_t pad1[2];
@@ -77,7 +80,7 @@ struct NET_EXPORT_PRIVATE IndexHeader {
uint32_t magic;
uint32_t version;
int32_t num_entries; // Number of entries currently stored.
- int32_t num_bytes; // Total size of the stored data.
+ int32_t old_v2_num_bytes; // Total size of the stored data, in versions 2.x
int32_t last_file; // Last external file created.
int32_t this_id; // Id for all entries being changed (dirty flag).
CacheAddr stats; // Storage for usage data.
@@ -85,7 +88,8 @@ struct NET_EXPORT_PRIVATE IndexHeader {
int32_t crash; // Signals a previous crash.
int32_t experiment; // Id of an ongoing test.
uint64_t create_time; // Creation time for this set of files.
- int32_t pad[52];
+ int64_t num_bytes; // Total size of the stored data, in version 3.0
+ int32_t pad[50];
LruData lru; // Eviction control data.
};
diff --git a/chromium/net/disk_cache/blockfile/entry_impl.cc b/chromium/net/disk_cache/blockfile/entry_impl.cc
index 01859badd06..019c3aacd8f 100644
--- a/chromium/net/disk_cache/blockfile/entry_impl.cc
+++ b/chromium/net/disk_cache/blockfile/entry_impl.cc
@@ -319,9 +319,6 @@ EntryImpl::EntryImpl(BackendImpl* backend, Addr address, bool read_only)
backend_(backend->GetWeakPtr()),
read_only_(read_only) {
entry_.LazyInit(backend->File(address), address);
- for (int i = 0; i < kNumStreams; i++) {
- unreported_size_[i] = 0;
- }
}
void EntryImpl::DoomImpl() {
@@ -1307,7 +1304,7 @@ File* EntryImpl::GetExternalFile(Addr address, int index) {
DCHECK(index >= 0 && index <= kKeyFileIndex);
if (!files_[index].get()) {
// For a key file, use mixed mode IO.
- scoped_refptr<File> file(new File(kKeyFileIndex == index));
+ auto file = base::MakeRefCounted<File>(kKeyFileIndex == index);
if (file->Init(backend_->GetFileName(address)))
files_[index].swap(file);
}
@@ -1563,7 +1560,7 @@ int EntryImpl::InitSparseData() {
return net::OK;
// Use a local variable so that sparse_ never goes from 'valid' to NULL.
- std::unique_ptr<SparseControl> sparse(new SparseControl(this));
+ auto sparse = std::make_unique<SparseControl>(this);
int result = sparse->Init();
if (net::OK == result)
sparse_.swap(sparse);
@@ -1580,7 +1577,9 @@ uint32_t EntryImpl::GetEntryFlags() {
return entry_.Data()->flags;
}
-void EntryImpl::GetData(int index, char** buffer, Addr* address) {
+void EntryImpl::GetData(int index,
+ std::unique_ptr<char[]>* buffer,
+ Addr* address) {
DCHECK(backend_.get());
if (user_buffers_[index].get() && user_buffers_[index]->Size() &&
!user_buffers_[index]->Start()) {
@@ -1588,8 +1587,8 @@ void EntryImpl::GetData(int index, char** buffer, Addr* address) {
int data_len = entry_.Data()->data_size[index];
if (data_len <= user_buffers_[index]->Size()) {
DCHECK(!user_buffers_[index]->Start());
- *buffer = new char[data_len];
- memcpy(*buffer, user_buffers_[index]->Data(), data_len);
+ *buffer = std::make_unique<char[]>(data_len);
+ memcpy(buffer->get(), user_buffers_[index]->Data(), data_len);
return;
}
}
diff --git a/chromium/net/disk_cache/blockfile/entry_impl.h b/chromium/net/disk_cache/blockfile/entry_impl.h
index b758719b7f6..40ad359c067 100644
--- a/chromium/net/disk_cache/blockfile/entry_impl.h
+++ b/chromium/net/disk_cache/blockfile/entry_impl.h
@@ -291,7 +291,7 @@ class NET_EXPORT_PRIVATE EntryImpl
// responsible for deleting the block (or file) from the backing store at some
// point; there is no need to report any storage-size change, only to do the
// actual cleanup.
- void GetData(int index, char** buffer, Addr* address);
+ void GetData(int index, std::unique_ptr<char[]>* buffer, Addr* address);
// |net_log_| should be early since some field destructors (at least
// ~SparseControl) can touch it.
@@ -304,7 +304,8 @@ class NET_EXPORT_PRIVATE EntryImpl
// Files to store external user data and key.
scoped_refptr<File> files_[kNumStreams + 1];
mutable std::string key_; // Copy of the key.
- int unreported_size_[kNumStreams]; // Bytes not reported yet to the backend.
+ // Bytes not reported yet to the backend.
+ int unreported_size_[kNumStreams] = {};
bool doomed_ = false; // True if this entry was removed from the cache.
bool read_only_; // True if not yet writing.
bool dirty_ = false; // True if we detected that this is a dirty entry.
diff --git a/chromium/net/disk_cache/blockfile/file.h b/chromium/net/disk_cache/blockfile/file.h
index 6e02091d473..94b16d4acf2 100644
--- a/chromium/net/disk_cache/blockfile/file.h
+++ b/chromium/net/disk_cache/blockfile/file.h
@@ -27,7 +27,7 @@ class FileIOCallback {
virtual void OnFileIOComplete(int bytes_copied) = 0;
protected:
- virtual ~FileIOCallback() {}
+ virtual ~FileIOCallback() = default;
};
// Simple wrapper around a file that allows asynchronous operations.
diff --git a/chromium/net/disk_cache/blockfile/file_block.h b/chromium/net/disk_cache/blockfile/file_block.h
index 4250dd1b492..cf9e4f793ca 100644
--- a/chromium/net/disk_cache/blockfile/file_block.h
+++ b/chromium/net/disk_cache/blockfile/file_block.h
@@ -16,7 +16,7 @@ namespace disk_cache {
// Used to simplify loading / storing the block from disk.
class FileBlock {
public:
- virtual ~FileBlock() {}
+ virtual ~FileBlock() = default;
// Returns a pointer to the actual data.
virtual void* buffer() const = 0;
diff --git a/chromium/net/disk_cache/blockfile/file_ios.cc b/chromium/net/disk_cache/blockfile/file_ios.cc
index c325d17a278..c910da3c82f 100644
--- a/chromium/net/disk_cache/blockfile/file_ios.cc
+++ b/chromium/net/disk_cache/blockfile/file_ios.cc
@@ -70,12 +70,12 @@ class FileBackgroundIO : public disk_cache::BackgroundIO {
// The specialized controller that keeps track of current operations.
class FileInFlightIO : public disk_cache::InFlightIO {
public:
- FileInFlightIO() {}
+ FileInFlightIO() = default;
FileInFlightIO(const FileInFlightIO&) = delete;
FileInFlightIO& operator=(const FileInFlightIO&) = delete;
- ~FileInFlightIO() override {}
+ ~FileInFlightIO() override = default;
// These methods start an asynchronous operation. The arguments have the same
// semantics of the File asynchronous operations, with the exception that the
@@ -118,8 +118,8 @@ void FileBackgroundIO::Write() {
void FileInFlightIO::PostRead(disk_cache::File *file, void* buf, size_t buf_len,
size_t offset, disk_cache::FileIOCallback *callback) {
- scoped_refptr<FileBackgroundIO> operation(
- new FileBackgroundIO(file, buf, buf_len, offset, callback, this));
+ auto operation = base::MakeRefCounted<FileBackgroundIO>(
+ file, buf, buf_len, offset, callback, this);
file->AddRef(); // Balanced on OnOperationComplete()
base::ThreadPool::PostTask(
@@ -132,8 +132,8 @@ void FileInFlightIO::PostRead(disk_cache::File *file, void* buf, size_t buf_len,
void FileInFlightIO::PostWrite(disk_cache::File* file, const void* buf,
size_t buf_len, size_t offset,
disk_cache::FileIOCallback* callback) {
- scoped_refptr<FileBackgroundIO> operation(
- new FileBackgroundIO(file, buf, buf_len, offset, callback, this));
+ auto operation = base::MakeRefCounted<FileBackgroundIO>(
+ file, buf, buf_len, offset, callback, this);
file->AddRef(); // Balanced on OnOperationComplete()
base::ThreadPool::PostTask(
@@ -157,7 +157,7 @@ void FileInFlightIO::OnOperationComplete(disk_cache::BackgroundIO* operation,
}
// A static object that will broker all async operations.
-FileInFlightIO* s_file_operations = NULL;
+FileInFlightIO* s_file_operations = nullptr;
// Returns the current FileInFlightIO.
FileInFlightIO* GetFileInFlightIO() {
@@ -171,7 +171,7 @@ FileInFlightIO* GetFileInFlightIO() {
void DeleteFileInFlightIO() {
DCHECK(s_file_operations);
delete s_file_operations;
- s_file_operations = NULL;
+ s_file_operations = nullptr;
}
} // namespace
@@ -285,8 +285,7 @@ void File::DropPendingIO() {
DeleteFileInFlightIO();
}
-File::~File() {
-}
+File::~File() = default;
base::PlatformFile File::platform_file() const {
return base_file_.GetPlatformFile();
diff --git a/chromium/net/disk_cache/blockfile/file_win.cc b/chromium/net/disk_cache/blockfile/file_win.cc
index 6f5724d8c24..61c98814383 100644
--- a/chromium/net/disk_cache/blockfile/file_win.cc
+++ b/chromium/net/disk_cache/blockfile/file_win.cc
@@ -63,7 +63,8 @@ class CompletionHandler : public base::MessagePumpForIO::IOHandler,
class CompletionHandlerHolder {
public:
- CompletionHandlerHolder() { completion_handler_ = new CompletionHandler; }
+ CompletionHandlerHolder()
+ : completion_handler_(base::MakeRefCounted<CompletionHandler>()) {}
CompletionHandler* completion_handler() { return completion_handler_.get(); }
@@ -215,8 +216,7 @@ bool File::Write(const void* buffer, size_t buffer_len, size_t offset,
return AsyncWrite(buffer, buffer_len, offset, callback, completed);
}
-File::~File() {
-}
+File::~File() = default;
base::PlatformFile File::platform_file() const {
DCHECK(init_);
diff --git a/chromium/net/disk_cache/blockfile/in_flight_backend_io.cc b/chromium/net/disk_cache/blockfile/in_flight_backend_io.cc
index 0f18911f4f2..98bb1ec43ae 100644
--- a/chromium/net/disk_cache/blockfile/in_flight_backend_io.cc
+++ b/chromium/net/disk_cache/blockfile/in_flight_backend_io.cc
@@ -86,7 +86,7 @@ void BackendIO::OnDone(bool cancel) {
if (ReturnsEntry() && result_ == net::OK) {
static_cast<EntryImpl*>(out_entry_)->OnEntryCreated(backend_);
if (cancel)
- out_entry_->Close();
+ out_entry_.ExtractAsDangling()->Close();
}
}
@@ -319,6 +319,9 @@ void BackendIO::ExecuteBackendOperation() {
result_ = backend_->SyncOpenNextEntry(iterator_, &entry);
out_entry_ = LeakEntryImpl(std::move(entry));
out_entry_opened_ = true;
+ // `iterator_` is a proxied argument and not needed beyond this point. Set
+ // it to nullptr so as to not leave a dangling pointer around.
+ iterator_ = nullptr;
break;
}
case OP_END_ENUMERATION:
@@ -407,47 +410,47 @@ InFlightBackendIO::InFlightBackendIO(
InFlightBackendIO::~InFlightBackendIO() = default;
void InFlightBackendIO::Init(net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->Init();
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::OpenOrCreateEntry(const std::string& key,
EntryResultCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->OpenOrCreateEntry(key);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::OpenEntry(const std::string& key,
EntryResultCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->OpenEntry(key);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::CreateEntry(const std::string& key,
EntryResultCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->CreateEntry(key);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::DoomEntry(const std::string& key,
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->DoomEntry(key);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::DoomAllEntries(net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->DoomAllEntries();
PostOperation(FROM_HERE, operation.get());
}
@@ -456,76 +459,76 @@ void InFlightBackendIO::DoomEntriesBetween(
const base::Time initial_time,
const base::Time end_time,
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->DoomEntriesBetween(initial_time, end_time);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::CalculateSizeOfAllEntries(
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->CalculateSizeOfAllEntries();
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::DoomEntriesSince(const base::Time initial_time,
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->DoomEntriesSince(initial_time);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::OpenNextEntry(Rankings::Iterator* iterator,
EntryResultCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->OpenNextEntry(iterator);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::EndEnumeration(
std::unique_ptr<Rankings::Iterator> iterator) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, net::CompletionOnceCallback()));
+ auto operation = base::MakeRefCounted<BackendIO>(
+ this, backend_, net::CompletionOnceCallback());
operation->EndEnumeration(std::move(iterator));
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::OnExternalCacheHit(const std::string& key) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, net::CompletionOnceCallback()));
+ auto operation = base::MakeRefCounted<BackendIO>(
+ this, backend_, net::CompletionOnceCallback());
operation->OnExternalCacheHit(key);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::CloseEntryImpl(EntryImpl* entry) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, net::CompletionOnceCallback()));
+ auto operation = base::MakeRefCounted<BackendIO>(
+ this, backend_, net::CompletionOnceCallback());
operation->CloseEntryImpl(entry);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::DoomEntryImpl(EntryImpl* entry) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, net::CompletionOnceCallback()));
+ auto operation = base::MakeRefCounted<BackendIO>(
+ this, backend_, net::CompletionOnceCallback());
operation->DoomEntryImpl(entry);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::FlushQueue(net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->FlushQueue();
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::RunTask(base::OnceClosure task,
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->RunTask(std::move(task));
PostOperation(FROM_HERE, operation.get());
}
@@ -536,8 +539,8 @@ void InFlightBackendIO::ReadData(EntryImpl* entry,
net::IOBuffer* buf,
int buf_len,
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->ReadData(entry, index, offset, buf, buf_len);
PostOperation(FROM_HERE, operation.get());
}
@@ -549,8 +552,8 @@ void InFlightBackendIO::WriteData(EntryImpl* entry,
int buf_len,
bool truncate,
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->WriteData(entry, index, offset, buf, buf_len, truncate);
PostOperation(FROM_HERE, operation.get());
}
@@ -560,8 +563,8 @@ void InFlightBackendIO::ReadSparseData(EntryImpl* entry,
net::IOBuffer* buf,
int buf_len,
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->ReadSparseData(entry, offset, buf, buf_len);
PostOperation(FROM_HERE, operation.get());
}
@@ -571,8 +574,8 @@ void InFlightBackendIO::WriteSparseData(EntryImpl* entry,
net::IOBuffer* buf,
int buf_len,
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->WriteSparseData(entry, offset, buf, buf_len);
PostOperation(FROM_HERE, operation.get());
}
@@ -581,23 +584,23 @@ void InFlightBackendIO::GetAvailableRange(EntryImpl* entry,
int64_t offset,
int len,
RangeResultCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->GetAvailableRange(entry, offset, len);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::CancelSparseIO(EntryImpl* entry) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, net::CompletionOnceCallback()));
+ auto operation = base::MakeRefCounted<BackendIO>(
+ this, backend_, net::CompletionOnceCallback());
operation->CancelSparseIO(entry);
PostOperation(FROM_HERE, operation.get());
}
void InFlightBackendIO::ReadyForSparseIO(EntryImpl* entry,
net::CompletionOnceCallback callback) {
- scoped_refptr<BackendIO> operation(
- new BackendIO(this, backend_, std::move(callback)));
+ auto operation =
+ base::MakeRefCounted<BackendIO>(this, backend_, std::move(callback));
operation->ReadyForSparseIO(entry);
PostOperation(FROM_HERE, operation.get());
}
diff --git a/chromium/net/disk_cache/blockfile/in_flight_backend_io.h b/chromium/net/disk_cache/blockfile/in_flight_backend_io.h
index 7c67dc98031..180f3ef8289 100644
--- a/chromium/net/disk_cache/blockfile/in_flight_backend_io.h
+++ b/chromium/net/disk_cache/blockfile/in_flight_backend_io.h
@@ -154,7 +154,7 @@ class BackendIO : public BackgroundIO {
void ExecuteBackendOperation();
void ExecuteEntryOperation();
- raw_ptr<BackendImpl> backend_;
+ raw_ptr<BackendImpl, DanglingUntriaged> backend_;
net::CompletionOnceCallback callback_;
Operation operation_ = OP_NONE;
diff --git a/chromium/net/disk_cache/blockfile/in_flight_io.h b/chromium/net/disk_cache/blockfile/in_flight_io.h
index 320775a3948..cc83583d340 100644
--- a/chromium/net/disk_cache/blockfile/in_flight_io.h
+++ b/chromium/net/disk_cache/blockfile/in_flight_io.h
@@ -68,7 +68,7 @@ class BackgroundIO : public base::RefCountedThreadSafe<BackgroundIO> {
// An event to signal when the operation completes.
base::WaitableEvent io_completed_;
- raw_ptr<InFlightIO>
+ raw_ptr<InFlightIO, DanglingUntriaged>
controller_; // The controller that tracks all operations.
base::Lock controller_lock_; // A lock protecting clearing of controller_.
};
diff --git a/chromium/net/disk_cache/blockfile/mapped_file.cc b/chromium/net/disk_cache/blockfile/mapped_file.cc
index b2fedd2c787..7cac41e5d48 100644
--- a/chromium/net/disk_cache/blockfile/mapped_file.cc
+++ b/chromium/net/disk_cache/blockfile/mapped_file.cc
@@ -23,7 +23,7 @@ bool MappedFile::Store(const FileBlock* block) {
bool MappedFile::Preload() {
size_t file_len = GetLength();
- std::unique_ptr<char[]> buf(new char[file_len]);
+ auto buf = std::make_unique<char[]>(file_len);
if (!Read(buf.get(), file_len, 0))
return false;
return true;
diff --git a/chromium/net/disk_cache/blockfile/mapped_file_posix.cc b/chromium/net/disk_cache/blockfile/mapped_file_posix.cc
index 7921ffdf40f..bc94afc7d80 100644
--- a/chromium/net/disk_cache/blockfile/mapped_file_posix.cc
+++ b/chromium/net/disk_cache/blockfile/mapped_file_posix.cc
@@ -31,7 +31,7 @@ void* MappedFile::Init(const base::FilePath& name, size_t size) {
buffer_ = nullptr;
// Make sure we detect hardware failures reading the headers.
- std::unique_ptr<char[]> temp(new char[temp_len]);
+ auto temp = std::make_unique<char[]>(temp_len);
if (!Read(temp.get(), temp_len, 0))
return nullptr;
diff --git a/chromium/net/disk_cache/blockfile/mapped_file_unittest.cc b/chromium/net/disk_cache/blockfile/mapped_file_unittest.cc
index b9147fd0e89..d8bfb6eca48 100644
--- a/chromium/net/disk_cache/blockfile/mapped_file_unittest.cc
+++ b/chromium/net/disk_cache/blockfile/mapped_file_unittest.cc
@@ -44,7 +44,7 @@ void FileCallbackTest::OnFileIOComplete(int bytes_copied) {
TEST_F(DiskCacheTest, MappedFile_SyncIO) {
base::FilePath filename = cache_path_.AppendASCII("a_test");
- scoped_refptr<disk_cache::MappedFile> file(new disk_cache::MappedFile);
+ auto file = base::MakeRefCounted<disk_cache::MappedFile>();
ASSERT_TRUE(CreateCacheTestFile(filename));
ASSERT_TRUE(file->Init(filename, 8192));
@@ -59,7 +59,7 @@ TEST_F(DiskCacheTest, MappedFile_SyncIO) {
TEST_F(DiskCacheTest, MappedFile_AsyncIO) {
base::FilePath filename = cache_path_.AppendASCII("a_test");
- scoped_refptr<disk_cache::MappedFile> file(new disk_cache::MappedFile);
+ auto file = base::MakeRefCounted<disk_cache::MappedFile>();
ASSERT_TRUE(CreateCacheTestFile(filename));
ASSERT_TRUE(file->Init(filename, 8192));
diff --git a/chromium/net/disk_cache/blockfile/mapped_file_win.cc b/chromium/net/disk_cache/blockfile/mapped_file_win.cc
index 5829dcc4a28..3cc771e4951 100644
--- a/chromium/net/disk_cache/blockfile/mapped_file_win.cc
+++ b/chromium/net/disk_cache/blockfile/mapped_file_win.cc
@@ -32,7 +32,7 @@ void* MappedFile::Init(const base::FilePath& name, size_t size) {
// Make sure we detect hardware failures reading the headers.
size_t temp_len = size ? size : 4096;
- std::unique_ptr<char[]> temp(new char[temp_len]);
+ auto temp = std::make_unique<char[]>(temp_len);
if (!Read(temp.get(), temp_len, 0))
return nullptr;
diff --git a/chromium/net/disk_cache/blockfile/rankings.cc b/chromium/net/disk_cache/blockfile/rankings.cc
index 0b8a06875ee..d7bb61fdbf7 100644
--- a/chromium/net/disk_cache/blockfile/rankings.cc
+++ b/chromium/net/disk_cache/blockfile/rankings.cc
@@ -212,8 +212,9 @@ Rankings::Iterator::Iterator() {
void Rankings::Iterator::Reset() {
if (my_rankings) {
- for (int i = 0; i < 3; i++)
- ScopedRankingsBlock(my_rankings, nodes[i]);
+ for (auto* node : nodes) {
+ ScopedRankingsBlock(my_rankings, node);
+ }
}
memset(this, 0, sizeof(Iterator));
}
@@ -875,9 +876,9 @@ bool Rankings::IsTail(CacheAddr addr, List* list) const {
// of cache iterators and update all that are pointing to the given node.
void Rankings::UpdateIterators(CacheRankingsBlock* node) {
CacheAddr address = node->address().value();
- for (auto it = iterators_.begin(); it != iterators_.end(); ++it) {
- if (it->first == address && it->second->HasData()) {
- CacheRankingsBlock* other = it->second;
+ for (auto& iterator : iterators_) {
+ if (iterator.first == address && iterator.second->HasData()) {
+ CacheRankingsBlock* other = iterator.second;
if (other != node)
*other->Data() = *node->Data();
}
@@ -887,10 +888,10 @@ void Rankings::UpdateIterators(CacheRankingsBlock* node) {
void Rankings::UpdateIteratorsForRemoved(CacheAddr address,
CacheRankingsBlock* next) {
CacheAddr next_addr = next->address().value();
- for (auto it = iterators_.begin(); it != iterators_.end(); ++it) {
- if (it->first == address) {
- it->first = next_addr;
- it->second->CopyFrom(next);
+ for (auto& iterator : iterators_) {
+ if (iterator.first == address) {
+ iterator.first = next_addr;
+ iterator.second->CopyFrom(next);
}
}
}
diff --git a/chromium/net/disk_cache/blockfile/sparse_control.cc b/chromium/net/disk_cache/blockfile/sparse_control.cc
index 96cb03cf840..6fe761e39e6 100644
--- a/chromium/net/disk_cache/blockfile/sparse_control.cc
+++ b/chromium/net/disk_cache/blockfile/sparse_control.cc
@@ -77,7 +77,7 @@ class ChildrenDeleter
// Two ways of deleting the children: if we have the children map, use Start()
// directly, otherwise pass the data address to ReadData().
- void Start(char* buffer, int len);
+ void Start(std::unique_ptr<char[]> buffer, int len);
void ReadData(disk_cache::Addr address, int len);
private:
@@ -95,19 +95,18 @@ class ChildrenDeleter
// This is the callback of the file operation.
void ChildrenDeleter::OnFileIOComplete(int bytes_copied) {
- char* buffer = buffer_.release();
- Start(buffer, bytes_copied);
+ Start(std::move(buffer_), bytes_copied);
}
-void ChildrenDeleter::Start(char* buffer, int len) {
- buffer_.reset(buffer);
+void ChildrenDeleter::Start(std::unique_ptr<char[]> buffer, int len) {
+ buffer_ = std::move(buffer);
if (len < static_cast<int>(sizeof(disk_cache::SparseData)))
return Release();
// Just copy the information from |buffer|, delete |buffer| and start deleting
// the child entries.
disk_cache::SparseData* data =
- reinterpret_cast<disk_cache::SparseData*>(buffer);
+ reinterpret_cast<disk_cache::SparseData*>(buffer_.get());
signature_ = data->header.signature;
int num_bits = (len - sizeof(disk_cache::SparseHeader)) * 8;
@@ -130,7 +129,7 @@ void ChildrenDeleter::ReadData(disk_cache::Addr address, int len) {
size_t file_offset = address.start_block() * address.BlockSize() +
disk_cache::kBlockHeaderSize;
- buffer_.reset(new char[len]);
+ buffer_ = std::make_unique<char[]>(len);
bool completed;
if (!file->Read(buffer_.get(), len, file_offset, this, &completed))
return Release();
@@ -375,7 +374,7 @@ void SparseControl::DeleteChildren(EntryImpl* entry) {
if (map_len > kMaxMapSize || map_len % 4)
return;
- char* buffer;
+ std::unique_ptr<char[]> buffer;
Addr address;
entry->GetData(kSparseIndex, &buffer, &address);
if (!buffer && !address.is_initialized())
@@ -391,8 +390,8 @@ void SparseControl::DeleteChildren(EntryImpl* entry) {
if (buffer) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::BindOnce(&ChildrenDeleter::Start, deleter, buffer, data_len));
+ FROM_HERE, base::BindOnce(&ChildrenDeleter::Start, deleter,
+ std::move(buffer), data_len));
} else {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
diff --git a/chromium/net/disk_cache/blockfile/stats.cc b/chromium/net/disk_cache/blockfile/stats.cc
index fc867fdc41a..5023bc4a056 100644
--- a/chromium/net/disk_cache/blockfile/stats.cc
+++ b/chromium/net/disk_cache/blockfile/stats.cc
@@ -139,11 +139,11 @@ void Stats::InitSizeHistogram() {
return;
first_time = false;
- for (int i = 0; i < kDataSizesLength; i++) {
+ for (int& data_size : data_sizes_) {
// This is a good time to fix any inconsistent data. The count should be
// always positive, but if it's not, reset the value now.
- if (data_sizes_[i] < 0)
- data_sizes_[i] = 0;
+ if (data_size < 0)
+ data_size = 0;
}
}
diff --git a/chromium/net/disk_cache/blockfile/stats_unittest.cc b/chromium/net/disk_cache/blockfile/stats_unittest.cc
index afe31d9f40e..be15cbf93aa 100644
--- a/chromium/net/disk_cache/blockfile/stats_unittest.cc
+++ b/chromium/net/disk_cache/blockfile/stats_unittest.cc
@@ -17,7 +17,7 @@ TEST(DiskCacheStatsTest, Init) {
TEST(DiskCacheStatsTest, InitWithEmptyBuffer) {
disk_cache::Stats stats;
int required_len = stats.StorageSize();
- std::unique_ptr<char[]> storage(new char[required_len]);
+ auto storage = std::make_unique<char[]>(required_len);
memset(storage.get(), 0, required_len);
ASSERT_TRUE(stats.Init(storage.get(), required_len, disk_cache::Addr()));
@@ -27,7 +27,7 @@ TEST(DiskCacheStatsTest, InitWithEmptyBuffer) {
TEST(DiskCacheStatsTest, FailsInit) {
disk_cache::Stats stats;
int required_len = stats.StorageSize();
- std::unique_ptr<char[]> storage(new char[required_len]);
+ auto storage = std::make_unique<char[]>(required_len);
memset(storage.get(), 0, required_len);
// Try a small buffer.
@@ -41,7 +41,7 @@ TEST(DiskCacheStatsTest, FailsInit) {
}
TEST(DiskCacheStatsTest, SaveRestore) {
- std::unique_ptr<disk_cache::Stats> stats(new disk_cache::Stats);
+ auto stats = std::make_unique<disk_cache::Stats>();
disk_cache::Addr addr(5);
ASSERT_TRUE(stats->Init(nullptr, 0, addr));
@@ -52,7 +52,7 @@ TEST(DiskCacheStatsTest, SaveRestore) {
stats->OnEvent(disk_cache::Stats::DOOM_RECENT);
int required_len = stats->StorageSize();
- std::unique_ptr<char[]> storage(new char[required_len]);
+ auto storage = std::make_unique<char[]>(required_len);
disk_cache::Addr out_addr;
int real_len = stats->SerializeStats(storage.get(), required_len, &out_addr);
EXPECT_GE(required_len, real_len);
diff --git a/chromium/net/disk_cache/blockfile/storage_block.h b/chromium/net/disk_cache/blockfile/storage_block.h
index f0bb68c05a9..e367c3bb0fa 100644
--- a/chromium/net/disk_cache/blockfile/storage_block.h
+++ b/chromium/net/disk_cache/blockfile/storage_block.h
@@ -39,7 +39,7 @@ class StorageBlock : public FileBlock {
StorageBlock(const StorageBlock&) = delete;
StorageBlock& operator=(const StorageBlock&) = delete;
- virtual ~StorageBlock();
+ ~StorageBlock() override;
// Deeps copies from another block. Neither this nor |other| should be
// |modified|.
diff --git a/chromium/net/disk_cache/blockfile/storage_block_unittest.cc b/chromium/net/disk_cache/blockfile/storage_block_unittest.cc
index 9992edc4d60..7d7c13befaf 100644
--- a/chromium/net/disk_cache/blockfile/storage_block_unittest.cc
+++ b/chromium/net/disk_cache/blockfile/storage_block_unittest.cc
@@ -14,7 +14,7 @@ typedef disk_cache::StorageBlock<disk_cache::EntryStore> CacheEntryBlock;
TEST_F(DiskCacheTest, StorageBlock_LoadStore) {
base::FilePath filename = cache_path_.AppendASCII("a_test");
- scoped_refptr<disk_cache::MappedFile> file(new disk_cache::MappedFile);
+ auto file = base::MakeRefCounted<disk_cache::MappedFile>();
ASSERT_TRUE(CreateCacheTestFile(filename));
ASSERT_TRUE(file->Init(filename, 8192));
@@ -34,7 +34,7 @@ TEST_F(DiskCacheTest, StorageBlock_LoadStore) {
TEST_F(DiskCacheTest, StorageBlock_SetData) {
base::FilePath filename = cache_path_.AppendASCII("a_test");
- scoped_refptr<disk_cache::MappedFile> file(new disk_cache::MappedFile);
+ auto file = base::MakeRefCounted<disk_cache::MappedFile>();
ASSERT_TRUE(CreateCacheTestFile(filename));
ASSERT_TRUE(file->Init(filename, 8192));
@@ -54,17 +54,17 @@ TEST_F(DiskCacheTest, StorageBlock_SetData) {
TEST_F(DiskCacheTest, StorageBlock_SetModified) {
base::FilePath filename = cache_path_.AppendASCII("a_test");
- scoped_refptr<disk_cache::MappedFile> file(new disk_cache::MappedFile);
+ auto file = base::MakeRefCounted<disk_cache::MappedFile>();
ASSERT_TRUE(CreateCacheTestFile(filename));
ASSERT_TRUE(file->Init(filename, 8192));
- CacheEntryBlock* entry1 =
- new CacheEntryBlock(file.get(), disk_cache::Addr(0xa0010003));
+ auto entry1 = std::make_unique<CacheEntryBlock>(file.get(),
+ disk_cache::Addr(0xa0010003));
EXPECT_TRUE(entry1->Load());
EXPECT_TRUE(0 == entry1->Data()->hash);
entry1->Data()->hash = 0x45687912;
entry1->set_modified();
- delete entry1;
+ entry1.reset();
CacheEntryBlock entry2(file.get(), disk_cache::Addr(0xa0010003));
EXPECT_TRUE(entry2.Load());
diff --git a/chromium/net/disk_cache/disk_cache.cc b/chromium/net/disk_cache/disk_cache.cc
index 6f820bdd079..b31892c1890 100644
--- a/chromium/net/disk_cache/disk_cache.cc
+++ b/chromium/net/disk_cache/disk_cache.cc
@@ -47,17 +47,20 @@ class CacheCreator {
base::android::ApplicationStatusListener* app_status_listener,
#endif
net::NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
base::OnceClosure post_cleanup_callback,
- net::CompletionOnceCallback callback);
+ disk_cache::BackendResultCallback callback);
CacheCreator(const CacheCreator&) = delete;
CacheCreator& operator=(const CacheCreator&) = delete;
+ // Wait for any previous backends for given path to finish clean up and then
+ // attempt to create a new one. This will never succeed synchronously, though
+ // it may fail synchronously.
net::Error TryCreateCleanupTrackerAndRun();
// Creates the backend, the cleanup context for it having been already
- // established... or purposefully left as null.
+ // established... or purposefully left as null. This will never succeed
+ // synchronously, though it may fail synchronously.
net::Error Run();
private:
@@ -80,9 +83,8 @@ class CacheCreator {
#if BUILDFLAG(IS_ANDROID)
raw_ptr<base::android::ApplicationStatusListener> app_status_listener_;
#endif
- raw_ptr<std::unique_ptr<disk_cache::Backend>> backend_;
base::OnceClosure post_cleanup_callback_;
- net::CompletionOnceCallback callback_;
+ disk_cache::BackendResultCallback callback_;
std::unique_ptr<disk_cache::Backend> created_cache_;
raw_ptr<net::NetLog> net_log_;
scoped_refptr<disk_cache::BackendCleanupTracker> cleanup_tracker_;
@@ -99,9 +101,8 @@ CacheCreator::CacheCreator(
base::android::ApplicationStatusListener* app_status_listener,
#endif
net::NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
base::OnceClosure post_cleanup_callback,
- net::CompletionOnceCallback callback)
+ disk_cache::BackendResultCallback callback)
: path_(path),
reset_handling_(reset_handling),
max_bytes_(max_bytes),
@@ -111,7 +112,6 @@ CacheCreator::CacheCreator(
#if BUILDFLAG(IS_ANDROID)
app_status_listener_(app_status_listener),
#endif
- backend_(backend),
post_cleanup_callback_(std::move(post_cleanup_callback)),
callback_(std::move(callback)),
net_log_(net_log) {
@@ -136,32 +136,33 @@ net::Error CacheCreator::Run() {
if (backend_type_ == net::CACHE_BACKEND_SIMPLE ||
(backend_type_ == net::CACHE_BACKEND_DEFAULT &&
kSimpleBackendIsDefault)) {
- disk_cache::SimpleBackendImpl* simple_cache =
- new disk_cache::SimpleBackendImpl(
- file_operations_factory_, path_, cleanup_tracker_.get(),
- /* file_tracker = */ nullptr, max_bytes_, type_, net_log_);
- created_cache_.reset(simple_cache);
+ auto cache = std::make_unique<disk_cache::SimpleBackendImpl>(
+ file_operations_factory_, path_, cleanup_tracker_.get(),
+ /* file_tracker = */ nullptr, max_bytes_, type_, net_log_);
+ disk_cache::SimpleBackendImpl* simple_cache = cache.get();
+ created_cache_ = std::move(cache);
#if BUILDFLAG(IS_ANDROID)
if (app_status_listener_)
simple_cache->set_app_status_listener(app_status_listener_);
#endif
- return simple_cache->Init(
+ simple_cache->Init(
base::BindOnce(&CacheCreator::OnIOComplete, base::Unretained(this)));
+ return net::ERR_IO_PENDING;
}
// Avoid references to blockfile functions on Android to reduce binary size.
#if BUILDFLAG(IS_ANDROID)
return net::ERR_FAILED;
#else
- disk_cache::BackendImpl* new_cache =
- new disk_cache::BackendImpl(path_, cleanup_tracker_.get(),
- /*cache_thread = */ nullptr, type_, net_log_);
- created_cache_.reset(new_cache);
+ auto cache = std::make_unique<disk_cache::BackendImpl>(
+ path_, cleanup_tracker_.get(),
+ /*cache_thread = */ nullptr, type_, net_log_);
+ disk_cache::BackendImpl* new_cache = cache.get();
+ created_cache_ = std::move(cache);
new_cache->SetMaxSize(max_bytes_);
- net::Error rv = new_cache->Init(
+ new_cache->Init(
base::BindOnce(&CacheCreator::OnIOComplete, base::Unretained(this)));
- DCHECK_EQ(net::ERR_IO_PENDING, rv);
- return rv;
+ return net::ERR_IO_PENDING;
#endif
}
@@ -195,15 +196,18 @@ net::Error CacheCreator::TryCreateCleanupTrackerAndRun() {
return Run();
}
-void CacheCreator::DoCallback(int result) {
- DCHECK_NE(net::ERR_IO_PENDING, result);
- if (result == net::OK) {
- *backend_ = std::move(created_cache_);
+void CacheCreator::DoCallback(int net_error) {
+ DCHECK_NE(net::ERR_IO_PENDING, net_error);
+ disk_cache::BackendResult result;
+ if (net_error == net::OK) {
+ result = disk_cache::BackendResult::Make(std::move(created_cache_));
} else {
LOG(ERROR) << "Unable to create cache";
+ result = disk_cache::BackendResult::MakeError(
+ static_cast<net::Error>(net_error));
created_cache_.reset();
}
- std::move(callback_).Run(result);
+ std::move(callback_).Run(std::move(result));
delete this;
}
@@ -281,7 +285,29 @@ class UnboundTrivialFileOperations
namespace disk_cache {
-net::Error CreateCacheBackendImpl(
+BackendResult::BackendResult() = default;
+BackendResult::~BackendResult() = default;
+BackendResult::BackendResult(BackendResult&&) = default;
+BackendResult& BackendResult::operator=(BackendResult&&) = default;
+
+// static
+BackendResult BackendResult::MakeError(net::Error error_in) {
+ DCHECK_NE(error_in, net::OK);
+ BackendResult result;
+ result.net_error = error_in;
+ return result;
+}
+
+// static
+BackendResult BackendResult::Make(std::unique_ptr<Backend> backend_in) {
+ DCHECK(backend_in);
+ BackendResult result;
+ result.net_error = net::OK;
+ result.backend = std::move(backend_in);
+ return result;
+}
+
+BackendResult CreateCacheBackendImpl(
net::CacheType type,
net::BackendType backend_type,
scoped_refptr<BackendFileOperationsFactory> file_operations,
@@ -292,9 +318,8 @@ net::Error CreateCacheBackendImpl(
base::android::ApplicationStatusListener* app_status_listener,
#endif
net::NetLog* net_log,
- std::unique_ptr<Backend>* backend,
base::OnceClosure post_cleanup_callback,
- net::CompletionOnceCallback callback) {
+ BackendResultCallback callback) {
DCHECK(!callback.is_null());
if (type == net::MEMORY_CACHE) {
@@ -303,13 +328,12 @@ net::Error CreateCacheBackendImpl(
if (mem_backend_impl) {
mem_backend_impl->SetPostCleanupCallback(
std::move(post_cleanup_callback));
- *backend = std::move(mem_backend_impl);
- return net::OK;
+ return BackendResult::Make(std::move(mem_backend_impl));
} else {
if (!post_cleanup_callback.is_null())
base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE, std::move(post_cleanup_callback));
- return net::ERR_FAILED;
+ return BackendResult::MakeError(net::ERR_FAILED);
}
}
@@ -320,16 +344,16 @@ net::Error CreateCacheBackendImpl(
#if BUILDFLAG(IS_ANDROID)
std::move(app_status_listener),
#endif
- net_log, backend, std::move(post_cleanup_callback), std::move(callback));
+ net_log, std::move(post_cleanup_callback), std::move(callback));
if (type == net::DISK_CACHE) {
DCHECK(!had_post_cleanup_callback);
- return creator->Run();
+ return BackendResult::MakeError(creator->Run());
}
- return creator->TryCreateCleanupTrackerAndRun();
+ return BackendResult::MakeError(creator->TryCreateCleanupTrackerAndRun());
}
-net::Error CreateCacheBackend(
+BackendResult CreateCacheBackend(
net::CacheType type,
net::BackendType backend_type,
scoped_refptr<BackendFileOperationsFactory> file_operations,
@@ -337,19 +361,18 @@ net::Error CreateCacheBackend(
int64_t max_bytes,
ResetHandling reset_handling,
net::NetLog* net_log,
- std::unique_ptr<Backend>* backend,
- net::CompletionOnceCallback callback) {
+ BackendResultCallback callback) {
return CreateCacheBackendImpl(type, backend_type, std::move(file_operations),
path, max_bytes, reset_handling,
#if BUILDFLAG(IS_ANDROID)
nullptr,
#endif
- net_log, backend, base::OnceClosure(),
+ net_log, base::OnceClosure(),
std::move(callback));
}
#if BUILDFLAG(IS_ANDROID)
-NET_EXPORT net::Error CreateCacheBackend(
+NET_EXPORT BackendResult CreateCacheBackend(
net::CacheType type,
net::BackendType backend_type,
scoped_refptr<BackendFileOperationsFactory> file_operations,
@@ -357,17 +380,16 @@ NET_EXPORT net::Error CreateCacheBackend(
int64_t max_bytes,
ResetHandling reset_handling,
net::NetLog* net_log,
- std::unique_ptr<Backend>* backend,
- net::CompletionOnceCallback callback,
+ BackendResultCallback callback,
base::android::ApplicationStatusListener* app_status_listener) {
- return CreateCacheBackendImpl(
- type, backend_type, std::move(file_operations), path, max_bytes,
- reset_handling, std::move(app_status_listener), net_log, backend,
- base::OnceClosure(), std::move(callback));
+ return CreateCacheBackendImpl(type, backend_type, std::move(file_operations),
+ path, max_bytes, reset_handling,
+ std::move(app_status_listener), net_log,
+ base::OnceClosure(), std::move(callback));
}
#endif
-net::Error CreateCacheBackend(
+BackendResult CreateCacheBackend(
net::CacheType type,
net::BackendType backend_type,
scoped_refptr<BackendFileOperationsFactory> file_operations,
@@ -375,16 +397,15 @@ net::Error CreateCacheBackend(
int64_t max_bytes,
ResetHandling reset_handling,
net::NetLog* net_log,
- std::unique_ptr<Backend>* backend,
base::OnceClosure post_cleanup_callback,
- net::CompletionOnceCallback callback) {
- return CreateCacheBackendImpl(
- type, backend_type, std::move(file_operations), path, max_bytes,
- reset_handling,
+ BackendResultCallback callback) {
+ return CreateCacheBackendImpl(type, backend_type, std::move(file_operations),
+ path, max_bytes, reset_handling,
#if BUILDFLAG(IS_ANDROID)
- nullptr,
+ nullptr,
#endif
- net_log, backend, std::move(post_cleanup_callback), std::move(callback));
+ net_log, std::move(post_cleanup_callback),
+ std::move(callback));
}
void FlushCacheThreadForTesting() {
diff --git a/chromium/net/disk_cache/disk_cache.h b/chromium/net/disk_cache/disk_cache.h
index 88f140d750f..31f548b2a46 100644
--- a/chromium/net/disk_cache/disk_cache.h
+++ b/chromium/net/disk_cache/disk_cache.h
@@ -54,6 +54,26 @@ using RangeResultCallback = base::OnceCallback<void(const RangeResult&)>;
// See CreateCacheBackend() for its usage.
enum class ResetHandling { kReset, kResetOnError, kNeverReset };
+struct NET_EXPORT BackendResult {
+ BackendResult();
+ ~BackendResult();
+ BackendResult(BackendResult&&);
+ BackendResult& operator=(BackendResult&&);
+
+ BackendResult(const BackendResult&) = delete;
+ BackendResult& operator=(const BackendResult&) = delete;
+
+ // `error_in` should not be net::OK for MakeError().
+ static BackendResult MakeError(net::Error error_in);
+ // `backend_in` should not be nullptr for Make().
+ static BackendResult Make(std::unique_ptr<Backend> backend_in);
+
+ net::Error net_error = net::ERR_FAILED;
+ std::unique_ptr<Backend> backend;
+};
+
+using BackendResultCallback = base::OnceCallback<void(BackendResult)>;
+
// Returns an instance of a Backend of the given `type`. `file_operations`
// (nullable) is used to broker file operations in sandboxed environments.
// Currently `file_operations` is only used for the simple backend.
@@ -71,28 +91,27 @@ enum class ResetHandling { kReset, kResetOnError, kNeverReset };
// cache creation will fail if there is a problem with cache initialization.
//
// `max_bytes` is the maximum size the cache can grow to. If zero is passed in
-// as `max_bytes`, the cache will determine the value to use. The returned
-// pointer can be nullptr if a fatal error is found. The actual return value of
-// the function is a net error code. If this function returns ERR_IO_PENDING,
-// the `callback` will be invoked when a backend is available or a fatal error
-// condition is reached. The pointer to receive the `backend` must remain valid
-// until the operation completes (the callback is notified).
-NET_EXPORT net::Error CreateCacheBackend(
- net::CacheType type,
- net::BackendType backend_type,
- scoped_refptr<BackendFileOperationsFactory> file_operations,
- const base::FilePath& path,
- int64_t max_bytes,
- ResetHandling reset_handling,
- net::NetLog* net_log,
- std::unique_ptr<Backend>* backend,
- net::CompletionOnceCallback callback);
+// as `max_bytes`, the cache will determine the value to use.
+//
+// `net_error` in return value of the function is a net error code. If it is
+// ERR_IO_PENDING, the `callback` will be invoked when a backend is available or
+// a fatal error condition is reached. `backend` in return value or parameter
+// to callback can be nullptr if a fatal error is found.
+NET_EXPORT BackendResult
+CreateCacheBackend(net::CacheType type,
+ net::BackendType backend_type,
+ scoped_refptr<BackendFileOperationsFactory> file_operations,
+ const base::FilePath& path,
+ int64_t max_bytes,
+ ResetHandling reset_handling,
+ net::NetLog* net_log,
+ BackendResultCallback callback);
#if BUILDFLAG(IS_ANDROID)
// Similar to the function above, but takes an |app_status_listener| which is
// used to listen for when the Android application status changes, so we can
// flush the cache to disk when the app goes to the background.
-NET_EXPORT net::Error CreateCacheBackend(
+NET_EXPORT BackendResult CreateCacheBackend(
net::CacheType type,
net::BackendType backend_type,
scoped_refptr<BackendFileOperationsFactory> file_operations,
@@ -100,8 +119,7 @@ NET_EXPORT net::Error CreateCacheBackend(
int64_t max_bytes,
ResetHandling reset_handling,
net::NetLog* net_log,
- std::unique_ptr<Backend>* backend,
- net::CompletionOnceCallback callback,
+ BackendResultCallback callback,
base::android::ApplicationStatusListener* app_status_listener);
#endif
@@ -114,17 +132,16 @@ NET_EXPORT net::Error CreateCacheBackend(
//
// Note that this will not wait for |post_cleanup_callback| of a previous
// instance for |path| to run.
-NET_EXPORT net::Error CreateCacheBackend(
- net::CacheType type,
- net::BackendType backend_type,
- scoped_refptr<BackendFileOperationsFactory> file_operations,
- const base::FilePath& path,
- int64_t max_bytes,
- ResetHandling reset_handling,
- net::NetLog* net_log,
- std::unique_ptr<Backend>* backend,
- base::OnceClosure post_cleanup_callback,
- net::CompletionOnceCallback callback);
+NET_EXPORT BackendResult
+CreateCacheBackend(net::CacheType type,
+ net::BackendType backend_type,
+ scoped_refptr<BackendFileOperationsFactory> file_operations,
+ const base::FilePath& path,
+ int64_t max_bytes,
+ ResetHandling reset_handling,
+ net::NetLog* net_log,
+ base::OnceClosure post_cleanup_callback,
+ BackendResultCallback callback);
// This will flush any internal threads used by backends created w/o an
// externally injected thread specified, so tests can be sure that all I/O
@@ -146,7 +163,7 @@ class NET_EXPORT Backend {
class Iterator {
public:
- virtual ~Iterator() {}
+ virtual ~Iterator() = default;
// OpenNextEntry returns a result with net_error() |net::OK| and provided
// entry if there is an entry to enumerate which it can return immediately.
@@ -175,8 +192,8 @@ class NET_EXPORT Backend {
// on what will succeed and what will fail. In particular the blockfile
// backend will leak entries closed after backend deletion, while others
// handle it properly.
- Backend(net::CacheType cache_type) : cache_type_(cache_type) {}
- virtual ~Backend() {}
+ explicit Backend(net::CacheType cache_type) : cache_type_(cache_type) {}
+ virtual ~Backend() = default;
// Returns the type of this cache.
net::CacheType GetCacheType() const { return cache_type_; }
@@ -464,7 +481,7 @@ class NET_EXPORT Entry {
virtual void SetLastUsedTimeForTest(base::Time time) = 0;
protected:
- virtual ~Entry() {}
+ virtual ~Entry() = default;
};
struct EntryDeleter {
diff --git a/chromium/net/disk_cache/disk_cache_fuzzer.cc b/chromium/net/disk_cache/disk_cache_fuzzer.cc
index 2e0bd143a3f..e111cbe9894 100644
--- a/chromium/net/disk_cache/disk_cache_fuzzer.cc
+++ b/chromium/net/disk_cache/disk_cache_fuzzer.cc
@@ -1151,8 +1151,9 @@ void DiskCacheLPMFuzzer::CreateBackend(
bool simple_cache_wait_for_index) {
if (cache_backend == disk_cache_fuzzer::FuzzCommands::IN_MEMORY) {
MAYBE_PRINT << "Using in-memory cache." << std::endl;
- mem_cache_ = new disk_cache::MemBackendImpl(nullptr);
- cache_.reset(mem_cache_);
+ auto cache = std::make_unique<disk_cache::MemBackendImpl>(nullptr);
+ mem_cache_ = cache.get();
+ cache_ = std::move(cache);
CHECK(cache_);
} else if (cache_backend == disk_cache_fuzzer::FuzzCommands::SIMPLE) {
MAYBE_PRINT << "Using simple cache." << std::endl;
@@ -1162,13 +1163,12 @@ void DiskCacheLPMFuzzer::CreateBackend(
if (!simple_file_tracker_)
simple_file_tracker_ =
std::make_unique<disk_cache::SimpleFileTracker>(kMaxFdsSimpleCache);
- std::unique_ptr<disk_cache::SimpleBackendImpl> simple_backend =
- std::make_unique<disk_cache::SimpleBackendImpl>(
- /*file_operations=*/nullptr, cache_path_,
- /*cleanup_tracker=*/nullptr, simple_file_tracker_.get(), max_size_,
- type, /*net_log=*/nullptr);
- int rv = simple_backend->Init(cb.callback());
- CHECK_EQ(cb.GetResult(rv), net::OK);
+ auto simple_backend = std::make_unique<disk_cache::SimpleBackendImpl>(
+ /*file_operations=*/nullptr, cache_path_,
+ /*cleanup_tracker=*/nullptr, simple_file_tracker_.get(), max_size_,
+ type, /*net_log=*/nullptr);
+ simple_backend->Init(cb.callback());
+ CHECK_EQ(cb.WaitForResult(), net::OK);
simple_cache_impl_ = simple_backend.get();
cache_ = std::move(simple_backend);
@@ -1178,25 +1178,28 @@ void DiskCacheLPMFuzzer::CreateBackend(
net::TestCompletionCallback wait_for_index_cb;
simple_cache_impl_->index()->ExecuteWhenReady(
wait_for_index_cb.callback());
- rv = wait_for_index_cb.WaitForResult();
+ int rv = wait_for_index_cb.WaitForResult();
CHECK_EQ(rv, net::OK);
}
} else {
MAYBE_PRINT << "Using blockfile cache";
-
+ std::unique_ptr<disk_cache::BackendImpl> cache;
if (mask) {
MAYBE_PRINT << ", mask = " << mask << std::endl;
- block_impl_ = new disk_cache::BackendImpl(cache_path_, mask,
- /* runner = */ nullptr, type,
- /* net_log = */ nullptr);
+ cache = std::make_unique<disk_cache::BackendImpl>(
+ cache_path_, mask,
+ /* runner = */ nullptr, type,
+ /* net_log = */ nullptr);
} else {
MAYBE_PRINT << "." << std::endl;
- block_impl_ = new disk_cache::BackendImpl(cache_path_,
- /* cleanup_tracker = */ nullptr,
- /* runner = */ nullptr, type,
- /* net_log = */ nullptr);
+ cache = std::make_unique<disk_cache::BackendImpl>(
+ cache_path_,
+ /* cleanup_tracker = */ nullptr,
+ /* runner = */ nullptr, type,
+ /* net_log = */ nullptr);
}
- cache_.reset(block_impl_);
+ block_impl_ = cache.get();
+ cache_ = std::move(cache);
CHECK(cache_);
// TODO(mpdenton) kNoRandom or not? It does a lot of waiting for IO. May be
// good for avoiding leaks but tests a less realistic cache.
@@ -1204,8 +1207,8 @@ void DiskCacheLPMFuzzer::CreateBackend(
// TODO(mpdenton) should I always wait here?
net::TestCompletionCallback cb;
- int rv = block_impl_->Init(cb.callback());
- CHECK_EQ(cb.GetResult(rv), net::OK);
+ block_impl_->Init(cb.callback());
+ CHECK_EQ(cb.WaitForResult(), net::OK);
}
}
diff --git a/chromium/net/disk_cache/disk_cache_perftest.cc b/chromium/net/disk_cache/disk_cache_perftest.cc
index 14ce27d2d76..0a2501e475a 100644
--- a/chromium/net/disk_cache/disk_cache_perftest.cc
+++ b/chromium/net/disk_cache/disk_cache_perftest.cc
@@ -277,9 +277,10 @@ class ReadHandler {
what_to_read_(what_to_read),
cache_(cache),
final_callback_(std::move(final_callback)) {
- for (int i = 0; i < kMaxParallelOperations; ++i)
- read_buffers_[i] = base::MakeRefCounted<net::IOBuffer>(
+ for (auto& read_buffer : read_buffers_) {
+ read_buffer = base::MakeRefCounted<net::IOBuffer>(
std::max(kHeadersSize, kChunkSize));
+ }
}
void Run();
@@ -547,10 +548,9 @@ TEST_F(DiskCachePerfTest, BlockFilesPerformance) {
base::ElapsedTimer sequential_timer;
// Fill up the 32-byte block file (use three files).
- for (int i = 0; i < kNumBlocks; i++) {
+ for (auto& addr : address) {
int block_size = base::RandInt(1, 4);
- EXPECT_TRUE(
- files.CreateBlock(disk_cache::RANKINGS, block_size, &address[i]));
+ EXPECT_TRUE(files.CreateBlock(disk_cache::RANKINGS, block_size, &addr));
}
reporter.AddResult(kMetricFillBlocksTimeMs,
@@ -629,9 +629,8 @@ TEST_F(DiskCachePerfTest, SimpleCacheInitialReadPortion) {
VerifyRvAndCallClosure, base::Unretained(&barrier), kHeadersSize));
base::ElapsedTimer timer_early;
- for (int e = 0; e < kBatchSize; ++e) {
- int rv =
- cache_entry[e]->ReadData(0, 0, buffer1.get(), kHeadersSize, cb_batch);
+ for (auto* entry : cache_entry) {
+ int rv = entry->ReadData(0, 0, buffer1.get(), kHeadersSize, cb_batch);
if (rv != net::ERR_IO_PENDING) {
barrier.Run();
ASSERT_EQ(kHeadersSize, rv);
@@ -645,8 +644,8 @@ TEST_F(DiskCachePerfTest, SimpleCacheInitialReadPortion) {
}
// Cleanup
- for (int i = 0; i < kBatchSize; ++i)
- cache_entry[i]->Close();
+ for (auto* entry : cache_entry)
+ entry->Close();
disk_cache::FlushCacheThreadForTesting();
base::RunLoop().RunUntilIdle();
diff --git a/chromium/net/disk_cache/disk_cache_test_base.cc b/chromium/net/disk_cache/disk_cache_test_base.cc
index 792e751049b..9e36dd91212 100644
--- a/chromium/net/disk_cache/disk_cache_test_base.cc
+++ b/chromium/net/disk_cache/disk_cache_test_base.cc
@@ -352,8 +352,9 @@ void DiskCacheTestWithCache::TearDown() {
}
void DiskCacheTestWithCache::InitMemoryCache() {
- mem_cache_ = new disk_cache::MemBackendImpl(nullptr);
- cache_.reset(mem_cache_);
+ auto cache = std::make_unique<disk_cache::MemBackendImpl>(nullptr);
+ mem_cache_ = cache.get();
+ cache_ = std::move(cache);
ASSERT_TRUE(cache_);
if (size_)
@@ -390,28 +391,32 @@ void DiskCacheTestWithCache::CreateBackend(uint32_t flags) {
/*file_operations=*/nullptr, cache_path_,
/* cleanup_tracker = */ nullptr, simple_file_tracker_.get(), size_,
type_, /*net_log = */ nullptr);
- int rv = simple_backend->Init(cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
+ simple_backend->Init(cb.callback());
+ ASSERT_THAT(cb.WaitForResult(), IsOk());
simple_cache_impl_ = simple_backend.get();
cache_ = std::move(simple_backend);
if (simple_cache_wait_for_index_) {
net::TestCompletionCallback wait_for_index_cb;
simple_cache_impl_->index()->ExecuteWhenReady(
wait_for_index_cb.callback());
- rv = wait_for_index_cb.WaitForResult();
+ int rv = wait_for_index_cb.WaitForResult();
ASSERT_THAT(rv, IsOk());
}
return;
}
- if (mask_)
- cache_impl_ = new disk_cache::BackendImpl(cache_path_, mask_, runner, type_,
- /* net_log = */ nullptr);
- else
- cache_impl_ = new disk_cache::BackendImpl(
+ std::unique_ptr<disk_cache::BackendImpl> cache;
+ if (mask_) {
+ cache = std::make_unique<disk_cache::BackendImpl>(cache_path_, mask_,
+ runner, type_,
+ /* net_log = */ nullptr);
+ } else {
+ cache = std::make_unique<disk_cache::BackendImpl>(
cache_path_, /* cleanup_tracker = */ nullptr, runner, type_,
/* net_log = */ nullptr);
- cache_.reset(cache_impl_);
+ }
+ cache_impl_ = cache.get();
+ cache_ = std::move(cache);
ASSERT_TRUE(cache_);
if (size_)
EXPECT_TRUE(cache_impl_->SetMaxSize(size_));
@@ -419,6 +424,6 @@ void DiskCacheTestWithCache::CreateBackend(uint32_t flags) {
cache_impl_->SetNewEviction();
cache_impl_->SetFlags(flags);
net::TestCompletionCallback cb;
- int rv = cache_impl_->Init(cb.callback());
- ASSERT_THAT(cb.GetResult(rv), IsOk());
+ cache_impl_->Init(cb.callback());
+ ASSERT_THAT(cb.WaitForResult(), IsOk());
}
diff --git a/chromium/net/disk_cache/disk_cache_test_util.cc b/chromium/net/disk_cache/disk_cache_test_util.cc
index ad1fb222ee6..7256850af5a 100644
--- a/chromium/net/disk_cache/disk_cache_test_util.cc
+++ b/chromium/net/disk_cache/disk_cache_test_util.cc
@@ -62,9 +62,9 @@ bool CheckCacheIntegrity(const base::FilePath& path,
bool new_eviction,
int max_size,
uint32_t mask) {
- std::unique_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl(
+ auto cache = std::make_unique<disk_cache::BackendImpl>(
path, mask, base::ThreadTaskRunnerHandle::Get(), net::DISK_CACHE,
- nullptr));
+ nullptr);
if (max_size)
cache->SetMaxSize(max_size);
if (!cache.get())
@@ -78,6 +78,17 @@ bool CheckCacheIntegrity(const base::FilePath& path,
}
// -----------------------------------------------------------------------
+TestBackendResultCompletionCallback::TestBackendResultCompletionCallback() =
+ default;
+
+TestBackendResultCompletionCallback::~TestBackendResultCompletionCallback() =
+ default;
+
+disk_cache::BackendResultCallback
+TestBackendResultCompletionCallback::callback() {
+ return base::BindOnce(&TestBackendResultCompletionCallback::SetResult,
+ base::Unretained(this));
+}
TestEntryResultCompletionCallback::TestEntryResultCompletionCallback() =
default;
diff --git a/chromium/net/disk_cache/disk_cache_test_util.h b/chromium/net/disk_cache/disk_cache_test_util.h
index c3586a17df7..548fefbef07 100644
--- a/chromium/net/disk_cache/disk_cache_test_util.h
+++ b/chromium/net/disk_cache/disk_cache_test_util.h
@@ -39,6 +39,31 @@ bool CheckCacheIntegrity(const base::FilePath& path,
// -----------------------------------------------------------------------
+// Like net::TestCompletionCallback, but for BackendResultCallback.
+struct BackendResultIsPendingHelper {
+ bool operator()(const disk_cache::BackendResult& result) const {
+ return result.net_error == net::ERR_IO_PENDING;
+ }
+};
+using TestBackendResultCompletionCallbackBase =
+ net::internal::TestCompletionCallbackTemplate<disk_cache::BackendResult,
+ BackendResultIsPendingHelper>;
+
+class TestBackendResultCompletionCallback
+ : public TestBackendResultCompletionCallbackBase {
+ public:
+ TestBackendResultCompletionCallback();
+
+ TestBackendResultCompletionCallback(
+ const TestBackendResultCompletionCallback&) = delete;
+ TestBackendResultCompletionCallback& operator=(
+ const TestBackendResultCompletionCallback&) = delete;
+
+ ~TestBackendResultCompletionCallback() override;
+
+ disk_cache::BackendResultCallback callback();
+};
+
// Like net::TestCompletionCallback, but for EntryResultCallback.
struct EntryResultIsPendingHelper {
diff --git a/chromium/net/disk_cache/entry_unittest.cc b/chromium/net/disk_cache/entry_unittest.cc
index a3290992bc2..d5a444bf1d9 100644
--- a/chromium/net/disk_cache/entry_unittest.cc
+++ b/chromium/net/disk_cache/entry_unittest.cc
@@ -606,9 +606,9 @@ void DiskCacheEntryTest::StreamAccess() {
const int kBufferSize = 1024;
const int kNumStreams = 3;
scoped_refptr<net::IOBuffer> reference_buffers[kNumStreams];
- for (int i = 0; i < kNumStreams; i++) {
- reference_buffers[i] = base::MakeRefCounted<net::IOBuffer>(kBufferSize);
- CacheTestFillBuffer(reference_buffers[i]->data(), kBufferSize, false);
+ for (auto& reference_buffer : reference_buffers) {
+ reference_buffer = base::MakeRefCounted<net::IOBuffer>(kBufferSize);
+ CacheTestFillBuffer(reference_buffer->data(), kBufferSize, false);
}
scoped_refptr<net::IOBuffer> buffer1 =
base::MakeRefCounted<net::IOBuffer>(kBufferSize);
@@ -2552,7 +2552,7 @@ TEST_F(DiskCacheEntryTest, SparseClipEnd) {
// Blockfile refuses to deal with sparse indices over 64GiB.
SparseClipEnd(std::numeric_limits<int64_t>::max(),
- /* expect_unsupported = */ true);
+ /*expected_unsupported=*/true);
}
TEST_F(DiskCacheEntryTest, SparseClipEnd2) {
@@ -2561,7 +2561,7 @@ TEST_F(DiskCacheEntryTest, SparseClipEnd2) {
const int64_t kLimit = 64ll * 1024 * 1024 * 1024;
// Separate test for blockfile for indices right at the edge of its address
// space limit. kLimit must match kMaxEndOffset in sparse_control.cc
- SparseClipEnd(kLimit, /* expect_unsupported = */ false);
+ SparseClipEnd(kLimit, /*expected_unsupported=*/false);
// Test with things after kLimit, too, which isn't an issue for backends
// supporting the entire 64-bit offset range.
@@ -2594,14 +2594,14 @@ TEST_F(DiskCacheEntryTest, MemoryOnlySparseClipEnd) {
SetMemoryOnlyMode();
InitCache();
SparseClipEnd(std::numeric_limits<int64_t>::max(),
- /* expect_unsupported = */ false);
+ /* expected_unsupported = */ false);
}
TEST_F(DiskCacheEntryTest, SimpleSparseClipEnd) {
SetSimpleCacheMode();
InitCache();
SparseClipEnd(std::numeric_limits<int64_t>::max(),
- /* expect_unsupported = */ false);
+ /* expected_unsupported = */ false);
}
// Tests that corrupt sparse children are removed automatically.
@@ -2625,16 +2625,16 @@ TEST_F(DiskCacheEntryTest, CleanupSparseEntry) {
std::unique_ptr<TestIterator> iter = CreateIterator();
int count = 0;
- std::string child_key[2];
+ std::string child_keys[2];
while (iter->OpenNextEntry(&entry) == net::OK) {
ASSERT_TRUE(entry != nullptr);
// Writing to an entry will alter the LRU list and invalidate the iterator.
if (entry->GetKey() != key && count < 2)
- child_key[count++] = entry->GetKey();
+ child_keys[count++] = entry->GetKey();
entry->Close();
}
- for (int i = 0; i < 2; i++) {
- ASSERT_THAT(OpenEntry(child_key[i], &entry), IsOk());
+ for (const auto& child_key : child_keys) {
+ ASSERT_THAT(OpenEntry(child_key, &entry), IsOk());
// Overwrite the header's magic and signature.
EXPECT_EQ(12, WriteData(entry, 2, 0, buf1.get(), 12, false));
entry->Close();
diff --git a/chromium/net/disk_cache/memory/mem_backend_impl.cc b/chromium/net/disk_cache/memory/mem_backend_impl.cc
index 993792e49b2..ab9f0416f96 100644
--- a/chromium/net/disk_cache/memory/mem_backend_impl.cc
+++ b/chromium/net/disk_cache/memory/mem_backend_impl.cc
@@ -76,9 +76,9 @@ bool MemBackendImpl::Init() {
if (max_size_)
return true;
- int64_t total_memory = base::SysInfo::AmountOfPhysicalMemory();
+ uint64_t total_memory = base::SysInfo::AmountOfPhysicalMemory();
- if (total_memory <= 0) {
+ if (total_memory == 0) {
max_size_ = kDefaultInMemoryCacheSize;
return true;
}
@@ -86,7 +86,7 @@ bool MemBackendImpl::Init() {
// We want to use up to 2% of the computer's memory, with a limit of 50 MB,
// reached on system with more than 2.5 GB of RAM.
total_memory = total_memory * 2 / 100;
- if (total_memory > kDefaultInMemoryCacheSize * 5)
+ if (total_memory > static_cast<uint64_t>(kDefaultInMemoryCacheSize) * 5)
max_size_ = kDefaultInMemoryCacheSize * 5;
else
max_size_ = static_cast<int32_t>(total_memory);
@@ -308,8 +308,7 @@ class MemBackendImpl::MemIterator final : public Backend::Iterator {
};
std::unique_ptr<Backend::Iterator> MemBackendImpl::CreateIterator() {
- return std::unique_ptr<Backend::Iterator>(
- new MemIterator(weak_factory_.GetWeakPtr()));
+ return std::make_unique<MemIterator>(weak_factory_.GetWeakPtr());
}
void MemBackendImpl::OnExternalCacheHit(const std::string& key) {
diff --git a/chromium/net/disk_cache/memory/mem_entry_impl.cc b/chromium/net/disk_cache/memory/mem_entry_impl.cc
index a045f72e727..38ab5bf418a 100644
--- a/chromium/net/disk_cache/memory/mem_entry_impl.cc
+++ b/chromium/net/disk_cache/memory/mem_entry_impl.cc
@@ -58,7 +58,7 @@ std::string GenerateChildName(const std::string& base_name, int64_t child_id) {
// Returns NetLog parameters for the creation of a MemEntryImpl. A separate
// function is needed because child entries don't store their key().
base::Value NetLogEntryCreationParams(const MemEntryImpl* entry) {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
std::string key;
switch (entry->type()) {
case MemEntryImpl::EntryType::kParent:
@@ -68,9 +68,9 @@ base::Value NetLogEntryCreationParams(const MemEntryImpl* entry) {
key = GenerateChildName(entry->parent()->key(), entry->child_id());
break;
}
- dict.SetStringKey("key", key);
- dict.SetBoolKey("created", true);
- return dict;
+ dict.Set("key", key);
+ dict.Set("created", true);
+ return base::Value(std::move(dict));
}
} // namespace
diff --git a/chromium/net/disk_cache/net_log_parameters.cc b/chromium/net/disk_cache/net_log_parameters.cc
index 89c1245a3fb..9745df6856f 100644
--- a/chromium/net/disk_cache/net_log_parameters.cc
+++ b/chromium/net/disk_cache/net_log_parameters.cc
@@ -19,39 +19,39 @@ base::Value NetLogReadWriteDataParams(int index,
int offset,
int buf_len,
bool truncate) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetIntKey("index", index);
- dict.SetIntKey("offset", offset);
- dict.SetIntKey("buf_len", buf_len);
+ base::Value::Dict dict;
+ dict.Set("index", index);
+ dict.Set("offset", offset);
+ dict.Set("buf_len", buf_len);
if (truncate)
- dict.SetBoolKey("truncate", truncate);
- return dict;
+ dict.Set("truncate", truncate);
+ return base::Value(std::move(dict));
}
base::Value NetLogReadWriteCompleteParams(int bytes_copied) {
DCHECK_NE(bytes_copied, net::ERR_IO_PENDING);
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
if (bytes_copied < 0) {
- dict.SetIntKey("net_error", bytes_copied);
+ dict.Set("net_error", bytes_copied);
} else {
- dict.SetIntKey("bytes_copied", bytes_copied);
+ dict.Set("bytes_copied", bytes_copied);
}
- return dict;
+ return base::Value(std::move(dict));
}
base::Value NetLogSparseOperationParams(int64_t offset, int buf_len) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetKey("offset", net::NetLogNumberValue(offset));
- dict.SetIntKey("buf_len", buf_len);
- return dict;
+ base::Value::Dict dict;
+ dict.Set("offset", net::NetLogNumberValue(offset));
+ dict.Set("buf_len", buf_len);
+ return base::Value(std::move(dict));
}
base::Value NetLogSparseReadWriteParams(const net::NetLogSource& source,
int child_len) {
- base::Value dict(base::Value::Type::DICTIONARY);
- source.AddToEventParameters(&dict);
- dict.SetIntKey("child_len", child_len);
- return dict;
+ base::Value::Dict dict;
+ source.AddToEventParameters(dict);
+ dict.Set("child_len", child_len);
+ return base::Value(std::move(dict));
}
} // namespace
@@ -61,10 +61,10 @@ namespace disk_cache {
base::Value CreateNetLogParametersEntryCreationParams(const Entry* entry,
bool created) {
DCHECK(entry);
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("key", entry->GetKey());
- dict.SetBoolKey("created", created);
- return dict;
+ base::Value::Dict dict;
+ dict.Set("key", entry->GetKey());
+ dict.Set("created", created);
+ return base::Value(std::move(dict));
}
void NetLogReadWriteData(const net::NetLogWithSource& net_log,
@@ -109,14 +109,14 @@ void NetLogSparseReadWrite(const net::NetLogWithSource& net_log,
base::Value CreateNetLogGetAvailableRangeResultParams(
disk_cache::RangeResult result) {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
if (result.net_error == net::OK) {
- dict.SetIntKey("length", result.available_len);
- dict.SetKey("start", net::NetLogNumberValue(result.start));
+ dict.Set("length", result.available_len);
+ dict.Set("start", net::NetLogNumberValue(result.start));
} else {
- dict.SetIntKey("net_error", result.net_error);
+ dict.Set("net_error", result.net_error);
}
- return dict;
+ return base::Value(std::move(dict));
}
} // namespace disk_cache
diff --git a/chromium/net/disk_cache/simple/post_doom_waiter.cc b/chromium/net/disk_cache/simple/post_doom_waiter.cc
index 8814efbfb0e..717adda347d 100644
--- a/chromium/net/disk_cache/simple/post_doom_waiter.cc
+++ b/chromium/net/disk_cache/simple/post_doom_waiter.cc
@@ -11,7 +11,7 @@
namespace disk_cache {
-SimplePostDoomWaiter::SimplePostDoomWaiter() {}
+SimplePostDoomWaiter::SimplePostDoomWaiter() = default;
SimplePostDoomWaiter::SimplePostDoomWaiter(base::OnceClosure to_run_post_doom)
: run_post_doom(std::move(to_run_post_doom)) {}
@@ -20,7 +20,7 @@ SimplePostDoomWaiter::SimplePostDoomWaiter(SimplePostDoomWaiter&& other) =
default;
SimplePostDoomWaiter& SimplePostDoomWaiter::operator=(
SimplePostDoomWaiter&& other) = default;
-SimplePostDoomWaiter::~SimplePostDoomWaiter() {}
+SimplePostDoomWaiter::~SimplePostDoomWaiter() = default;
SimplePostDoomWaiterTable::SimplePostDoomWaiterTable(net::CacheType cache_type)
: cache_type_(cache_type) {}
diff --git a/chromium/net/disk_cache/simple/post_doom_waiter.h b/chromium/net/disk_cache/simple/post_doom_waiter.h
index 01c563c8607..3fde99253e3 100644
--- a/chromium/net/disk_cache/simple/post_doom_waiter.h
+++ b/chromium/net/disk_cache/simple/post_doom_waiter.h
@@ -19,7 +19,7 @@ namespace disk_cache {
struct SimplePostDoomWaiter {
SimplePostDoomWaiter();
explicit SimplePostDoomWaiter(base::OnceClosure to_run_post_doom);
- explicit SimplePostDoomWaiter(SimplePostDoomWaiter&& other);
+ SimplePostDoomWaiter(SimplePostDoomWaiter&& other);
~SimplePostDoomWaiter();
SimplePostDoomWaiter& operator=(SimplePostDoomWaiter&& other);
diff --git a/chromium/net/disk_cache/simple/simple_backend_impl.cc b/chromium/net/disk_cache/simple/simple_backend_impl.cc
index cec9824dbc1..e0be60eb39b 100644
--- a/chromium/net/disk_cache/simple/simple_backend_impl.cc
+++ b/chromium/net/disk_cache/simple/simple_backend_impl.cc
@@ -22,6 +22,7 @@
#include "base/files/file_util.h"
#include "base/lazy_instance.h"
#include "base/location.h"
+#include "base/memory/ptr_util.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/field_trial_params.h"
#include "base/metrics/histogram_functions.h"
@@ -192,9 +193,7 @@ class SimpleBackendImpl::ActiveEntryProxy
static std::unique_ptr<SimpleEntryImpl::ActiveEntryProxy> Create(
int64_t entry_hash,
SimpleBackendImpl* backend) {
- std::unique_ptr<SimpleEntryImpl::ActiveEntryProxy> proxy(
- new ActiveEntryProxy(entry_hash, backend));
- return proxy;
+ return base::WrapUnique(new ActiveEntryProxy(entry_hash, backend));
}
private:
@@ -248,7 +247,7 @@ void SimpleBackendImpl::SetTaskRunnerForTesting(
std::move(task_runner));
}
-net::Error SimpleBackendImpl::Init(CompletionOnceCallback completion_callback) {
+void SimpleBackendImpl::Init(CompletionOnceCallback completion_callback) {
auto index_task_runner = base::ThreadPool::CreateSequencedTaskRunner(
{base::MayBlock(), base::WithBaseSyncPrimitives(),
base::TaskPriority::USER_BLOCKING,
@@ -273,7 +272,6 @@ net::Error SimpleBackendImpl::Init(CompletionOnceCallback completion_callback) {
GetCacheType()),
base::BindOnce(&SimpleBackendImpl::InitializeIndex, AsWeakPtr(),
std::move(completion_callback)));
- return net::ERR_IO_PENDING;
}
bool SimpleBackendImpl::SetMaxSize(int64_t max_bytes) {
@@ -301,8 +299,7 @@ scoped_refptr<SimplePostDoomWaiterTable> SimpleBackendImpl::OnDoomStart(
void SimpleBackendImpl::DoomEntries(std::vector<uint64_t>* entry_hashes,
net::CompletionOnceCallback callback) {
- std::unique_ptr<std::vector<uint64_t>> mass_doom_entry_hashes(
- new std::vector<uint64_t>());
+ auto mass_doom_entry_hashes = std::make_unique<std::vector<uint64_t>>();
mass_doom_entry_hashes->swap(*entry_hashes);
std::vector<uint64_t> to_doom_individually_hashes;
@@ -629,7 +626,7 @@ class SimpleBackendImpl::SimpleIterator final : public Iterator {
};
std::unique_ptr<Backend::Iterator> SimpleBackendImpl::CreateIterator() {
- return std::unique_ptr<Iterator>(new SimpleIterator(AsWeakPtr()));
+ return std::make_unique<SimpleIterator>(AsWeakPtr());
}
void SimpleBackendImpl::GetStats(base::StringPairs* stats) {
@@ -780,7 +777,7 @@ SimpleBackendImpl::CreateOrFindActiveOrDoomedEntry(
return nullptr;
std::pair<EntryMap::iterator, bool> insert_result =
- active_entries_.insert(EntryMap::value_type(entry_hash, NULL));
+ active_entries_.insert(EntryMap::value_type(entry_hash, nullptr));
EntryMap::iterator& it = insert_result.first;
const bool did_insert = insert_result.second;
if (did_insert) {
@@ -841,9 +838,6 @@ EntryResult SimpleBackendImpl::OpenEntryFromHash(uint64_t entry_hash,
net::Error SimpleBackendImpl::DoomEntryFromHash(
uint64_t entry_hash,
CompletionOnceCallback callback) {
- Entry** entry = new Entry*();
- std::unique_ptr<Entry*> scoped_entry(entry);
-
std::vector<SimplePostDoomWaiter>* post_doom =
post_doom_waiting_->Find(entry_hash);
if (post_doom) {
diff --git a/chromium/net/disk_cache/simple/simple_backend_impl.h b/chromium/net/disk_cache/simple/simple_backend_impl.h
index 46859670b34..84ca265f3ef 100644
--- a/chromium/net/disk_cache/simple/simple_backend_impl.h
+++ b/chromium/net/disk_cache/simple/simple_backend_impl.h
@@ -63,6 +63,7 @@ class NET_EXPORT_PRIVATE SimpleBackendImpl : public Backend,
// Note: only pass non-nullptr for |file_tracker| if you don't want the global
// one (which things other than tests would want). |file_tracker| must outlive
// the backend and all the entries, including their asynchronous close.
+ // |Init()| must be called to finish the initialization process.
SimpleBackendImpl(
scoped_refptr<BackendFileOperationsFactory> file_operations_factory,
const base::FilePath& path,
@@ -79,7 +80,8 @@ class NET_EXPORT_PRIVATE SimpleBackendImpl : public Backend,
void SetTaskRunnerForTesting(
scoped_refptr<base::SequencedTaskRunner> task_runner);
- net::Error Init(CompletionOnceCallback completion_callback);
+ // Finishes initialization. Always asynchronous.
+ void Init(CompletionOnceCallback completion_callback);
// Sets the maximum size for the total amount of data stored by this instance.
bool SetMaxSize(int64_t max_bytes);
diff --git a/chromium/net/disk_cache/simple/simple_entry_format_history.h b/chromium/net/disk_cache/simple/simple_entry_format_history.h
index 3bcb8b44917..5936c8807d3 100644
--- a/chromium/net/disk_cache/simple/simple_entry_format_history.h
+++ b/chromium/net/disk_cache/simple/simple_entry_format_history.h
@@ -9,9 +9,7 @@
#include "net/base/net_export.h"
-namespace disk_cache {
-
-namespace simplecache_v5 {
+namespace disk_cache::simplecache_v5 {
const uint64_t kSimpleInitialMagicNumber = UINT64_C(0xfcfb6d1ba7725c30);
const uint64_t kSimpleFinalMagicNumber = UINT64_C(0xf4fa6f45970d41d8);
@@ -55,8 +53,6 @@ struct NET_EXPORT_PRIVATE SimpleFileEOF {
uint32_t stream_size;
};
-} // namespace simplecache_v5
-
-} // namespace disk_cache
+} // namespace disk_cache::simplecache_v5
#endif // NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_FORMAT_HISTORY_H_
diff --git a/chromium/net/disk_cache/simple/simple_entry_impl.cc b/chromium/net/disk_cache/simple/simple_entry_impl.cc
index 116ce16838c..02d2005d86e 100644
--- a/chromium/net/disk_cache/simple/simple_entry_impl.cc
+++ b/chromium/net/disk_cache/simple/simple_entry_impl.cc
@@ -788,9 +788,8 @@ void SimpleEntryImpl::OpenEntryInternal(
DCHECK(!synchronous_entry_);
state_ = STATE_IO_PENDING;
const base::TimeTicks start_time = base::TimeTicks::Now();
- std::unique_ptr<SimpleEntryCreationResults> results(
- new SimpleEntryCreationResults(SimpleEntryStat(
- last_used_, last_modified_, data_size_, sparse_data_size_)));
+ auto results = std::make_unique<SimpleEntryCreationResults>(SimpleEntryStat(
+ last_used_, last_modified_, data_size_, sparse_data_size_));
int32_t trailer_prefetch_size = -1;
base::Time last_used_time;
@@ -846,9 +845,8 @@ void SimpleEntryImpl::CreateEntryInternal(
last_used_ = last_modified_ = base::Time::Now();
const base::TimeTicks start_time = base::TimeTicks::Now();
- std::unique_ptr<SimpleEntryCreationResults> results(
- new SimpleEntryCreationResults(SimpleEntryStat(
- last_used_, last_modified_, data_size_, sparse_data_size_)));
+ auto results = std::make_unique<SimpleEntryCreationResults>(SimpleEntryStat(
+ last_used_, last_modified_, data_size_, sparse_data_size_));
OnceClosure task =
base::BindOnce(&SimpleSynchronousEntry::CreateEntry, cache_type_, path_,
@@ -897,9 +895,8 @@ void SimpleEntryImpl::OpenOrCreateEntryInternal(
DCHECK(!synchronous_entry_);
state_ = STATE_IO_PENDING;
const base::TimeTicks start_time = base::TimeTicks::Now();
- std::unique_ptr<SimpleEntryCreationResults> results(
- new SimpleEntryCreationResults(SimpleEntryStat(
- last_used_, last_modified_, data_size_, sparse_data_size_)));
+ auto results = std::make_unique<SimpleEntryCreationResults>(SimpleEntryStat(
+ last_used_, last_modified_, data_size_, sparse_data_size_));
int32_t trailer_prefetch_size = -1;
base::Time last_used_time;
@@ -937,8 +934,7 @@ void SimpleEntryImpl::CloseInternal() {
}
typedef SimpleSynchronousEntry::CRCRecord CRCRecord;
- std::unique_ptr<std::vector<CRCRecord>> crc32s_to_write(
- new std::vector<CRCRecord>());
+ auto crc32s_to_write = std::make_unique<std::vector<CRCRecord>>();
net_log_.AddEvent(net::NetLogEventType::SIMPLE_CACHE_ENTRY_CLOSE_BEGIN);
@@ -959,8 +955,7 @@ void SimpleEntryImpl::CloseInternal() {
DCHECK(STATE_UNINITIALIZED == state_ || STATE_FAILURE == state_);
}
- std::unique_ptr<SimpleEntryCloseResults> results =
- std::make_unique<SimpleEntryCloseResults>();
+ auto results = std::make_unique<SimpleEntryCloseResults>();
if (synchronous_entry_) {
OnceClosure task = base::BindOnce(
&SimpleSynchronousEntry::Close, base::Unretained(synchronous_entry_),
@@ -1049,10 +1044,9 @@ int SimpleEntryImpl::ReadDataInternal(bool sync_possible,
read_req.request_verify_crc = !have_written_[stream_index];
}
- std::unique_ptr<SimpleSynchronousEntry::ReadResult> result =
- std::make_unique<SimpleSynchronousEntry::ReadResult>();
- std::unique_ptr<SimpleEntryStat> entry_stat(new SimpleEntryStat(
- last_used_, last_modified_, data_size_, sparse_data_size_));
+ auto result = std::make_unique<SimpleSynchronousEntry::ReadResult>();
+ auto entry_stat = std::make_unique<SimpleEntryStat>(
+ last_used_, last_modified_, data_size_, sparse_data_size_);
OnceClosure task = base::BindOnce(
&SimpleSynchronousEntry::ReadData, base::Unretained(synchronous_entry_),
read_req, entry_stat.get(), base::RetainedRef(buf), result.get());
@@ -1139,8 +1133,8 @@ void SimpleEntryImpl::WriteDataInternal(int stream_index,
}
// |entry_stat| needs to be initialized before modifying |data_size_|.
- std::unique_ptr<SimpleEntryStat> entry_stat(new SimpleEntryStat(
- last_used_, last_modified_, data_size_, sparse_data_size_));
+ auto entry_stat = std::make_unique<SimpleEntryStat>(
+ last_used_, last_modified_, data_size_, sparse_data_size_);
if (truncate) {
data_size_[stream_index] = offset + buf_len;
} else {
@@ -1148,8 +1142,7 @@ void SimpleEntryImpl::WriteDataInternal(int stream_index,
GetDataSize(stream_index));
}
- std::unique_ptr<SimpleSynchronousEntry::WriteResult> write_result =
- std::make_unique<SimpleSynchronousEntry::WriteResult>();
+ auto write_result = std::make_unique<SimpleSynchronousEntry::WriteResult>();
// Since we don't know the correct values for |last_used_| and
// |last_modified_| yet, we make this approximation.
@@ -1212,8 +1205,8 @@ void SimpleEntryImpl::ReadSparseDataInternal(
DCHECK_EQ(STATE_READY, state_);
state_ = STATE_IO_PENDING;
- std::unique_ptr<int> result(new int());
- std::unique_ptr<base::Time> last_used(new base::Time());
+ auto result = std::make_unique<int>();
+ auto last_used = std::make_unique<base::Time>();
OnceClosure task = base::BindOnce(
&SimpleSynchronousEntry::ReadSparseData,
base::Unretained(synchronous_entry_),
@@ -1263,12 +1256,12 @@ void SimpleEntryImpl::WriteSparseDataInternal(
max_sparse_data_size = max_cache_size / kMaxSparseDataSizeDivisor;
}
- std::unique_ptr<SimpleEntryStat> entry_stat(new SimpleEntryStat(
- last_used_, last_modified_, data_size_, sparse_data_size_));
+ auto entry_stat = std::make_unique<SimpleEntryStat>(
+ last_used_, last_modified_, data_size_, sparse_data_size_);
last_used_ = last_modified_ = base::Time::Now();
- std::unique_ptr<int> result(new int());
+ auto result = std::make_unique<int>();
OnceClosure task = base::BindOnce(
&SimpleSynchronousEntry::WriteSparseData,
base::Unretained(synchronous_entry_),
@@ -1405,8 +1398,8 @@ void SimpleEntryImpl::CreationOperationComplete(
// If this is a successful creation (rather than open), mark all streams to be
// saved on close.
if (in_results->created) {
- for (int i = 0; i < kSimpleEntryStreamCount; ++i)
- have_written_[i] = true;
+ for (bool& have_written : have_written_)
+ have_written = true;
}
// Make sure to keep the index up-to-date. We likely already did this when
@@ -1460,9 +1453,15 @@ void SimpleEntryImpl::CreationOperationComplete(
net_log_.AddEvent(end_event_type);
+ const bool created = in_results->created;
+
+ // We need to release `in_results` before going out of scope, because
+ // `operation_runner` destruction might call a close operation, that will
+ // ultimately release `in_results->sync_entry`, and thus leading to having a
+ // dangling pointer here.
+ in_results = nullptr;
if (result_state == SimpleEntryOperation::ENTRY_NEEDS_CALLBACK) {
- ReturnEntryToCallerAsync(!in_results->created,
- std::move(completion_callback));
+ ReturnEntryToCallerAsync(!created, std::move(completion_callback));
}
}
@@ -1657,9 +1656,8 @@ void SimpleEntryImpl::UpdateDataFromEntryStat(
int64_t SimpleEntryImpl::GetDiskUsage() const {
int64_t file_size = 0;
- for (int i = 0; i < kSimpleEntryStreamCount; ++i) {
- file_size +=
- simple_util::GetFileSizeFromDataSize(key_.size(), data_size_[i]);
+ for (int data_size : data_size_) {
+ file_size += simple_util::GetFileSizeFromDataSize(key_.size(), data_size);
}
file_size += sparse_data_size_;
return file_size;
diff --git a/chromium/net/disk_cache/simple/simple_file_tracker.cc b/chromium/net/disk_cache/simple/simple_file_tracker.cc
index 45a783052a3..7560a8622cc 100644
--- a/chromium/net/disk_cache/simple/simple_file_tracker.cc
+++ b/chromium/net/disk_cache/simple/simple_file_tracker.cc
@@ -63,7 +63,7 @@ void SimpleFileTracker::Register(const SimpleSynchronousEntry* owner,
}
if (!owners_files) {
- candidates.emplace_back(new TrackedFiles());
+ candidates.emplace_back(std::make_unique<TrackedFiles>());
owners_files = candidates.back().get();
owners_files->owner = owner;
owners_files->key = owner->entry_file_key();
diff --git a/chromium/net/disk_cache/simple/simple_file_tracker.h b/chromium/net/disk_cache/simple/simple_file_tracker.h
index d9bf2d0682c..3262bd75b00 100644
--- a/chromium/net/disk_cache/simple/simple_file_tracker.h
+++ b/chromium/net/disk_cache/simple/simple_file_tracker.h
@@ -75,7 +75,7 @@ class NET_EXPORT_PRIVATE SimpleFileTracker {
};
struct EntryFileKey {
- EntryFileKey() {}
+ EntryFileKey() = default;
explicit EntryFileKey(uint64_t hash) : entry_hash(hash) {}
uint64_t entry_hash = 0;
@@ -90,7 +90,7 @@ class NET_EXPORT_PRIVATE SimpleFileTracker {
// The default limit here is half of what's available on our target OS where
// Chrome has the lowest limit.
- SimpleFileTracker(int file_limit = 512);
+ explicit SimpleFileTracker(int file_limit = 512);
SimpleFileTracker(const SimpleFileTracker&) = delete;
SimpleFileTracker& operator=(const SimpleFileTracker&) = delete;
diff --git a/chromium/net/disk_cache/simple/simple_file_tracker_unittest.cc b/chromium/net/disk_cache/simple/simple_file_tracker_unittest.cc
index ec501d7d631..0708ac9f31c 100644
--- a/chromium/net/disk_cache/simple/simple_file_tracker_unittest.cc
+++ b/chromium/net/disk_cache/simple/simple_file_tracker_unittest.cc
@@ -38,7 +38,8 @@ class SimpleFileTrackerTest : public DiskCacheTest {
// create/delete SimpleSynchronousEntry objects.
class SyncEntryDeleter {
public:
- SyncEntryDeleter(SimpleFileTrackerTest* fixture) : fixture_(fixture) {}
+ explicit SyncEntryDeleter(SimpleFileTrackerTest* fixture)
+ : fixture_(fixture) {}
void operator()(SimpleSynchronousEntry* entry) {
fixture_->DeleteSyncEntry(entry);
}
@@ -230,8 +231,8 @@ TEST_F(SimpleFileTrackerTest, PointerStability) {
borrow->Write(0, msg.data(), msg.size()));
}
- for (int i = 0; i < kEntries; ++i)
- file_tracker_.Close(entries[i].get(), SimpleFileTracker::SubFile::FILE_0);
+ for (const auto& entry : entries)
+ file_tracker_.Close(entry.get(), SimpleFileTracker::SubFile::FILE_0);
// Verify the file.
std::string verify;
diff --git a/chromium/net/disk_cache/simple/simple_index.cc b/chromium/net/disk_cache/simple/simple_index.cc
index 044df008225..10f9e62153e 100644
--- a/chromium/net/disk_cache/simple/simple_index.cc
+++ b/chromium/net/disk_cache/simple/simple_index.cc
@@ -193,10 +193,8 @@ SimpleIndex::~SimpleIndex() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// Fail all callbacks waiting for the index to come up.
- for (auto it = to_run_when_initialized_.begin(),
- end = to_run_when_initialized_.end();
- it != end; ++it) {
- std::move(*it).Run(net::ERR_ABORTED);
+ for (auto& callback : to_run_when_initialized_) {
+ std::move(callback).Run(net::ERR_ABORTED);
}
}
@@ -215,12 +213,13 @@ void SimpleIndex::Initialize(base::Time cache_mtime) {
}
#endif
- SimpleIndexLoadResult* load_result = new SimpleIndexLoadResult();
- std::unique_ptr<SimpleIndexLoadResult> load_result_scoped(load_result);
- base::OnceClosure reply =
+ auto load_result = std::make_unique<SimpleIndexLoadResult>();
+ auto* load_result_ptr = load_result.get();
+ index_file_->LoadIndexEntries(
+ cache_mtime,
base::BindOnce(&SimpleIndex::MergeInitializingSet, AsWeakPtr(),
- std::move(load_result_scoped));
- index_file_->LoadIndexEntries(cache_mtime, std::move(reply), load_result);
+ std::move(load_result)),
+ load_result_ptr);
}
void SimpleIndex::SetMaxSize(uint64_t max_bytes) {
@@ -258,7 +257,7 @@ std::unique_ptr<SimpleIndex::HashList> SimpleIndex::GetEntriesBetween(
end_time += EntryMetadata::GetUpperEpsilonForTimeComparisons();
DCHECK(end_time >= initial_time);
- std::unique_ptr<HashList> ret_hashes(new HashList());
+ auto ret_hashes = std::make_unique<HashList>();
for (const auto& entry : entries_set_) {
const EntryMetadata& metadata = entry.second;
base::Time entry_time = metadata.GetLastUsedTime();
@@ -546,25 +545,23 @@ void SimpleIndex::MergeInitializingSet(
EntrySet* index_file_entries = &load_result->entries;
- for (auto it = removed_entries_.begin(); it != removed_entries_.end(); ++it) {
- index_file_entries->erase(*it);
+ for (uint64_t removed_entry : removed_entries_) {
+ index_file_entries->erase(removed_entry);
}
removed_entries_.clear();
- for (EntrySet::const_iterator it = entries_set_.begin();
- it != entries_set_.end(); ++it) {
- const uint64_t entry_hash = it->first;
+ for (const auto& it : entries_set_) {
+ const uint64_t entry_hash = it.first;
std::pair<EntrySet::iterator, bool> insert_result =
index_file_entries->insert(EntrySet::value_type(entry_hash,
EntryMetadata()));
EntrySet::iterator& possibly_inserted_entry = insert_result.first;
- possibly_inserted_entry->second = it->second;
+ possibly_inserted_entry->second = it.second;
}
uint64_t merged_cache_size = 0;
- for (auto it = index_file_entries->begin(); it != index_file_entries->end();
- ++it) {
- merged_cache_size += it->second.GetEntrySize();
+ for (const auto& index_file_entry : *index_file_entries) {
+ merged_cache_size += index_file_entry.second.GetEntrySize();
}
entries_set_.swap(*index_file_entries);
@@ -587,10 +584,9 @@ void SimpleIndex::MergeInitializingSet(
static_cast<base::HistogramBase::Sample>(max_size_ / kBytesInKb));
// Run all callbacks waiting for the index to come up.
- for (auto it = to_run_when_initialized_.begin(),
- end = to_run_when_initialized_.end();
- it != end; ++it) {
- task_runner_->PostTask(FROM_HERE, base::BindOnce(std::move(*it), net::OK));
+ for (auto& callback : to_run_when_initialized_) {
+ task_runner_->PostTask(FROM_HERE,
+ base::BindOnce(std::move(callback), net::OK));
}
to_run_when_initialized_.clear();
}
diff --git a/chromium/net/disk_cache/simple/simple_index_delegate.h b/chromium/net/disk_cache/simple/simple_index_delegate.h
index 0ff77c29a08..00e02a8c987 100644
--- a/chromium/net/disk_cache/simple/simple_index_delegate.h
+++ b/chromium/net/disk_cache/simple/simple_index_delegate.h
@@ -16,7 +16,7 @@ namespace disk_cache {
class NET_EXPORT_PRIVATE SimpleIndexDelegate {
public:
- virtual ~SimpleIndexDelegate() {}
+ virtual ~SimpleIndexDelegate() = default;
// Dooms all entries in |entries|, calling |callback| with the result
// asynchronously. |entries| is mutated in an undefined way by this call,
diff --git a/chromium/net/disk_cache/simple/simple_index_file.cc b/chromium/net/disk_cache/simple/simple_index_file.cc
index c60d833fe4d..bc36558d2cc 100644
--- a/chromium/net/disk_cache/simple/simple_index_file.cc
+++ b/chromium/net/disk_cache/simple/simple_index_file.cc
@@ -518,9 +518,9 @@ std::unique_ptr<base::Pickle> SimpleIndexFile::Serialize(
std::unique_ptr<base::Pickle> pickle = std::make_unique<SimpleIndexPickle>();
index_metadata.Serialize(pickle.get());
- for (auto it = entries.begin(); it != entries.end(); ++it) {
- pickle->WriteUInt64(it->first);
- it->second.Serialize(cache_type, pickle.get());
+ for (const auto& entry : entries) {
+ pickle->WriteUInt64(entry.first);
+ entry.second.Serialize(cache_type, pickle.get());
}
return pickle;
}
diff --git a/chromium/net/disk_cache/simple/simple_index_file_unittest.cc b/chromium/net/disk_cache/simple/simple_index_file_unittest.cc
index ebf2de335e8..7802c98675f 100644
--- a/chromium/net/disk_cache/simple/simple_index_file_unittest.cc
+++ b/chromium/net/disk_cache/simple/simple_index_file_unittest.cc
@@ -493,8 +493,8 @@ TEST_F(SimpleIndexFileTest, WriteThenLoadIndex) {
EXPECT_FALSE(load_index_result.flush_required);
EXPECT_EQ(kNumHashes, load_index_result.entries.size());
- for (size_t i = 0; i < kNumHashes; ++i)
- EXPECT_EQ(1U, load_index_result.entries.count(kHashes[i]));
+ for (uint64_t hash : kHashes)
+ EXPECT_EQ(1U, load_index_result.entries.count(hash));
}
TEST_F(SimpleIndexFileTest, LoadCorruptIndex) {
@@ -603,10 +603,10 @@ TEST_F(SimpleIndexFileTest, SimpleCacheUpgrade) {
/*file_tracker=*/nullptr, 0, net::DISK_CACHE,
/*net_log=*/nullptr);
net::TestCompletionCallback cb;
- int rv = simple_cache->Init(cb.callback());
- EXPECT_THAT(cb.GetResult(rv), IsOk());
+ simple_cache->Init(cb.callback());
+ EXPECT_THAT(cb.WaitForResult(), IsOk());
simple_cache->index()->ExecuteWhenReady(cb.callback());
- rv = cb.WaitForResult();
+ int rv = cb.WaitForResult();
EXPECT_THAT(rv, IsOk());
simple_cache.reset();
cleanup_tracker = nullptr;
diff --git a/chromium/net/disk_cache/simple/simple_index_unittest.cc b/chromium/net/disk_cache/simple/simple_index_unittest.cc
index 92cde3b83ed..34d2266fed9 100644
--- a/chromium/net/disk_cache/simple/simple_index_unittest.cc
+++ b/chromium/net/disk_cache/simple/simple_index_unittest.cc
@@ -114,8 +114,7 @@ class SimpleIndexTest : public net::TestWithTaskEnvironment,
}
void SetUp() override {
- std::unique_ptr<MockSimpleIndexFile> index_file(
- new MockSimpleIndexFile(CacheType()));
+ auto index_file = std::make_unique<MockSimpleIndexFile>(CacheType());
index_file_ = index_file->AsWeakPtr();
index_ =
std::make_unique<SimpleIndex>(/* io_thread = */ nullptr,
@@ -263,13 +262,13 @@ TEST_F(SimpleIndexTest, IndexSizeCorrectOnMerge) {
index()->UpdateEntrySize(hashes_.at<4>(), 4u * kSizeResolution);
EXPECT_EQ(9u * kSizeResolution, index()->cache_size_);
{
- std::unique_ptr<SimpleIndexLoadResult> result(new SimpleIndexLoadResult());
+ auto result = std::make_unique<SimpleIndexLoadResult>();
result->did_load = true;
index()->MergeInitializingSet(std::move(result));
}
EXPECT_EQ(9u * kSizeResolution, index()->cache_size_);
{
- std::unique_ptr<SimpleIndexLoadResult> result(new SimpleIndexLoadResult());
+ auto result = std::make_unique<SimpleIndexLoadResult>();
result->did_load = true;
const uint64_t new_hash_key = hashes_.at<11>();
result->entries.insert(std::make_pair(
diff --git a/chromium/net/disk_cache/simple/simple_net_log_parameters.cc b/chromium/net/disk_cache/simple/simple_net_log_parameters.cc
index ee3241ba989..b6d06026193 100644
--- a/chromium/net/disk_cache/simple/simple_net_log_parameters.cc
+++ b/chromium/net/disk_cache/simple/simple_net_log_parameters.cc
@@ -20,20 +20,20 @@ namespace {
base::Value NetLogSimpleEntryConstructionParams(
const disk_cache::SimpleEntryImpl* entry) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("entry_hash",
- base::StringPrintf("%#016" PRIx64, entry->entry_hash()));
- return dict;
+ base::Value::Dict dict;
+ dict.Set("entry_hash",
+ base::StringPrintf("%#016" PRIx64, entry->entry_hash()));
+ return base::Value(std::move(dict));
}
base::Value NetLogSimpleEntryCreationParams(
const disk_cache::SimpleEntryImpl* entry,
int net_error) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetIntKey("net_error", net_error);
+ base::Value::Dict dict;
+ dict.Set("net_error", net_error);
if (net_error == net::OK)
- dict.SetStringKey("key", entry->key());
- return dict;
+ dict.Set("key", entry->key());
+ return base::Value(std::move(dict));
}
} // namespace
diff --git a/chromium/net/disk_cache/simple/simple_synchronous_entry.cc b/chromium/net/disk_cache/simple/simple_synchronous_entry.cc
index 4102a28ba2f..8ac5d028cdf 100644
--- a/chromium/net/disk_cache/simple/simple_synchronous_entry.cc
+++ b/chromium/net/disk_cache/simple/simple_synchronous_entry.cc
@@ -1067,8 +1067,8 @@ void SimpleSynchronousEntry::Close(
base::ElapsedTimer close_time;
DCHECK(stream_0_data);
- for (auto it = crc32s_to_write->begin(); it != crc32s_to_write->end(); ++it) {
- const int stream_index = it->index;
+ for (auto& crc_record : *crc32s_to_write) {
+ const int stream_index = crc_record.index;
const int file_index = GetFileIndexFromStreamIndex(stream_index);
if (empty_file_omitted_[file_index])
continue;
@@ -1103,10 +1103,10 @@ void SimpleSynchronousEntry::Close(
// Re-compute stream 0 CRC if the data got changed (we may be here even
// if it didn't change if stream 0's position on disk got changed due to
// stream 1 write).
- if (!it->has_crc32) {
- it->data_crc32 =
+ if (!crc_record.has_crc32) {
+ crc_record.data_crc32 =
simple_util::Crc32(stream_0_data->data(), entry_stat.data_size(0));
- it->has_crc32 = true;
+ crc_record.has_crc32 = true;
}
out_results->estimated_trailer_prefetch_size =
@@ -1117,11 +1117,11 @@ void SimpleSynchronousEntry::Close(
eof_record.stream_size = entry_stat.data_size(stream_index);
eof_record.final_magic_number = kSimpleFinalMagicNumber;
eof_record.flags = 0;
- if (it->has_crc32)
+ if (crc_record.has_crc32)
eof_record.flags |= SimpleFileEOF::FLAG_HAS_CRC32;
if (stream_index == 0)
eof_record.flags |= SimpleFileEOF::FLAG_HAS_KEY_SHA256;
- eof_record.data_crc32 = it->data_crc32;
+ eof_record.data_crc32 = crc_record.data_crc32;
int eof_offset = entry_stat.GetEOFOffsetInFile(key_.size(), stream_index);
// If stream 0 changed size, the file needs to be resized, otherwise the
// next open will yield wrong stream sizes. On stream 1 and stream 2 proper
@@ -1179,8 +1179,9 @@ SimpleSynchronousEntry::SimpleSynchronousEntry(
file_tracker_(file_tracker),
unbound_file_operations_(std::move(unbound_file_operations)),
trailer_prefetch_size_(trailer_prefetch_size) {
- for (int i = 0; i < kSimpleEntryNormalFileCount; ++i)
- empty_file_omitted_[i] = false;
+ for (bool& empty_file_omitted : empty_file_omitted_) {
+ empty_file_omitted = false;
+ }
}
SimpleSynchronousEntry::~SimpleSynchronousEntry() {
diff --git a/chromium/net/disk_cache/simple/simple_test_util.cc b/chromium/net/disk_cache/simple/simple_test_util.cc
index 0251f3ad914..d62320e0690 100644
--- a/chromium/net/disk_cache/simple/simple_test_util.cc
+++ b/chromium/net/disk_cache/simple/simple_test_util.cc
@@ -10,8 +10,7 @@
#include "net/disk_cache/simple/simple_entry_format.h"
#include "net/disk_cache/simple/simple_util.h"
-namespace disk_cache {
-namespace simple_util {
+namespace disk_cache::simple_util {
using base::File;
using base::FilePath;
@@ -131,5 +130,4 @@ bool CorruptStream0LengthFromEntry(const std::string& key,
return true;
}
-} // namespace simple_util
-} // namespace disk_cache
+} // namespace disk_cache::simple_util
diff --git a/chromium/net/disk_cache/simple/simple_test_util.h b/chromium/net/disk_cache/simple/simple_test_util.h
index 36af9285b9c..701e1eb3a85 100644
--- a/chromium/net/disk_cache/simple/simple_test_util.h
+++ b/chromium/net/disk_cache/simple/simple_test_util.h
@@ -15,8 +15,7 @@ namespace base {
class FilePath;
}
-namespace disk_cache {
-namespace simple_util {
+namespace disk_cache::simple_util {
// Immutable array with compile-time bound-checking.
template <typename T, size_t Size>
@@ -24,7 +23,8 @@ class ImmutableArray {
public:
static const size_t size = Size;
- ImmutableArray(const base::RepeatingCallback<T(size_t index)>& initializer) {
+ explicit ImmutableArray(
+ const base::RepeatingCallback<T(size_t index)>& initializer) {
for (size_t i = 0; i < size; ++i)
data_[i] = initializer.Run(i);
}
@@ -55,7 +55,6 @@ bool CorruptKeySHA256FromEntry(const std::string& key,
bool CorruptStream0LengthFromEntry(const std::string& key,
const base::FilePath& cache_path);
-} // namespace simple_util
-} // namespace disk_cache
+} // namespace disk_cache::simple_util
#endif // NET_DISK_CACHE_SIMPLE_SIMPLE_TEST_UTIL_H_
diff --git a/chromium/net/disk_cache/simple/simple_util.cc b/chromium/net/disk_cache/simple/simple_util.cc
index d9fc89080fc..ed0b382221d 100644
--- a/chromium/net/disk_cache/simple/simple_util.cc
+++ b/chromium/net/disk_cache/simple/simple_util.cc
@@ -25,9 +25,7 @@ const size_t kEntryHashKeyAsHexStringSize = 2 * sizeof(uint64_t);
} // namespace
-namespace disk_cache {
-
-namespace simple_util {
+namespace disk_cache::simple_util {
std::string ConvertEntryHashKeyToHexString(uint64_t hash_key) {
const std::string hash_key_str = base::StringPrintf("%016" PRIx64, hash_key);
@@ -115,6 +113,4 @@ uint32_t IncrementalCrc32(uint32_t previous_crc, const char* data, int length) {
return crc32(previous_crc, reinterpret_cast<const Bytef*>(data), length);
}
-} // namespace simple_util
-
-} // namespace disk_cache
+} // namespace disk_cache::simple_util
diff --git a/chromium/net/disk_cache/simple/simple_util.h b/chromium/net/disk_cache/simple/simple_util.h
index b74632139ae..6860e39350d 100644
--- a/chromium/net/disk_cache/simple/simple_util.h
+++ b/chromium/net/disk_cache/simple/simple_util.h
@@ -17,9 +17,7 @@ namespace base {
class FilePath;
}
-namespace disk_cache {
-
-namespace simple_util {
+namespace disk_cache::simple_util {
NET_EXPORT_PRIVATE std::string ConvertEntryHashKeyToHexString(
uint64_t hash_key);
@@ -83,8 +81,6 @@ uint32_t Crc32(const char* data, int length);
uint32_t IncrementalCrc32(uint32_t previous_crc, const char* data, int length);
-} // namespace simple_util
-
-} // namespace disk_cache
+} // namespace disk_cache::simple_util
#endif // NET_DISK_CACHE_SIMPLE_SIMPLE_UTIL_H_
diff --git a/chromium/net/disk_cache/simple/simple_util_posix.cc b/chromium/net/disk_cache/simple/simple_util_posix.cc
index 129b9ee7cd7..0a72be27c39 100644
--- a/chromium/net/disk_cache/simple/simple_util_posix.cc
+++ b/chromium/net/disk_cache/simple/simple_util_posix.cc
@@ -6,12 +6,10 @@
#include "base/files/file_util.h"
-namespace disk_cache {
-namespace simple_util {
+namespace disk_cache::simple_util {
bool SimpleCacheDeleteFile(const base::FilePath& path) {
return base::DeleteFile(path);
}
-} // namespace simple_util
-} // namespace disk_cache
+} // namespace disk_cache::simple_util
diff --git a/chromium/net/dns/BUILD.gn b/chromium/net/dns/BUILD.gn
index 9fdc44daedc..e8f3d6b5091 100644
--- a/chromium/net/dns/BUILD.gn
+++ b/chromium/net/dns/BUILD.gn
@@ -71,6 +71,7 @@ source_set("dns") {
"mapped_host_resolver.cc",
"nsswitch_reader.cc",
"nsswitch_reader.h",
+ "opt_record_rdata.cc",
"record_parsed.cc",
"record_rdata.cc",
"resolve_context.cc",
@@ -312,6 +313,7 @@ source_set("dns_client") {
"dns_response.h",
"dns_transaction.h",
"https_record_rdata.h",
+ "opt_record_rdata.h",
"record_parsed.h",
"record_rdata.h",
]
@@ -400,6 +402,7 @@ source_set("tests") {
"httpssvc_metrics_unittest.cc",
"mapped_host_resolver_unittest.cc",
"nsswitch_reader_unittest.cc",
+ "opt_record_rdata_unittest.cc",
"record_parsed_unittest.cc",
"record_rdata_unittest.cc",
"resolve_context_unittest.cc",
diff --git a/chromium/net/dns/address_info.cc b/chromium/net/dns/address_info.cc
index 5c888a4e580..334b3cf21e3 100644
--- a/chromium/net/dns/address_info.cc
+++ b/chromium/net/dns/address_info.cc
@@ -56,7 +56,7 @@ AddressInfo::AddressInfoAndResult AddressInfo::Get(
const std::string& host,
const addrinfo& hints,
std::unique_ptr<AddrInfoGetter> getter,
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
if (getter == nullptr)
getter = std::make_unique<AddrInfoGetter>();
int err = OK;
@@ -179,7 +179,7 @@ std::unique_ptr<addrinfo, FreeAddrInfoFunc> AddrInfoGetter::getaddrinfo(
const std::string& host,
const addrinfo* hints,
int* out_os_error,
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
addrinfo* ai;
// We wrap freeaddrinfo() in a lambda just in case some operating systems use
// a different signature for it.
@@ -187,7 +187,7 @@ std::unique_ptr<addrinfo, FreeAddrInfoFunc> AddrInfoGetter::getaddrinfo(
std::unique_ptr<addrinfo, FreeAddrInfoFunc> rv = {nullptr, deleter};
- if (network != NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (network != handles::kInvalidNetworkHandle) {
// Currently, only Android supports lookups for a specific network.
#if BUILDFLAG(IS_ANDROID)
*out_os_error = android::GetAddrInfoForNetwork(network, host.c_str(),
diff --git a/chromium/net/dns/address_info.h b/chromium/net/dns/address_info.h
index f7eba2402dd..144632a8e8a 100644
--- a/chromium/net/dns/address_info.h
+++ b/chromium/net/dns/address_info.h
@@ -13,7 +13,7 @@
#include "build/build_config.h"
#include "net/base/address_family.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/base/sys_addrinfo.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -56,14 +56,13 @@ class NET_EXPORT_PRIVATE AddressInfo {
// null, the system's getaddrinfo will be invoked. (A non-null `getter` is
// primarily for tests).
// `network` is an optional parameter, when specified (!=
- // kInvalidNetworkHandle) the lookup will be performed specifically for
- // `network` (currently only supported on Android platforms).
+ // handles::kInvalidNetworkHandle) the lookup will be performed specifically
+ // for `network` (currently only supported on Android platforms).
static AddressInfoAndResult Get(
const std::string& host,
const addrinfo& hints,
std::unique_ptr<AddrInfoGetter> getter = nullptr,
- NetworkChangeNotifier::NetworkHandle network =
- NetworkChangeNotifier::kInvalidNetworkHandle);
+ handles::NetworkHandle network = handles::kInvalidNetworkHandle);
AddressInfo(const AddressInfo&) = delete;
AddressInfo& operator=(const AddressInfo&) = delete;
@@ -107,7 +106,7 @@ class NET_EXPORT_PRIVATE AddrInfoGetter {
const std::string& host,
const addrinfo* hints,
int* out_os_error,
- NetworkChangeNotifier::NetworkHandle network);
+ handles::NetworkHandle network);
};
} // namespace net
diff --git a/chromium/net/dns/address_info_unittest.cc b/chromium/net/dns/address_info_unittest.cc
index 1763956a28e..56663180a17 100644
--- a/chromium/net/dns/address_info_unittest.cc
+++ b/chromium/net/dns/address_info_unittest.cc
@@ -32,7 +32,7 @@ class MockAddrInfoGetter : public AddrInfoGetter {
const std::string& host,
const addrinfo* hints,
int* out_os_error,
- NetworkChangeNotifier::NetworkHandle network) override;
+ handles::NetworkHandle network) override;
private:
struct IpAndPort {
@@ -132,7 +132,7 @@ std::unique_ptr<addrinfo, FreeAddrInfoFunc> MockAddrInfoGetter::getaddrinfo(
const std::string& host,
const addrinfo* /* hints */,
int* out_os_error,
- NetworkChangeNotifier::NetworkHandle) {
+ handles::NetworkHandle) {
// Presume success
*out_os_error = 0;
@@ -249,8 +249,9 @@ TEST(AddressInfoTest, Iteration) {
{
int count = 0;
- for (auto aii = ai->begin(); aii != ai->end(); ++aii) {
- const sockaddr_in* addr = reinterpret_cast<sockaddr_in*>(aii->ai_addr);
+ for (const auto& addr_info : *ai) {
+ const sockaddr_in* addr =
+ reinterpret_cast<sockaddr_in*>(addr_info.ai_addr);
EXPECT_EQ(base::HostToNet16(addr->sin_port) % 10, count % 10);
++count;
}
diff --git a/chromium/net/dns/address_sorter.h b/chromium/net/dns/address_sorter.h
index 0e3409fa04d..19162d86e53 100644
--- a/chromium/net/dns/address_sorter.h
+++ b/chromium/net/dns/address_sorter.h
@@ -28,7 +28,7 @@ class NET_EXPORT AddressSorter {
AddressSorter(const AddressSorter&) = delete;
AddressSorter& operator=(const AddressSorter&) = delete;
- virtual ~AddressSorter() {}
+ virtual ~AddressSorter() = default;
// Sorts `endpoints`, which must include at least one IPv6 address.
// Calls `callback` upon completion. Could complete synchronously. Could
@@ -40,7 +40,7 @@ class NET_EXPORT AddressSorter {
static std::unique_ptr<AddressSorter> CreateAddressSorter();
protected:
- AddressSorter() {}
+ AddressSorter() = default;
};
} // namespace net
diff --git a/chromium/net/dns/address_sorter_posix.cc b/chromium/net/dns/address_sorter_posix.cc
index f17b4808320..9bd30d0ac84 100644
--- a/chromium/net/dns/address_sorter_posix.cc
+++ b/chromium/net/dns/address_sorter_posix.cc
@@ -67,8 +67,7 @@ unsigned GetPolicyValue(const AddressSorterPosix::PolicyTable& table,
const IPAddress& address) {
if (address.IsIPv4())
return GetPolicyValue(table, ConvertIPv4ToIPv4MappedIPv6(address));
- for (unsigned i = 0; i < table.size(); ++i) {
- const AddressSorterPosix::PolicyEntry& entry = table[i];
+ for (const auto& entry : table) {
IPAddress prefix(entry.prefix);
if (IPAddressMatchesPrefix(address, prefix, entry.prefix_length))
return entry.value;
@@ -277,7 +276,7 @@ void AddressSorterPosix::Sort(const std::vector<IPEndPoint>& endpoints,
std::vector<std::unique_ptr<DestinationInfo>> sort_list;
for (const IPEndPoint& endpoint : endpoints) {
- std::unique_ptr<DestinationInfo> info(new DestinationInfo());
+ auto info = std::make_unique<DestinationInfo>();
info->endpoint = endpoint;
info->scope = GetScope(ipv4_scope_table_, info->endpoint.address());
info->precedence =
@@ -369,7 +368,7 @@ void AddressSorterPosix::OnIPAddressChanged() {
return;
}
- for (struct ifaddrs* ifa = addrs; ifa != NULL; ifa = ifa->ifa_next) {
+ for (struct ifaddrs* ifa = addrs; ifa != nullptr; ifa = ifa->ifa_next) {
IPEndPoint src;
if (!src.FromSockAddr(ifa->ifa_addr, ifa->ifa_addr->sa_len))
continue;
@@ -412,8 +411,8 @@ void AddressSorterPosix::FillPolicy(const IPAddress& address,
// static
std::unique_ptr<AddressSorter> AddressSorter::CreateAddressSorter() {
- return std::unique_ptr<AddressSorter>(
- new AddressSorterPosix(ClientSocketFactory::GetDefaultFactory()));
+ return std::make_unique<AddressSorterPosix>(
+ ClientSocketFactory::GetDefaultFactory());
}
} // namespace net
diff --git a/chromium/net/dns/address_sorter_posix_unittest.cc b/chromium/net/dns/address_sorter_posix_unittest.cc
index 6bd613d5689..124aa2f0d6a 100644
--- a/chromium/net/dns/address_sorter_posix_unittest.cc
+++ b/chromium/net/dns/address_sorter_posix_unittest.cc
@@ -77,38 +77,12 @@ class TestUDPClientSocket : public DatagramClientSocket {
return OK;
}
void UseNonBlockingIO() override {}
- int WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) override {
- NOTIMPLEMENTED();
- return OK;
- }
- int WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) override {
- NOTIMPLEMENTED();
- return OK;
- }
- DatagramBuffers GetUnwrittenBuffers() override {
- DatagramBuffers result;
- NOTIMPLEMENTED();
- return result;
- }
- void SetWriteAsyncEnabled(bool enabled) override {}
- void SetMaxPacketSize(size_t max_packet_size) override {}
- bool WriteAsyncEnabled() override { return false; }
- void SetWriteMultiCoreEnabled(bool enabled) override {}
- void SetSendmmsgEnabled(bool enabled) override {}
- void SetWriteBatchingActive(bool active) override {}
int SetMulticastInterface(uint32_t interface_index) override {
NOTIMPLEMENTED();
return ERR_NOT_IMPLEMENTED;
}
- int ConnectUsingNetwork(NetworkChangeNotifier::NetworkHandle network,
+ int ConnectUsingNetwork(handles::NetworkHandle network,
const IPEndPoint& address) override {
NOTIMPLEMENTED();
return ERR_NOT_IMPLEMENTED;
@@ -117,8 +91,8 @@ class TestUDPClientSocket : public DatagramClientSocket {
NOTIMPLEMENTED();
return ERR_NOT_IMPLEMENTED;
}
- NetworkChangeNotifier::NetworkHandle GetBoundNetwork() const override {
- return NetworkChangeNotifier::kInvalidNetworkHandle;
+ handles::NetworkHandle GetBoundNetwork() const override {
+ return handles::kInvalidNetworkHandle;
}
void ApplySocketTag(const SocketTag& tag) override {}
void SetMsgConfirm(bool confirm) override {}
@@ -157,8 +131,7 @@ class TestSocketFactory : public ClientSocketFactory {
DatagramSocket::BindType,
NetLog*,
const NetLogSource&) override {
- return std::unique_ptr<DatagramClientSocket>(
- new TestUDPClientSocket(&mapping_));
+ return std::make_unique<TestUDPClientSocket>(&mapping_);
}
std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
const AddressList&,
@@ -220,7 +193,7 @@ class AddressSorterPosixTest : public TestWithTaskEnvironment {
// after sorting.
void Verify(const char* const addresses[], const int order[]) {
std::vector<IPEndPoint> endpoints;
- for (const char* const* addr = addresses; *addr != NULL; ++addr)
+ for (const char* const* addr = addresses; *addr != nullptr; ++addr)
endpoints.emplace_back(ParseIP(*addr), 80);
for (size_t i = 0; order[i] >= 0; ++i)
CHECK_LT(order[i], static_cast<int>(endpoints.size()));
@@ -248,7 +221,7 @@ class AddressSorterPosixTest : public TestWithTaskEnvironment {
// Rule 1: Avoid unusable destinations.
TEST_F(AddressSorterPosixTest, Rule1) {
AddMapping("10.0.0.231", "10.0.0.1");
- const char* const addresses[] = { "::1", "10.0.0.231", "127.0.0.1", NULL };
+ const char* const addresses[] = {"::1", "10.0.0.231", "127.0.0.1", nullptr};
const int order[] = { 1, -1 };
Verify(addresses, order);
}
@@ -263,11 +236,11 @@ TEST_F(AddressSorterPosixTest, Rule2) {
AddMapping("8.0.0.1", "169.254.0.10"); // global vs. link-local
// In all three cases, matching scope is preferred.
const int order[] = { 1, 0, -1 };
- const char* const addresses1[] = { "3002::2", "3002::1", NULL };
+ const char* const addresses1[] = {"3002::2", "3002::1", nullptr};
Verify(addresses1, order);
- const char* const addresses2[] = { "fec1::2", "ff32::1", NULL };
+ const char* const addresses2[] = {"fec1::2", "ff32::1", nullptr};
Verify(addresses2, order);
- const char* const addresses3[] = { "8.0.0.1", "fec1::1", NULL };
+ const char* const addresses3[] = {"8.0.0.1", "fec1::1", nullptr};
Verify(addresses3, order);
}
@@ -277,7 +250,7 @@ TEST_F(AddressSorterPosixTest, Rule3) {
AddMapping("3002::1", "4000::10");
GetSourceInfo("4000::10")->deprecated = true;
AddMapping("3002::2", "4000::20");
- const char* const addresses[] = { "3002::1", "3002::2", NULL };
+ const char* const addresses[] = {"3002::1", "3002::2", nullptr};
const int order[] = { 1, 0, -1 };
Verify(addresses, order);
}
@@ -287,7 +260,7 @@ TEST_F(AddressSorterPosixTest, Rule4) {
AddMapping("3002::1", "4000::10");
AddMapping("3002::2", "4000::20");
GetSourceInfo("4000::20")->home = true;
- const char* const addresses[] = { "3002::1", "3002::2", NULL };
+ const char* const addresses[] = {"3002::1", "3002::2", nullptr};
const int order[] = { 1, 0, -1 };
Verify(addresses, order);
}
@@ -300,11 +273,11 @@ TEST_F(AddressSorterPosixTest, Rule5) {
AddMapping("2002::1", "2001::10"); // 6to4 vs. Teredo
const int order[] = { 1, 0, -1 };
{
- const char* const addresses[] = { "2001::1", "::1", NULL };
+ const char* const addresses[] = {"2001::1", "::1", nullptr};
Verify(addresses, order);
}
{
- const char* const addresses[] = { "2002::1", "::ffff:1234:1", NULL };
+ const char* const addresses[] = {"2002::1", "::ffff:1234:1", nullptr};
Verify(addresses, order);
}
}
@@ -315,8 +288,8 @@ TEST_F(AddressSorterPosixTest, Rule6) {
AddMapping("ff32::1", "fe81::10"); // multicast
AddMapping("::ffff:1234:1", "::ffff:1234:10"); // IPv4-mapped
AddMapping("2001::1", "2001::10"); // Teredo
- const char* const addresses[] = { "2001::1", "::ffff:1234:1", "ff32::1",
- "::1", NULL };
+ const char* const addresses[] = {"2001::1", "::ffff:1234:1", "ff32::1", "::1",
+ nullptr};
const int order[] = { 3, 2, 1, 0, -1 };
Verify(addresses, order);
}
@@ -326,7 +299,7 @@ TEST_F(AddressSorterPosixTest, Rule7) {
AddMapping("3002::1", "4000::10");
AddMapping("3002::2", "4000::20");
GetSourceInfo("4000::20")->native = true;
- const char* const addresses[] = { "3002::1", "3002::2", NULL };
+ const char* const addresses[] = {"3002::1", "3002::2", nullptr};
const int order[] = { 1, 0, -1 };
Verify(addresses, order);
}
@@ -340,8 +313,8 @@ TEST_F(AddressSorterPosixTest, Rule8) {
AddMapping("ff32::1", "4000::10"); // link-local
AddMapping("ff35::1", "4000::10"); // site-local
AddMapping("ff38::1", "4000::10"); // org-local
- const char* const addresses[] = { "ff38::1", "3000::1", "ff35::1", "ff32::1",
- "fe81::1", NULL };
+ const char* const addresses[] = {"ff38::1", "3000::1", "ff35::1",
+ "ff32::1", "fe81::1", nullptr};
const int order[] = { 4, 1, 3, 2, 0, -1 };
Verify(addresses, order);
}
@@ -354,8 +327,8 @@ TEST_F(AddressSorterPosixTest, Rule9) {
GetSourceInfo("4000::10")->prefix_length = 15;
AddMapping("4002::1", "4000::10"); // 14 bit match
AddMapping("4080::1", "4000::10"); // 8 bit match
- const char* const addresses[] = { "4080::1", "4002::1", "4000::1", "3000::1",
- NULL };
+ const char* const addresses[] = {"4080::1", "4002::1", "4000::1", "3000::1",
+ nullptr};
const int order[] = { 3, 2, 1, 0, -1 };
Verify(addresses, order);
}
@@ -365,7 +338,7 @@ TEST_F(AddressSorterPosixTest, Rule10) {
AddMapping("4000::1", "4000::10");
AddMapping("4000::2", "4000::10");
AddMapping("4000::3", "4000::10");
- const char* const addresses[] = { "4000::1", "4000::2", "4000::3", NULL };
+ const char* const addresses[] = {"4000::1", "4000::2", "4000::3", nullptr};
const int order[] = { 0, 1, 2, -1 };
Verify(addresses, order);
}
@@ -377,8 +350,8 @@ TEST_F(AddressSorterPosixTest, MultipleRules) {
AddMapping("4000::1", "4000::10"); // global unicast
AddMapping("ff32::2", "fe81::20"); // deprecated link-local multicast
GetSourceInfo("fe81::20")->deprecated = true;
- const char* const addresses[] = { "ff3e::1", "ff32::2", "4000::1", "ff32::1",
- "::1", "8.0.0.1", NULL };
+ const char* const addresses[] = {"ff3e::1", "ff32::2", "4000::1", "ff32::1",
+ "::1", "8.0.0.1", nullptr};
const int order[] = { 4, 3, 0, 2, 1, -1 };
Verify(addresses, order);
}
diff --git a/chromium/net/dns/address_sorter_win.cc b/chromium/net/dns/address_sorter_win.cc
index 1f3fdc7fa28..dc02848e17b 100644
--- a/chromium/net/dns/address_sorter_win.cc
+++ b/chromium/net/dns/address_sorter_win.cc
@@ -147,7 +147,7 @@ class AddressSorterWin : public AddressSorter {
// static
std::unique_ptr<AddressSorter> AddressSorter::CreateAddressSorter() {
- return std::unique_ptr<AddressSorter>(new AddressSorterWin());
+ return std::make_unique<AddressSorterWin>();
}
} // namespace net
diff --git a/chromium/net/dns/context_host_resolver.cc b/chromium/net/dns/context_host_resolver.cc
index b398e85b8f2..ba0edc91f28 100644
--- a/chromium/net/dns/context_host_resolver.cc
+++ b/chromium/net/dns/context_host_resolver.cc
@@ -140,10 +140,9 @@ const URLRequestContext* ContextHostResolver::GetContextForTesting() const {
return resolve_context_ ? resolve_context_->url_request_context() : nullptr;
}
-NetworkChangeNotifier::NetworkHandle
-ContextHostResolver::GetTargetNetworkForTesting() const {
+handles::NetworkHandle ContextHostResolver::GetTargetNetworkForTesting() const {
return resolve_context_ ? resolve_context_->GetTargetNetwork()
- : NetworkChangeNotifier::kInvalidNetworkHandle;
+ : handles::kInvalidNetworkHandle;
}
size_t ContextHostResolver::LastRestoredCacheSize() const {
diff --git a/chromium/net/dns/context_host_resolver.h b/chromium/net/dns/context_host_resolver.h
index 40f52618729..7499d699f72 100644
--- a/chromium/net/dns/context_host_resolver.h
+++ b/chromium/net/dns/context_host_resolver.h
@@ -12,6 +12,7 @@
#include "base/memory/raw_ptr.h"
#include "base/sequence_checker.h"
#include "net/base/net_export.h"
+#include "net/base/network_handle.h"
#include "net/base/network_isolation_key.h"
#include "net/dns/host_resolver.h"
#include "net/log/net_log_with_source.h"
@@ -72,8 +73,7 @@ class NET_EXPORT ContextHostResolver : public HostResolver {
void SetRequestContext(URLRequestContext* request_context) override;
HostResolverManager* GetManagerForTesting() override;
const URLRequestContext* GetContextForTesting() const override;
- NetworkChangeNotifier::NetworkHandle GetTargetNetworkForTesting()
- const override;
+ handles::NetworkHandle GetTargetNetworkForTesting() const override;
// Returns the number of host cache entries that were restored, or 0 if there
// is no cache.
@@ -88,8 +88,10 @@ class NET_EXPORT ContextHostResolver : public HostResolver {
}
private:
- const raw_ptr<HostResolverManager> manager_;
std::unique_ptr<HostResolverManager> owned_manager_;
+ // `manager_` might point to `owned_manager_`. It must be declared last and
+ // cleared first.
+ const raw_ptr<HostResolverManager> manager_;
std::unique_ptr<ResolveContext> resolve_context_;
// If true, the context is shutting down. Subsequent request Start() calls
diff --git a/chromium/net/dns/context_host_resolver_unittest.cc b/chromium/net/dns/context_host_resolver_unittest.cc
index 74a742359ee..4369636fbb5 100644
--- a/chromium/net/dns/context_host_resolver_unittest.cc
+++ b/chromium/net/dns/context_host_resolver_unittest.cc
@@ -80,8 +80,7 @@ class ContextHostResolverTest : public ::testing::Test,
void SetMockDnsRules(MockDnsClientRuleList rules) {
IPAddress dns_ip(192, 168, 1, 0);
DnsConfig config;
- config.nameservers.push_back(
- IPEndPoint(dns_ip, dns_protocol::kDefaultPort));
+ config.nameservers.emplace_back(dns_ip, dns_protocol::kDefaultPort);
config.doh_config = *DnsOverHttpsConfig::FromString("https://example.com");
EXPECT_TRUE(config.IsValid());
@@ -100,7 +99,7 @@ class ContextHostResolverTest : public ::testing::Test,
EXPECT_TRUE(dns_client_->GetEffectiveConfig());
scoped_refptr<HostResolverProc> proc = CreateCatchAllHostResolverProc();
- manager_->set_proc_params_for_test(ProcTaskParams(proc.get(), 1u));
+ manager_->set_proc_params_for_test(ProcTaskParams(proc, 1u));
}
raw_ptr<MockDnsClient> dns_client_;
@@ -620,13 +619,14 @@ TEST_F(ContextHostResolverTest, ResolveFromCache) {
// cache.
base::SimpleTestTickClock clock;
clock.Advance(base::Days(62)); // Arbitrary non-zero time.
- AddressList expected(kEndpoint);
+ std::vector<IPEndPoint> expected({kEndpoint});
host_cache->Set(
HostCache::Key("example.com", DnsQueryType::UNSPECIFIED,
0 /* host_resolver_flags */, HostResolverSource::ANY,
NetworkIsolationKey()),
- HostCache::Entry(OK, expected, HostCache::Entry::SOURCE_DNS,
- base::Days(1)),
+ HostCache::Entry(OK, expected,
+ /*aliases=*/std::set<std::string>({"example.com"}),
+ HostCache::Entry::SOURCE_DNS, base::Days(1)),
clock.NowTicks(), base::Days(1));
resolver->SetTickClockForTesting(&clock);
@@ -773,19 +773,18 @@ TEST_F(ContextHostResolverTest, HostCacheInvalidation) {
class NetworkBoundResolveContext : public ResolveContext {
public:
- NetworkBoundResolveContext(
- URLRequestContext* url_request_context,
- bool enable_caching,
- NetworkChangeNotifier::NetworkHandle target_network)
+ NetworkBoundResolveContext(URLRequestContext* url_request_context,
+ bool enable_caching,
+ handles::NetworkHandle target_network)
: ResolveContext(url_request_context, enable_caching),
target_network_(target_network) {}
- NetworkChangeNotifier::NetworkHandle GetTargetNetwork() const override {
+ handles::NetworkHandle GetTargetNetwork() const override {
return target_network_;
}
private:
- const NetworkChangeNotifier::NetworkHandle target_network_;
+ const handles::NetworkHandle target_network_;
};
// A mock HostResolverProc which returns different IP addresses based on the
@@ -803,7 +802,7 @@ class NetworkAwareHostResolverProc : public HostResolverProc {
HostResolverFlags host_resolver_flags,
AddressList* addrlist,
int* os_error,
- NetworkChangeNotifier::NetworkHandle network) override {
+ handles::NetworkHandle network) override {
// Presume failure
*os_error = 1;
const auto* iter = kResults.find(network);
@@ -823,7 +822,7 @@ class NetworkAwareHostResolverProc : public HostResolverProc {
AddressList* addrlist,
int* os_error) override {
return Resolve(host, address_family, host_resolver_flags, addrlist,
- os_error, NetworkChangeNotifier::kInvalidNetworkHandle);
+ os_error, handles::kInvalidNetworkHandle);
}
struct IPv4 {
@@ -835,7 +834,7 @@ class NetworkAwareHostResolverProc : public HostResolverProc {
static constexpr int kPort = 100;
static constexpr auto kResults =
- base::MakeFixedFlatMap<NetworkChangeNotifier::NetworkHandle, IPv4>(
+ base::MakeFixedFlatMap<handles::NetworkHandle, IPv4>(
{{1, IPv4{1, 2, 3, 4}}, {2, IPv4{8, 8, 8, 8}}});
static IPEndPoint ToIPEndPoint(const IPv4& ipv4) {
@@ -855,8 +854,7 @@ TEST_F(ContextHostResolverTest, ExistingNetworkBoundLookup) {
const url::SchemeHostPort host(url::kHttpsScheme, "example.com",
NetworkAwareHostResolverProc::kPort);
- scoped_refptr<NetworkAwareHostResolverProc> resolver_proc =
- new NetworkAwareHostResolverProc();
+ auto resolver_proc = base::MakeRefCounted<NetworkAwareHostResolverProc>();
ScopedDefaultHostResolverProc scoped_default_host_resolver;
scoped_default_host_resolver.Init(resolver_proc.get());
@@ -896,8 +894,7 @@ TEST_F(ContextHostResolverTest, ExistingNetworkBoundLookup) {
TEST_F(ContextHostResolverTest, NotExistingNetworkBoundLookup) {
const url::SchemeHostPort host(url::kHttpsScheme, "example.com",
NetworkAwareHostResolverProc::kPort);
- scoped_refptr<NetworkAwareHostResolverProc> resolver_proc =
- new NetworkAwareHostResolverProc();
+ auto resolver_proc = base::MakeRefCounted<NetworkAwareHostResolverProc>();
ScopedDefaultHostResolverProc scoped_default_host_resolver;
scoped_default_host_resolver.Init(resolver_proc.get());
@@ -932,7 +929,7 @@ TEST_F(ContextHostResolverTest, NetworkBoundResolverCacheInvalidation) {
// The actual network handle doesn't really matter, this test just wants to
// check that all the pieces are in place and configured correctly.
- constexpr NetworkChangeNotifier::NetworkHandle network = 2;
+ constexpr handles::NetworkHandle network = 2;
manager_ = HostResolverManager::CreateNetworkBoundHostResolverManager(
HostResolver::ManagerOptions(), network, nullptr /* net_log */);
manager_->SetLastIPv6ProbeResultForTesting(true);
diff --git a/chromium/net/dns/dns_alias_utility.cc b/chromium/net/dns/dns_alias_utility.cc
index 03101758593..3576f87135a 100644
--- a/chromium/net/dns/dns_alias_utility.cc
+++ b/chromium/net/dns/dns_alias_utility.cc
@@ -14,9 +14,7 @@
#include "url/url_canon.h"
#include "url/url_canon_stdstring.h"
-namespace net {
-
-namespace dns_alias_utility {
+namespace net::dns_alias_utility {
std::string ValidateAndCanonicalizeAlias(base::StringPiece alias) {
// Disallow empty hostnames, hostnames longer than
@@ -57,6 +55,4 @@ std::set<std::string> FixUpDnsAliases(const std::set<std::string>& aliases) {
return fixed_aliases;
}
-} // namespace dns_alias_utility
-
-} // namespace net
+} // namespace net::dns_alias_utility
diff --git a/chromium/net/dns/dns_alias_utility.h b/chromium/net/dns/dns_alias_utility.h
index 6ee0c1cc44a..2e51d3ace77 100644
--- a/chromium/net/dns/dns_alias_utility.h
+++ b/chromium/net/dns/dns_alias_utility.h
@@ -11,9 +11,7 @@
#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
-namespace net {
-
-namespace dns_alias_utility {
+namespace net::dns_alias_utility {
// Validates that `alias` represents a valid DNS alias name, e.g. CNAME, and
// then URL-canonicalizes the name. Returns empty string if not valid or unable
@@ -31,8 +29,6 @@ NET_EXPORT_PRIVATE std::string ValidateAndCanonicalizeAlias(
NET_EXPORT_PRIVATE std::set<std::string> FixUpDnsAliases(
const std::set<std::string>& aliases);
-} // namespace dns_alias_utility
-
-} // namespace net
+} // namespace net::dns_alias_utility
#endif // NET_DNS_DNS_ALIAS_UTILITY_H_
diff --git a/chromium/net/dns/dns_client.cc b/chromium/net/dns/dns_client.cc
index 179f857d54e..fd48d43f451 100644
--- a/chromium/net/dns/dns_client.cc
+++ b/chromium/net/dns/dns_client.cc
@@ -14,7 +14,6 @@
#include "base/rand_util.h"
#include "base/ranges/algorithm.h"
#include "base/values.h"
-#include "net/base/address_list.h"
#include "net/base/ip_address.h"
#include "net/base/ip_endpoint.h"
#include "net/dns/address_sorter.h"
@@ -177,7 +176,7 @@ class DnsClientImpl : public DnsClient {
return &config->hosts;
}
- absl::optional<AddressList> GetPresetAddrs(
+ absl::optional<std::vector<IPEndPoint>> GetPresetAddrs(
const url::SchemeHostPort& endpoint) const override {
DCHECK(endpoint.IsValid());
if (!session_)
@@ -199,7 +198,7 @@ class DnsClientImpl : public DnsClient {
combined.emplace_back(ip, endpoint.port());
}
}
- return AddressList(std::move(combined));
+ return combined;
}
DnsTransactionFactory* GetTransactionFactory() override {
@@ -295,8 +294,9 @@ class DnsClientImpl : public DnsClient {
if (new_effective_config) {
DCHECK(new_effective_config.value().IsValid());
- session_ = new DnsSession(std::move(new_effective_config).value(),
- rand_int_callback_, net_log_);
+ session_ = base::MakeRefCounted<DnsSession>(
+ std::move(new_effective_config).value(), rand_int_callback_,
+ net_log_);
factory_ = DnsTransactionFactory::CreateFactory(session_.get());
}
}
diff --git a/chromium/net/dns/dns_client.h b/chromium/net/dns/dns_client.h
index 208a1b148cb..4a0931f76a0 100644
--- a/chromium/net/dns/dns_client.h
+++ b/chromium/net/dns/dns_client.h
@@ -7,7 +7,7 @@
#include <memory>
-#include "net/base/address_list.h"
+#include "net/base/ip_endpoint.h"
#include "net/base/net_export.h"
#include "net/base/rand_callback.h"
#include "net/dns/dns_config.h"
@@ -89,7 +89,7 @@ class NET_EXPORT DnsClient {
// Returns all preset addresses for the specified endpoint, if any are
// present in the current effective DnsConfig.
- virtual absl::optional<AddressList> GetPresetAddrs(
+ virtual absl::optional<std::vector<IPEndPoint>> GetPresetAddrs(
const url::SchemeHostPort& endpoint) const = 0;
// Returns null if the current config is not valid.
diff --git a/chromium/net/dns/dns_client_unittest.cc b/chromium/net/dns/dns_client_unittest.cc
index 17bce032793..7ce5be79432 100644
--- a/chromium/net/dns/dns_client_unittest.cc
+++ b/chromium/net/dns/dns_client_unittest.cc
@@ -306,7 +306,8 @@ TEST_F(DnsClientTest, GetPresetAddrs) {
EXPECT_FALSE(client_->GetPresetAddrs(
url::SchemeHostPort("https", "www.doh.com", 9999)));
- AddressList expected({{{4, 3, 2, 1}, 443}, {{4, 3, 2, 2}, 443}});
+ std::vector<IPEndPoint> expected({{{4, 3, 2, 1}, 443}, {{4, 3, 2, 2}, 443}});
+
EXPECT_THAT(
client_->GetPresetAddrs(url::SchemeHostPort("https", "www.doh.com", 443)),
testing::Optional(expected));
diff --git a/chromium/net/dns/dns_config_service_android_unittest.cc b/chromium/net/dns/dns_config_service_android_unittest.cc
index 553e58bd63a..0a8851ff788 100644
--- a/chromium/net/dns/dns_config_service_android_unittest.cc
+++ b/chromium/net/dns/dns_config_service_android_unittest.cc
@@ -23,8 +23,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace internal {
+namespace net::internal {
namespace {
const IPEndPoint kNameserver1(IPAddress(1, 2, 3, 4), 53);
@@ -273,5 +272,4 @@ TEST_F(DnsConfigServiceAndroidTest, ReadsEmptySearchSuffixes) {
}
} // namespace
-} // namespace internal
-} // namespace net
+} // namespace net::internal
diff --git a/chromium/net/dns/dns_config_service_linux.cc b/chromium/net/dns/dns_config_service_linux.cc
index b762a2fc3ea..b9d65f6a5cc 100644
--- a/chromium/net/dns/dns_config_service_linux.cc
+++ b/chromium/net/dns/dns_config_service_linux.cc
@@ -20,10 +20,13 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/check.h"
+#include "base/containers/contains.h"
#include "base/files/file_path.h"
#include "base/files/file_path_watcher.h"
#include "base/location.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
+#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/sequence_checker.h"
#include "base/threading/scoped_blocking_call.h"
@@ -203,11 +206,12 @@ enum class IncompatibleNsswitchReason {
void RecordIncompatibleNsswitchReason(
IncompatibleNsswitchReason reason,
absl::optional<NsswitchReader::Service> service_token) {
- UMA_HISTOGRAM_ENUMERATION("Net.DNS.DnsConfig.Nsswitch.IncompatibleReason",
- reason);
+ base::UmaHistogramEnumeration("Net.DNS.DnsConfig.Nsswitch.IncompatibleReason",
+ reason);
if (service_token) {
- UMA_HISTOGRAM_ENUMERATION("Net.DNS.DnsConfig.Nsswitch.IncompatibleService",
- service_token.value());
+ base::UmaHistogramEnumeration(
+ "Net.DNS.DnsConfig.Nsswitch.IncompatibleService",
+ service_token.value());
}
}
@@ -370,12 +374,12 @@ class DnsConfigServiceLinux::Watcher : public DnsConfigService::Watcher {
private:
void OnResolvFilePathWatcherChange(const base::FilePath& path, bool error) {
- UMA_HISTOGRAM_BOOLEAN("Net.DNS.DnsConfig.Resolv.FileChange", true);
+ base::UmaHistogramBoolean("Net.DNS.DnsConfig.Resolv.FileChange", true);
OnConfigChanged(!error);
}
void OnNsswitchFilePathWatcherChange(const base::FilePath& path, bool error) {
- UMA_HISTOGRAM_BOOLEAN("Net.DNS.DnsConfig.Nsswitch.FileChange", true);
+ base::UmaHistogramBoolean("Net.DNS.DnsConfig.Nsswitch.FileChange", true);
OnConfigChanged(!error);
}
@@ -452,14 +456,14 @@ class DnsConfigServiceLinux::ConfigReader : public SerialWorker {
}
}
- UMA_HISTOGRAM_BOOLEAN("Net.DNS.DnsConfig.Resolv.Read",
- dns_config_.has_value());
+ base::UmaHistogramBoolean("Net.DNS.DnsConfig.Resolv.Read",
+ dns_config_.has_value());
if (!dns_config_.has_value())
return;
- UMA_HISTOGRAM_BOOLEAN("Net.DNS.DnsConfig.Resolv.Valid",
- dns_config_->IsValid());
- UMA_HISTOGRAM_BOOLEAN("Net.DNS.DnsConfig.Resolv.Compatible",
- !dns_config_->unhandled_options);
+ base::UmaHistogramBoolean("Net.DNS.DnsConfig.Resolv.Valid",
+ dns_config_->IsValid());
+ base::UmaHistogramBoolean("Net.DNS.DnsConfig.Resolv.Compatible",
+ !dns_config_->unhandled_options);
// Override `fallback_period` value to match default setting on
// Windows.
@@ -468,12 +472,16 @@ class DnsConfigServiceLinux::ConfigReader : public SerialWorker {
if (dns_config_ && !dns_config_->unhandled_options) {
std::vector<NsswitchReader::ServiceSpecification> nsswitch_hosts =
nsswitch_reader_->ReadAndParseHosts();
- UMA_HISTOGRAM_COUNTS_100("Net.DNS.DnsConfig.Nsswitch.NumServices",
- nsswitch_hosts.size());
+ base::UmaHistogramCounts100("Net.DNS.DnsConfig.Nsswitch.NumServices",
+ nsswitch_hosts.size());
dns_config_->unhandled_options =
!IsNsswitchConfigCompatible(nsswitch_hosts);
- UMA_HISTOGRAM_BOOLEAN("Net.DNS.DnsConfig.Nsswitch.Compatible",
- !dns_config_->unhandled_options);
+ base::UmaHistogramBoolean("Net.DNS.DnsConfig.Nsswitch.Compatible",
+ !dns_config_->unhandled_options);
+ base::UmaHistogramBoolean(
+ "Net.DNS.DnsConfig.Nsswitch.NisServiceInHosts",
+ base::Contains(nsswitch_hosts, NsswitchReader::Service::kNis,
+ &NsswitchReader::ServiceSpecification::service));
}
}
@@ -485,7 +493,7 @@ class DnsConfigServiceLinux::ConfigReader : public SerialWorker {
};
// Raw pointer to owning DnsConfigService.
- DnsConfigServiceLinux* const service_;
+ const raw_ptr<DnsConfigServiceLinux> service_;
// Null while the `WorkItem` is running on the `ThreadPool`.
std::unique_ptr<WorkItem> work_item_;
diff --git a/chromium/net/dns/dns_config_service_linux_unittest.cc b/chromium/net/dns/dns_config_service_linux_unittest.cc
index 6fd1bdad937..cd92a042be2 100644
--- a/chromium/net/dns/dns_config_service_linux_unittest.cc
+++ b/chromium/net/dns/dns_config_service_linux_unittest.cc
@@ -15,6 +15,7 @@
#include "base/cancelable_callback.h"
#include "base/check.h"
#include "base/files/file_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h"
#include "base/sys_byteorder.h"
@@ -22,6 +23,7 @@
#include "base/task/single_thread_task_runner.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
+#include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h"
#include "base/test/test_waitable_event.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -40,6 +42,9 @@ namespace net {
namespace {
+const char kNsswitchNisServiceInHostsHistogramName[] =
+ "Net.DNS.DnsConfig.Nsswitch.NisServiceInHosts";
+
// MAXNS is normally 3, but let's test 4 if possible.
const char* const kNameserversIPv4[] = {
"8.8.8.8",
@@ -310,8 +315,8 @@ class DnsConfigServiceLinuxTest : public ::testing::Test,
protected:
internal::DnsConfigServiceLinux service_;
- TestResolvReader* resolv_reader_;
- TestNsswitchReader* nsswitch_reader_;
+ raw_ptr<TestResolvReader> resolv_reader_;
+ raw_ptr<TestNsswitchReader> nsswitch_reader_;
};
// Regression test to verify crash does not occur if DnsConfigServiceLinux
@@ -878,6 +883,28 @@ TEST_F(DnsConfigServiceLinuxTest, RejectsNsswitchResolve) {
EXPECT_TRUE(config->unhandled_options);
}
+TEST_F(DnsConfigServiceLinuxTest, HistogramNoNisServiceInHosts) {
+ auto res = std::make_unique<struct __res_state>();
+ InitializeResState(res.get());
+ resolv_reader_->set_value(std::move(res));
+
+ nsswitch_reader_->set_value(
+ {NsswitchReader::ServiceSpecification(NsswitchReader::Service::kFiles),
+ NsswitchReader::ServiceSpecification(NsswitchReader::Service::kDns)});
+
+ base::HistogramTester histogram_tester;
+ CallbackHelper callback_helper;
+ service_.ReadConfig(callback_helper.GetCallback());
+ absl::optional<DnsConfig> config = callback_helper.WaitForResult();
+ EXPECT_TRUE(resolv_reader_->closed());
+ histogram_tester.ExpectBucketCount(kNsswitchNisServiceInHostsHistogramName,
+ false, 1);
+
+ ASSERT_TRUE(config.has_value());
+ EXPECT_TRUE(config->IsValid());
+ EXPECT_FALSE(config->unhandled_options);
+}
+
TEST_F(DnsConfigServiceLinuxTest, AcceptsNsswitchNis) {
auto res = std::make_unique<struct __res_state>();
InitializeResState(res.get());
@@ -888,10 +915,13 @@ TEST_F(DnsConfigServiceLinuxTest, AcceptsNsswitchNis) {
NsswitchReader::ServiceSpecification(NsswitchReader::Service::kNis),
NsswitchReader::ServiceSpecification(NsswitchReader::Service::kDns)});
+ base::HistogramTester histogram_tester;
CallbackHelper callback_helper;
service_.ReadConfig(callback_helper.GetCallback());
absl::optional<DnsConfig> config = callback_helper.WaitForResult();
EXPECT_TRUE(resolv_reader_->closed());
+ histogram_tester.ExpectBucketCount(kNsswitchNisServiceInHostsHistogramName,
+ true, 1);
ASSERT_TRUE(config.has_value());
EXPECT_TRUE(config->IsValid());
diff --git a/chromium/net/dns/dns_config_service_posix.cc b/chromium/net/dns/dns_config_service_posix.cc
index 3cce5f20af7..025078e1126 100644
--- a/chromium/net/dns/dns_config_service_posix.cc
+++ b/chromium/net/dns/dns_config_service_posix.cc
@@ -16,6 +16,7 @@
#include "base/lazy_instance.h"
#include "base/location.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/sequence_checker.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/scoped_blocking_call.h"
@@ -208,7 +209,7 @@ class DnsConfigServicePosix::ConfigReader : public SerialWorker {
};
// Raw pointer to owning DnsConfigService.
- DnsConfigServicePosix* const service_;
+ const raw_ptr<DnsConfigServicePosix> service_;
};
DnsConfigServicePosix::DnsConfigServicePosix()
@@ -314,8 +315,7 @@ std::unique_ptr<DnsConfigService> DnsConfigService::CreateSystemService() {
#if BUILDFLAG(IS_IOS)
return nullptr;
#else // BUILDFLAG(IS_IOS)
- return std::unique_ptr<DnsConfigService>(
- new internal::DnsConfigServicePosix());
+ return std::make_unique<internal::DnsConfigServicePosix>();
#endif // BUILDFLAG(IS_IOS)
}
diff --git a/chromium/net/dns/dns_config_service_posix_unittest.cc b/chromium/net/dns/dns_config_service_posix_unittest.cc
index b254160cfb9..695a382526e 100644
--- a/chromium/net/dns/dns_config_service_posix_unittest.cc
+++ b/chromium/net/dns/dns_config_service_posix_unittest.cc
@@ -50,9 +50,9 @@ const char* const kNameserversIPv4[] = {
#if BUILDFLAG(IS_CHROMEOS)
const char* const kNameserversIPv6[] = {
- NULL,
+ nullptr,
"2001:DB8:0::42",
- NULL,
+ nullptr,
"::FFFF:129.144.52.38",
};
#endif
@@ -107,7 +107,7 @@ void InitializeResState(res_state res) {
void CloseResState(res_state res) {
#if BUILDFLAG(IS_CHROMEOS)
for (int i = 0; i < res->nscount; ++i) {
- if (res->_u._ext.nsaddrs[i] != NULL)
+ if (res->_u._ext.nsaddrs[i] != nullptr)
free(res->_u._ext.nsaddrs[i]);
}
#endif
@@ -196,8 +196,7 @@ TEST(DnsConfigServicePosixTest, DestroyWhileJobsWorking) {
base::test::TaskEnvironment::MainThreadType::IO,
base::test::TaskEnvironment::TimeSource::MOCK_TIME);
- std::unique_ptr<internal::DnsConfigServicePosix> service(
- new internal::DnsConfigServicePosix());
+ auto service = std::make_unique<internal::DnsConfigServicePosix>();
// Call WatchConfig() which also tests ReadConfig().
service->WatchConfig(base::BindRepeating(&DummyConfigCallback));
service.reset();
diff --git a/chromium/net/dns/dns_config_service_unittest.cc b/chromium/net/dns/dns_config_service_unittest.cc
index e235d90883c..7ba68e14760 100644
--- a/chromium/net/dns/dns_config_service_unittest.cc
+++ b/chromium/net/dns/dns_config_service_unittest.cc
@@ -97,8 +97,7 @@ class DnsConfigServiceTest : public TestWithTaskEnvironment {
// Generate a config using the given seed..
DnsConfig MakeConfig(unsigned seed) {
DnsConfig config;
- config.nameservers.push_back(
- IPEndPoint(IPAddress(1, 2, 3, 4), seed & 0xFFFF));
+ config.nameservers.emplace_back(IPAddress(1, 2, 3, 4), seed & 0xFFFF);
EXPECT_TRUE(config.IsValid());
return config;
}
diff --git a/chromium/net/dns/dns_config_service_win.cc b/chromium/net/dns/dns_config_service_win.cc
index e2d17692567..71ecb1866a2 100644
--- a/chromium/net/dns/dns_config_service_win.cc
+++ b/chromium/net/dns/dns_config_service_win.cc
@@ -679,7 +679,7 @@ bool DnsConfigServiceWin::StartWatching() {
// static
std::unique_ptr<DnsConfigService> DnsConfigService::CreateSystemService() {
- return std::unique_ptr<DnsConfigService>(new internal::DnsConfigServiceWin());
+ return std::make_unique<internal::DnsConfigServiceWin>();
}
} // namespace net
diff --git a/chromium/net/dns/dns_config_watcher_mac.cc b/chromium/net/dns/dns_config_watcher_mac.cc
index 9d5398a261b..747c18bf16c 100644
--- a/chromium/net/dns/dns_config_watcher_mac.cc
+++ b/chromium/net/dns/dns_config_watcher_mac.cc
@@ -7,6 +7,7 @@
#include <dlfcn.h>
#include "base/lazy_instance.h"
+#include "base/memory/raw_ptr.h"
#include "third_party/apple_apsl/dnsinfo.h"
namespace {
@@ -46,7 +47,7 @@ class DnsInfoApi {
dns_configuration_free_t dns_configuration_free = nullptr;
private:
- void* handle_;
+ raw_ptr<void> handle_;
};
const DnsInfoApi& GetDnsInfoApi() {
diff --git a/chromium/net/dns/dns_config_watcher_mac.h b/chromium/net/dns/dns_config_watcher_mac.h
index 86dbe5ad2c1..489452230c1 100644
--- a/chromium/net/dns/dns_config_watcher_mac.h
+++ b/chromium/net/dns/dns_config_watcher_mac.h
@@ -8,8 +8,7 @@
#include "base/callback_forward.h"
#include "net/dns/notify_watcher_mac.h"
-namespace net {
-namespace internal {
+namespace net::internal {
// Watches DNS configuration on Mac.
class DnsConfigWatcher {
@@ -23,7 +22,6 @@ class DnsConfigWatcher {
NotifyWatcherMac watcher_;
};
-} // namespace internal
-} // namespace net
+} // namespace net::internal
#endif // NET_DNS_DNS_CONFIG_WATCHER_MAC_H_
diff --git a/chromium/net/dns/dns_query.cc b/chromium/net/dns/dns_query.cc
index 75faae360b4..01d7bab9d88 100644
--- a/chromium/net/dns/dns_query.cc
+++ b/chromium/net/dns/dns_query.cc
@@ -13,6 +13,7 @@
#include "base/sys_byteorder.h"
#include "net/base/io_buffer.h"
#include "net/dns/dns_util.h"
+#include "net/dns/opt_record_rdata.h"
#include "net/dns/public/dns_protocol.h"
#include "net/dns/record_rdata.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -58,31 +59,36 @@ size_t DeterminePaddingSize(size_t unpadded_size,
}
}
-absl::optional<OptRecordRdata> AddPaddingIfNecessary(
+std::unique_ptr<OptRecordRdata> AddPaddingIfNecessary(
const OptRecordRdata* opt_rdata,
DnsQuery::PaddingStrategy padding_strategy,
size_t no_opt_buffer_size) {
// If no input OPT record rdata and no padding, no OPT record rdata needed.
if (!opt_rdata && padding_strategy == DnsQuery::PaddingStrategy::NONE)
- return absl::nullopt;
-
- OptRecordRdata merged_opt_rdata;
- if (opt_rdata)
- merged_opt_rdata.AddOpts(*opt_rdata);
+ return nullptr;
+
+ std::unique_ptr<OptRecordRdata> merged_opt_rdata;
+ if (opt_rdata) {
+ merged_opt_rdata = OptRecordRdata::Create(
+ base::StringPiece(opt_rdata->buf().data(), opt_rdata->buf().size()));
+ } else {
+ merged_opt_rdata = std::make_unique<OptRecordRdata>();
+ }
+ DCHECK(merged_opt_rdata);
- size_t unpadded_size = no_opt_buffer_size + OptRecordSize(&merged_opt_rdata);
+ size_t unpadded_size =
+ no_opt_buffer_size + OptRecordSize(merged_opt_rdata.get());
size_t padding_size = DeterminePaddingSize(unpadded_size, padding_strategy);
if (padding_size > 0) {
// |opt_rdata| must not already contain padding if DnsQuery is to add
// padding.
- DCHECK(!merged_opt_rdata.ContainsOptCode(dns_protocol::kEdnsPadding));
+ DCHECK(!merged_opt_rdata->ContainsOptCode(dns_protocol::kEdnsPadding));
// OPT header is the minimum amount of padding.
DCHECK(padding_size >= OptRecordRdata::Opt::kHeaderSize);
- merged_opt_rdata.AddOpt(OptRecordRdata::Opt(
- dns_protocol::kEdnsPadding,
- std::string(padding_size - OptRecordRdata::Opt::kHeaderSize, 0)));
+ merged_opt_rdata->AddOpt(std::make_unique<OptRecordRdata::PaddingOpt>(
+ padding_size - OptRecordRdata::Opt::kHeaderSize));
}
return merged_opt_rdata;
@@ -106,10 +112,10 @@ DnsQuery::DnsQuery(uint16_t id,
#endif // DCHECK_IS_ON()
size_t buffer_size = kHeaderSize + QuestionSize(qname_size_);
- absl::optional<OptRecordRdata> merged_opt_rdata =
+ std::unique_ptr<OptRecordRdata> merged_opt_rdata =
AddPaddingIfNecessary(opt_rdata, padding_strategy, buffer_size);
if (merged_opt_rdata)
- buffer_size += OptRecordSize(&merged_opt_rdata.value());
+ buffer_size += OptRecordSize(merged_opt_rdata.get());
io_buffer_ = base::MakeRefCounted<IOBufferWithSize>(buffer_size);
@@ -127,7 +133,7 @@ DnsQuery::DnsQuery(uint16_t id,
writer.WriteU16(dns_protocol::kClassIN);
if (merged_opt_rdata) {
- DCHECK(!merged_opt_rdata.value().opts().empty());
+ DCHECK_NE(merged_opt_rdata->OptCount(), 0u);
header_->arcount = base::HostToNet16(1);
// Write OPT pseudo-resource record.
@@ -142,9 +148,9 @@ DnsQuery::DnsQuery(uint16_t id,
writer.WriteU16(0); // flags
// rdata
- writer.WriteU16(merged_opt_rdata.value().buf().size()); // rdata length
- writer.WriteBytes(merged_opt_rdata.value().buf().data(),
- merged_opt_rdata.value().buf().size());
+ writer.WriteU16(merged_opt_rdata->buf().size()); // rdata length
+ writer.WriteBytes(merged_opt_rdata->buf().data(),
+ merged_opt_rdata->buf().size());
}
}
diff --git a/chromium/net/dns/dns_query_unittest.cc b/chromium/net/dns/dns_query_unittest.cc
index 1f6bf1138b8..b09d6c8f303 100644
--- a/chromium/net/dns/dns_query_unittest.cc
+++ b/chromium/net/dns/dns_query_unittest.cc
@@ -11,6 +11,7 @@
#include "base/memory/scoped_refptr.h"
#include "net/base/io_buffer.h"
#include "net/dns/dns_util.h"
+#include "net/dns/opt_record_rdata.h"
#include "net/dns/public/dns_protocol.h"
#include "net/dns/record_rdata.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -122,7 +123,8 @@ TEST(DnsQueryTest, EDNS0) {
base::StringPiece qname(kQNameData, sizeof(kQNameData));
OptRecordRdata opt_rdata;
- opt_rdata.AddOpt(OptRecordRdata::Opt(255, "\xde\xad\xbe\xef"));
+ opt_rdata.AddOpt(
+ OptRecordRdata::UnknownOpt::CreateForTesting(255, "\xde\xad\xbe\xef"));
DnsQuery q1(0xbeef, qname, dns_protocol::kTypeA, &opt_rdata);
EXPECT_EQ(dns_protocol::kTypeA, q1.qtype());
diff --git a/chromium/net/dns/dns_response.h b/chromium/net/dns/dns_response.h
index c5a248f7303..57132abc4dc 100644
--- a/chromium/net/dns/dns_response.h
+++ b/chromium/net/dns/dns_response.h
@@ -35,7 +35,7 @@ struct Header;
// 4.1.3.
struct NET_EXPORT_PRIVATE DnsResourceRecord {
DnsResourceRecord();
- explicit DnsResourceRecord(const DnsResourceRecord& other);
+ DnsResourceRecord(const DnsResourceRecord& other);
DnsResourceRecord(DnsResourceRecord&& other);
~DnsResourceRecord();
diff --git a/chromium/net/dns/dns_response_result_extractor.cc b/chromium/net/dns/dns_response_result_extractor.cc
index d0701302f7d..90af6162505 100644
--- a/chromium/net/dns/dns_response_result_extractor.cc
+++ b/chromium/net/dns/dns_response_result_extractor.cc
@@ -323,11 +323,15 @@ ExtractionError ExtractAddressResults(const DnsResponse& response,
}
ip_endpoints.emplace_back(address, /*port=*/0);
}
+ int error_result = ip_endpoints.empty() ? ERR_NAME_NOT_RESOLVED : OK;
- HostCache::Entry results(ip_endpoints.empty() ? ERR_NAME_NOT_RESOLVED : OK,
- std::move(ip_endpoints),
- HostCache::Entry::SOURCE_DNS, response_ttl);
- results.set_aliases(std::move(aliases));
+ HostCache::Entry results(error_result, std::move(ip_endpoints),
+ std::move(aliases), HostCache::Entry::SOURCE_DNS,
+ response_ttl);
+
+ if (!canonical_name.empty()) {
+ results.set_canonical_names(std::set<std::string>({canonical_name}));
+ }
*out_results = std::move(results);
return ExtractionError::kOk;
@@ -556,13 +560,16 @@ ExtractionError ExtractHttpsResults(const DnsResponse& response,
if (!service->IsCompatible())
continue;
- // Only support services at the original domain name, as that is the name at
- // which Chrome queried A/AAAA. Chrome does not yet support followup queries
- // or diverging addresses.
base::StringPiece target_name = service->service_name().empty()
? record->name()
: service->service_name();
- if (target_name != original_domain_name) {
+
+ // Chrome does not yet support followup queries. So only support services at
+ // the original domain name or the canonical name (the record name).
+ // Note: HostCache::Entry::GetEndpoints() will not return metadatas which
+ // target name is different from the canonical name of A/AAAA query results.
+ if ((target_name != original_domain_name) &&
+ (target_name != record->name())) {
continue;
}
@@ -594,6 +601,8 @@ ExtractionError ExtractHttpsResults(const DnsResponse& response,
metadata.ech_config_list = ConnectionEndpointMetadata::EchConfigList(
service->ech_config().cbegin(), service->ech_config().cend());
+ metadata.target_name = base::ToLowerASCII(target_name);
+
results.emplace(service->priority(), std::move(metadata));
if (service->default_alpn())
diff --git a/chromium/net/dns/dns_response_result_extractor.h b/chromium/net/dns/dns_response_result_extractor.h
index e48d0e76f63..5e575aa95d0 100644
--- a/chromium/net/dns/dns_response_result_extractor.h
+++ b/chromium/net/dns/dns_response_result_extractor.h
@@ -68,7 +68,7 @@ class NET_EXPORT_PRIVATE DnsResponseResultExtractor {
static HostCache::Entry CreateEmptyResult(DnsQueryType query_type);
private:
- const raw_ptr<const DnsResponse> response_;
+ const raw_ptr<const DnsResponse, DanglingUntriaged> response_;
};
} // namespace net
diff --git a/chromium/net/dns/dns_response_result_extractor_unittest.cc b/chromium/net/dns/dns_response_result_extractor_unittest.cc
index 115026160a3..afee3d37903 100644
--- a/chromium/net/dns/dns_response_result_extractor_unittest.cc
+++ b/chromium/net/dns/dns_response_result_extractor_unittest.cc
@@ -922,7 +922,8 @@ TEST(DnsResponseResultExtractorTest, ExtractsBasicHttpsResponses) {
EXPECT_THAT(
results.GetMetadatas(),
testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
- testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn)))));
+ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
@@ -963,11 +964,12 @@ TEST(DnsResponseResultExtractorTest, ExtractsComprehensiveHttpsResponses) {
EXPECT_THAT(results.error(), test::IsOk());
EXPECT_THAT(results.GetMetadatas(),
testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(kAlpn)),
+ ExpectConnectionEndpointMetadata(testing::ElementsAre(kAlpn),
+ testing::IsEmpty(), kName),
ExpectConnectionEndpointMetadata(
testing::ElementsAre(
kAlpn, dns_protocol::kHttpsServiceDefaultAlpn),
- testing::ElementsAreArray(kEchConfig)))));
+ testing::ElementsAreArray(kEchConfig), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true, true)));
@@ -1058,7 +1060,8 @@ TEST(DnsResponseResultExtractorTest, IgnoresUnsupportedParamsInHttpsRecord) {
EXPECT_THAT(
results.GetMetadatas(),
testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
- testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn)))));
+ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
}
@@ -1092,10 +1095,11 @@ TEST(DnsResponseResultExtractorTest,
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(false, true)));
}
@@ -1119,10 +1123,11 @@ TEST(DnsResponseResultExtractorTest,
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
}
@@ -1146,10 +1151,11 @@ TEST(DnsResponseResultExtractorTest,
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
}
@@ -1174,10 +1180,11 @@ TEST(DnsResponseResultExtractorTest,
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
}
@@ -1202,10 +1209,11 @@ TEST(DnsResponseResultExtractorTest,
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
}
@@ -1234,25 +1242,25 @@ TEST(DnsResponseResultExtractorTest,
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true, true)));
}
TEST(DnsResponseResultExtractorTest,
- IgnoreHttpsRecordWithPrefixedNameAndDefaultServiceName) {
+ ExtractsHttpsRecordWithPrefixedNameAndDefaultServiceName) {
constexpr char kPrefixedName[] = "_445._https.https.test";
- DnsResponse response =
- BuildTestDnsResponse(kPrefixedName, dns_protocol::kTypeHttps,
- {BuildTestHttpsServiceRecord(
- kPrefixedName, /*priority=*/4,
- /*service_name=*/".",
- /*params=*/
- {BuildTestHttpsServiceAlpnParam({"ignored"})})});
+ DnsResponse response = BuildTestDnsResponse(
+ kPrefixedName, dns_protocol::kTypeHttps,
+ {BuildTestHttpsServiceRecord(kPrefixedName, /*priority=*/4,
+ /*service_name=*/".",
+ /*params=*/
+ {BuildTestHttpsServiceAlpnParam({"foo"})})});
DnsResponseResultExtractor extractor(&response);
HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN);
@@ -1261,14 +1269,18 @@ TEST(DnsResponseResultExtractorTest,
/*request_port=*/0, &results),
DnsResponseResultExtractor::ExtractionError::kOk);
- EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED));
- EXPECT_THAT(results.GetMetadatas(), testing::Optional(testing::IsEmpty()));
+ EXPECT_THAT(results.error(), test::IsOk());
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kPrefixedName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
}
TEST(DnsResponseResultExtractorTest,
- IgnoreHttpsRecordWithAliasingAndDefaultServiceName) {
+ ExtractsHttpsRecordWithAliasingAndDefaultServiceName) {
constexpr char kName[] = "https.test";
DnsResponse response = BuildTestDnsResponse(
@@ -1286,8 +1298,12 @@ TEST(DnsResponseResultExtractorTest,
/*request_port=*/0, &results),
DnsResponseResultExtractor::ExtractionError::kOk);
- EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED));
- EXPECT_THAT(results.GetMetadatas(), testing::Optional(testing::IsEmpty()));
+ EXPECT_THAT(results.error(), test::IsOk());
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), "alias.test"))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
}
@@ -1312,10 +1328,11 @@ TEST(DnsResponseResultExtractorTest, ExtractsHttpsRecordWithMatchingPort) {
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
}
@@ -1343,10 +1360,11 @@ TEST(DnsResponseResultExtractorTest, IgnoresHttpsRecordWithMismatchingPort) {
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true, true)));
}
@@ -1376,10 +1394,11 @@ TEST(DnsResponseResultExtractorTest, IgnoresHttpsRecordWithNoAlpn) {
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true, true)));
}
@@ -1579,10 +1598,11 @@ TEST(DnsResponseResultExtractorTest, IgnoresAdditionalHttpsRecords) {
DnsResponseResultExtractor::ExtractionError::kOk);
EXPECT_THAT(results.error(), test::IsOk());
- EXPECT_THAT(results.GetMetadatas(),
- testing::Optional(testing::ElementsAre(
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- "foo1", dns_protocol::kHttpsServiceDefaultAlpn)))));
+ EXPECT_THAT(
+ results.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata(
+ testing::ElementsAre("foo1", dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName))));
EXPECT_THAT(results.https_record_compatibility(),
testing::Pointee(testing::ElementsAre(true)));
diff --git a/chromium/net/dns/dns_response_unittest.cc b/chromium/net/dns/dns_response_unittest.cc
index 74be2439273..6908103b777 100644
--- a/chromium/net/dns/dns_response_unittest.cc
+++ b/chromium/net/dns/dns_response_unittest.cc
@@ -493,8 +493,7 @@ TEST(DnsResponseTest, InitParse) {
const char qname_data[] = "\x0A""codereview""\x08""chromium""\x03""org";
const base::StringPiece qname(qname_data, sizeof(qname_data));
// Compilers want to copy when binding temporary to const &, so must use heap.
- std::unique_ptr<DnsQuery> query(
- new DnsQuery(0xcafe, qname, dns_protocol::kTypeA));
+ auto query = std::make_unique<DnsQuery>(0xcafe, qname, dns_protocol::kTypeA);
const uint8_t response_data[] = {
// Header
@@ -559,8 +558,8 @@ TEST(DnsResponseTest, InitParse) {
EXPECT_THAT(resp.id(), testing::Optional(0xcafe));
// Reject wrong question.
- std::unique_ptr<DnsQuery> wrong_query(
- new DnsQuery(0xcafe, qname, dns_protocol::kTypeCNAME));
+ auto wrong_query =
+ std::make_unique<DnsQuery>(0xcafe, qname, dns_protocol::kTypeCNAME);
EXPECT_FALSE(resp.InitParse(sizeof(response_data), *wrong_query));
EXPECT_FALSE(resp.IsValid());
EXPECT_THAT(resp.id(), testing::Optional(0xcafe));
@@ -605,8 +604,7 @@ TEST(DnsResponseTest, InitParseInvalidFlags) {
"org";
const base::StringPiece qname(qname_data, sizeof(qname_data));
// Compilers want to copy when binding temporary to const &, so must use heap.
- std::unique_ptr<DnsQuery> query(
- new DnsQuery(0xcafe, qname, dns_protocol::kTypeA));
+ auto query = std::make_unique<DnsQuery>(0xcafe, qname, dns_protocol::kTypeA);
const uint8_t response_data[] = {
// Header
@@ -1321,8 +1319,11 @@ TEST(DnsResponseWriteTest, SingleARecordAnswerWithQuestion) {
std::string dotted_name("www.example.com");
std::string dns_name;
ASSERT_TRUE(DNSDomainFromDot(dotted_name, &dns_name));
+
OptRecordRdata opt_rdata;
- opt_rdata.AddOpt(OptRecordRdata::Opt(255, "\xde\xad\xbe\xef"));
+ opt_rdata.AddOpt(
+ OptRecordRdata::UnknownOpt::CreateForTesting(255, "\xde\xad\xbe\xef"));
+
absl::optional<DnsQuery> query;
query.emplace(0x1234 /* id */, dns_name, dns_protocol::kTypeA, &opt_rdata);
net::DnsResourceRecord answer;
diff --git a/chromium/net/dns/dns_test_util.cc b/chromium/net/dns/dns_test_util.cc
index 5d401ae9935..fd2e535ef4e 100644
--- a/chromium/net/dns/dns_test_util.cc
+++ b/chromium/net/dns/dns_test_util.cc
@@ -20,7 +20,6 @@
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
-#include "net/base/address_list.h"
#include "net/base/io_buffer.h"
#include "net/base/ip_address.h"
#include "net/base/ip_endpoint.h"
@@ -419,17 +418,17 @@ class MockDnsTransactionFactory::MockTransaction
// Find the relevant rule which matches |qtype|, |secure|, prefix of
// |hostname_|, and |url_request_context| (iff the rule context is not
// null).
- for (size_t i = 0; i < rules.size(); ++i) {
- const std::string& prefix = rules[i].prefix;
- if ((rules[i].qtype == qtype) && (rules[i].secure == secure) &&
+ for (const auto& rule : rules) {
+ const std::string& prefix = rule.prefix;
+ if ((rule.qtype == qtype) && (rule.secure == secure) &&
(hostname_.size() >= prefix.size()) &&
(hostname_.compare(0, prefix.size(), prefix) == 0) &&
- (!rules[i].context ||
- rules[i].context == resolve_context->url_request_context())) {
- const MockDnsClientRule::Result* result = &rules[i].result;
+ (!rule.context ||
+ rule.context == resolve_context->url_request_context())) {
+ const MockDnsClientRule::Result* result = &rule.result;
result_ = MockDnsClientRule::Result(result->type);
result_.net_error = result->net_error;
- delayed_ = rules[i].delay;
+ delayed_ = rule.delay;
// Generate a DnsResponse when not provided with the rule.
std::vector<DnsResourceRecord> authority_records;
@@ -639,7 +638,8 @@ std::unique_ptr<DnsProbeRunner> MockDnsTransactionFactory::CreateDohProbeRunner(
return std::make_unique<MockDohProbeRunner>(weak_ptr_factory_.GetWeakPtr());
}
-void MockDnsTransactionFactory::AddEDNSOption(const OptRecordRdata::Opt& opt) {}
+void MockDnsTransactionFactory::AddEDNSOption(
+ std::unique_ptr<OptRecordRdata::Opt> opt) {}
SecureDnsMode MockDnsTransactionFactory::GetSecureDnsModeForTest() {
return SecureDnsMode::kAutomatic;
@@ -648,10 +648,9 @@ SecureDnsMode MockDnsTransactionFactory::GetSecureDnsModeForTest() {
void MockDnsTransactionFactory::CompleteDelayedTransactions() {
DelayedTransactionList old_delayed_transactions;
old_delayed_transactions.swap(delayed_transactions_);
- for (auto it = old_delayed_transactions.begin();
- it != old_delayed_transactions.end(); ++it) {
- if (it->get())
- (*it)->FinishDelayedTransaction();
+ for (auto& old_delayed_transaction : old_delayed_transactions) {
+ if (old_delayed_transaction.get())
+ old_delayed_transaction->FinishDelayedTransaction();
}
}
@@ -669,8 +668,8 @@ bool MockDnsTransactionFactory::CompleteOneDelayedTransactionOfType(
MockDnsClient::MockDnsClient(DnsConfig config, MockDnsClientRuleList rules)
: config_(std::move(config)),
- factory_(new MockDnsTransactionFactory(std::move(rules))),
- address_sorter_(new MockAddressSorter()) {
+ factory_(std::make_unique<MockDnsTransactionFactory>(std::move(rules))),
+ address_sorter_(std::make_unique<MockAddressSorter>()) {
effective_config_ = BuildEffectiveConfig();
session_ = BuildSession();
}
@@ -786,7 +785,7 @@ void MockDnsClient::SetTransactionFactoryForTesting(
NOTREACHED();
}
-absl::optional<AddressList> MockDnsClient::GetPresetAddrs(
+absl::optional<std::vector<IPEndPoint>> MockDnsClient::GetPresetAddrs(
const url::SchemeHostPort& endpoint) const {
EXPECT_THAT(preset_endpoint_, testing::Optional(endpoint));
return preset_addrs_;
diff --git a/chromium/net/dns/dns_test_util.h b/chromium/net/dns/dns_test_util.h
index 299e8080317..438ec95d934 100644
--- a/chromium/net/dns/dns_test_util.h
+++ b/chromium/net/dns/dns_test_util.h
@@ -18,8 +18,8 @@
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
-#include "net/base/address_list.h"
#include "net/base/connection_endpoint_metadata.h"
+#include "net/base/ip_endpoint.h"
#include "net/dns/dns_client.h"
#include "net/dns/dns_config.h"
#include "net/dns/dns_response.h"
@@ -358,7 +358,7 @@ class MockDnsTransactionFactory : public DnsTransactionFactory {
std::unique_ptr<DnsProbeRunner> CreateDohProbeRunner(
ResolveContext* resolve_context) override;
- void AddEDNSOption(const OptRecordRdata::Opt& opt) override;
+ void AddEDNSOption(std::unique_ptr<OptRecordRdata::Opt> opt) override;
SecureDnsMode GetSecureDnsModeForTest() override;
@@ -417,7 +417,7 @@ class MockDnsClient : public DnsClient {
DnsConfigOverrides GetConfigOverridesForTesting() const override;
void SetTransactionFactoryForTesting(
std::unique_ptr<DnsTransactionFactory> factory) override;
- absl::optional<AddressList> GetPresetAddrs(
+ absl::optional<std::vector<IPEndPoint>> GetPresetAddrs(
const url::SchemeHostPort& endpoint) const override;
// Completes all DnsTransactions that were delayed by a rule.
@@ -438,7 +438,7 @@ class MockDnsClient : public DnsClient {
preset_endpoint_ = std::move(endpoint);
}
- void set_preset_addrs(AddressList preset_addrs) {
+ void set_preset_addrs(std::vector<IPEndPoint> preset_addrs) {
preset_addrs_ = std::move(preset_addrs);
}
@@ -470,7 +470,7 @@ class MockDnsClient : public DnsClient {
std::unique_ptr<MockDnsTransactionFactory> factory_;
std::unique_ptr<AddressSorter> address_sorter_;
absl::optional<url::SchemeHostPort> preset_endpoint_;
- absl::optional<AddressList> preset_addrs_;
+ absl::optional<std::vector<IPEndPoint>> preset_addrs_;
};
} // namespace net
diff --git a/chromium/net/dns/dns_transaction.cc b/chromium/net/dns/dns_transaction.cc
index b41ce26b909..8acf25c45c0 100644
--- a/chromium/net/dns/dns_transaction.cc
+++ b/chromium/net/dns/dns_transaction.cc
@@ -1223,9 +1223,9 @@ class DnsTransactionImpl : public DnsTransaction,
}
std::string qname;
- for (size_t i = 0; i < config.search.size(); ++i) {
+ for (const auto& suffix : config.search) {
// Ignore invalid (too long) combinations.
- if (!DNSDomainFromDot(hostname_ + "." + config.search[i], &qname))
+ if (!DNSDomainFromDot(hostname_ + "." + suffix, &qname))
continue;
if (qname.size() == labeled_hostname.size()) {
if (had_hostname)
@@ -1530,7 +1530,6 @@ class DnsTransactionImpl : public DnsTransaction,
result = StartQuery();
}
break;
- case ERR_CONNECTION_REFUSED:
case ERR_DNS_TIMED_OUT:
timer_.Stop();
@@ -1721,11 +1720,12 @@ class DnsTransactionFactoryImpl : public DnsTransactionFactory {
session_->GetWeakPtr(), resolve_context->GetWeakPtr());
}
- void AddEDNSOption(const OptRecordRdata::Opt& opt) override {
+ void AddEDNSOption(std::unique_ptr<OptRecordRdata::Opt> opt) override {
+ DCHECK(opt);
if (opt_rdata_ == nullptr)
opt_rdata_ = std::make_unique<OptRecordRdata>();
- opt_rdata_->AddOpt(opt);
+ opt_rdata_->AddOpt(std::move(opt));
}
SecureDnsMode GetSecureDnsModeForTest() override {
@@ -1745,8 +1745,7 @@ DnsTransactionFactory::~DnsTransactionFactory() = default;
// static
std::unique_ptr<DnsTransactionFactory> DnsTransactionFactory::CreateFactory(
DnsSession* session) {
- return std::unique_ptr<DnsTransactionFactory>(
- new DnsTransactionFactoryImpl(session));
+ return std::make_unique<DnsTransactionFactoryImpl>(session);
}
} // namespace net
diff --git a/chromium/net/dns/dns_transaction.h b/chromium/net/dns/dns_transaction.h
index 1ed0792086f..ace31bb9e94 100644
--- a/chromium/net/dns/dns_transaction.h
+++ b/chromium/net/dns/dns_transaction.h
@@ -15,6 +15,7 @@
#include "base/strings/string_piece.h"
#include "base/time/time.h"
#include "net/base/request_priority.h"
+#include "net/dns/opt_record_rdata.h"
#include "net/dns/public/secure_dns_mode.h"
#include "net/dns/record_rdata.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -63,7 +64,7 @@ class NET_EXPORT_PRIVATE DnsTransaction {
class DnsProbeRunner {
public:
// Destruction cancels the probes.
- virtual ~DnsProbeRunner() {}
+ virtual ~DnsProbeRunner() = default;
// Starts all applicable probes that are not already running. May be called
// multiple times, but should not be called after destruction of the
@@ -124,7 +125,7 @@ class NET_EXPORT_PRIVATE DnsTransactionFactory {
// The given EDNS0 option will be included in all DNS queries performed by
// transactions from this factory.
- virtual void AddEDNSOption(const OptRecordRdata::Opt& opt) = 0;
+ virtual void AddEDNSOption(std::unique_ptr<OptRecordRdata::Opt> opt) = 0;
// Returns the default SecureDnsMode in the config.
virtual SecureDnsMode GetSecureDnsModeForTest() = 0;
diff --git a/chromium/net/dns/dns_transaction_unittest.cc b/chromium/net/dns/dns_transaction_unittest.cc
index 94d024b3255..db7bfd9c2e0 100644
--- a/chromium/net/dns/dns_transaction_unittest.cc
+++ b/chromium/net/dns/dns_transaction_unittest.cc
@@ -111,23 +111,21 @@ class DnsSocketData {
const OptRecordRdata* opt_rdata = nullptr,
DnsQuery::PaddingStrategy padding_strategy =
DnsQuery::PaddingStrategy::NONE)
- : query_(new DnsQuery(id,
- DomainFromDot(dotted_name),
- qtype,
- opt_rdata,
- padding_strategy)),
+ : query_(std::make_unique<DnsQuery>(id,
+ DomainFromDot(dotted_name),
+ qtype,
+ opt_rdata,
+ padding_strategy)),
transport_(transport) {
if (Transport::TCP == transport_) {
- std::unique_ptr<uint16_t> length(new uint16_t);
+ auto length = std::make_unique<uint16_t>();
*length = base::HostToNet16(query_->io_buffer()->size());
- writes_.push_back(MockWrite(mode,
- reinterpret_cast<const char*>(length.get()),
- sizeof(uint16_t), num_reads_and_writes()));
+ writes_.emplace_back(mode, reinterpret_cast<const char*>(length.get()),
+ sizeof(uint16_t), num_reads_and_writes());
lengths_.push_back(std::move(length));
}
- writes_.push_back(MockWrite(mode, query_->io_buffer()->data(),
- query_->io_buffer()->size(),
- num_reads_and_writes()));
+ writes_.emplace_back(mode, query_->io_buffer()->data(),
+ query_->io_buffer()->size(), num_reads_and_writes());
}
DnsSocketData(const DnsSocketData&) = delete;
@@ -143,16 +141,14 @@ class DnsSocketData {
uint16_t tcp_length) {
CHECK(!provider_.get());
if (Transport::TCP == transport_) {
- std::unique_ptr<uint16_t> length(new uint16_t);
+ auto length = std::make_unique<uint16_t>();
*length = base::HostToNet16(tcp_length);
- reads_.push_back(MockRead(mode,
- reinterpret_cast<const char*>(length.get()),
- sizeof(uint16_t), num_reads_and_writes()));
+ reads_.emplace_back(mode, reinterpret_cast<const char*>(length.get()),
+ sizeof(uint16_t), num_reads_and_writes());
lengths_.push_back(std::move(length));
}
- reads_.push_back(MockRead(mode, response->io_buffer()->data(),
- response->io_buffer_size(),
- num_reads_and_writes()));
+ reads_.emplace_back(mode, response->io_buffer()->data(),
+ response->io_buffer_size(), num_reads_and_writes());
responses_.push_back(std::move(response));
}
@@ -184,8 +180,8 @@ class DnsSocketData {
// Add no-answer (RCODE only) response matching the query.
void AddRcode(int rcode, IoMode mode) {
- std::unique_ptr<DnsResponse> response(new DnsResponse(
- query_->io_buffer()->data(), query_->io_buffer()->size(), 0));
+ auto response = std::make_unique<DnsResponse>(
+ query_->io_buffer()->data(), query_->io_buffer()->size(), 0);
dns_protocol::Header* header =
reinterpret_cast<dns_protocol::Header*>(response->io_buffer()->data());
header->flags |= base::HostToNet16(dns_protocol::kFlagResponse | rcode);
@@ -194,7 +190,7 @@ class DnsSocketData {
// Add error response.
void AddReadError(int error, IoMode mode) {
- reads_.push_back(MockRead(mode, error, num_reads_and_writes()));
+ reads_.emplace_back(mode, error, num_reads_and_writes());
}
// Build, if needed, and return the SocketDataProvider. No new responses
@@ -205,8 +201,8 @@ class DnsSocketData {
// Terminate the reads with ERR_IO_PENDING to prevent overrun and default to
// timeout.
if (transport_ != Transport::HTTPS) {
- reads_.push_back(MockRead(SYNCHRONOUS, ERR_IO_PENDING,
- writes_.size() + reads_.size()));
+ reads_.emplace_back(SYNCHRONOUS, ERR_IO_PENDING,
+ writes_.size() + reads_.size());
}
provider_ = std::make_unique<SequencedSocketData>(reads_, writes_);
if (Transport::TCP == transport_ || Transport::HTTPS == transport_) {
@@ -278,8 +274,7 @@ class TestSocketFactory : public MockClientSocketFactory {
const NetLogSource& source) override {
if (fail_next_socket_) {
fail_next_socket_ = false;
- return std::unique_ptr<DatagramClientSocket>(
- new FailingUDPClientSocket(&empty_data_, net_log));
+ return std::make_unique<FailingUDPClientSocket>(&empty_data_, net_log);
}
SocketDataProvider* data_provider = mock_data().GetNext();
@@ -608,8 +603,8 @@ class DnsTransactionTestBase : public testing::Test {
CHECK_LE(num_servers, 255u);
config_.nameservers.clear();
for (size_t i = 0; i < num_servers; ++i) {
- config_.nameservers.push_back(
- IPEndPoint(IPAddress(192, 168, 1, i), dns_protocol::kDefaultPort));
+ config_.nameservers.emplace_back(IPAddress(192, 168, 1, i),
+ dns_protocol::kDefaultPort);
}
}
@@ -647,11 +642,11 @@ class DnsTransactionTestBase : public testing::Test {
// Called after fully configuring |config|.
void ConfigureFactory() {
- session_ =
- new DnsSession(config_,
- base::BindRepeating(&DnsTransactionTestBase::GetNextId,
- base::Unretained(this)),
- nullptr /* NetLog */);
+ session_ = base::MakeRefCounted<DnsSession>(
+ config_,
+ base::BindRepeating(&DnsTransactionTestBase::GetNextId,
+ base::Unretained(this)),
+ nullptr /* NetLog */);
resolve_context_->InvalidateCachesAndPerSessionData(
session_.get(), false /* network_change */);
transaction_factory_ = DnsTransactionFactory::CreateFactory(session_.get());
@@ -681,8 +676,8 @@ class DnsTransactionTestBase : public testing::Test {
DnsQuery::PaddingStrategy::NONE,
bool enqueue_transaction_id = true) {
CHECK(socket_factory_.get());
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- id, dotted_name, qtype, mode, transport, opt_rdata, padding_strategy));
+ auto data = std::make_unique<DnsSocketData>(
+ id, dotted_name, qtype, mode, transport, opt_rdata, padding_strategy);
data->AddResponseData(response_data, response_length, mode);
AddSocketData(std::move(data), enqueue_transaction_id);
}
@@ -698,8 +693,8 @@ class DnsTransactionTestBase : public testing::Test {
DnsQuery::PaddingStrategy::NONE,
bool enqueue_transaction_id = true) {
CHECK(socket_factory_.get());
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- id, dotted_name, qtype, mode, transport, opt_rdata, padding_strategy));
+ auto data = std::make_unique<DnsSocketData>(
+ id, dotted_name, qtype, mode, transport, opt_rdata, padding_strategy);
data->AddReadError(error, mode);
AddSocketData(std::move(data), enqueue_transaction_id);
}
@@ -732,9 +727,9 @@ class DnsTransactionTestBase : public testing::Test {
DnsQuery::PaddingStrategy::NONE,
uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max()),
bool enqueue_transaction_id = true) {
- std::unique_ptr<DnsSocketData> data(
- new DnsSocketData(id, dotted_name, qtype, ASYNC, Transport::UDP,
- nullptr /* opt_rdata */, padding_strategy));
+ auto data = std::make_unique<DnsSocketData>(
+ id, dotted_name, qtype, ASYNC, Transport::UDP, nullptr /* opt_rdata */,
+ padding_strategy);
AddSocketData(std::move(data), enqueue_transaction_id);
}
@@ -751,9 +746,9 @@ class DnsTransactionTestBase : public testing::Test {
uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max()),
bool enqueue_transaction_id = true) {
CHECK_NE(dns_protocol::kRcodeNOERROR, rcode);
- std::unique_ptr<DnsSocketData> data(
- new DnsSocketData(id, dotted_name, qtype, mode, trans,
- nullptr /* opt_rdata */, padding_strategy));
+ auto data = std::make_unique<DnsSocketData>(id, dotted_name, qtype, mode,
+ trans, nullptr /* opt_rdata */,
+ padding_strategy);
data->AddRcode(rcode, mode);
AddSocketData(std::move(data), enqueue_transaction_id);
}
@@ -867,7 +862,7 @@ class DnsTransactionTestBase : public testing::Test {
DohJobInterceptor(const DohJobInterceptor&) = delete;
DohJobInterceptor& operator=(const DohJobInterceptor&) = delete;
- ~DohJobInterceptor() override {}
+ ~DohJobInterceptor() override = default;
// URLRequestInterceptor implementation:
std::unique_ptr<URLRequestJob> MaybeInterceptRequest(
@@ -987,9 +982,10 @@ TEST_F(DnsTransactionTest, Lookup) {
TEST_F(DnsTransactionTest, LookupWithEDNSOption) {
OptRecordRdata expected_opt_rdata;
- const OptRecordRdata::Opt ednsOpt(123, "\xbe\xef");
- transaction_factory_->AddEDNSOption(ednsOpt);
- expected_opt_rdata.AddOpt(ednsOpt);
+ transaction_factory_->AddEDNSOption(
+ OptRecordRdata::UnknownOpt::CreateForTesting(123, "\xbe\xef"));
+ expected_opt_rdata.AddOpt(
+ OptRecordRdata::UnknownOpt::CreateForTesting(123, "\xbe\xef"));
AddAsyncQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype,
kT0ResponseDatagram, std::size(kT0ResponseDatagram),
@@ -1004,15 +1000,19 @@ TEST_F(DnsTransactionTest, LookupWithEDNSOption) {
TEST_F(DnsTransactionTest, LookupWithMultipleEDNSOptions) {
OptRecordRdata expected_opt_rdata;
- for (const auto& ednsOpt : {
- // Two options with the same code, to check that both are included.
- OptRecordRdata::Opt(1, "\xde\xad"),
- OptRecordRdata::Opt(1, "\xbe\xef"),
- // Try a different code and different length of data.
- OptRecordRdata::Opt(2, "\xff"),
- }) {
- transaction_factory_->AddEDNSOption(ednsOpt);
- expected_opt_rdata.AddOpt(ednsOpt);
+ std::vector<std::pair<uint16_t, std::string>> params = {
+ // Two options with the same code, to check that both are included.
+ std::pair<uint16_t, std::string>(1, "\xde\xad"),
+ std::pair<uint16_t, std::string>(1, "\xbe\xef"),
+ // Try a different code and different length of data.
+ std::pair<uint16_t, std::string>(2, "\xff")};
+
+ for (auto& param : params) {
+ transaction_factory_->AddEDNSOption(
+ OptRecordRdata::UnknownOpt::CreateForTesting(param.first,
+ param.second));
+ expected_opt_rdata.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ param.first, param.second));
}
AddAsyncQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype,
@@ -1098,15 +1098,15 @@ TEST_F(DnsTransactionTest, MismatchedResponseSync) {
ConfigureFactory();
// First attempt receives mismatched response synchronously.
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ SYNCHRONOUS, Transport::UDP);
data->AddResponseData(kT1ResponseDatagram, std::size(kT1ResponseDatagram),
SYNCHRONOUS);
AddSocketData(std::move(data));
// Second attempt receives valid response synchronously.
- std::unique_ptr<DnsSocketData> data1(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
+ auto data1 = std::make_unique<DnsSocketData>(
+ 0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP);
data1->AddResponseData(kT0ResponseDatagram, std::size(kT0ResponseDatagram),
SYNCHRONOUS);
AddSocketData(std::move(data1));
@@ -1122,15 +1122,15 @@ TEST_F(DnsTransactionTest, MismatchedResponseAsync) {
ConfigureFactory();
// First attempt receives mismatched response asynchronously.
- std::unique_ptr<DnsSocketData> data0(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::UDP));
+ auto data0 = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName,
+ kT0Qtype, ASYNC, Transport::UDP);
data0->AddResponseData(kT1ResponseDatagram, std::size(kT1ResponseDatagram),
ASYNC);
AddSocketData(std::move(data0));
// Second attempt receives valid response asynchronously.
- std::unique_ptr<DnsSocketData> data1(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::UDP));
+ auto data1 = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName,
+ kT0Qtype, ASYNC, Transport::UDP);
data1->AddResponseData(kT0ResponseDatagram, std::size(kT0ResponseDatagram),
ASYNC);
AddSocketData(std::move(data1));
@@ -1166,8 +1166,8 @@ TEST_F(DnsTransactionTest, MismatchedResponseNxdomain) {
// First attempt receives mismatched response followed by valid NXDOMAIN
// response.
// Second attempt receives valid NXDOMAIN response.
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ SYNCHRONOUS, Transport::UDP);
data->AddResponseData(kT1ResponseDatagram, std::size(kT1ResponseDatagram),
SYNCHRONOUS);
data->AddRcode(dns_protocol::kRcodeNXDOMAIN, ASYNC);
@@ -1707,9 +1707,9 @@ std::unique_ptr<URLRequestJob> DohJobMakerCallbackFailSync(
TEST_F(DnsTransactionTest, HttpsPostLookupFailSync) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseWithLength(std::make_unique<DnsResponse>(), SYNCHRONOUS, 0);
AddSocketData(std::move(data), false /* enqueue_transaction_id */);
TransactionHelper helper0(ERR_DNS_MALFORMED_RESPONSE);
@@ -1743,9 +1743,9 @@ TEST_F(DnsTransactionTest, HttpsPostLookupFailAsync) {
TEST_F(DnsTransactionTest, HttpsPostLookup2Sync) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseData(kT0ResponseDatagram, 20, SYNCHRONOUS);
data->AddResponseData(kT0ResponseDatagram + 20,
std::size(kT0ResponseDatagram) - 20, SYNCHRONOUS);
@@ -1758,9 +1758,9 @@ TEST_F(DnsTransactionTest, HttpsPostLookup2Sync) {
TEST_F(DnsTransactionTest, HttpsPostLookup2Async) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseData(kT0ResponseDatagram, 20, ASYNC);
data->AddResponseData(kT0ResponseDatagram + 20,
std::size(kT0ResponseDatagram) - 20, ASYNC);
@@ -1773,9 +1773,9 @@ TEST_F(DnsTransactionTest, HttpsPostLookup2Async) {
TEST_F(DnsTransactionTest, HttpsPostLookupAsyncWithAsyncZeroRead) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseData(kT0ResponseDatagram, std::size(kT0ResponseDatagram),
ASYNC);
data->AddResponseData(kT0ResponseDatagram, 0, ASYNC);
@@ -1788,9 +1788,9 @@ TEST_F(DnsTransactionTest, HttpsPostLookupAsyncWithAsyncZeroRead) {
TEST_F(DnsTransactionTest, HttpsPostLookupSyncWithAsyncZeroRead) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseData(kT0ResponseDatagram, std::size(kT0ResponseDatagram),
SYNCHRONOUS);
data->AddResponseData(kT0ResponseDatagram, 0, ASYNC);
@@ -1803,9 +1803,9 @@ TEST_F(DnsTransactionTest, HttpsPostLookupSyncWithAsyncZeroRead) {
TEST_F(DnsTransactionTest, HttpsPostLookupAsyncThenSync) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseData(kT0ResponseDatagram, 20, ASYNC);
data->AddResponseData(kT0ResponseDatagram + 20,
std::size(kT0ResponseDatagram) - 20, SYNCHRONOUS);
@@ -1818,9 +1818,9 @@ TEST_F(DnsTransactionTest, HttpsPostLookupAsyncThenSync) {
TEST_F(DnsTransactionTest, HttpsPostLookupAsyncThenSyncError) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseData(kT0ResponseDatagram, 20, ASYNC);
data->AddReadError(ERR_FAILED, SYNCHRONOUS);
AddSocketData(std::move(data), false /* enqueue_transaction_id */);
@@ -1832,9 +1832,9 @@ TEST_F(DnsTransactionTest, HttpsPostLookupAsyncThenSyncError) {
TEST_F(DnsTransactionTest, HttpsPostLookupAsyncThenAsyncError) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseData(kT0ResponseDatagram, 20, ASYNC);
data->AddReadError(ERR_FAILED, ASYNC);
AddSocketData(std::move(data), false /* enqueue_transaction_id */);
@@ -1846,9 +1846,9 @@ TEST_F(DnsTransactionTest, HttpsPostLookupAsyncThenAsyncError) {
TEST_F(DnsTransactionTest, HttpsPostLookupSyncThenAsyncError) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseData(kT0ResponseDatagram, 20, SYNCHRONOUS);
data->AddReadError(ERR_FAILED, ASYNC);
AddSocketData(std::move(data), false /* enqueue_transaction_id */);
@@ -1860,9 +1860,9 @@ TEST_F(DnsTransactionTest, HttpsPostLookupSyncThenAsyncError) {
TEST_F(DnsTransactionTest, HttpsPostLookupSyncThenSyncError) {
ConfigureDohServers(true /* use_post */);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddResponseData(kT0ResponseDatagram, 20, SYNCHRONOUS);
data->AddReadError(ERR_FAILED, SYNCHRONOUS);
AddSocketData(std::move(data), false /* enqueue_transaction_id */);
@@ -2303,9 +2303,9 @@ TEST_F(DnsTransactionTest, SuccessfulTransactionStartedBeforeUnavailable) {
// Create a socket data to first return ERR_IO_PENDING. This will pause the
// response and not return the second response until
// SequencedSocketData::Resume() is called.
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+ auto data = std::make_unique<DnsSocketData>(
0, kT0HostName, kT0Qtype, ASYNC, Transport::HTTPS,
- nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128));
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
data->AddReadError(ERR_IO_PENDING, ASYNC);
data->AddResponseData(kT0ResponseDatagram, std::size(kT0ResponseDatagram),
ASYNC);
@@ -3085,8 +3085,8 @@ TEST_F(DnsTransactionTest, TCPFailure) {
TEST_F(DnsTransactionTest, TCPMalformed) {
AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ ASYNC, Transport::TCP);
// Valid response but length too short.
// This must be truncated in the question section. The DnsResponse doesn't
// examine the answer section until asked to parse it, so truncating it in
@@ -3154,8 +3154,8 @@ TEST_F(DnsTransactionTestWithMockTime, TcpTimeout_LowEntropy) {
TEST_F(DnsTransactionTest, TCPReadReturnsZeroAsync) {
AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ ASYNC, Transport::TCP);
// Return all but the last byte of the response.
data->AddResponseWithLength(
std::make_unique<DnsResponse>(
@@ -3175,8 +3175,8 @@ TEST_F(DnsTransactionTest, TCPReadReturnsZeroAsync) {
TEST_F(DnsTransactionTest, TCPReadReturnsZeroSynchronous) {
AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ ASYNC, Transport::TCP);
// Return all but the last byte of the response.
data->AddResponseWithLength(
std::make_unique<DnsResponse>(
@@ -3196,8 +3196,8 @@ TEST_F(DnsTransactionTest, TCPReadReturnsZeroSynchronous) {
TEST_F(DnsTransactionTest, TCPConnectionClosedAsync) {
AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ ASYNC, Transport::TCP);
data->AddReadError(ERR_CONNECTION_CLOSED, ASYNC);
AddSocketData(std::move(data));
@@ -3210,8 +3210,8 @@ TEST_F(DnsTransactionTest, TCPConnectionClosedAsync) {
TEST_F(DnsTransactionTest, TCPConnectionClosedSynchronous) {
AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ ASYNC, Transport::TCP);
data->AddReadError(ERR_CONNECTION_CLOSED, SYNCHRONOUS);
AddSocketData(std::move(data));
@@ -3224,8 +3224,8 @@ TEST_F(DnsTransactionTest, TCPConnectionClosedSynchronous) {
TEST_F(DnsTransactionTest, MismatchedThenNxdomainThenTCP) {
config_.attempts = 2;
ConfigureFactory();
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ SYNCHRONOUS, Transport::UDP);
// First attempt gets a mismatched response.
data->AddResponseData(kT1ResponseDatagram, std::size(kT1ResponseDatagram),
SYNCHRONOUS);
@@ -3244,8 +3244,8 @@ TEST_F(DnsTransactionTest, MismatchedThenNxdomainThenTCP) {
TEST_F(DnsTransactionTest, MismatchedThenOkThenTCP) {
config_.attempts = 2;
ConfigureFactory();
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ SYNCHRONOUS, Transport::UDP);
// First attempt gets a mismatched response.
data->AddResponseData(kT1ResponseDatagram, std::size(kT1ResponseDatagram),
SYNCHRONOUS);
@@ -3289,8 +3289,8 @@ TEST_F(DnsTransactionTest, MismatchedThenRefusedThenTCP) {
ConfigureFactory();
// Attempt 1.
- std::unique_ptr<DnsSocketData> data(new DnsSocketData(
- 0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
+ auto data = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName, kT0Qtype,
+ SYNCHRONOUS, Transport::UDP);
data->AddResponseData(kT1ResponseDatagram, std::size(kT1ResponseDatagram),
SYNCHRONOUS);
data->AddRcode(dns_protocol::kFlagTC, ASYNC);
@@ -3996,6 +3996,115 @@ TEST_F(DnsTransactionTestWithMockTime, RejectsQueryingLongNames) {
helper0.RunUntilComplete();
}
+// Test that ERR_CONNECTION_REFUSED error after fallback of DnsTCPAttempt
+// should not cause DCHECK failure (https://crbug.com/1334250).
+TEST_F(DnsTransactionTestWithMockTime, TcpConnectionRefusedAfterFallback) {
+ ConfigureNumServers(2);
+ ConfigureFactory();
+ socket_factory_->diverse_source_ports_ = false;
+
+ // Data for UDP attempts to set `low_entropy` flag.
+ for (int i = 0; i <= DnsUdpTracker::kPortReuseThreshold; ++i) {
+ AddQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+ std::size(kT0ResponseDatagram), ASYNC, Transport::UDP);
+ }
+
+ // Data for TCP attempt.
+ auto data1 = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName,
+ kT0Qtype, ASYNC, Transport::TCP);
+ data1->AddReadError(ERR_IO_PENDING, ASYNC);
+ data1->AddReadError(ERR_CONNECTION_REFUSED, ASYNC);
+ SequencedSocketData* sequenced_socket_data1 = data1->GetProvider();
+ AddSocketData(std::move(data1));
+
+ auto data2 = std::make_unique<DnsSocketData>(0 /* id */, kT0HostName,
+ kT0Qtype, ASYNC, Transport::TCP);
+ data2->AddReadError(ERR_IO_PENDING, ASYNC);
+ data2->AddResponseData(kT0ResponseDatagram, std::size(kT0ResponseDatagram),
+ ASYNC);
+ SequencedSocketData* sequenced_socket_data2 = data2->GetProvider();
+ AddSocketData(std::move(data2));
+
+ // DNS transactions for UDP attempts to set `low_entropy` flag.
+ for (int i = 0; i <= DnsUdpTracker::kPortReuseThreshold; ++i) {
+ TransactionHelper udp_helper(kT0RecordCount);
+ udp_helper.StartTransaction(transaction_factory_.get(), kT0HostName,
+ kT0Qtype, false /* secure */,
+ resolve_context_.get());
+ udp_helper.RunUntilComplete();
+ }
+
+ ASSERT_TRUE(session_->udp_tracker()->low_entropy());
+
+ // DNS transactions for TCP attempt.
+ TransactionHelper helper0(kT0RecordCount);
+ helper0.StartTransaction(transaction_factory_.get(), kT0HostName, kT0Qtype,
+ false /* secure */, resolve_context_.get());
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(helper0.has_completed());
+
+ base::TimeDelta timeout = resolve_context_->NextClassicFallbackPeriod(
+ 0 /* classic_server_index */, 0 /* attempt */, session_.get());
+ FastForwardBy(timeout);
+
+ // Resume the first query.
+ sequenced_socket_data1->Resume();
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(helper0.has_completed());
+
+ // Resume the second query.
+ sequenced_socket_data2->Resume();
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_TRUE(helper0.has_completed());
+}
+
+// Test that ERR_CONNECTION_REFUSED error after fallback of DnsHTTPAttempt
+// should not cause DCHECK failure (https://crbug.com/1334250).
+TEST_F(DnsTransactionTestWithMockTime, HttpsConnectionRefusedAfterFallback) {
+ ConfigureDohServers(false /* use_post */, 2 /* num_doh_servers */,
+ true /* make_available */);
+
+ auto data1 = std::make_unique<DnsSocketData>(
+ 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::HTTPS,
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
+ data1->AddReadError(ERR_IO_PENDING, ASYNC);
+ data1->AddReadError(ERR_CONNECTION_REFUSED, ASYNC);
+ SequencedSocketData* sequenced_socket_data1 = data1->GetProvider();
+ AddSocketData(std::move(data1), false /* enqueue_transaction_id */);
+
+ auto data2 = std::make_unique<DnsSocketData>(
+ 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::HTTPS,
+ nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128);
+ data2->AddReadError(ERR_IO_PENDING, ASYNC);
+ data2->AddResponseData(kT0ResponseDatagram, std::size(kT0ResponseDatagram),
+ ASYNC);
+ SequencedSocketData* sequenced_socket_data2 = data2->GetProvider();
+ AddSocketData(std::move(data2), false /* enqueue_transaction_id */);
+
+ TransactionHelper helper0(kT0RecordCount);
+ helper0.StartTransaction(transaction_factory_.get(), kT0HostName, kT0Qtype,
+ true /* secure */, resolve_context_.get());
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(helper0.has_completed());
+
+ base::TimeDelta timeout = resolve_context_->NextDohFallbackPeriod(
+ 0 /* doh_server_index */, session_.get());
+ FastForwardBy(timeout);
+
+ // Resume the first query.
+ sequenced_socket_data1->Resume();
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(helper0.has_completed());
+
+ // Resume the second query.
+ sequenced_socket_data2->Resume();
+
+ EXPECT_TRUE(helper0.has_completed());
+}
+
} // namespace
} // namespace net
diff --git a/chromium/net/dns/dns_util_unittest.cc b/chromium/net/dns/dns_util_unittest.cc
index c31e29a56e4..9aae23630ed 100644
--- a/chromium/net/dns/dns_util_unittest.cc
+++ b/chromium/net/dns/dns_util_unittest.cc
@@ -418,8 +418,8 @@ TEST_F(DNSUtilTest, IsValidDNSDomain) {
"noodles.blorg`", "www.-noodles.blorg",
};
- for (size_t i = 0; i < std::size(bad_hostnames); ++i) {
- EXPECT_FALSE(IsValidDNSDomain(bad_hostnames[i]));
+ for (const auto* bad_hostname : bad_hostnames) {
+ EXPECT_FALSE(IsValidDNSDomain(bad_hostname));
}
const char* const good_hostnames[] = {
@@ -428,8 +428,8 @@ TEST_F(DNSUtilTest, IsValidDNSDomain) {
"www_.noodles.blorg", "www.noodles.blorg.", "_privet._tcp.local",
};
- for (size_t i = 0; i < std::size(good_hostnames); ++i) {
- EXPECT_TRUE(IsValidDNSDomain(good_hostnames[i]));
+ for (const auto* good_hostname : good_hostnames) {
+ EXPECT_TRUE(IsValidDNSDomain(good_hostname));
}
}
@@ -442,8 +442,8 @@ TEST_F(DNSUtilTest, IsValidUnrestrictedDNSDomain) {
"www.nood(les).blorg", "noo dl(es)._tcp.local",
};
- for (size_t i = 0; i < std::size(good_hostnames); ++i) {
- EXPECT_TRUE(IsValidUnrestrictedDNSDomain(good_hostnames[i]));
+ for (const auto* good_hostname : good_hostnames) {
+ EXPECT_TRUE(IsValidUnrestrictedDNSDomain(good_hostname));
}
}
diff --git a/chromium/net/dns/fuzzed_host_resolver_util.cc b/chromium/net/dns/fuzzed_host_resolver_util.cc
index dff68038cce..bb6ebe68ba7 100644
--- a/chromium/net/dns/fuzzed_host_resolver_util.cc
+++ b/chromium/net/dns/fuzzed_host_resolver_util.cc
@@ -376,7 +376,8 @@ class FuzzedHostResolverManager : public HostResolverManager {
net_log_(net_log),
data_provider_weak_factory_(data_provider) {
ProcTaskParams proc_task_params(
- new FuzzedHostResolverProc(data_provider_weak_factory_.GetWeakPtr()),
+ base::MakeRefCounted<FuzzedHostResolverProc>(
+ data_provider_weak_factory_.GetWeakPtr()),
// Retries are only used when the original request hangs, which this
// class currently can't simulate.
0 /* max_retry_attempts */);
diff --git a/chromium/net/dns/host_cache.cc b/chromium/net/dns/host_cache.cc
index 4e8d6eea38b..042d9ff186d 100644
--- a/chromium/net/dns/host_cache.cc
+++ b/chromium/net/dns/host_cache.cc
@@ -75,6 +75,7 @@ const char kAddressesKey[] = "addresses";
const char kTextRecordsKey[] = "text_records";
const char kHostnameResultsKey[] = "hostname_results";
const char kHostPortsKey[] = "host_ports";
+const char kCanonicalNamesKey[] = "canonical_names";
base::Value IpEndpointToValue(const IPEndPoint& endpoint) {
base::Value::Dict dictionary;
@@ -137,21 +138,17 @@ EndpointMetadataPairFromValue(const base::Value& value) {
std::move(metadata).value());
}
-bool AddressListFromListValue(const base::Value::List* value,
- absl::optional<AddressList>* out_list) {
- if (!value) {
- out_list->reset();
- return true;
- }
-
- out_list->emplace();
- for (const auto& it : *value) {
+bool IPEndPointsFromLegacyAddressListValue(
+ const base::Value::List& value,
+ absl::optional<std::vector<IPEndPoint>>* ip_endpoints) {
+ ip_endpoints->emplace();
+ for (const auto& it : value) {
IPAddress address;
const std::string* addr_string = it.GetIfString();
if (!addr_string || !address.AssignFromIPLiteral(*addr_string)) {
return false;
}
- out_list->value().push_back(IPEndPoint(address, 0));
+ ip_endpoints->value().emplace_back(address, 0);
}
return true;
}
@@ -285,11 +282,18 @@ HostCache::Entry::GetEndpoints() const {
if (ip_endpoints_.value().empty())
return endpoints;
-
absl::optional<std::vector<ConnectionEndpointMetadata>> metadatas =
GetMetadatas();
- if (metadatas.has_value()) {
+
+ if (metadatas.has_value() && canonical_names_ &&
+ (canonical_names_->size() == 1)) {
+ // Currently Chrome uses HTTPS records only when A and AAAA records are at
+ // the same canonical name and that matches the HTTPS target name.
for (ConnectionEndpointMetadata& metadata : metadatas.value()) {
+ if (canonical_names_->find(metadata.target_name) ==
+ canonical_names_->end()) {
+ continue;
+ }
endpoints.emplace_back();
endpoints.back().ip_endpoints = ip_endpoints_.value();
endpoints.back().metadata = std::move(metadata);
@@ -342,17 +346,11 @@ HostCache::Entry HostCache::Entry::MergeEntries(Entry front, Entry back) {
MergeLists(&front.ip_endpoints_, back.ip_endpoints_);
MergeContainers(front.endpoint_metadatas_, back.endpoint_metadatas_);
MergeContainers(front.aliases_, back.aliases_);
- front.MergeAddressesFrom(back);
MergeLists(&front.text_records_, back.text_records());
MergeLists(&front.hostnames_, back.hostnames());
MergeLists(&front.https_record_compatibility_,
back.https_record_compatibility_);
-
- // The DNS aliases include the canonical name(s), if any, each as the
- // first entry in the field, which is an optional vector. If |front| has
- // a canonical name, it will be used. Otherwise, if |back| has a
- // canonical name, it will be in the first slot in the merged alias field.
- front.MergeDnsAliasesFrom(back);
+ MergeContainers(front.canonical_names_, back.canonical_names_);
// Only expected to merge entries from same source.
DCHECK_EQ(front.source(), back.source());
@@ -383,13 +381,6 @@ HostCache::Entry HostCache::Entry::CopyWithDefaultPort(uint16_t port) const {
}
}
- if (copy.legacy_addresses_) {
- for (IPEndPoint& endpoint : copy.legacy_addresses_.value().endpoints()) {
- if (endpoint.port() == 0)
- endpoint = IPEndPoint(endpoint.address(), port);
- }
- }
-
if (copy.hostnames_) {
for (HostPortPair& hostname : copy.hostnames_.value()) {
if (hostname.port() == 0)
@@ -404,6 +395,19 @@ HostCache::Entry& HostCache::Entry::operator=(const Entry& entry) = default;
HostCache::Entry& HostCache::Entry::operator=(Entry&& entry) = default;
+HostCache::Entry::Entry(int error,
+ std::vector<IPEndPoint> ip_endpoints,
+ std::set<std::string> aliases,
+ Source source,
+ absl::optional<base::TimeDelta> ttl)
+ : error_(error),
+ ip_endpoints_(std::move(ip_endpoints)),
+ aliases_(std::move(aliases)),
+ source_(source),
+ ttl_(ttl ? ttl.value() : base::Seconds(-1)) {
+ DCHECK(!ttl || ttl.value() >= base::TimeDelta());
+}
+
HostCache::Entry::Entry(const HostCache::Entry& entry,
base::TimeTicks now,
base::TimeDelta ttl,
@@ -412,12 +416,12 @@ HostCache::Entry::Entry(const HostCache::Entry& entry,
ip_endpoints_(entry.ip_endpoints_),
endpoint_metadatas_(entry.endpoint_metadatas_),
aliases_(base::OptionalFromPtr(entry.aliases())),
- legacy_addresses_(entry.legacy_addresses()),
text_records_(entry.text_records()),
hostnames_(entry.hostnames()),
https_record_compatibility_(entry.https_record_compatibility_),
source_(entry.source()),
pinning_(entry.pinning()),
+ canonical_names_(entry.canonical_names()),
ttl_(entry.ttl()),
expires_(now + ttl),
network_changes_(network_changes) {}
@@ -429,7 +433,6 @@ HostCache::Entry::Entry(
std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>>
endpoint_metadatas,
absl::optional<std::set<std::string>> aliases,
- const absl::optional<AddressList>& legacy_addresses,
absl::optional<std::vector<std::string>>&& text_records,
absl::optional<std::vector<HostPortPair>>&& hostnames,
absl::optional<std::vector<bool>>&& https_record_compatibility,
@@ -440,7 +443,6 @@ HostCache::Entry::Entry(
ip_endpoints_(std::move(ip_endpoints)),
endpoint_metadatas_(std::move(endpoint_metadatas)),
aliases_(std::move(aliases)),
- legacy_addresses_(legacy_addresses),
text_records_(std::move(text_records)),
hostnames_(std::move(hostnames)),
https_record_compatibility_(std::move(https_record_compatibility)),
@@ -479,66 +481,6 @@ base::Value HostCache::Entry::NetLogParams() const {
return base::Value(GetAsValue(false /* include_staleness */));
}
-void HostCache::Entry::MergeAddressesFrom(const HostCache::Entry& source) {
- MergeLists(&legacy_addresses_, source.legacy_addresses());
- if (!legacy_addresses_ || legacy_addresses_->size() <= 1)
- return; // Nothing to do.
-
- legacy_addresses_->Deduplicate();
-
- std::stable_sort(legacy_addresses_->begin(), legacy_addresses_->end(),
- [](const IPEndPoint& lhs, const IPEndPoint& rhs) {
- // Return true iff |lhs < rhs|.
- return lhs.GetFamily() == ADDRESS_FAMILY_IPV6 &&
- rhs.GetFamily() == ADDRESS_FAMILY_IPV4;
- });
-}
-
-void HostCache::Entry::MergeDnsAliasesFrom(const HostCache::Entry& source) {
- // No aliases to merge if source has no AddressList.
- if (!source.legacy_addresses())
- return;
-
- // We expect this to be true because the address merging should have already
- // created the AddressList if the source had one but the target didn't.
- DCHECK(legacy_addresses());
-
- // Nothing to merge.
- if (source.legacy_addresses()->dns_aliases().empty())
- return;
-
- // No aliases pre-existing in target, so simply set target's aliases to
- // source's. This takes care of the case where target does not have a usable
- // canonical name, but source does.
- if (legacy_addresses()->dns_aliases().empty()) {
- legacy_addresses_->SetDnsAliases(source.legacy_addresses()->dns_aliases());
- return;
- }
-
- DCHECK(legacy_addresses()->dns_aliases() != std::vector<std::string>({""}));
- DCHECK(source.legacy_addresses()->dns_aliases() !=
- std::vector<std::string>({""}));
-
- // We need to check for possible blanks and duplicates in the source's
- // aliases.
- std::unordered_set<std::string> aliases_seen;
- std::vector<std::string> deduplicated_source_aliases;
-
- aliases_seen.insert(legacy_addresses()->dns_aliases().begin(),
- legacy_addresses()->dns_aliases().end());
-
- for (const auto& alias : source.legacy_addresses()->dns_aliases()) {
- if (alias != "" && aliases_seen.find(alias) == aliases_seen.end()) {
- aliases_seen.insert(alias);
- deduplicated_source_aliases.push_back(alias);
- }
- }
-
- // The first entry of target's aliases must remain in place,
- // as it's the canonical name, so we append source's aliases to the back.
- legacy_addresses_->AppendDnsAliases(std::move(deduplicated_source_aliases));
-}
-
base::Value::Dict HostCache::Entry::GetAsValue(bool include_staleness) const {
base::Value::Dict entry_dict;
@@ -590,15 +532,6 @@ base::Value::Dict HostCache::Entry::GetAsValue(bool include_staleness) const {
entry_dict.Set(kAliasesKey, std::move(alias_list));
}
- if (legacy_addresses()) {
- // Append all of the resolved addresses.
- base::Value::List addresses_value;
- for (const IPEndPoint& address : legacy_addresses().value()) {
- addresses_value.Append(address.ToStringWithoutPort());
- }
- entry_dict.Set(kAddressesKey, std::move(addresses_value));
- }
-
if (text_records()) {
// Append all resolved text records.
base::Value::List text_list_value;
@@ -619,6 +552,13 @@ base::Value::Dict HostCache::Entry::GetAsValue(bool include_staleness) const {
entry_dict.Set(kHostnameResultsKey, std::move(hostnames_value));
entry_dict.Set(kHostPortsKey, std::move(host_ports_value));
}
+ if (canonical_names()) {
+ base::Value::List canonical_names_list;
+ for (const std::string& canonical_name : canonical_names().value()) {
+ canonical_names_list.Append(canonical_name);
+ }
+ entry_dict.Set(kCanonicalNamesKey, std::move(canonical_names_list));
+ }
}
return entry_dict;
@@ -970,6 +910,7 @@ bool HostCache::RestoreFromListValue(const base::Value::List& old_cache) {
const base::Value::List* text_records_list = nullptr;
const base::Value::List* hostname_records_list = nullptr;
const base::Value::List* host_ports_list = nullptr;
+ const base::Value::List* canonical_names_list = nullptr;
absl::optional<int> maybe_error = entry_dict.FindInt(kNetErrorKey);
absl::optional<bool> maybe_pinned = entry_dict.FindBool(kPinnedKey);
if (maybe_error.has_value()) {
@@ -982,6 +923,7 @@ bool HostCache::RestoreFromListValue(const base::Value::List& old_cache) {
text_records_list = entry_dict.FindList(kTextRecordsKey);
hostname_records_list = entry_dict.FindList(kHostnameResultsKey);
host_ports_list = entry_dict.FindList(kHostPortsKey);
+ canonical_names_list = entry_dict.FindList(kCanonicalNamesKey);
if ((hostname_records_list == nullptr && host_ports_list != nullptr) ||
(hostname_records_list != nullptr && host_ports_list == nullptr)) {
@@ -1035,10 +977,15 @@ bool HostCache::RestoreFromListValue(const base::Value::List& old_cache) {
}
}
- absl::optional<AddressList> legacy_address_value;
- if (!AddressListFromListValue(legacy_addresses_list,
- &legacy_address_value)) {
- return false;
+ // `addresses` field was supported until M105. We keep reading this field
+ // for backward compatibility for several milestones.
+ if (legacy_addresses_list) {
+ if (ip_endpoints)
+ return false;
+ if (!IPEndPointsFromLegacyAddressListValue(*legacy_addresses_list,
+ &ip_endpoints)) {
+ return false;
+ }
}
absl::optional<std::vector<std::string>> text_records;
@@ -1066,21 +1013,36 @@ bool HostCache::RestoreFromListValue(const base::Value::List& old_cache) {
(*host_ports_list)[i].GetInt())) {
return false;
}
- hostname_records.value().push_back(HostPortPair(
+ hostname_records.value().emplace_back(
(*hostname_records_list)[i].GetString(),
- base::checked_cast<uint16_t>((*host_ports_list)[i].GetInt())));
+ base::checked_cast<uint16_t>((*host_ports_list)[i].GetInt()));
+ }
+ }
+
+ absl::optional<std::set<std::string>> canonical_names;
+ if (canonical_names_list) {
+ canonical_names = std::set<std::string>();
+ for (const auto& item : *canonical_names_list) {
+ const std::string* name = item.GetIfString();
+ if (!name)
+ return false;
+ canonical_names->insert(*name);
}
}
// We do not intend to serialize experimental results with the host cache.
absl::optional<std::vector<bool>> experimental_results;
- // Assume an empty address list if we have an address type and no results.
- if (IsAddressType(dns_query_type) && !ip_endpoints &&
- !legacy_address_value && !text_records && !hostname_records) {
- legacy_address_value.emplace();
+ // Assume an empty endpoints list and an empty aliases if we have an address
+ // type and no results.
+ if (IsAddressType(dns_query_type) && !text_records && !hostname_records) {
+ if (!ip_endpoints) {
+ ip_endpoints.emplace();
+ }
+ if (!aliases) {
+ aliases.emplace();
+ }
}
-
Key key(std::move(host), dns_query_type, flags,
static_cast<HostResolverSource>(host_resolver_source),
network_isolation_key);
@@ -1090,13 +1052,14 @@ bool HostCache::RestoreFromListValue(const base::Value::List& old_cache) {
// replace the entry.
auto found = entries_.find(key);
if (found == entries_.end()) {
- Entry entry(error, std::move(ip_endpoints), std::move(endpoint_metadatas),
- std::move(aliases), legacy_address_value,
- std::move(text_records), std::move(hostname_records),
- std::move(experimental_results), Entry::SOURCE_UNKNOWN,
- expiration_time, network_changes_ - 1);
- entry.set_pinning(maybe_pinned.value_or(false));
- AddEntry(key, std::move(entry));
+ Entry new_entry(error, std::move(ip_endpoints),
+ std::move(endpoint_metadatas), std::move(aliases),
+ std::move(text_records), std::move(hostname_records),
+ std::move(experimental_results), Entry::SOURCE_UNKNOWN,
+ expiration_time, network_changes_ - 1);
+ new_entry.set_pinning(maybe_pinned.value_or(false));
+ new_entry.set_canonical_names(std::move(canonical_names));
+ AddEntry(key, std::move(new_entry));
restore_size_++;
}
}
diff --git a/chromium/net/dns/host_cache.h b/chromium/net/dns/host_cache.h
index bcbc165499f..eb915468c45 100644
--- a/chromium/net/dns/host_cache.h
+++ b/chromium/net/dns/host_cache.h
@@ -26,7 +26,6 @@
#include "base/time/time.h"
#include "base/values.h"
#include "net/base/address_family.h"
-#include "net/base/address_list.h"
#include "net/base/connection_endpoint_metadata.h"
#include "net/base/expiring_cache.h"
#include "net/base/host_port_pair.h"
@@ -142,6 +141,13 @@ class NET_EXPORT HostCache {
Entry(int error, T&& results, Source source)
: Entry(error, std::forward<T>(results), source, absl::nullopt) {}
+ // Use for address entries.
+ Entry(int error,
+ std::vector<IPEndPoint> ip_endpoints,
+ std::set<std::string> aliases,
+ Source source,
+ absl::optional<base::TimeDelta> ttl = absl::nullopt);
+
// For errors with no |results|.
Entry(int error,
Source source,
@@ -165,12 +171,12 @@ class NET_EXPORT HostCache {
bool ContentsEqual(const Entry& other) const {
return std::tie(error_, ip_endpoints_, endpoint_metadatas_, aliases_,
- legacy_addresses_, text_records_, hostnames_,
- https_record_compatibility_) ==
- std::tie(other.error_, other.ip_endpoints_,
- other.endpoint_metadatas_, other.aliases_,
- other.legacy_addresses_, other.text_records_,
- other.hostnames_, other.https_record_compatibility_);
+ text_records_, hostnames_, https_record_compatibility_,
+ canonical_names_) ==
+ std::tie(
+ other.error_, other.ip_endpoints_, other.endpoint_metadatas_,
+ other.aliases_, other.text_records_, other.hostnames_,
+ other.https_record_compatibility_, other.canonical_names_);
}
int error() const { return error_; }
@@ -197,12 +203,6 @@ class NET_EXPORT HostCache {
void set_aliases(std::set<std::string> aliases) {
aliases_ = std::move(aliases);
}
- const absl::optional<AddressList>& legacy_addresses() const {
- return legacy_addresses_;
- }
- void set_legacy_addresses(absl::optional<AddressList> addresses) {
- legacy_addresses_ = std::move(addresses);
- }
const absl::optional<std::vector<std::string>>& text_records() const {
return text_records_;
}
@@ -226,6 +226,14 @@ class NET_EXPORT HostCache {
absl::optional<bool> pinning() const { return pinning_; }
void set_pinning(absl::optional<bool> pinning) { pinning_ = pinning; }
+ const absl::optional<std::set<std::string>>& canonical_names() const {
+ return canonical_names_;
+ }
+ void set_canonical_names(
+ absl::optional<std::set<std::string>> canonical_names) {
+ canonical_names_ = std::move(canonical_names);
+ }
+
Source source() const { return source_; }
bool has_ttl() const { return ttl_ >= base::TimeDelta(); }
base::TimeDelta ttl() const { return ttl_; }
@@ -270,7 +278,6 @@ class NET_EXPORT HostCache {
std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>>
endpoint_metadatas,
absl::optional<std::set<std::string>> aliases,
- const absl::optional<AddressList>& legacy_addresses,
absl::optional<std::vector<std::string>>&& text_results,
absl::optional<std::vector<HostPortPair>>&& hostnames,
absl::optional<std::vector<bool>>&& https_record_compatibility,
@@ -280,17 +287,11 @@ class NET_EXPORT HostCache {
void PrepareForCacheInsertion();
- void SetResult(std::vector<IPEndPoint> ip_endpoints) {
- ip_endpoints_ = std::move(ip_endpoints);
- }
void SetResult(
std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>
endpoint_metadatas) {
endpoint_metadatas_ = std::move(endpoint_metadatas);
}
- void SetResult(AddressList addresses) {
- legacy_addresses_ = std::move(addresses);
- }
void SetResult(std::vector<std::string> text_records) {
text_records_ = std::move(text_records);
}
@@ -310,23 +311,6 @@ class NET_EXPORT HostCache {
int network_changes,
EntryStaleness* out) const;
- // Merges legacy addresses from |source| into the stored list of addresses
- // and deduplicates. The address list can be accessed with |addresses()|.
- // This method performs a stable sort to ensure IPv6 addresses precede IPv4
- // addresses. IP versions being equal, addresses from |*this| will precede
- // those from |source|.
- //
- // Only non-failure entries (`error_` is OK or ERR_NAME_NOT_RESOLVED) can be
- // merged. Because an ERR_NAME_NOT_RESOLVED represents success without any
- // results, merging an OK entry with an ERR_NAME_NOT_RESOLVED entry
- // represents merging a non-empty entry with an empty entry, resulting in
- // non-empty and therefore OK.
- void MergeAddressesFrom(const HostCache::Entry& source);
-
- // Merges the legacy DNS aliases list from `source` into the stored list of
- // DNS aliases and deduplicates.
- void MergeDnsAliasesFrom(const HostCache::Entry& source);
-
base::Value::Dict GetAsValue(bool include_staleness) const;
// The resolve results for this entry.
@@ -336,7 +320,6 @@ class NET_EXPORT HostCache {
std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>>
endpoint_metadatas_;
absl::optional<std::set<std::string>> aliases_;
- absl::optional<AddressList> legacy_addresses_;
absl::optional<std::vector<std::string>> text_records_;
absl::optional<std::vector<HostPortPair>> hostnames_;
@@ -360,6 +343,11 @@ class NET_EXPORT HostCache {
// for followup queries after insecure/expired bootstrap are abandoned (see
// TODO(crbug.com/1200908) in HostResolverManager).
absl::optional<bool> pinning_;
+
+ // The final name at the end of the alias chain that was the record name for
+ // the A/AAAA records.
+ absl::optional<std::set<std::string>> canonical_names_;
+
// TTL obtained from the nameserver. Negative if unknown.
base::TimeDelta ttl_ = base::Seconds(-1);
diff --git a/chromium/net/dns/host_cache_unittest.cc b/chromium/net/dns/host_cache_unittest.cc
index d53d089782f..863eec2f4fc 100644
--- a/chromium/net/dns/host_cache_unittest.cc
+++ b/chromium/net/dns/host_cache_unittest.cc
@@ -13,6 +13,7 @@
#include "base/callback.h"
#include "base/callback_helpers.h"
#include "base/format_macros.h"
+#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
@@ -22,6 +23,7 @@
#include "base/time/time.h"
#include "base/values.h"
#include "net/base/connection_endpoint_metadata.h"
+#include "net/base/ip_endpoint.h"
#include "net/base/network_isolation_key.h"
#include "net/base/schemeful_site.h"
#include "net/dns/host_resolver_results.h"
@@ -77,6 +79,19 @@ MATCHER_P(EntryContentsEqual,
return arg.ContentsEqual(entry);
}
+IPAddress MakeIP(base::StringPiece literal) {
+ IPAddress ret;
+ CHECK(ret.AssignFromIPLiteral(literal));
+ return ret;
+}
+
+std::vector<IPEndPoint> MakeEndpoints(std::vector<std::string> my_addresses) {
+ std::vector<IPEndPoint> out(my_addresses.size());
+ std::transform(my_addresses.begin(), my_addresses.end(), out.begin(),
+ [](auto& s) { return IPEndPoint(MakeIP(s), 0); });
+ return out;
+}
+
} // namespace
TEST(HostCacheTest, Basic) {
@@ -90,7 +105,8 @@ TEST(HostCacheTest, Basic) {
HostCache::Key key1 = Key("foobar.com");
HostCache::Key key2 = Key("foobar2.com");
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{"foobar.com"},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0U, cache.size());
@@ -144,21 +160,22 @@ TEST(HostCacheTest, Basic) {
TEST(HostCacheTest, GetEndpoints) {
std::vector<IPEndPoint> ip_endpoints = {IPEndPoint(IPAddress(1, 1, 1, 1), 0),
IPEndPoint(IPAddress(2, 2, 2, 2), 0)};
- HostCache::Entry entry(OK, ip_endpoints, HostCache::Entry::SOURCE_DNS);
+ HostCache::Entry entry(OK, ip_endpoints, /*aliases=*/{},
+ HostCache::Entry::SOURCE_DNS);
EXPECT_THAT(entry.GetEndpoints(),
Optional(ElementsAre(ExpectEndpointResult(ip_endpoints))));
}
TEST(HostCacheTest, GetEmptyEndpoints) {
- HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, std::vector<IPEndPoint>(),
- HostCache::Entry::SOURCE_DNS);
+ HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, /*ip_endpoints=*/{},
+ /*aliases=*/{}, HostCache::Entry::SOURCE_DNS);
EXPECT_THAT(entry.GetEndpoints(), Optional(IsEmpty()));
}
TEST(HostCacheTest, GetEmptyEndpointsWithMetadata) {
- HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, std::vector<IPEndPoint>(),
- HostCache::Entry::SOURCE_DNS);
+ HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, /*ip_endpoints=*/{},
+ /*aliases=*/{}, HostCache::Entry::SOURCE_DNS);
// Merge in non-empty metadata.
ConnectionEndpointMetadata metadata;
@@ -216,7 +233,8 @@ TEST(HostCacheTest, HandlesKeysWithoutScheme) {
NetworkIsolationKey());
ASSERT_NE(key, key_with_scheme);
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
ASSERT_EQ(0U, cache.size());
ASSERT_FALSE(cache.Lookup(key, now));
@@ -268,9 +286,11 @@ TEST(HostCacheTest, NetworkIsolationKey) {
HostCache::Key key2(kHost, DnsQueryType::UNSPECIFIED, 0,
HostResolverSource::ANY, kNetworkIsolationKey2);
HostCache::Entry entry1 =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
- HostCache::Entry entry2 = HostCache::Entry(ERR_FAILED, AddressList(),
- HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry2 =
+ HostCache::Entry(ERR_FAILED, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
HostCache cache(kMaxCacheEntries);
@@ -326,7 +346,8 @@ TEST(HostCacheTest, NoCacheZeroTTL) {
HostCache::Key key1 = Key("foobar.com");
HostCache::Key key2 = Key("foobar2.com");
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_FALSE(cache.Lookup(key1, now));
cache.Set(key1, entry, now, kFailureEntryTTL);
@@ -355,7 +376,8 @@ TEST(HostCacheTest, CacheNegativeEntry) {
HostCache::Key key1 = Key("foobar.com");
HostCache::Key key2 = Key("foobar2.com");
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0U, cache.size());
@@ -421,7 +443,8 @@ TEST(HostCacheTest, DnsQueryTypeIsPartOfKey) {
DnsQueryType::A, 0, HostResolverSource::ANY,
NetworkIsolationKey());
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0U, cache.size());
@@ -460,7 +483,8 @@ TEST(HostCacheTest, HostResolverFlagsArePartOfKey) {
HostCache::Key key3(kHost, DnsQueryType::A, HOST_RESOLVER_LOOPBACK_ONLY,
HostResolverSource::ANY, NetworkIsolationKey());
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0U, cache.size());
@@ -505,7 +529,8 @@ TEST(HostCacheTest, HostResolverSourceIsPartOfKey) {
HostCache::Key key2(kHost, DnsQueryType::UNSPECIFIED, 0,
HostResolverSource::DNS, NetworkIsolationKey());
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0U, cache.size());
@@ -545,7 +570,8 @@ TEST(HostCacheTest, SecureIsPartOfKey) {
NetworkIsolationKey());
key2.secure = false;
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0U, cache.size());
@@ -590,7 +616,8 @@ TEST(HostCacheTest, PreferLessStaleMoreSecure) {
NetworkIsolationKey());
secure_key.secure = true;
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0U, cache.size());
@@ -647,7 +674,8 @@ TEST(HostCacheTest, NoCache) {
base::TimeTicks now;
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
// Lookup and Set should have no effect.
EXPECT_FALSE(cache.Lookup(Key("foobar.com"), now));
@@ -666,7 +694,8 @@ TEST(HostCacheTest, Clear) {
base::TimeTicks now;
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0u, cache.size());
@@ -691,7 +720,8 @@ TEST(HostCacheTest, ClearForHosts) {
base::TimeTicks now;
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0u, cache.size());
@@ -728,7 +758,8 @@ TEST(HostCacheTest, Evict) {
HostCache::Key key2 = Key("foobar2.com");
HostCache::Key key3 = Key("foobar3.com");
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0u, cache.size());
EXPECT_FALSE(cache.Lookup(key1, now));
@@ -764,7 +795,8 @@ TEST(HostCacheTest, Stale) {
HostCache::Key key = Key("foobar.com");
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0U, cache.size());
@@ -828,7 +860,8 @@ TEST(HostCacheTest, EvictStale) {
HostCache::Key key2 = Key("foobar2.com");
HostCache::Key key3 = Key("foobar3.com");
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0u, cache.size());
EXPECT_FALSE(cache.Lookup(key1, now));
@@ -893,7 +926,8 @@ TEST(HostCacheTest, NoEvictPinned) {
HostCache::Key key2 = Key("foobar2.com");
HostCache::Key key3 = Key("foobar3.com");
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
entry.set_pinning(true);
cache.Set(key1, entry, now, base::Seconds(5));
@@ -920,7 +954,8 @@ TEST(HostCacheTest, EvictObsoletePinned) {
HostCache::Key key3 = Key("foobar3.com");
HostCache::Key key4 = Key("foobar4.com");
HostCache::Entry entry =
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
entry.set_pinning(true);
// |key2| should be preserved, since it expires later.
@@ -954,10 +989,10 @@ TEST(HostCacheTest, PreserveActivePin) {
// Make entry1 and entry2, identical except for IP and pinned flag.
IPEndPoint endpoint1(IPAddress(192, 0, 2, 1), 0);
IPEndPoint endpoint2(IPAddress(192, 0, 2, 2), 0);
- HostCache::Entry entry1 = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint1}, HostCache::Entry::SOURCE_UNKNOWN);
- HostCache::Entry entry2 = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint2}, HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry1 = HostCache::Entry(OK, {endpoint1}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry2 = HostCache::Entry(OK, {endpoint2}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
entry1.set_pinning(true);
HostCache::Key key = Key("foobar.com");
@@ -994,10 +1029,10 @@ TEST(HostCacheTest, DontPreserveObsoletePin) {
// Make entry1 and entry2, identical except for IP and "pinned" flag.
IPEndPoint endpoint1(IPAddress(192, 0, 2, 1), 0);
IPEndPoint endpoint2(IPAddress(192, 0, 2, 2), 0);
- HostCache::Entry entry1 = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint1}, HostCache::Entry::SOURCE_UNKNOWN);
- HostCache::Entry entry2 = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint2}, HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry1 = HostCache::Entry(OK, {endpoint1}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry2 = HostCache::Entry(OK, {endpoint2}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
entry1.set_pinning(true);
HostCache::Key key = Key("foobar.com");
@@ -1038,10 +1073,10 @@ TEST(HostCacheTest, Unpin) {
// Make entry1 and entry2, identical except for IP and pinned flag.
IPEndPoint endpoint1(IPAddress(192, 0, 2, 1), 0);
IPEndPoint endpoint2(IPAddress(192, 0, 2, 2), 0);
- HostCache::Entry entry1 = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint1}, HostCache::Entry::SOURCE_UNKNOWN);
- HostCache::Entry entry2 = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint2}, HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry1 = HostCache::Entry(OK, {endpoint1}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry2 = HostCache::Entry(OK, {endpoint2}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
entry1.set_pinning(true);
entry2.set_pinning(false);
@@ -1236,8 +1271,8 @@ TEST(HostCacheTest, SerializeAndDeserializeWithExpirations) {
HostCache::Key expire_by_changes_key = Key("expire.by.changes.test");
IPEndPoint endpoint(IPAddress(1, 2, 3, 4), 0);
- HostCache::Entry entry = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint}, HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry = HostCache::Entry(OK, {endpoint}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0u, cache.size());
@@ -1310,17 +1345,16 @@ TEST(HostCacheTest, SerializeAndDeserializeWithChanges) {
IPEndPoint endpoint(IPAddress(1, 1, 1, 1), 0);
HostCache::Entry serialized_entry = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint}, HostCache::Entry::SOURCE_UNKNOWN);
+ OK, {endpoint}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
IPEndPoint replacement_endpoint(IPAddress(2, 2, 2, 2), 0);
HostCache::Entry replacement_entry =
- HostCache::Entry(OK, std::vector<IPEndPoint>{replacement_endpoint},
+ HostCache::Entry(OK, {replacement_endpoint}, /*aliases=*/{},
HostCache::Entry::SOURCE_UNKNOWN);
IPEndPoint other_endpoint(IPAddress(3, 3, 3, 3), 0);
- HostCache::Entry other_entry =
- HostCache::Entry(OK, std::vector<IPEndPoint>{other_endpoint},
- HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry other_entry = HostCache::Entry(
+ OK, {other_endpoint}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0u, cache.size());
@@ -1381,7 +1415,7 @@ TEST(HostCacheTest, SerializeAndDeserializeWithChanges) {
Pointee(Pair(other_key, EntryContentsEqual(other_entry))));
}
-TEST(HostCacheTest, SerializeAndDeserializeLegacyAddresses) {
+TEST(HostCacheTest, SerializeAndDeserializeAddresses) {
const base::TimeDelta kTTL = base::Seconds(10);
HostCache cache(kMaxCacheEntries);
@@ -1400,16 +1434,15 @@ TEST(HostCacheTest, SerializeAndDeserializeLegacyAddresses) {
IPEndPoint endpoint_ipv4(address_ipv4, 0);
IPEndPoint endpoint_ipv6(address_ipv6, 0);
- HostCache::Entry entry1 = HostCache::Entry(OK, AddressList(endpoint_ipv4),
- HostCache::Entry::SOURCE_UNKNOWN);
- AddressList addresses2 = AddressList(endpoint_ipv6);
- addresses2.push_back(endpoint_ipv4);
+ HostCache::Entry entry1 = HostCache::Entry(
+ OK, {endpoint_ipv4}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
HostCache::Entry entry2 =
- HostCache::Entry(OK, addresses2, HostCache::Entry::SOURCE_UNKNOWN);
- HostCache::Entry entry3 = HostCache::Entry(OK, AddressList(endpoint_ipv6),
- HostCache::Entry::SOURCE_UNKNOWN);
- HostCache::Entry entry4 = HostCache::Entry(OK, AddressList(endpoint_ipv4),
- HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry(OK, {endpoint_ipv6, endpoint_ipv4}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry3 = HostCache::Entry(
+ OK, {endpoint_ipv6}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry4 = HostCache::Entry(
+ OK, {endpoint_ipv4}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
EXPECT_EQ(0u, cache.size());
@@ -1470,12 +1503,11 @@ TEST(HostCacheTest, SerializeAndDeserializeLegacyAddresses) {
restored_cache.LookupStale(key1, now, &stale);
EXPECT_TRUE(result1);
EXPECT_TRUE(result1->first.secure);
- ASSERT_TRUE(result1->second.legacy_addresses());
+ ASSERT_TRUE(result1->second.ip_endpoints());
EXPECT_FALSE(result1->second.text_records());
EXPECT_FALSE(result1->second.hostnames());
- EXPECT_EQ(1u, result1->second.legacy_addresses().value().size());
- EXPECT_EQ(address_ipv4,
- result1->second.legacy_addresses().value().front().address());
+ EXPECT_EQ(1u, result1->second.ip_endpoints()->size());
+ EXPECT_EQ(endpoint_ipv4, result1->second.ip_endpoints()->front());
EXPECT_EQ(1, stale.network_changes);
// Time to TimeTicks conversion is fuzzy, so just check that expected and
// actual expiration times are close.
@@ -1488,12 +1520,10 @@ TEST(HostCacheTest, SerializeAndDeserializeLegacyAddresses) {
restored_cache.LookupStale(key2, now, &stale);
EXPECT_TRUE(result2);
EXPECT_FALSE(result2->first.secure);
- ASSERT_TRUE(result2->second.legacy_addresses());
- EXPECT_EQ(2u, result2->second.legacy_addresses().value().size());
- EXPECT_EQ(address_ipv6,
- result2->second.legacy_addresses().value().front().address());
- EXPECT_EQ(address_ipv4,
- result2->second.legacy_addresses().value().back().address());
+ ASSERT_TRUE(result2->second.ip_endpoints());
+ EXPECT_EQ(2u, result2->second.ip_endpoints()->size());
+ EXPECT_EQ(endpoint_ipv6, result2->second.ip_endpoints()->front());
+ EXPECT_EQ(endpoint_ipv4, result2->second.ip_endpoints()->back());
EXPECT_EQ(1, stale.network_changes);
EXPECT_GT(base::Milliseconds(100),
(base::Seconds(-3) - stale.expired_by).magnitude());
@@ -1502,19 +1532,17 @@ TEST(HostCacheTest, SerializeAndDeserializeLegacyAddresses) {
const std::pair<const HostCache::Key, HostCache::Entry>* result3 =
restored_cache.Lookup(key3, now);
EXPECT_TRUE(result3);
- ASSERT_TRUE(result3->second.legacy_addresses());
- EXPECT_EQ(1u, result3->second.legacy_addresses().value().size());
- EXPECT_EQ(address_ipv4,
- result3->second.legacy_addresses().value().front().address());
+ ASSERT_TRUE(result3->second.ip_endpoints());
+ EXPECT_EQ(1u, result3->second.ip_endpoints()->size());
+ EXPECT_EQ(endpoint_ipv4, result3->second.ip_endpoints()->front());
// The "foobar4.com" entry is still present and usable.
const std::pair<const HostCache::Key, HostCache::Entry>* result4 =
restored_cache.Lookup(key4, now);
EXPECT_TRUE(result4);
- ASSERT_TRUE(result4->second.legacy_addresses());
- EXPECT_EQ(1u, result4->second.legacy_addresses().value().size());
- EXPECT_EQ(address_ipv4,
- result4->second.legacy_addresses().value().front().address());
+ ASSERT_TRUE(result4->second.ip_endpoints());
+ EXPECT_EQ(1u, result4->second.ip_endpoints()->size());
+ EXPECT_EQ(endpoint_ipv4, result4->second.ip_endpoints()->front());
EXPECT_EQ(2u, restored_cache.last_restore_size());
}
@@ -1524,8 +1552,9 @@ TEST(HostCacheTest, SerializeAndDeserializeEntryWithoutScheme) {
HostCache::Key key("host.test", DnsQueryType::UNSPECIFIED, 0,
HostResolverSource::ANY, NetworkIsolationKey());
- HostCache::Entry entry = HostCache::Entry(OK, std::vector<IPEndPoint>(),
- HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry =
+ HostCache::Entry(OK, /*ip_endpoints=*/{},
+ /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
base::TimeTicks now;
HostCache cache(kMaxCacheEntries);
@@ -1562,8 +1591,8 @@ TEST(HostCacheTest, SerializeAndDeserializeWithNetworkIsolationKey) {
HostResolverSource::ANY, kOpaqueNetworkIsolationKey);
IPEndPoint endpoint(IPAddress(1, 2, 3, 4), 0);
- HostCache::Entry entry = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint}, HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry = HostCache::Entry(OK, {endpoint}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
base::TimeTicks now;
HostCache cache(kMaxCacheEntries);
@@ -1602,8 +1631,8 @@ TEST(HostCacheTest, SerializeForDebugging) {
HostResolverSource::ANY, kNetworkIsolationKey);
IPEndPoint endpoint(IPAddress(1, 2, 3, 4), 0);
- HostCache::Entry entry = HostCache::Entry(
- OK, std::vector<IPEndPoint>{endpoint}, HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry = HostCache::Entry(OK, {endpoint}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
base::TimeTicks now;
HostCache cache(kMaxCacheEntries);
@@ -1697,23 +1726,32 @@ TEST(HostCacheTest, SerializeAndDeserializeEndpointResult) {
HostCache::Key key(url::SchemeHostPort(url::kHttpsScheme, "example.com", 443),
DnsQueryType::A, 0, HostResolverSource::DNS,
NetworkIsolationKey());
+ IPEndPoint ipv6_endpoint(
+ IPAddress(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), 110);
+ IPEndPoint ipv4_endpoint1(IPAddress(1, 1, 1, 1), 80);
+ IPEndPoint ipv4_endpoint2(IPAddress(2, 2, 2, 2), 90);
+ IPEndPoint other_ipv4_endpoint(IPAddress(3, 3, 3, 3), 100);
+ std::string ipv6_alias = "ipv6_alias.test";
+ std::string ipv4_alias = "ipv4_alias.test";
+ std::string other_alias = "other_alias.test";
+ std::vector<IPEndPoint> ip_endpoints = {ipv6_endpoint, ipv4_endpoint1,
+ ipv4_endpoint2, other_ipv4_endpoint};
+ std::set<std::string> aliases = {ipv6_alias, ipv4_alias, other_alias};
+ HostCache::Entry entry(OK, ip_endpoints, aliases,
+ HostCache::Entry::SOURCE_DNS, ttl);
+
+ std::set<std::string> canonical_names = {ipv6_alias, ipv4_alias};
+ entry.set_canonical_names(canonical_names);
- std::vector<IPEndPoint> ip_endpoints = {
- IPEndPoint(IPAddress(1, 1, 1, 1), 800),
- IPEndPoint(IPAddress(2, 2, 2, 2), 900),
- IPEndPoint(IPAddress(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4),
- 100)};
- HostCache::Entry entry(OK, ip_endpoints, HostCache::Entry::SOURCE_DNS, ttl);
- std::set<std::string> aliases = {"ipv4_alias.test", "ipv6_alias.test",
- "other_alias.test"};
- entry.set_aliases(aliases);
EXPECT_TRUE(entry.GetEndpoints());
ConnectionEndpointMetadata metadata1;
metadata1.supported_protocol_alpns = {"h3", "h2"};
metadata1.ech_config_list = {'f', 'o', 'o'};
+ metadata1.target_name = ipv6_alias;
ConnectionEndpointMetadata metadata2;
metadata2.supported_protocol_alpns = {"h2", "h4"};
+ metadata2.target_name = ipv4_alias;
HostCache::Entry metadata_entry(
OK,
std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>{
@@ -1722,6 +1760,19 @@ TEST(HostCacheTest, SerializeAndDeserializeEndpointResult) {
auto merged_entry = HostCache::Entry::MergeEntries(entry, metadata_entry);
+ EXPECT_THAT(merged_entry.GetEndpoints(),
+ Optional(ElementsAre(ExpectEndpointResult(ip_endpoints))));
+ EXPECT_THAT(
+ merged_entry.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(
+ ExpectConnectionEndpointMetadata(testing::ElementsAre("h3", "h2"),
+ testing::ElementsAre('f', 'o', 'o'),
+ ipv6_alias),
+ ExpectConnectionEndpointMetadata(testing::ElementsAre("h2", "h4"),
+ IsEmpty(), ipv4_alias))));
+ EXPECT_THAT(merged_entry.canonical_names(),
+ testing::Optional(UnorderedElementsAre(ipv4_alias, ipv6_alias)));
+
HostCache cache(kMaxCacheEntries);
cache.Set(key, merged_entry, now, ttl);
EXPECT_EQ(1u, cache.size());
@@ -1744,14 +1795,106 @@ TEST(HostCacheTest, SerializeAndDeserializeEndpointResult) {
ASSERT_TRUE(result);
EXPECT_THAT(result, Pointee(Pair(key, EntryContentsEqual(merged_entry))));
+ EXPECT_THAT(result->second.GetEndpoints(),
+ Optional(ElementsAre(ExpectEndpointResult(ip_endpoints))));
EXPECT_THAT(
- result->second.GetEndpoints(),
- Optional(ElementsAre(ExpectEndpointResult(ip_endpoints, metadata1),
- ExpectEndpointResult(ip_endpoints, metadata2),
- ExpectEndpointResult(ip_endpoints))));
+ result->second.GetMetadatas(),
+ testing::Optional(testing::ElementsAre(
+ ExpectConnectionEndpointMetadata(testing::ElementsAre("h3", "h2"),
+ testing::ElementsAre('f', 'o', 'o'),
+ ipv6_alias),
+ ExpectConnectionEndpointMetadata(testing::ElementsAre("h2", "h4"),
+ IsEmpty(), ipv4_alias))));
+ EXPECT_THAT(result->second.canonical_names(),
+ testing::Optional(UnorderedElementsAre(ipv4_alias, ipv6_alias)));
+
EXPECT_THAT(result->second.aliases(), Pointee(aliases));
}
+TEST(HostCacheTest, DeserializeNoEndpointNoAliase) {
+ base::TimeDelta ttl = base::Seconds(99);
+ std::string expiration_time_str = base::NumberToString(
+ (base::Time::Now() + ttl).since_origin().InMicroseconds());
+
+ auto dict = base::JSONReader::Read(base::StringPrintf(
+ R"(
+ [ {
+ "dns_query_type": 1,
+ "expiration": "%s",
+ "flags": 0,
+ "host_resolver_source": 2,
+ "hostname": "example.com",
+ "network_isolation_key": [ ],
+ "port": 443,
+ "scheme": "https",
+ "secure": false
+} ]
+)",
+ expiration_time_str.c_str()));
+ ASSERT_TRUE(dict);
+
+ HostCache restored_cache(kMaxCacheEntries);
+ ASSERT_TRUE(dict->is_list());
+ restored_cache.RestoreFromListValue(dict->GetList());
+
+ ASSERT_EQ(1u, restored_cache.size());
+
+ HostCache::Key key(url::SchemeHostPort(url::kHttpsScheme, "example.com", 443),
+ DnsQueryType::A, 0, HostResolverSource::DNS,
+ NetworkIsolationKey());
+
+ HostCache::EntryStaleness stale;
+ const std::pair<const HostCache::Key, HostCache::Entry>* result =
+ restored_cache.LookupStale(key, base::TimeTicks::Now(), &stale);
+
+ ASSERT_TRUE(result);
+ EXPECT_THAT(result->second.aliases(), Pointee(ElementsAre()));
+ EXPECT_THAT(result->second.ip_endpoints(), Pointee(ElementsAre()));
+}
+
+TEST(HostCacheTest, DeserializeLegacyAddresses) {
+ base::TimeDelta ttl = base::Seconds(99);
+ std::string expiration_time_str = base::NumberToString(
+ (base::Time::Now() + ttl).since_origin().InMicroseconds());
+
+ auto dict = base::JSONReader::Read(base::StringPrintf(
+ R"(
+ [ {
+ "addresses": [ "2000::", "1.2.3.4" ],
+ "dns_query_type": 1,
+ "expiration": "%s",
+ "flags": 0,
+ "host_resolver_source": 2,
+ "hostname": "example.com",
+ "network_isolation_key": [ ],
+ "port": 443,
+ "scheme": "https",
+ "secure": false
+} ]
+)",
+ expiration_time_str.c_str()));
+ ASSERT_TRUE(dict);
+
+ HostCache restored_cache(kMaxCacheEntries);
+ ASSERT_TRUE(dict->is_list());
+ restored_cache.RestoreFromListValue(dict->GetList());
+
+ ASSERT_EQ(1u, restored_cache.size());
+
+ HostCache::Key key(url::SchemeHostPort(url::kHttpsScheme, "example.com", 443),
+ DnsQueryType::A, 0, HostResolverSource::DNS,
+ NetworkIsolationKey());
+
+ HostCache::EntryStaleness stale;
+ const std::pair<const HostCache::Key, HostCache::Entry>* result =
+ restored_cache.LookupStale(key, base::TimeTicks::Now(), &stale);
+
+ ASSERT_TRUE(result);
+ EXPECT_THAT(result->second.ip_endpoints(),
+ Pointee(ElementsAreArray(MakeEndpoints({"2000::", "1.2.3.4"}))));
+ EXPECT_THAT(result->second.aliases(), Pointee(ElementsAre()));
+}
+
TEST(HostCacheTest, PersistenceDelegate) {
const base::TimeDelta kTTL = base::Seconds(10);
HostCache cache(kMaxCacheEntries);
@@ -1761,14 +1904,16 @@ TEST(HostCacheTest, PersistenceDelegate) {
HostCache::Key key1 = Key("foobar.com");
HostCache::Key key2 = Key("foobar2.com");
- HostCache::Entry ok_entry = HostCache::Entry(
- OK, std::vector<IPEndPoint>(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry ok_entry =
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN);
std::vector<IPEndPoint> other_endpoints = {
IPEndPoint(IPAddress(1, 1, 1, 1), 300)};
- HostCache::Entry other_entry(OK, std::move(other_endpoints),
+ HostCache::Entry other_entry(OK, std::move(other_endpoints), /*aliases=*/{},
HostCache::Entry::SOURCE_UNKNOWN);
- HostCache::Entry error_entry = HostCache::Entry(
- ERR_NAME_NOT_RESOLVED, AddressList(), HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry error_entry =
+ HostCache::Entry(ERR_NAME_NOT_RESOLVED, /*ip_endpoints=*/{},
+ /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
// Start at t=0.
base::TimeTicks now;
@@ -1821,12 +1966,10 @@ TEST(HostCacheTest, PersistenceDelegate) {
EXPECT_EQ(4, delegate.num_changes());
}
-TEST(HostCacheTest, MergeLegacyAddressEntries) {
+TEST(HostCacheTest, MergeEndpointsWithAliases) {
const IPAddress kAddressFront(1, 2, 3, 4);
const IPEndPoint kEndpointFront(kAddressFront, 0);
- std::vector<std::string> aliases_front({"alias1", "alias2", "alias3"});
- HostCache::Entry front(OK,
- AddressList(kEndpointFront, std::move(aliases_front)),
+ HostCache::Entry front(OK, {kEndpointFront}, {"alias1", "alias2", "alias3"},
HostCache::Entry::SOURCE_DNS);
front.set_text_records(std::vector<std::string>{"text1"});
const HostPortPair kHostnameFront("host", 1);
@@ -1835,8 +1978,7 @@ TEST(HostCacheTest, MergeLegacyAddressEntries) {
const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);
const IPEndPoint kEndpointBack(kAddressBack, 0);
- std::vector<std::string> aliases_back({"alias2", "alias4", "alias5"});
- HostCache::Entry back(OK, AddressList(kEndpointBack, std::move(aliases_back)),
+ HostCache::Entry back(OK, {kEndpointBack}, {"alias2", "alias4", "alias5"},
HostCache::Entry::SOURCE_DNS);
back.set_text_records(std::vector<std::string>{"text2"});
const HostPortPair kHostnameBack("host", 2);
@@ -1848,123 +1990,41 @@ TEST(HostCacheTest, MergeLegacyAddressEntries) {
EXPECT_EQ(OK, result.error());
EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source());
- // Expect the IPv6 address to precede the IPv4 address.
- EXPECT_THAT(result.legacy_addresses(),
- Optional(Property(&AddressList::endpoints,
- ElementsAre(kEndpointBack, kEndpointFront))));
+ ASSERT_TRUE(result.ip_endpoints());
+ EXPECT_THAT(*result.ip_endpoints(),
+ ElementsAre(kEndpointFront, kEndpointBack));
EXPECT_THAT(result.text_records(), Optional(ElementsAre("text1", "text2")));
EXPECT_THAT(result.hostnames(),
Optional(ElementsAre(kHostnameFront, kHostnameBack)));
- ASSERT_TRUE(result.legacy_addresses());
+ ASSERT_TRUE(result.aliases());
EXPECT_THAT(
- result.legacy_addresses().value().dns_aliases(),
+ *result.aliases(),
UnorderedElementsAre("alias1", "alias2", "alias3", "alias4", "alias5"));
}
-IPAddress MakeIP(base::StringPiece literal) {
- IPAddress ret;
- CHECK(ret.AssignFromIPLiteral(literal));
- return ret;
-}
-
-IPAddressList MakeIPList(std::vector<std::string> my_addresses) {
- IPAddressList out(my_addresses.size());
- std::transform(my_addresses.begin(), my_addresses.end(), out.begin(),
- &MakeIP);
- return out;
-}
+TEST(HostCacheTest, MergeEndpointsKeepEndpointsOrder) {
+ std::vector<IPEndPoint> front_addresses =
+ MakeEndpoints({"::1", "0.0.0.2", "0.0.0.4"});
+ std::vector<IPEndPoint> back_addresses =
+ MakeEndpoints({"0.0.0.2", "0.0.0.2", "::3", "::3", "0.0.0.4"});
-std::vector<IPEndPoint> MakeEndpoints(std::vector<std::string> my_addresses) {
- std::vector<IPEndPoint> out(my_addresses.size());
- std::transform(my_addresses.begin(), my_addresses.end(), out.begin(),
- [](auto& s) { return IPEndPoint(MakeIP(s), 0); });
- return out;
-}
-
-TEST(HostCacheTest, SortsAndDeduplicatesLegacyAddresses) {
- IPAddressList front_addresses = MakeIPList({"0.0.0.1", "0.0.0.1", "0.0.0.2"});
- IPAddressList back_addresses =
- MakeIPList({"0.0.0.2", "0.0.0.2", "::3", "::3"});
-
- std::vector<std::string> front_aliases({"front"});
- HostCache::Entry front(OK,
- AddressList::CreateFromIPAddressList(
- front_addresses, std::move(front_aliases)),
+ HostCache::Entry front(OK, front_addresses, /*aliases=*/{"front"},
HostCache::Entry::SOURCE_DNS);
- std::vector<std::string> back_aliases({"back"});
- HostCache::Entry back(OK,
- AddressList::CreateFromIPAddressList(
- back_addresses, std::move(back_aliases)),
+ HostCache::Entry back(OK, back_addresses, /*aliases=*/{"back"},
HostCache::Entry::SOURCE_DNS);
HostCache::Entry result =
HostCache::Entry::MergeEntries(std::move(front), std::move(back));
- EXPECT_EQ(OK, result.error());
- EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source());
-
+ ASSERT_TRUE(result.ip_endpoints());
EXPECT_THAT(
- result.legacy_addresses(),
- Optional(Property(
- &AddressList::endpoints,
- ElementsAreArray(MakeEndpoints({"::3", "0.0.0.1", "0.0.0.2"})))));
-
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
- UnorderedElementsAre("front", "back"));
-}
-
-TEST(HostCacheTest, PrefersLegacyAddressesWithIpv6) {
- IPAddressList front_addresses = MakeIPList({"::1", "0.0.0.2", "0.0.0.4"});
- IPAddressList back_addresses =
- MakeIPList({"0.0.0.2", "0.0.0.2", "::3", "::3", "0.0.0.4"});
-
- std::vector<std::string> front_aliases({"front"});
- HostCache::Entry front(OK,
- AddressList::CreateFromIPAddressList(
- front_addresses, std::move(front_aliases)),
- HostCache::Entry::SOURCE_DNS);
- std::vector<std::string> back_aliases({"back"});
- HostCache::Entry back(OK,
- AddressList::CreateFromIPAddressList(
- back_addresses, std::move(back_aliases)),
- HostCache::Entry::SOURCE_DNS);
-
- HostCache::Entry result =
- HostCache::Entry::MergeEntries(std::move(front), std::move(back));
-
- EXPECT_THAT(result.legacy_addresses(),
- Optional(Property(&AddressList::endpoints,
- ElementsAreArray(MakeEndpoints(
- {"::1", "::3", "0.0.0.2", "0.0.0.4"})))));
-
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
- UnorderedElementsAre("front", "back"));
-}
-
-TEST(HostCacheTest, MergeEndpoints) {
- std::vector<IPEndPoint> front_endpoints = {
- IPEndPoint(IPAddress(1, 1, 1, 1), 800),
- IPEndPoint(IPAddress(2, 2, 2, 2), 900)};
- HostCache::Entry front(OK, front_endpoints, HostCache::Entry::SOURCE_DNS);
-
- std::vector<IPEndPoint> back_endpoints = {IPEndPoint(
- IPAddress(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), 100)};
- HostCache::Entry back(OK, back_endpoints, HostCache::Entry::SOURCE_DNS);
-
- std::vector<IPEndPoint> expected_endpoints = {
- IPEndPoint(IPAddress(1, 1, 1, 1), 800),
- IPEndPoint(IPAddress(2, 2, 2, 2), 900),
- IPEndPoint(IPAddress(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4),
- 100)};
- HostCache::Entry expected(OK, expected_endpoints,
- HostCache::Entry::SOURCE_DNS);
-
- HostCache::Entry result = HostCache::Entry::MergeEntries(front, back);
- EXPECT_EQ(result, expected);
+ *result.ip_endpoints(),
+ ElementsAreArray(MakeEndpoints({"::1", "0.0.0.2", "0.0.0.4", "0.0.0.2",
+ "0.0.0.2", "::3", "::3", "0.0.0.4"})));
+ ASSERT_TRUE(result.aliases());
+ EXPECT_THAT(*result.aliases(), UnorderedElementsAre("front", "back"));
}
TEST(HostCacheTest, MergeMetadatas) {
@@ -1991,16 +2051,89 @@ TEST(HostCacheTest, MergeMetadatas) {
EXPECT_FALSE(result.GetEndpoints());
}
-TEST(HostCacheTest, MergeMetadatasWithIpEndpoints) {
+TEST(HostCacheTest, MergeMetadatasWithIpEndpointsDifferentCanonicalName) {
+ std::string target_name = "example.com";
+ std::string other_target_name = "other.example.com";
+ ConnectionEndpointMetadata metadata;
+ metadata.supported_protocol_alpns = {"h5", "h6", "monster truck rally"};
+ metadata.ech_config_list = {'h', 'i'};
+ metadata.target_name = target_name;
+
+ std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata> metadata_map{
+ {4u, metadata}};
+ HostCache::Entry metadata_entry(OK, metadata_map,
+ HostCache::Entry::SOURCE_DNS);
+
+ // Expect `GetEndpoints()` to always ignore metadatas with no `IPEndPoint`s.
+ EXPECT_FALSE(metadata_entry.GetEndpoints());
+
+ // Merge in an `IPEndPoint` with different canonical name.
+ IPEndPoint ip_endpoint(IPAddress(1, 1, 1, 1), 0);
+ HostCache::Entry with_ip_endpoint(OK, {ip_endpoint}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_DNS);
+ with_ip_endpoint.set_canonical_names(
+ std::set<std::string>{other_target_name});
+ HostCache::Entry result =
+ HostCache::Entry::MergeEntries(metadata_entry, with_ip_endpoint);
+
+ // Expect `GetEndpoints()` not to return the metadata.
+ EXPECT_THAT(result.GetEndpoints(),
+ Optional(ElementsAre(
+ ExpectEndpointResult(std::vector<IPEndPoint>{ip_endpoint}))));
+
+ // Expect merge order irrelevant.
+ EXPECT_EQ(result,
+ HostCache::Entry::MergeEntries(with_ip_endpoint, metadata_entry));
+}
+
+TEST(HostCacheTest, MergeMetadatasWithIpEndpointsMatchingCanonicalName) {
+ std::string target_name = "example.com";
+ ConnectionEndpointMetadata metadata;
+ metadata.supported_protocol_alpns = {"h5", "h6", "monster truck rally"};
+ metadata.ech_config_list = {'h', 'i'};
+ metadata.target_name = target_name;
+
+ std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata> metadata_map{
+ {4u, metadata}};
+ HostCache::Entry metadata_entry(OK, metadata_map,
+ HostCache::Entry::SOURCE_DNS);
+
+ // Expect `GetEndpoints()` to always ignore metadatas with no `IPEndPoint`s.
+ EXPECT_FALSE(metadata_entry.GetEndpoints());
+
+ // Merge in an `IPEndPoint` with different canonical name.
+ IPEndPoint ip_endpoint(IPAddress(1, 1, 1, 1), 0);
+ HostCache::Entry with_ip_endpoint(OK, {ip_endpoint}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_DNS);
+ with_ip_endpoint.set_canonical_names(std::set<std::string>{target_name});
+ HostCache::Entry result =
+ HostCache::Entry::MergeEntries(metadata_entry, with_ip_endpoint);
+
+ // Expect `GetEndpoints()` to return the metadata.
+ EXPECT_THAT(result.GetEndpoints(),
+ Optional(ElementsAre(
+ ExpectEndpointResult(ElementsAre(ip_endpoint), metadata),
+ ExpectEndpointResult(ElementsAre(ip_endpoint)))));
+
+ // Expect merge order irrelevant.
+ EXPECT_EQ(result,
+ HostCache::Entry::MergeEntries(with_ip_endpoint, metadata_entry));
+}
+
+TEST(HostCacheTest, MergeMultipleMetadatasWithIpEndpoints) {
+ std::string target_name = "example.com";
ConnectionEndpointMetadata front_metadata;
front_metadata.supported_protocol_alpns = {"h5", "h6", "monster truck rally"};
front_metadata.ech_config_list = {'h', 'i'};
+ front_metadata.target_name = target_name;
+
std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>
front_metadata_map{{4u, front_metadata}};
HostCache::Entry front(OK, front_metadata_map, HostCache::Entry::SOURCE_DNS);
ConnectionEndpointMetadata back_metadata;
back_metadata.supported_protocol_alpns = {"h5"};
+ back_metadata.target_name = target_name;
std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>
back_metadata_map{{2u, back_metadata}};
HostCache::Entry back(OK, back_metadata_map, HostCache::Entry::SOURCE_DNS);
@@ -2016,8 +2149,9 @@ TEST(HostCacheTest, MergeMetadatasWithIpEndpoints) {
// Merge in an `IPEndPoint`.
IPEndPoint ip_endpoint(IPAddress(1, 1, 1, 1), 0);
- HostCache::Entry with_ip_endpoint(OK, std::vector<IPEndPoint>{ip_endpoint},
+ HostCache::Entry with_ip_endpoint(OK, {ip_endpoint}, /*aliases=*/{},
HostCache::Entry::SOURCE_DNS);
+ with_ip_endpoint.set_canonical_names(std::set<std::string>{target_name});
HostCache::Entry result =
HostCache::Entry::MergeEntries(merged_metadatas, with_ip_endpoint);
@@ -2041,17 +2175,18 @@ TEST(HostCacheTest, MergeMetadatasWithIpEndpoints) {
}
TEST(HostCacheTest, MergeAliases) {
- HostCache::Entry front(OK, std::vector<IPEndPoint>(),
+ HostCache::Entry front(OK, /*ip_endpoints=*/{},
+ /*aliases=*/{"foo1.test", "foo2.test", "foo3.test"},
HostCache::Entry::SOURCE_DNS);
- front.set_aliases({"foo1.test", "foo2.test", "foo3.test"});
- HostCache::Entry back(OK, std::vector<IPEndPoint>(),
+ HostCache::Entry back(OK, /*ip_endpoints=*/{},
+ /*aliases=*/{"foo2.test", "foo4.test"},
HostCache::Entry::SOURCE_DNS);
- back.set_aliases({"foo2.test", "foo4.test"});
- HostCache::Entry expected(OK, std::vector<IPEndPoint>(),
- HostCache::Entry::SOURCE_DNS);
- expected.set_aliases({"foo1.test", "foo2.test", "foo3.test", "foo4.test"});
+ HostCache::Entry expected(
+ OK, /*ip_endpoints=*/{},
+ /*aliases=*/{"foo1.test", "foo2.test", "foo3.test", "foo4.test"},
+ HostCache::Entry::SOURCE_DNS);
HostCache::Entry result = HostCache::Entry::MergeEntries(front, back);
EXPECT_EQ(result, expected);
@@ -2061,14 +2196,13 @@ TEST(HostCacheTest, MergeAliases) {
EXPECT_EQ(result, expected);
}
-TEST(HostCacheTest, MergeLegacyAddressEntries_frontEmpty) {
+TEST(HostCacheTest, MergeEntries_frontEmpty) {
HostCache::Entry front(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS);
const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);
const IPEndPoint kEndpointBack(kAddressBack, 0);
- std::vector<std::string> aliases_back({"alias1", "alias2", "alias3"});
- HostCache::Entry back(OK, AddressList(kEndpointBack, std::move(aliases_back)),
+ HostCache::Entry back(OK, {kEndpointBack}, {"alias1", "alias2", "alias3"},
HostCache::Entry::SOURCE_DNS, base::Hours(4));
back.set_text_records(std::vector<std::string>{"text2"});
const HostPortPair kHostnameBack("host", 2);
@@ -2080,25 +2214,22 @@ TEST(HostCacheTest, MergeLegacyAddressEntries_frontEmpty) {
EXPECT_EQ(OK, result.error());
EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().endpoints(),
- ElementsAre(kEndpointBack));
+ ASSERT_TRUE(result.ip_endpoints());
+ EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointBack));
EXPECT_THAT(result.text_records(), Optional(ElementsAre("text2")));
EXPECT_THAT(result.hostnames(), Optional(ElementsAre(kHostnameBack)));
EXPECT_EQ(base::Hours(4), result.ttl());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
+ ASSERT_TRUE(result.aliases());
+ EXPECT_THAT(*result.aliases(),
UnorderedElementsAre("alias1", "alias2", "alias3"));
}
-TEST(HostCacheTest, MergeLegacyAddressEntries_backEmpty) {
+TEST(HostCacheTest, MergeEntries_backEmpty) {
const IPAddress kAddressFront(1, 2, 3, 4);
const IPEndPoint kEndpointFront(kAddressFront, 0);
- std::vector<std::string> aliases_front({"alias1", "alias2", "alias3"});
- HostCache::Entry front(OK,
- AddressList(kEndpointFront, std::move(aliases_front)),
+ HostCache::Entry front(OK, {kEndpointFront}, {"alias1", "alias2", "alias3"},
HostCache::Entry::SOURCE_DNS, base::Minutes(5));
front.set_text_records(std::vector<std::string>{"text1"});
const HostPortPair kHostnameFront("host", 1);
@@ -2112,20 +2243,19 @@ TEST(HostCacheTest, MergeLegacyAddressEntries_backEmpty) {
EXPECT_EQ(OK, result.error());
EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().endpoints(),
- ElementsAre(kEndpointFront));
+ ASSERT_TRUE(result.ip_endpoints());
+ EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointFront));
EXPECT_THAT(result.text_records(), Optional(ElementsAre("text1")));
EXPECT_THAT(result.hostnames(), Optional(ElementsAre(kHostnameFront)));
EXPECT_EQ(base::Minutes(5), result.ttl());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
+ ASSERT_TRUE(result.aliases());
+ EXPECT_THAT(*result.aliases(),
UnorderedElementsAre("alias1", "alias2", "alias3"));
}
-TEST(HostCacheTest, MergeLegacyAddressEntries_bothEmpty) {
+TEST(HostCacheTest, MergeEntries_bothEmpty) {
HostCache::Entry front(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS);
HostCache::Entry back(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS);
@@ -2135,25 +2265,21 @@ TEST(HostCacheTest, MergeLegacyAddressEntries_bothEmpty) {
EXPECT_EQ(ERR_NAME_NOT_RESOLVED, result.error());
EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source());
- EXPECT_FALSE(result.legacy_addresses());
+ EXPECT_FALSE(result.ip_endpoints());
EXPECT_FALSE(result.text_records());
EXPECT_FALSE(result.hostnames());
EXPECT_FALSE(result.has_ttl());
}
-TEST(HostCacheTest,
- MergeLegacyAddressEntries_frontWithAliasesNoAddressesBackWithBoth) {
+TEST(HostCacheTest, MergeEntries_frontWithAliasesNoAddressesBackWithBoth) {
HostCache::Entry front(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS);
- AddressList front_addresses;
- std::vector<std::string> aliases_front({"alias0", "alias1", "alias2"});
- front_addresses.SetDnsAliases(std::move(aliases_front));
- front.set_legacy_addresses(front_addresses);
+ std::set<std::string> aliases_front({"alias0", "alias1", "alias2"});
+ front.set_aliases(aliases_front);
const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);
const IPEndPoint kEndpointBack(kAddressBack, 0);
- std::vector<std::string> aliases_back({"alias1", "alias2", "alias3"});
- HostCache::Entry back(OK, AddressList(kEndpointBack, std::move(aliases_back)),
+ HostCache::Entry back(OK, {kEndpointBack}, {"alias1", "alias2", "alias3"},
HostCache::Entry::SOURCE_DNS, base::Hours(4));
HostCache::Entry result =
@@ -2162,32 +2288,25 @@ TEST(HostCacheTest,
EXPECT_EQ(OK, result.error());
EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().endpoints(),
- ElementsAre(kEndpointBack));
+ ASSERT_TRUE(result.ip_endpoints());
+ EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointBack));
EXPECT_EQ(base::Hours(4), result.ttl());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
+ ASSERT_TRUE(result.aliases());
+ EXPECT_THAT(*result.aliases(),
UnorderedElementsAre("alias0", "alias1", "alias2", "alias3"));
}
-TEST(HostCacheTest,
- MergeLegacyAddressEntries_backWithAliasesNoAddressesFrontWithBoth) {
+TEST(HostCacheTest, MergeEntries_backWithAliasesNoAddressesFrontWithBoth) {
HostCache::Entry back(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS);
- AddressList back_addresses;
- std::vector<std::string> aliases_back({"alias1", "alias2", "alias3"});
-
- back_addresses.SetDnsAliases(std::move(aliases_back));
- back.set_legacy_addresses(back_addresses);
+ std::set<std::string> aliases_back({"alias1", "alias2", "alias3"});
+ back.set_aliases(aliases_back);
const IPAddress kAddressFront(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);
const IPEndPoint kEndpointFront(kAddressFront, 0);
- std::vector<std::string> aliases_front({"alias0", "alias1", "alias2"});
- HostCache::Entry front(OK,
- AddressList(kEndpointFront, std::move(aliases_front)),
+ HostCache::Entry front(OK, {kEndpointFront}, {"alias0", "alias1", "alias2"},
HostCache::Entry::SOURCE_DNS, base::Hours(4));
HostCache::Entry result =
@@ -2196,61 +2315,53 @@ TEST(HostCacheTest,
EXPECT_EQ(OK, result.error());
EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().endpoints(),
- ElementsAre(kEndpointFront));
+ ASSERT_TRUE(result.ip_endpoints());
+ EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointFront));
EXPECT_EQ(base::Hours(4), result.ttl());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
+ ASSERT_TRUE(result.aliases());
+ EXPECT_THAT(*result.aliases(),
UnorderedElementsAre("alias0", "alias1", "alias2", "alias3"));
}
-TEST(HostCacheTest,
- MergeLegacyAddressEntries_frontWithAddressesNoAliasesBackWithBoth) {
+TEST(HostCacheTest, MergeEntries_frontWithAddressesNoAliasesBackWithBoth) {
const IPAddress kAddressFront(1, 2, 3, 4);
const IPEndPoint kEndpointFront(kAddressFront, 0);
- HostCache::Entry front(OK, AddressList(kEndpointFront),
+ HostCache::Entry front(OK, {kEndpointFront}, /*aliases=*/{},
HostCache::Entry::SOURCE_DNS, base::Hours(4));
const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);
const IPEndPoint kEndpointBack(kAddressBack, 0);
- std::vector<std::string> aliases_back({"alias1", "alias2", "alias3"});
- HostCache::Entry back(OK, AddressList(kEndpointBack, std::move(aliases_back)),
+ HostCache::Entry back(OK, {kEndpointBack}, {"alias1", "alias2", "alias3"},
HostCache::Entry::SOURCE_DNS, base::Hours(4));
-
HostCache::Entry result =
HostCache::Entry::MergeEntries(std::move(front), std::move(back));
EXPECT_EQ(OK, result.error());
EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().endpoints(),
- ElementsAre(kEndpointBack, kEndpointFront));
+ ASSERT_TRUE(result.ip_endpoints());
+ EXPECT_THAT(*result.ip_endpoints(),
+ ElementsAre(kEndpointFront, kEndpointBack));
EXPECT_EQ(base::Hours(4), result.ttl());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
+ ASSERT_TRUE(result.aliases());
+ EXPECT_THAT(*result.aliases(),
UnorderedElementsAre("alias1", "alias2", "alias3"));
}
-TEST(HostCacheTest,
- MergeLegacyAddressEntries_backWithAddressesNoAliasesFrontWithBoth) {
+TEST(HostCacheTest, MergeEntries_backWithAddressesNoAliasesFrontWithBoth) {
const IPAddress kAddressFront(1, 2, 3, 4);
const IPEndPoint kEndpointFront(kAddressFront, 0);
- std::vector<std::string> aliases_front({"alias1", "alias2", "alias3"});
- HostCache::Entry front(OK,
- AddressList(kEndpointFront, std::move(aliases_front)),
+ HostCache::Entry front(OK, {kEndpointFront}, {"alias1", "alias2", "alias3"},
HostCache::Entry::SOURCE_DNS, base::Hours(4));
-
const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);
const IPEndPoint kEndpointBack(kAddressBack, 0);
- HostCache::Entry back(OK, AddressList(kEndpointBack),
+ HostCache::Entry back(OK, {kEndpointBack}, /*aliases=*/{},
HostCache::Entry::SOURCE_DNS, base::Hours(4));
HostCache::Entry result =
@@ -2259,14 +2370,14 @@ TEST(HostCacheTest,
EXPECT_EQ(OK, result.error());
EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().endpoints(),
- ElementsAre(kEndpointBack, kEndpointFront));
+ ASSERT_TRUE(result.ip_endpoints());
+ EXPECT_THAT(*result.ip_endpoints(),
+ ElementsAre(kEndpointFront, kEndpointBack));
EXPECT_EQ(base::Hours(4), result.ttl());
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
+ ASSERT_TRUE(result.aliases());
+ EXPECT_THAT(*result.aliases(),
UnorderedElementsAre("alias1", "alias2", "alias3"));
}
@@ -2282,47 +2393,33 @@ TEST(HostCacheTest, MergeEntries_differentTtl) {
EXPECT_EQ(base::Seconds(42), result.ttl());
}
-TEST(HostCacheTest, MergeLegacyAddressEntries_FrontCannonnamePreserved) {
- AddressList addresses_front;
- const std::string kCanonicalNameFront = "name1";
- std::vector<std::string> front_aliases({kCanonicalNameFront});
- addresses_front.SetDnsAliases(std::move(front_aliases));
- HostCache::Entry front(OK, addresses_front, HostCache::Entry::SOURCE_DNS);
+TEST(HostCacheTest, MergeEntries_FrontCannonnamePreserved) {
+ HostCache::Entry front(OK, /*ip_endpoints=*/{}, /*aliases=*/{"name1"},
+ HostCache::Entry::SOURCE_DNS);
- AddressList addresses_back;
- const std::string kCanonicalNameBack = "name2";
- std::vector<std::string> back_aliases({kCanonicalNameBack});
- addresses_back.SetDnsAliases(std::move(back_aliases));
- HostCache::Entry back(OK, addresses_back, HostCache::Entry::SOURCE_DNS);
+ HostCache::Entry back(OK, /*ip_endpoints=*/{}, /*aliases=*/{"name2"},
+ HostCache::Entry::SOURCE_DNS);
HostCache::Entry result =
HostCache::Entry::MergeEntries(std::move(front), std::move(back));
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
- UnorderedElementsAre("name1", "name2"));
+ ASSERT_TRUE(result.aliases());
+ EXPECT_THAT(*result.aliases(), UnorderedElementsAre("name1", "name2"));
}
// Test that the back canonname can be used if there is no front cannonname.
-TEST(HostCacheTest, MergeLegacyAddressEntries_BackCannonnameUsable) {
- AddressList addresses_front;
- const std::string kCanonicalNameFront = "";
- std::vector<std::string> front_aliases({kCanonicalNameFront});
- addresses_front.SetDnsAliases(std::move(front_aliases));
- HostCache::Entry front(OK, addresses_front, HostCache::Entry::SOURCE_DNS);
-
- AddressList addresses_back;
- const std::string kCanonicalNameBack = "name2";
- std::vector<std::string> back_aliases({kCanonicalNameBack});
- addresses_back.SetDnsAliases(std::move(back_aliases));
- HostCache::Entry back(OK, addresses_back, HostCache::Entry::SOURCE_DNS);
+TEST(HostCacheTest, MergeEntries_BackCannonnameUsable) {
+ HostCache::Entry front(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_DNS);
+
+ HostCache::Entry back(OK, /*ip_endpoints=*/{}, /*aliases=*/{"name2"},
+ HostCache::Entry::SOURCE_DNS);
HostCache::Entry result =
HostCache::Entry::MergeEntries(std::move(front), std::move(back));
- ASSERT_TRUE(result.legacy_addresses());
- EXPECT_THAT(result.legacy_addresses().value().dns_aliases(),
- UnorderedElementsAre(kCanonicalNameBack));
+ ASSERT_TRUE(result.aliases());
+ EXPECT_THAT(*result.aliases(), UnorderedElementsAre("name2"));
}
} // namespace net
diff --git a/chromium/net/dns/host_resolver.cc b/chromium/net/dns/host_resolver.cc
index 29ba042292c..1aa58423843 100644
--- a/chromium/net/dns/host_resolver.cc
+++ b/chromium/net/dns/host_resolver.cc
@@ -11,14 +11,16 @@
#include "base/bind.h"
#include "base/check.h"
-#include "base/immediate_crash.h"
#include "base/no_destructor.h"
#include "base/notreached.h"
#include "base/ranges/algorithm.h"
#include "base/strings/string_number_conversions.h"
+#include "base/time/time_delta_from_string.h"
#include "base/values.h"
#include "net/base/address_list.h"
+#include "net/base/features.h"
#include "net/base/net_errors.h"
+#include "net/base/network_change_notifier.h"
#include "net/dns/context_host_resolver.h"
#include "net/dns/dns_client.h"
#include "net/dns/dns_util.h"
@@ -38,6 +40,21 @@ namespace net {
namespace {
+// The experiment settings of features::kUseDnsHttpsSvcb. See the comments in
+// net/base/features.h for more details.
+const char kUseDnsHttpsSvcbEnable[] = "enable";
+const char kUseDnsHttpsSvcbEnableInsecure[] = "enable_insecure";
+const char kUseDnsHttpsSvcbInsecureExtraTimeMax[] = "insecure_extra_time_max";
+const char kUseDnsHttpsSvcbInsecureExtraTimePercent[] =
+ "insecure_extra_time_percent";
+const char kUseDnsHttpsSvcbInsecureExtraTimeMin[] = "insecure_extra_time_min";
+const char kUseDnsHttpsSvcbSecureExtraTimeMax[] = "secure_extra_time_max";
+const char kUseDnsHttpsSvcbSecureExtraTimePercent[] =
+ "secure_extra_time_percent";
+const char kUseDnsHttpsSvcbSecureExtraTimeMin[] = "secure_extra_time_min";
+const char kUseDnsHttpsSvcbExtraTimeAbsolute[] = "extra_time_absolute";
+const char kUseDnsHttpsSvcbExtraTimePercent[] = "extra_time_percent";
+
class FailingRequestImpl : public HostResolver::ResolveHostRequest,
public HostResolver::ProbeRequest {
public:
@@ -93,11 +110,94 @@ bool EndpointResultIsNonProtocol(const HostResolverEndpointResult& result) {
return result.metadata.supported_protocol_alpns.empty();
}
+void GetTimeDeltaFromDictString(const base::Value::Dict& args,
+ base::StringPiece key,
+ base::TimeDelta* out) {
+ const std::string* value_string = args.FindString(key);
+ if (!value_string)
+ return;
+ *out = base::TimeDeltaFromString(*value_string).value_or(*out);
+}
+
} // namespace
+HostResolver::HttpsSvcbOptions::HttpsSvcbOptions() = default;
+
+HostResolver::HttpsSvcbOptions::HttpsSvcbOptions(
+ const HttpsSvcbOptions& other) = default;
+HostResolver::HttpsSvcbOptions::HttpsSvcbOptions(HttpsSvcbOptions&& other) =
+ default;
+
+HostResolver::HttpsSvcbOptions::~HttpsSvcbOptions() = default;
+
+// static
+HostResolver::HttpsSvcbOptions HostResolver::HttpsSvcbOptions::FromDict(
+ const base::Value::Dict& dict) {
+ net::HostResolver::HttpsSvcbOptions options;
+ options.enable =
+ dict.FindBool(kUseDnsHttpsSvcbEnable).value_or(options.enable);
+ options.enable_insecure = dict.FindBool(kUseDnsHttpsSvcbEnableInsecure)
+ .value_or(options.enable_insecure);
+ GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbInsecureExtraTimeMax,
+ &options.insecure_extra_time_max);
+
+ options.insecure_extra_time_percent =
+ dict.FindInt(kUseDnsHttpsSvcbInsecureExtraTimePercent)
+ .value_or(options.insecure_extra_time_percent);
+ GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbInsecureExtraTimeMin,
+ &options.insecure_extra_time_min);
+
+ GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbSecureExtraTimeMax,
+ &options.secure_extra_time_max);
+
+ options.secure_extra_time_percent =
+ dict.FindInt(kUseDnsHttpsSvcbSecureExtraTimePercent)
+ .value_or(options.secure_extra_time_percent);
+ GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbSecureExtraTimeMin,
+ &options.secure_extra_time_min);
+
+ GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbExtraTimeAbsolute,
+ &options.extra_time_absolute);
+ options.extra_time_percent = dict.FindInt(kUseDnsHttpsSvcbExtraTimePercent)
+ .value_or(options.extra_time_percent);
+ return options;
+}
+
+// static
+HostResolver::HttpsSvcbOptions HostResolver::HttpsSvcbOptions::FromFeatures() {
+ net::HostResolver::HttpsSvcbOptions options;
+ options.enable = base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb);
+ options.enable_insecure = features::kUseDnsHttpsSvcbEnableInsecure.Get();
+ options.insecure_extra_time_max =
+ features::kUseDnsHttpsSvcbInsecureExtraTimeMax.Get();
+ options.insecure_extra_time_percent =
+ features::kUseDnsHttpsSvcbInsecureExtraTimePercent.Get();
+ options.insecure_extra_time_min =
+ features::kUseDnsHttpsSvcbInsecureExtraTimeMin.Get();
+ options.secure_extra_time_max =
+ features::kUseDnsHttpsSvcbSecureExtraTimeMax.Get();
+ options.secure_extra_time_percent =
+ features::kUseDnsHttpsSvcbSecureExtraTimePercent.Get();
+ options.secure_extra_time_min =
+ features::kUseDnsHttpsSvcbSecureExtraTimeMin.Get();
+ options.extra_time_absolute =
+ features::kUseDnsHttpsSvcbExtraTimeAbsolute.Get();
+ options.extra_time_percent = features::kUseDnsHttpsSvcbExtraTimePercent.Get();
+ return options;
+}
+
+HostResolver::ManagerOptions::ManagerOptions() = default;
+
+HostResolver::ManagerOptions::ManagerOptions(const ManagerOptions& other) =
+ default;
+HostResolver::ManagerOptions::ManagerOptions(ManagerOptions&& other) = default;
+
+HostResolver::ManagerOptions::~ManagerOptions() = default;
+
const std::vector<bool>*
HostResolver::ResolveHostRequest::GetExperimentalResultsForTesting() const {
- IMMEDIATE_CRASH();
+ NOTREACHED();
+ return nullptr;
}
const size_t HostResolver::ManagerOptions::kDefaultRetryAttempts =
@@ -172,9 +272,8 @@ const URLRequestContext* HostResolver::GetContextForTesting() const {
return nullptr;
}
-NetworkChangeNotifier::NetworkHandle HostResolver::GetTargetNetworkForTesting()
- const {
- return NetworkChangeNotifier::kInvalidNetworkHandle;
+handles::NetworkHandle HostResolver::GetTargetNetworkForTesting() const {
+ return handles::kInvalidNetworkHandle;
}
// static
@@ -236,7 +335,7 @@ HostResolver::CreateStandaloneContextResolver(
std::unique_ptr<HostResolver>
HostResolver::CreateStandaloneNetworkBoundResolver(
NetLog* net_log,
- NetworkChangeNotifier::NetworkHandle target_network,
+ handles::NetworkHandle target_network,
absl::optional<ManagerOptions> options,
base::StringPiece host_mapping_rules,
bool enable_caching) {
diff --git a/chromium/net/dns/host_resolver.h b/chromium/net/dns/host_resolver.h
index bf866d7739b..b349d2fca25 100644
--- a/chromium/net/dns/host_resolver.h
+++ b/chromium/net/dns/host_resolver.h
@@ -17,7 +17,7 @@
#include "net/base/address_family.h"
#include "net/base/completion_once_callback.h"
#include "net/base/host_port_pair.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/base/network_isolation_key.h"
#include "net/base/request_priority.h"
#include "net/dns/host_cache.h"
@@ -64,7 +64,7 @@ class NET_EXPORT HostResolver {
public:
// Destruction cancels the request if running asynchronously, causing the
// callback to never be invoked.
- virtual ~ResolveHostRequest() {}
+ virtual ~ResolveHostRequest() = default;
// Starts the request and returns a network error code.
//
@@ -164,7 +164,7 @@ class NET_EXPORT HostResolver {
class ProbeRequest {
public:
// Destruction cancels the request and all probes.
- virtual ~ProbeRequest() {}
+ virtual ~ProbeRequest() = default;
// Activates async running of probes. Always returns ERR_IO_PENDING or an
// error from activating probes. No callback as probes will never "complete"
@@ -172,9 +172,41 @@ class NET_EXPORT HostResolver {
virtual int Start() = 0;
};
+ // The options for features::kUseDnsHttpsSvcb experiment. See the comments
+ // in net/base/features.h for more details.
+ struct NET_EXPORT HttpsSvcbOptions {
+ HttpsSvcbOptions();
+ HttpsSvcbOptions(const HttpsSvcbOptions&);
+ HttpsSvcbOptions(HttpsSvcbOptions&&);
+ HttpsSvcbOptions& operator=(const HttpsSvcbOptions&) = default;
+ HttpsSvcbOptions& operator=(HttpsSvcbOptions&&) = default;
+ ~HttpsSvcbOptions();
+
+ static HttpsSvcbOptions FromDict(const base::Value::Dict& dict);
+ static HttpsSvcbOptions FromFeatures();
+
+ bool enable = false;
+ bool enable_insecure = false;
+ base::TimeDelta insecure_extra_time_max;
+ int insecure_extra_time_percent = 0;
+ base::TimeDelta insecure_extra_time_min;
+ base::TimeDelta secure_extra_time_max;
+ int secure_extra_time_percent = 0;
+ base::TimeDelta secure_extra_time_min;
+ base::TimeDelta extra_time_absolute;
+ int extra_time_percent = 0;
+ };
+
// Parameter-grouping struct for additional optional parameters for creation
// of HostResolverManagers and stand-alone HostResolvers.
struct NET_EXPORT ManagerOptions {
+ ManagerOptions();
+ ManagerOptions(const ManagerOptions&);
+ ManagerOptions(ManagerOptions&&);
+ ManagerOptions& operator=(const ManagerOptions&) = default;
+ ManagerOptions& operator=(ManagerOptions&&) = default;
+ ~ManagerOptions();
+
// Set |max_concurrent_resolves| to this to select a default level
// of concurrency.
static const size_t kDefaultParallelism = 0;
@@ -208,6 +240,10 @@ class NET_EXPORT HostResolver {
// unreachable without actually checking. See https://crbug.com/696569 for
// further context.
bool check_ipv6_on_wifi = true;
+
+ // An experimental options for features::kUseDnsHttpsSvcb
+ // and features::kUseDnsHttpsSvcbAlpn.
+ absl::optional<HostResolver::HttpsSvcbOptions> https_svcb_options;
};
// Factory class. Useful for classes that need to inject and override resolver
@@ -312,7 +348,7 @@ class NET_EXPORT HostResolver {
// multiple types for the same host.
class Delegate {
public:
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
virtual void OnAddressResult(MdnsListenerUpdateType update_type,
DnsQueryType result_type,
@@ -331,7 +367,7 @@ class NET_EXPORT HostResolver {
};
// Destruction cancels the listening operation.
- virtual ~MdnsListener() {}
+ virtual ~MdnsListener() = default;
// Begins the listening operation, invoking |delegate| whenever results are
// updated. |delegate| will no longer be called once the listening operation
@@ -395,8 +431,7 @@ class NET_EXPORT HostResolver {
virtual HostResolverManager* GetManagerForTesting();
virtual const URLRequestContext* GetContextForTesting() const;
- virtual NetworkChangeNotifier::NetworkHandle GetTargetNetworkForTesting()
- const;
+ virtual handles::NetworkHandle GetTargetNetworkForTesting() const;
// Creates a new HostResolver. |manager| must outlive the returned resolver.
//
@@ -433,7 +468,7 @@ class NET_EXPORT HostResolver {
// Only implemented for Android starting from Marshmallow.
static std::unique_ptr<HostResolver> CreateStandaloneNetworkBoundResolver(
NetLog* net_log,
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
absl::optional<ManagerOptions> options = absl::nullopt,
base::StringPiece host_mapping_rules = "",
bool enable_caching = true);
diff --git a/chromium/net/dns/host_resolver_manager.cc b/chromium/net/dns/host_resolver_manager.cc
index 713f7e6cad7..095269ce601 100644
--- a/chromium/net/dns/host_resolver_manager.cc
+++ b/chromium/net/dns/host_resolver_manager.cc
@@ -528,14 +528,14 @@ uint16_t GetPort(const HostResolver::Host& host) {
return absl::get<HostPortPair>(host).port();
}
-// Only use scheme/port in JobKey if `features::kUseDnsHttpsSvcb` is enabled
+// Only use scheme/port in JobKey if `https_svcb_options_enabled` is true
// (or the query is explicitly for HTTPS). Otherwise DNS will not give different
// results for the same hostname.
absl::variant<url::SchemeHostPort, std::string> CreateHostForJobKey(
const HostResolver::Host& input,
- DnsQueryType query_type) {
- if ((base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb) ||
- query_type == DnsQueryType::HTTPS) &&
+ DnsQueryType query_type,
+ bool https_svcb_options_enabled) {
+ if ((https_svcb_options_enabled || query_type == DnsQueryType::HTTPS) &&
absl::holds_alternative<url::SchemeHostPort>(input)) {
return absl::get<url::SchemeHostPort>(input);
}
@@ -552,8 +552,8 @@ DnsResponse CreateFakeEmptyResponse(base::StringPiece hostname,
DnsQueryTypeToQtype(query_type));
}
-AddressList FilterAddresses(AddressList addresses,
- DnsQueryTypeSet query_types) {
+std::vector<IPEndPoint> FilterAddresses(std::vector<IPEndPoint> addresses,
+ DnsQueryTypeSet query_types) {
DCHECK(!query_types.Has(DnsQueryType::UNSPECIFIED));
DCHECK(!query_types.Empty());
@@ -564,7 +564,7 @@ AddressList FilterAddresses(AddressList addresses,
return addresses;
// Keep only the endpoints that match `want_family`.
- addresses.endpoints().erase(
+ addresses.erase(
base::ranges::remove_if(
addresses,
[want_family](AddressFamily family) { return family != want_family; },
@@ -577,14 +577,14 @@ AddressList FilterAddresses(AddressList addresses,
//-----------------------------------------------------------------------------
-bool ResolveLocalHostname(base::StringPiece host, AddressList* address_list) {
+bool ResolveLocalHostname(base::StringPiece host,
+ std::vector<IPEndPoint>* address_list) {
address_list->clear();
-
if (!IsLocalHostname(host))
return false;
- address_list->push_back(IPEndPoint(IPAddress::IPv6Localhost(), 0));
- address_list->push_back(IPEndPoint(IPAddress::IPv4Localhost(), 0));
+ address_list->emplace_back(IPAddress::IPv6Localhost(), 0);
+ address_list->emplace_back(IPAddress::IPv4Localhost(), 0);
return true;
}
@@ -615,7 +615,7 @@ class HostResolverManager::RequestImpl
request_host_(std::move(request_host)),
network_isolation_key_(
base::FeatureList::IsEnabled(
- net::features::kSplitHostCacheByNetworkIsolationKey)
+ features::kSplitHostCacheByNetworkIsolationKey)
? std::move(network_isolation_key)
: NetworkIsolationKey()),
parameters_(optional_parameters ? std::move(optional_parameters).value()
@@ -805,38 +805,21 @@ class HostResolverManager::RequestImpl
DCHECK(!endpoint_results_.has_value());
DCHECK(!fixed_up_dns_alias_results_.has_value());
- if (results_.value().legacy_addresses().has_value()) {
- DCHECK(!results_.value().ip_endpoints());
- legacy_address_results_ = results_.value().legacy_addresses();
- endpoint_results_ = HostResolver::AddressListToEndpointResults(
- legacy_address_results_.value());
-
- fixed_up_dns_alias_results_ = std::set<std::string>(
- legacy_address_results_.value().dns_aliases().begin(),
- legacy_address_results_.value().dns_aliases().end());
-
- // Skip fixups for `include_canonical_name` requests. Just use the
- // canonical name exactly as it was received from the system resolver.
+ endpoint_results_ = results_.value().GetEndpoints();
+ if (endpoint_results_.has_value()) {
+ DCHECK(results_.value().aliases());
+ fixed_up_dns_alias_results_ = *results_.value().aliases();
if (parameters().include_canonical_name) {
- DCHECK_LE(legacy_address_results_.value().dns_aliases().size(), 1u);
+ DCHECK_LE(fixed_up_dns_alias_results_.value().size(), 1u);
} else {
- fixed_up_dns_alias_results_ = dns_alias_utility::FixUpDnsAliases(
- fixed_up_dns_alias_results_.value());
- }
- } else {
- endpoint_results_ = results_.value().GetEndpoints();
- if (endpoint_results_.has_value()) {
- DCHECK(results_.value().aliases());
- fixed_up_dns_alias_results_ = *results_.value().aliases();
-
// Expect `aliases()` results to already be fixed up.
DCHECK(dns_alias_utility::FixUpDnsAliases(
fixed_up_dns_alias_results_.value()) ==
fixed_up_dns_alias_results_.value());
-
- legacy_address_results_ = HostResolver::EndpointResultToAddressList(
- endpoint_results_.value(), fixed_up_dns_alias_results_.value());
}
+
+ legacy_address_results_ = HostResolver::EndpointResultToAddressList(
+ endpoint_results_.value(), fixed_up_dns_alias_results_.value());
}
}
@@ -1016,7 +999,7 @@ class HostResolverManager::ProcTask {
scoped_refptr<base::TaskRunner> proc_task_runner,
const NetLogWithSource& job_net_log,
const base::TickClock* tick_clock,
- NetworkChangeNotifier::NetworkHandle network)
+ handles::NetworkHandle network)
: hostname_(std::move(hostname)),
address_family_(address_family),
flags_(flags),
@@ -1032,7 +1015,7 @@ class HostResolverManager::ProcTask {
params_.resolver_proc = HostResolverProc::GetDefault();
// If default is unset, use the system proc.
if (!params_.resolver_proc.get())
- params_.resolver_proc = new SystemHostResolverProc();
+ params_.resolver_proc = base::MakeRefCounted<SystemHostResolverProc>();
}
ProcTask(const ProcTask&) = delete;
@@ -1111,7 +1094,7 @@ class HostResolverManager::ProcTask {
scoped_refptr<HostResolverProc> resolver_proc,
scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
AttemptCompletionCallback completion_callback,
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
AddressList results;
int os_error = 0;
int error = resolver_proc->Resolve(hostname, address_family, flags,
@@ -1210,7 +1193,7 @@ class HostResolverManager::ProcTask {
raw_ptr<const base::TickClock> tick_clock_;
// Network to perform DNS lookups for.
- NetworkChangeNotifier::NetworkHandle network_;
+ handles::NetworkHandle network_;
// Used to loop back from the blocking lookup attempt tasks as well as from
// delayed retry tasks. Invalidate WeakPtrs on completion and cancellation to
@@ -1258,7 +1241,8 @@ class HostResolverManager::DnsTask : public base::SupportsWeakPtr<DnsTask> {
Delegate* delegate,
const NetLogWithSource& job_net_log,
const base::TickClock* tick_clock,
- bool fallback_available)
+ bool fallback_available,
+ const HostResolver::HttpsSvcbOptions& https_svcb_options)
: client_(client),
host_(std::move(host)),
resolve_context_(resolve_context->AsSafeRef()),
@@ -1268,7 +1252,8 @@ class HostResolverManager::DnsTask : public base::SupportsWeakPtr<DnsTask> {
net_log_(job_net_log),
tick_clock_(tick_clock),
task_start_time_(tick_clock_->NowTicks()),
- fallback_available_(fallback_available) {
+ fallback_available_(fallback_available),
+ https_svcb_options_(https_svcb_options) {
DCHECK(client_);
DCHECK(delegate_);
@@ -1404,7 +1389,7 @@ class HostResolverManager::DnsTask : public base::SupportsWeakPtr<DnsTask> {
return types;
if (types.Has(DnsQueryType::HTTPS)) {
- if (!secure_ && (!features::kUseDnsHttpsSvcbEnableInsecure.Get() ||
+ if (!secure_ && (!https_svcb_options_.enable_insecure ||
!client_->CanQueryAdditionalTypesViaInsecureDns())) {
types.Remove(DnsQueryType::HTTPS);
} else {
@@ -1783,11 +1768,7 @@ class HostResolverManager::DnsTask : public base::SupportsWeakPtr<DnsTask> {
timeout_timer_.Stop();
absl::optional<std::vector<IPEndPoint>> ip_endpoints;
- if (results.legacy_addresses().has_value()) {
- ip_endpoints = results.legacy_addresses().value().endpoints();
- } else {
- ip_endpoints = base::OptionalFromPtr(results.ip_endpoints());
- }
+ ip_endpoints = base::OptionalFromPtr(results.ip_endpoints());
if (ip_endpoints.has_value()) {
// If there are multiple addresses, and at least one is IPv6, need to
@@ -1814,16 +1795,8 @@ class HostResolverManager::DnsTask : public base::SupportsWeakPtr<DnsTask> {
bool secure,
bool success,
std::vector<IPEndPoint> sorted) {
- if (results.legacy_addresses().has_value()) {
- AddressList sorted_list;
- sorted_list.endpoints() = std::move(sorted);
- sorted_list.SetDnsAliases(results.legacy_addresses()->dns_aliases());
-
- results.set_legacy_addresses(std::move(sorted_list));
- } else {
- DCHECK(results.ip_endpoints());
- results.set_ip_endpoints(std::move(sorted));
- }
+ DCHECK(results.ip_endpoints());
+ results.set_ip_endpoints(std::move(sorted));
if (!success) {
OnFailure(ERR_DNS_SORT_ERROR, /*allow_fallback=*/true,
@@ -1832,8 +1805,7 @@ class HostResolverManager::DnsTask : public base::SupportsWeakPtr<DnsTask> {
}
// AddressSorter prunes unusable destinations.
- if (results.legacy_addresses().value_or(AddressList()).empty() &&
- (!results.ip_endpoints() || results.ip_endpoints()->empty()) &&
+ if ((!results.ip_endpoints() || results.ip_endpoints()->empty()) &&
results.text_records().value_or(std::vector<std::string>()).empty() &&
results.hostnames().value_or(std::vector<HostPortPair>()).empty()) {
LOG(WARNING) << "Address list empty after RFC3484 sort";
@@ -1951,24 +1923,22 @@ class HostResolverManager::DnsTask : public base::SupportsWeakPtr<DnsTask> {
base::TimeDelta timeout_min;
if (AnyOfTypeTransactionsRemain({DnsQueryType::HTTPS})) {
- DCHECK(base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb));
+ DCHECK(https_svcb_options_.enable);
if (secure_) {
- timeout_max = features::kUseDnsHttpsSvcbSecureExtraTimeMax.Get();
- extra_time_percent =
- features::kUseDnsHttpsSvcbSecureExtraTimePercent.Get();
- timeout_min = features::kUseDnsHttpsSvcbSecureExtraTimeMin.Get();
+ timeout_max = https_svcb_options_.secure_extra_time_max;
+ extra_time_percent = https_svcb_options_.secure_extra_time_percent;
+ timeout_min = https_svcb_options_.secure_extra_time_min;
} else {
- timeout_max = features::kUseDnsHttpsSvcbInsecureExtraTimeMax.Get();
- extra_time_percent =
- features::kUseDnsHttpsSvcbInsecureExtraTimePercent.Get();
- timeout_min = features::kUseDnsHttpsSvcbInsecureExtraTimeMin.Get();
+ timeout_max = https_svcb_options_.insecure_extra_time_max;
+ extra_time_percent = https_svcb_options_.insecure_extra_time_percent;
+ timeout_min = https_svcb_options_.insecure_extra_time_min;
}
if (timeout_max.is_zero() && extra_time_percent == 0 &&
timeout_min.is_zero()) {
- timeout_max = features::kUseDnsHttpsSvcbExtraTimeAbsolute.Get();
- extra_time_percent = features::kUseDnsHttpsSvcbExtraTimePercent.Get();
+ timeout_max = https_svcb_options_.extra_time_absolute;
+ extra_time_percent = https_svcb_options_.extra_time_percent;
}
// Skip timeout for secure requests if the timeout would be a fatal
@@ -2103,6 +2073,8 @@ class HostResolverManager::DnsTask : public base::SupportsWeakPtr<DnsTask> {
// task completes unsuccessfully. Used as a signal that underlying
// transactions should timeout more quickly.
bool fallback_available_;
+
+ const HostResolver::HttpsSvcbOptions https_svcb_options_;
};
//-----------------------------------------------------------------------------
@@ -2155,7 +2127,7 @@ struct HostResolverManager::JobKey {
return key;
}
- NetworkChangeNotifier::NetworkHandle GetTargetNetwork() const {
+ handles::NetworkHandle GetTargetNetwork() const {
return resolve_context->GetTargetNetwork();
}
};
@@ -2175,7 +2147,8 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
RequestPriority priority,
scoped_refptr<base::TaskRunner> proc_task_runner,
const NetLogWithSource& source_net_log,
- const base::TickClock* tick_clock)
+ const base::TickClock* tick_clock,
+ const HostResolver::HttpsSvcbOptions& https_svcb_options)
: resolver_(resolver),
key_(std::move(key)),
cache_usage_(cache_usage),
@@ -2184,6 +2157,7 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
priority_tracker_(priority),
proc_task_runner_(std::move(proc_task_runner)),
tick_clock_(tick_clock),
+ https_svcb_options_(https_svcb_options),
net_log_(
NetLogWithSource::Make(source_net_log.net_log(),
NetLogSourceType::HOST_RESOLVER_IMPL_JOB)) {
@@ -2485,8 +2459,7 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
bool is_running() const { return job_running_; }
bool HasTargetNetwork() const {
- return key_.GetTargetNetwork() !=
- NetworkChangeNotifier::kInvalidNetworkHandle;
+ return key_.GetTargetNetwork() != handles::kInvalidNetworkHandle;
}
private:
@@ -2494,10 +2467,10 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
base::Value::Dict dict;
source.AddToEventParameters(dict);
dict.Set("host", ToLogStringValue(key_.host));
- std::vector<base::Value> query_types_list;
+ base::Value::List query_types_list;
for (DnsQueryType query_type : key_.query_types)
- query_types_list.emplace_back(kDnsQueryTypes.at(query_type));
- dict.Set("dns_query_types", base::Value(std::move(query_types_list)));
+ query_types_list.Append(kDnsQueryTypes.at(query_type));
+ dict.Set("dns_query_types", std::move(query_types_list));
dict.Set("secure_dns_mode", base::strict_cast<int>(key_.secure_dns_mode));
dict.Set("network_isolation_key",
key_.network_isolation_key.ToDebugString());
@@ -2632,16 +2605,22 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
if (net_error == OK)
ttl = base::Seconds(kCacheEntryTTLSeconds);
+ auto aliases = std::set<std::string>(addr_list.dns_aliases().begin(),
+ addr_list.dns_aliases().end());
+
+ if (!(key_.flags & HOST_RESOLVER_CANONNAME)) {
+ aliases = dns_alias_utility::FixUpDnsAliases(aliases);
+ }
+
// Source unknown because the system resolver could have gotten it from a
// hosts file, its own cache, a DNS lookup or somewhere else.
// Don't store the |ttl| in cache since it's not obtained from the server.
CompleteRequests(
- HostCache::Entry(net_error,
- net_error == OK
- ? AddressList::CopyWithPort(addr_list, 0)
- : AddressList(),
- HostCache::Entry::SOURCE_UNKNOWN),
- ttl, true /* allow_cache */, false /* secure */);
+ HostCache::Entry(
+ net_error,
+ net_error == OK ? addr_list.endpoints() : std::vector<IPEndPoint>(),
+ std::move(aliases), HostCache::Entry::SOURCE_UNKNOWN),
+ ttl, /*allow_cache=*/true, /*secure=*/false);
}
void InsecureCacheLookup() {
@@ -2671,7 +2650,8 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
dns_task_ = std::make_unique<DnsTask>(
resolver_->dns_client_.get(), key_.host, key_.query_types,
&*key_.resolve_context, secure, key_.secure_dns_mode, this, net_log_,
- tick_clock_, !tasks_.empty() /* fallback_available */);
+ tick_clock_, !tasks_.empty() /* fallback_available */,
+ https_svcb_options_);
dns_task_->StartNextTransaction();
// Schedule a second transaction, if needed. DoH queries can bypass the
// dispatcher and start all of their transactions immediately.
@@ -2749,8 +2729,6 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
// transaction, e.g. a supplemental HTTPS transaction, finds results.
DCHECK(!key_.query_types.Has(DnsQueryType::UNSPECIFIED));
if (HasAddressType(key_.query_types) && results.error() == OK &&
- (!results.legacy_addresses() ||
- results.legacy_addresses().value().empty()) &&
(!results.ip_endpoints() || results.ip_endpoints()->empty())) {
results.set_error(ERR_NAME_NOT_RESOLVED);
}
@@ -2775,10 +2753,7 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
base::TimeDelta bounded_ttl =
std::max(results.ttl(), base::Seconds(kMinimumTTLSeconds));
- if ((results.legacy_addresses() &&
- ContainsIcannNameCollisionIp(
- results.legacy_addresses().value().endpoints())) ||
- (results.ip_endpoints() &&
+ if ((results.ip_endpoints() &&
ContainsIcannNameCollisionIp(*results.ip_endpoints()))) {
CompleteRequestsWithError(ERR_ICANN_NAME_COLLISION);
return;
@@ -2850,15 +2825,15 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
// TODO(crbug.com/846423): Consider adding MDNS-specific logging.
HostCache::Entry results = mdns_task_->GetResults();
- if (results.legacy_addresses() &&
- ContainsIcannNameCollisionIp(
- results.legacy_addresses().value().endpoints())) {
+
+ if ((results.ip_endpoints() &&
+ ContainsIcannNameCollisionIp(*results.ip_endpoints()))) {
CompleteRequestsWithError(ERR_ICANN_NAME_COLLISION);
- } else {
- // MDNS uses a separate cache, so skip saving result to cache.
- // TODO(crbug.com/926300): Consider merging caches.
- CompleteRequestsWithoutCache(results, absl::nullopt /* stale_info */);
+ return;
}
+ // MDNS uses a separate cache, so skip saving result to cache.
+ // TODO(crbug.com/926300): Consider merging caches.
+ CompleteRequestsWithoutCache(results, absl::nullopt /* stale_info */);
}
void OnMdnsImmediateFailure(int rv) {
@@ -3072,6 +3047,8 @@ class HostResolverManager::Job : public PrioritizedDispatcher::Job,
raw_ptr<const base::TickClock> tick_clock_;
base::TimeTicks start_time_;
+ HostResolver::HttpsSvcbOptions https_svcb_options_;
+
NetLogWithSource net_log_;
// Resolves the host using a HostResolverProc.
@@ -3106,21 +3083,25 @@ HostResolverManager::HostResolverManager(
: HostResolverManager(PassKey(),
options,
system_dns_config_notifier,
- NetworkChangeNotifier::kInvalidNetworkHandle,
+ handles::kInvalidNetworkHandle,
net_log) {}
HostResolverManager::HostResolverManager(
base::PassKey<HostResolverManager>,
const HostResolver::ManagerOptions& options,
SystemDnsConfigChangeNotifier* system_dns_config_notifier,
- NetworkChangeNotifier::NetworkHandle target_network,
+ handles::NetworkHandle target_network,
NetLog* net_log)
: proc_params_(nullptr, options.max_system_retry_attempts),
net_log_(net_log),
system_dns_config_notifier_(system_dns_config_notifier),
target_network_(target_network),
check_ipv6_on_wifi_(options.check_ipv6_on_wifi),
- tick_clock_(base::DefaultTickClock::GetInstance()) {
+ tick_clock_(base::DefaultTickClock::GetInstance()),
+ https_svcb_options_(
+ options.https_svcb_options
+ ? *options.https_svcb_options
+ : HostResolver::HttpsSvcbOptions::FromFeatures()) {
PrioritizedDispatcher::Limits job_limits = GetDispatcherLimits(options);
dispatcher_ = std::make_unique<PrioritizedDispatcher>(job_limits);
max_queued_jobs_ = job_limits.total_jobs * 100u;
@@ -3177,7 +3158,7 @@ HostResolverManager::~HostResolverManager() {
// OnJobComplete will not start any new jobs.
jobs_.clear();
- if (target_network_ == NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (target_network_ == handles::kInvalidNetworkHandle) {
NetworkChangeNotifier::RemoveIPAddressObserver(this);
NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
}
@@ -3189,7 +3170,7 @@ HostResolverManager::~HostResolverManager() {
std::unique_ptr<HostResolverManager>
HostResolverManager::CreateNetworkBoundHostResolverManager(
const HostResolver::ManagerOptions& options,
- NetworkChangeNotifier::NetworkHandle target_network,
+ handles::NetworkHandle target_network,
NetLog* net_log) {
#if BUILDFLAG(IS_ANDROID)
DCHECK(NetworkChangeNotifier::AreNetworkHandlesSupported());
@@ -3412,7 +3393,8 @@ int HostResolverManager::Resolve(RequestImpl* request) {
const auto& parameters = request->parameters();
JobKey job_key(request->resolve_context());
job_key.host =
- CreateHostForJobKey(request->request_host(), parameters.dns_query_type);
+ CreateHostForJobKey(request->request_host(), parameters.dns_query_type,
+ https_svcb_options_.enable);
job_key.network_isolation_key = request->network_isolation_key();
job_key.source = parameters.source;
@@ -3580,10 +3562,10 @@ HostResolverManager::Job* HostResolverManager::AddJobWithoutRequest(
std::deque<TaskType> tasks,
RequestPriority priority,
const NetLogWithSource& source_net_log) {
- auto new_job =
- std::make_unique<Job>(weak_ptr_factory_.GetWeakPtr(), key, cache_usage,
- host_cache, std::move(tasks), priority,
- proc_task_runner_, source_net_log, tick_clock_);
+ auto new_job = std::make_unique<Job>(
+ weak_ptr_factory_.GetWeakPtr(), key, cache_usage, host_cache,
+ std::move(tasks), priority, proc_task_runner_, source_net_log,
+ tick_clock_, https_svcb_options_);
auto insert_result = jobs_.emplace(std::move(key), std::move(new_job));
auto& iterator = insert_result.first;
bool is_new = insert_result.second;
@@ -3608,10 +3590,11 @@ HostCache::Entry HostResolverManager::ResolveAsIP(DnsQueryTypeSet query_types,
HostCache::Entry::SOURCE_UNKNOWN);
}
- AddressList addresses = AddressList::CreateFromIPAddress(ip_address, 0);
- if (resolve_canonname)
- addresses.SetDefaultCanonicalName();
- return HostCache::Entry(OK, std::move(addresses),
+ std::set<std::string> aliases;
+ if (resolve_canonname) {
+ aliases = {ip_address.ToString()};
+ }
+ return HostCache::Entry(OK, {IPEndPoint(ip_address, 0)}, std::move(aliases),
HostCache::Entry::SOURCE_UNKNOWN);
}
@@ -3662,17 +3645,17 @@ absl::optional<HostCache::Entry> HostResolverManager::MaybeReadFromConfig(
DCHECK(HasAddressType(key.query_types));
if (!absl::holds_alternative<url::SchemeHostPort>(key.host))
return absl::nullopt;
- absl::optional<AddressList> preset_addrs =
+ absl::optional<std::vector<IPEndPoint>> preset_addrs =
dns_client_->GetPresetAddrs(absl::get<url::SchemeHostPort>(key.host));
if (!preset_addrs)
return absl::nullopt;
- AddressList filtered_addresses =
+ std::vector<IPEndPoint> filtered_addresses =
FilterAddresses(std::move(*preset_addrs), key.query_types);
if (filtered_addresses.empty())
return absl::nullopt;
- return HostCache::Entry(OK, std::move(filtered_addresses),
+ return HostCache::Entry(OK, std::move(filtered_addresses), /*aliases=*/{},
HostCache::Entry::SOURCE_CONFIG);
}
@@ -3717,7 +3700,7 @@ absl::optional<HostCache::Entry> HostResolverManager::ServeFromHosts(
// flexibility, but lose implicit ordering.
// We prefer IPv6 because "happy eyeballs" will fall back to IPv4 if
// necessary.
- AddressList addresses;
+ std::vector<IPEndPoint> addresses;
if (query_types.Has(DnsQueryType::AAAA)) {
auto it = hosts->find(DnsHostsKey(effective_hostname, ADDRESS_FAMILY_IPV6));
if (it != hosts->end())
@@ -3741,12 +3724,11 @@ absl::optional<HostCache::Entry> HostResolverManager::ServeFromHosts(
return ServeFromHosts(hostname, query_types, false, tasks);
}
- if (!addresses.empty()) {
- return HostCache::Entry(OK, std::move(addresses),
- HostCache::Entry::SOURCE_HOSTS);
- }
+ if (addresses.empty())
+ return absl::nullopt;
- return absl::nullopt;
+ return HostCache::Entry(OK, std::move(addresses),
+ /*aliases=*/{}, HostCache::Entry::SOURCE_HOSTS);
}
absl::optional<HostCache::Entry> HostResolverManager::ServeLocalhost(
@@ -3755,7 +3737,7 @@ absl::optional<HostCache::Entry> HostResolverManager::ServeLocalhost(
bool default_family_due_to_no_ipv6) {
DCHECK(!query_types.Has(DnsQueryType::UNSPECIFIED));
- AddressList resolved_addresses;
+ std::vector<IPEndPoint> resolved_addresses;
if (!HasAddressType(query_types) ||
!ResolveLocalHostname(hostname, &resolved_addresses)) {
return absl::nullopt;
@@ -3767,9 +3749,9 @@ absl::optional<HostCache::Entry> HostResolverManager::ServeLocalhost(
// (See SystemHostResolverCall for rationale).
query_types.Put(DnsQueryType::AAAA);
}
- AddressList filtered_addresses =
+ std::vector<IPEndPoint> filtered_addresses =
FilterAddresses(std::move(resolved_addresses), query_types);
- return HostCache::Entry(OK, std::move(filtered_addresses),
+ return HostCache::Entry(OK, std::move(filtered_addresses), /*aliases=*/{},
HostCache::Entry::SOURCE_UNKNOWN);
}
@@ -4047,9 +4029,9 @@ void HostResolverManager::GetEffectiveParametersForRequest(
// Optimistically enable feature-controlled queries. These queries may be
// skipped at a later point.
- // `features::kUseDnsHttpsSvcb` has precedence, so if enabled, ignore any
+ // `https_svcb_options_.enable` has precedence, so if enabled, ignore any
// other related features.
- if (base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb)) {
+ if (https_svcb_options_.enable) {
static const char* const kSchemesForHttpsQuery[] = {
url::kHttpScheme, url::kHttpsScheme, url::kWsScheme, url::kWssScheme};
if (base::Contains(kSchemesForHttpsQuery, GetScheme(host)))
@@ -4068,9 +4050,9 @@ void HostResolverManager::GetEffectiveParametersForRequest(
namespace {
-bool RequestWillUseWiFi(NetworkChangeNotifier::NetworkHandle network) {
+bool RequestWillUseWiFi(handles::NetworkHandle network) {
NetworkChangeNotifier::ConnectionType connection_type;
- if (network == NetworkChangeNotifier::kInvalidNetworkHandle)
+ if (network == handles::kInvalidNetworkHandle)
connection_type = NetworkChangeNotifier::GetConnectionType();
else
connection_type = NetworkChangeNotifier::GetNetworkConnectionType(network);
diff --git a/chromium/net/dns/host_resolver_manager.h b/chromium/net/dns/host_resolver_manager.h
index 602a18b241a..922e5a6c4cf 100644
--- a/chromium/net/dns/host_resolver_manager.h
+++ b/chromium/net/dns/host_resolver_manager.h
@@ -27,6 +27,7 @@
#include "net/base/completion_once_callback.h"
#include "net/base/host_port_pair.h"
#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/base/network_isolation_key.h"
#include "net/base/prioritized_dispatcher.h"
#include "net/dns/dns_config.h"
@@ -52,7 +53,6 @@ class TickClock;
namespace net {
-class AddressList;
class DnsClient;
class DnsProbeRunner;
class IPAddress;
@@ -135,7 +135,7 @@ class NET_EXPORT HostResolverManager
static std::unique_ptr<HostResolverManager>
CreateNetworkBoundHostResolverManager(
const HostResolver::ManagerOptions& options,
- NetworkChangeNotifier::NetworkHandle target_network,
+ handles::NetworkHandle target_network,
NetLog* net_log);
// |resolve_context| must have already been added (via
@@ -237,15 +237,19 @@ class NET_EXPORT HostResolverManager
bool check_ipv6_on_wifi_for_testing() const { return check_ipv6_on_wifi_; }
- NetworkChangeNotifier::NetworkHandle target_network_for_testing() const {
+ handles::NetworkHandle target_network_for_testing() const {
return target_network_;
}
+ const HostResolver::HttpsSvcbOptions& https_svcb_options_for_testing() const {
+ return https_svcb_options_;
+ }
+
// Public to be called from std::make_unique. Not to be called directly.
HostResolverManager(base::PassKey<HostResolverManager>,
const HostResolver::ManagerOptions& options,
SystemDnsConfigChangeNotifier* system_dns_config_notifier,
- NetworkChangeNotifier::NetworkHandle target_network,
+ handles::NetworkHandle target_network,
NetLog* net_log);
protected:
@@ -478,7 +482,7 @@ class NET_EXPORT HostResolverManager
void UpdateConnectionType(NetworkChangeNotifier::ConnectionType type);
bool IsBoundToNetwork() const {
- return target_network_ != NetworkChangeNotifier::kInvalidNetworkHandle;
+ return target_network_ != handles::kInvalidNetworkHandle;
}
// Returns |nullptr| if DoH probes are currently not allowed (due to
@@ -510,7 +514,7 @@ class NET_EXPORT HostResolverManager
raw_ptr<SystemDnsConfigChangeNotifier> system_dns_config_notifier_;
- NetworkChangeNotifier::NetworkHandle target_network_;
+ handles::NetworkHandle target_network_;
// False if IPv6 should not be attempted and assumed unreachable when on a
// WiFi connection. See https://crbug.com/696569 for further context.
@@ -545,6 +549,9 @@ class NET_EXPORT HostResolverManager
// Helper for metrics associated with `features::kDnsHttpssvc`.
HttpssvcExperimentDomainCache httpssvc_domain_cache_;
+ // An experimental flag for features::kUseDnsHttpsSvcb.
+ HostResolver::HttpsSvcbOptions https_svcb_options_;
+
THREAD_CHECKER(thread_checker_);
base::WeakPtrFactory<HostResolverManager> weak_ptr_factory_{this};
@@ -558,8 +565,9 @@ class NET_EXPORT HostResolverManager
// This function is only exposed so it can be unit-tested.
// TODO(tfarina): It would be better to change the tests so this function
// gets exercised indirectly through HostResolverManager.
-NET_EXPORT_PRIVATE bool ResolveLocalHostname(base::StringPiece host,
- AddressList* address_list);
+NET_EXPORT_PRIVATE bool ResolveLocalHostname(
+ base::StringPiece host,
+ std::vector<IPEndPoint>* address_list);
} // namespace net
diff --git a/chromium/net/dns/host_resolver_manager_fuzzer.cc b/chromium/net/dns/host_resolver_manager_fuzzer.cc
index 72bc32f6add..fd9ec489091 100644
--- a/chromium/net/dns/host_resolver_manager_fuzzer.cc
+++ b/chromium/net/dns/host_resolver_manager_fuzzer.cc
@@ -55,8 +55,8 @@ class DnsRequest {
net::HostResolver* host_resolver,
FuzzedDataProvider* data_provider,
std::vector<std::unique_ptr<DnsRequest>>* dns_requests) {
- std::unique_ptr<DnsRequest> dns_request(
- new DnsRequest(host_resolver, data_provider, dns_requests));
+ auto dns_request = std::make_unique<DnsRequest>(
+ host_resolver, data_provider, dns_requests);
if (dns_request->Start() == net::ERR_IO_PENDING)
dns_requests->push_back(std::move(dns_request));
@@ -191,7 +191,7 @@ class DnsRequest {
void WaitUntilDone() {
CHECK(!run_loop_);
if (request_) {
- run_loop_.reset(new base::RunLoop());
+ run_loop_ = std::make_unique<base::RunLoop>();
run_loop_->Run();
run_loop_.reset();
}
diff --git a/chromium/net/dns/host_resolver_manager_unittest.cc b/chromium/net/dns/host_resolver_manager_unittest.cc
index 9b62694634e..2d91bb3f692 100644
--- a/chromium/net/dns/host_resolver_manager_unittest.cc
+++ b/chromium/net/dns/host_resolver_manager_unittest.cc
@@ -116,8 +116,8 @@ namespace {
const size_t kMaxJobs = 10u;
const size_t kMaxRetryAttempts = 4u;
-ProcTaskParams DefaultParams(HostResolverProc* resolver_proc) {
- return ProcTaskParams(resolver_proc, kMaxRetryAttempts);
+ProcTaskParams DefaultParams(scoped_refptr<HostResolverProc> resolver_proc) {
+ return ProcTaskParams(std::move(resolver_proc), kMaxRetryAttempts);
}
// A HostResolverProc that pushes each host mapped into a list and allows
@@ -194,7 +194,8 @@ class MockHostResolverProc : public HostResolverProc {
std::vector<std::string> dns_aliases;
if (canonical_name != "")
dns_aliases = {canonical_name};
- int rv = ParseAddressList(ip_list, dns_aliases, &result);
+ int rv = ParseAddressList(ip_list, &result.endpoints());
+ result.SetDnsAliases(dns_aliases);
DCHECK_EQ(OK, rv);
AddRule(hostname, family, result, flags);
}
@@ -207,7 +208,8 @@ class MockHostResolverProc : public HostResolverProc {
std::vector<std::string> dns_aliases;
if (canonical_name != "")
dns_aliases = {canonical_name};
- int rv = ParseAddressList(ip_list, dns_aliases, &result);
+ int rv = ParseAddressList(ip_list, &result.endpoints());
+ result.SetDnsAliases(dns_aliases);
DCHECK_EQ(OK, rv);
AddRule(hostname, ADDRESS_FAMILY_UNSPECIFIED, result, flags);
AddRule(hostname, ADDRESS_FAMILY_IPV4, result, flags);
@@ -234,7 +236,7 @@ class MockHostResolverProc : public HostResolverProc {
--num_slots_available_;
--num_requests_waiting_;
if (rules_.empty()) {
- int rv = ParseAddressList("127.0.0.1", {} /* dns_aliases */, addrlist);
+ int rv = ParseAddressList("127.0.0.1", &addrlist->endpoints());
DCHECK_EQ(OK, rv);
return OK;
}
@@ -488,7 +490,8 @@ class TestHostResolverManager : public HostResolverManager {
}
};
-bool HasAddress(const IPAddress& search_address, const AddressList& addresses) {
+bool HasAddress(const IPAddress& search_address,
+ const std::vector<IPEndPoint>& addresses) {
for (const auto& address : addresses) {
if (search_address == address.address())
return true;
@@ -497,7 +500,7 @@ bool HasAddress(const IPAddress& search_address, const AddressList& addresses) {
}
void TestBothLoopbackIPs(const std::string& host) {
- AddressList addresses;
+ std::vector<IPEndPoint> addresses;
EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
EXPECT_EQ(2u, addresses.size());
EXPECT_TRUE(HasAddress(IPAddress::IPv4Localhost(), addresses));
@@ -525,10 +528,10 @@ class HostResolverManagerTest : public TestWithTaskEnvironment {
base::test::TaskEnvironment::TimeSource time_source =
base::test::TaskEnvironment::TimeSource::SYSTEM_TIME)
: TestWithTaskEnvironment(time_source),
- proc_(new MockHostResolverProc()) {}
+ proc_(base::MakeRefCounted<MockHostResolverProc>()) {}
void CreateResolver(bool check_ipv6_on_wifi = true) {
- CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_),
true /* ipv6_reachable */,
check_ipv6_on_wifi);
}
@@ -544,7 +547,7 @@ class HostResolverManagerTest : public TestWithTaskEnvironment {
// This HostResolverManager will only allow 1 outstanding resolve at a time
// and perform no retries.
void CreateSerialResolver(bool check_ipv6_on_wifi = true) {
- ProcTaskParams params = DefaultParams(proc_.get());
+ ProcTaskParams params = DefaultParams(proc_);
params.max_retry_attempts = 0u;
CreateResolverWithLimitsAndParams(1u, params, true /* ipv6_reachable */,
check_ipv6_on_wifi);
@@ -623,7 +626,7 @@ class HostResolverManagerTest : public TestWithTaskEnvironment {
void PopulateCache(const HostCache::Key& key, IPEndPoint endpoint) {
resolver_->CacheResult(resolve_context_->host_cache(), key,
- HostCache::Entry(OK, AddressList(endpoint),
+ HostCache::Entry(OK, {endpoint}, /*aliases=*/{},
HostCache::Entry::SOURCE_UNKNOWN),
base::Seconds(1));
}
@@ -2415,11 +2418,10 @@ TEST_F(HostResolverManagerTest, MultipleAttempts) {
// retry at t=6001 instead of t=6000.
base::TimeDelta kSleepFudgeFactor = base::Milliseconds(1);
- scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
- new LookupAttemptHostResolverProc(nullptr, kAttemptNumberToResolve,
- kTotalAttempts));
+ auto resolver_proc = base::MakeRefCounted<LookupAttemptHostResolverProc>(
+ nullptr, kAttemptNumberToResolve, kTotalAttempts);
- ProcTaskParams params = DefaultParams(resolver_proc.get());
+ ProcTaskParams params = DefaultParams(resolver_proc);
base::TimeDelta unresponsive_delay = params.unresponsive_delay;
int retry_factor = params.retry_factor;
@@ -2487,7 +2489,7 @@ TEST_F(HostResolverManagerTest, DefaultMaxRetryAttempts) {
// expected to translate into |expected_num_retries|.
ASSERT_NE(HostResolver::ManagerOptions::kDefaultRetryAttempts,
expected_max_retries);
- ProcTaskParams params(resolver_proc.get(),
+ ProcTaskParams params(resolver_proc,
HostResolver::ManagerOptions::kDefaultRetryAttempts);
ASSERT_EQ(params.max_retry_attempts, expected_max_retries);
@@ -2652,6 +2654,27 @@ TEST_F(HostResolverManagerTest, IncludeCanonicalName) {
EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
}
+TEST_F(HostResolverManagerTest, FixupCanonicalName) {
+ proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42", /*flags=*/0,
+ "CANON.name");
+ proc_->SignalMultiple(1u);
+
+ ResolveHostResponseHelper response(resolver_->CreateRequest(
+ HostPortPair("just.testing", 80), NetworkIsolationKey(),
+ NetLogWithSource(), absl::nullopt, resolve_context_.get(),
+ resolve_context_->host_cache()));
+
+ EXPECT_THAT(response.result_error(), IsOk());
+ EXPECT_THAT(response.request()->GetAddressResults()->endpoints(),
+ testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
+ EXPECT_THAT(
+ response.request()->GetEndpointResults(),
+ testing::Pointee(testing::UnorderedElementsAre(ExpectEndpointResult(
+ testing::ElementsAre(CreateExpected("192.168.1.42", 80))))));
+ EXPECT_THAT(response.request()->GetDnsAliasResults(),
+ testing::Pointee(testing::UnorderedElementsAre("canon.name")));
+}
+
TEST_F(HostResolverManagerTest, IncludeCanonicalNameButNotReceived) {
proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42",
HOST_RESOLVER_CANONNAME);
@@ -3803,7 +3826,7 @@ TEST_F(HostResolverManagerTest, MdnsListener_RootDomain) {
DnsConfig CreateValidDnsConfig() {
IPAddress dns_ip(192, 168, 1, 0);
DnsConfig config;
- config.nameservers.push_back(IPEndPoint(dns_ip, dns_protocol::kDefaultPort));
+ config.nameservers.emplace_back(dns_ip, dns_protocol::kDefaultPort);
config.doh_config =
*DnsOverHttpsConfig::FromString("https://dns.example.com/");
config.secure_dns_mode = SecureDnsMode::kOff;
@@ -3987,9 +4010,8 @@ TEST_F(HostResolverManagerTest, NetworkIsolationKeyReadFromHostCache) {
cache_entry.network_isolation_key);
IPAddress address;
ASSERT_TRUE(address.AssignFromIPLiteral(cache_entry.cached_ip_address));
- HostCache::Entry entry =
- HostCache::Entry(OK, AddressList::CreateFromIPAddress(address, 80),
- HostCache::Entry::SOURCE_UNKNOWN);
+ HostCache::Entry entry = HostCache::Entry(
+ OK, {{address, 80}}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
resolve_context_->host_cache()->Set(key, entry, base::TimeTicks::Now(),
base::Days(1));
}
@@ -5392,7 +5414,7 @@ TEST_F(HostResolverManagerDnsTest, DontDisableDnsClientOnSporadicFailure) {
}
TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable) {
- CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_),
false /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
ChangeDnsConfig(CreateValidDnsConfig());
@@ -5412,7 +5434,7 @@ TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable) {
// Without a valid DnsConfig, assume IPv6 is needed and ignore prober.
TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_InvalidConfig) {
- CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_),
false /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
@@ -5435,7 +5457,7 @@ TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_InvalidConfig) {
}
TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_UseLocalIpv6) {
- CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_),
false /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
@@ -5475,7 +5497,7 @@ TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_UseLocalIpv6) {
// global IPv6 address. See SystemHostResolverCall for rationale.
// Test both the DnsClient and system host resolver paths.
TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_Localhost) {
- CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_),
false /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
@@ -5559,7 +5581,7 @@ TEST_F(HostResolverManagerDnsTest, Ipv6UnreachableOnlyDisablesAAAAQuery) {
MockDnsClientRule::Result(MockDnsClientRule::ResultType::kUnexpected),
/*delay=*/false);
- CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_),
/*ipv6_reachable=*/false,
/*check_ipv6_on_wifi=*/true);
UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
@@ -5647,7 +5669,7 @@ TEST_F(HostResolverManagerDnsTest, SeparateJobsBySecureDnsMode) {
// Cancel a request with a single DNS transaction active.
TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActive) {
// Disable ipv6 to ensure we'll only try a single transaction for the host.
- CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_),
false /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
DnsConfig config = CreateValidDnsConfig();
@@ -5703,7 +5725,7 @@ TEST_F(HostResolverManagerDnsTest, CancelWithTwoTransactionsActive) {
// Delete a resolver with some active requests and some queued requests.
TEST_F(HostResolverManagerDnsTest, DeleteWithActiveTransactions) {
// At most 10 Jobs active at once.
- CreateResolverWithLimitsAndParams(10u, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(10u, DefaultParams(proc_),
true /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
@@ -6849,7 +6871,7 @@ TEST_F(HostResolverManagerDnsTest, SerialResolver) {
// completion when only part of a multi-transaction request could be initially
// started.
TEST_F(HostResolverManagerDnsTest, AAAAStartsAfterOtherJobFinishes) {
- CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_),
true /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
set_allow_fallback_to_proctask(false);
@@ -6887,7 +6909,7 @@ TEST_F(HostResolverManagerDnsTest, AAAAStartsAfterOtherJobFinishes) {
// list, triggering fallback to ProcTask.
TEST_F(HostResolverManagerDnsTest, IPv4EmptyFallback) {
// Disable ipv6 to ensure we'll only try a single transaction for the host.
- CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_),
false /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
DnsConfig config = CreateValidDnsConfig();
@@ -6936,7 +6958,7 @@ TEST_F(HostResolverManagerDnsTest, InvalidDnsConfigWithPendingRequests) {
// to make sure that aborting the first HostResolverManager::Job does not
// trigger another DnsTransaction on the second Job when it releases its
// second prioritized dispatcher slot.
- CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_),
true /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
@@ -7006,7 +7028,7 @@ TEST_F(HostResolverManagerDnsTest,
// occupying two slots has its DnsTask aborted is the case most likely to run
// into problems. Try limits between [1, 2 * # of non failure requests].
for (size_t limit = 1u; limit < 10u; ++limit) {
- CreateResolverWithLimitsAndParams(limit, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(limit, DefaultParams(proc_),
true /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
@@ -7128,7 +7150,7 @@ TEST_F(HostResolverManagerDnsTest,
// make sure that aborting the first HostResolverManager::Job does not trigger
// another DnsTransaction on the second Job when it releases its second
// prioritized dispatcher slot.
- CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
+ CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_),
true /* ipv6_reachable */,
true /* check_ipv6_on_wifi */);
@@ -7214,8 +7236,7 @@ TEST_F(HostResolverManagerDnsTest,
DnsCallsWithDisabledDnsClient_DisabledAtConstruction) {
HostResolver::ManagerOptions options = DefaultOptions();
options.insecure_dns_client_enabled = false;
- CreateResolverWithOptionsAndParams(std::move(options),
- DefaultParams(proc_.get()),
+ CreateResolverWithOptionsAndParams(std::move(options), DefaultParams(proc_),
true /* ipv6_reachable */);
ChangeDnsConfig(CreateValidDnsConfig());
@@ -7839,7 +7860,7 @@ TEST_F(HostResolverManagerDnsTest, NoAdditionalDnsAliases) {
}
TEST_F(HostResolverManagerTest, ResolveLocalHostname) {
- AddressList addresses;
+ std::vector<IPEndPoint> addresses;
TestBothLoopbackIPs("localhost");
TestBothLoopbackIPs("localhoST");
@@ -10655,13 +10676,15 @@ TEST_F(HostResolverManagerDnsTest, HttpsInAddressQuery) {
resolve_context_->host_cache()));
EXPECT_THAT(response.result_error(), IsOk());
EXPECT_TRUE(response.request()->GetAddressResults());
- EXPECT_THAT(response.request()->GetEndpointResults(),
- testing::Pointee(testing::ElementsAre(
- ExpectEndpointResult(
- testing::SizeIs(2),
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- dns_protocol::kHttpsServiceDefaultAlpn))),
- ExpectEndpointResult(testing::SizeIs(2)))));
+ EXPECT_THAT(
+ response.request()->GetEndpointResults(),
+ testing::Pointee(testing::ElementsAre(
+ ExpectEndpointResult(
+ testing::SizeIs(2),
+ ExpectConnectionEndpointMetadata(
+ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName)),
+ ExpectEndpointResult(testing::SizeIs(2)))));
EXPECT_FALSE(response.request()->GetTextResults());
EXPECT_FALSE(response.request()->GetHostnameResults());
EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
@@ -10705,13 +10728,15 @@ TEST_F(HostResolverManagerDnsTest, HttpsInAddressQueryWithNonstandardPort) {
resolve_context_->host_cache()));
EXPECT_THAT(response.result_error(), IsOk());
EXPECT_TRUE(response.request()->GetAddressResults());
- EXPECT_THAT(response.request()->GetEndpointResults(),
- testing::Pointee(testing::ElementsAre(
- ExpectEndpointResult(
- testing::SizeIs(2),
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- dns_protocol::kHttpsServiceDefaultAlpn))),
- ExpectEndpointResult(testing::SizeIs(2)))));
+ EXPECT_THAT(
+ response.request()->GetEndpointResults(),
+ testing::Pointee(testing::ElementsAre(
+ ExpectEndpointResult(
+ testing::SizeIs(2),
+ ExpectConnectionEndpointMetadata(
+ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName)),
+ ExpectEndpointResult(testing::SizeIs(2)))));
EXPECT_FALSE(response.request()->GetTextResults());
EXPECT_FALSE(response.request()->GetHostnameResults());
EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
@@ -10813,7 +10838,7 @@ TEST_F(HostResolverManagerDnsTest, HttpsInAddressQueryWithAlpnAndEch) {
ExpectConnectionEndpointMetadata(
testing::UnorderedElementsAre(
"foo1", "foo2", dns_protocol::kHttpsServiceDefaultAlpn),
- testing::ElementsAreArray(kEch))),
+ testing::ElementsAreArray(kEch), kName)),
ExpectEndpointResult(testing::SizeIs(2)))));
EXPECT_FALSE(response.request()->GetTextResults());
EXPECT_FALSE(response.request()->GetHostnameResults());
@@ -10900,13 +10925,15 @@ TEST_F(HostResolverManagerDnsTest, HttpsInAddressQueryWithMatchingPort) {
resolve_context_->host_cache()));
EXPECT_THAT(response.result_error(), IsOk());
EXPECT_TRUE(response.request()->GetAddressResults());
- EXPECT_THAT(response.request()->GetEndpointResults(),
- testing::Pointee(testing::ElementsAre(
- ExpectEndpointResult(
- testing::SizeIs(2),
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- dns_protocol::kHttpsServiceDefaultAlpn))),
- ExpectEndpointResult(testing::SizeIs(2)))));
+ EXPECT_THAT(
+ response.request()->GetEndpointResults(),
+ testing::Pointee(testing::ElementsAre(
+ ExpectEndpointResult(
+ testing::SizeIs(2),
+ ExpectConnectionEndpointMetadata(
+ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName)),
+ ExpectEndpointResult(testing::SizeIs(2)))));
EXPECT_FALSE(response.request()->GetTextResults());
EXPECT_FALSE(response.request()->GetHostnameResults());
EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
@@ -11535,13 +11562,15 @@ TEST_F(HostResolverManagerDnsTest, HttpsInAddressQueryForWssScheme) {
resolve_context_->host_cache()));
EXPECT_THAT(response.result_error(), IsOk());
EXPECT_TRUE(response.request()->GetAddressResults());
- EXPECT_THAT(response.request()->GetEndpointResults(),
- testing::Pointee(testing::ElementsAre(
- ExpectEndpointResult(
- testing::SizeIs(2),
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- dns_protocol::kHttpsServiceDefaultAlpn))),
- ExpectEndpointResult(testing::SizeIs(2)))));
+ EXPECT_THAT(
+ response.request()->GetEndpointResults(),
+ testing::Pointee(testing::ElementsAre(
+ ExpectEndpointResult(
+ testing::SizeIs(2),
+ ExpectConnectionEndpointMetadata(
+ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName)),
+ ExpectEndpointResult(testing::SizeIs(2)))));
EXPECT_FALSE(response.request()->GetTextResults());
EXPECT_FALSE(response.request()->GetHostnameResults());
EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
@@ -11981,13 +12010,15 @@ TEST_F(HostResolverManagerDnsTest, HttpsInInsecureAddressQuery) {
EXPECT_THAT(response.result_error(), IsOk());
EXPECT_TRUE(response.request()->GetAddressResults());
- EXPECT_THAT(response.request()->GetEndpointResults(),
- testing::Pointee(testing::ElementsAre(
- ExpectEndpointResult(
- testing::SizeIs(2),
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- dns_protocol::kHttpsServiceDefaultAlpn))),
- ExpectEndpointResult(testing::SizeIs(2)))));
+ EXPECT_THAT(
+ response.request()->GetEndpointResults(),
+ testing::Pointee(testing::ElementsAre(
+ ExpectEndpointResult(
+ testing::SizeIs(2),
+ ExpectConnectionEndpointMetadata(
+ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName)),
+ ExpectEndpointResult(testing::SizeIs(2)))));
EXPECT_FALSE(response.request()->GetTextResults());
EXPECT_FALSE(response.request()->GetHostnameResults());
EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
@@ -13145,13 +13176,15 @@ TEST_F(HostResolverManagerDnsTest,
dns_client_->CompleteDelayedTransactions();
EXPECT_THAT(response.result_error(), IsOk());
EXPECT_TRUE(response.request()->GetAddressResults());
- EXPECT_THAT(response.request()->GetEndpointResults(),
- testing::Pointee(testing::ElementsAre(
- ExpectEndpointResult(
- testing::SizeIs(2),
- ExpectConnectionEndpointMetadata(testing::ElementsAre(
- dns_protocol::kHttpsServiceDefaultAlpn))),
- ExpectEndpointResult(testing::SizeIs(2)))));
+ EXPECT_THAT(
+ response.request()->GetEndpointResults(),
+ testing::Pointee(testing::ElementsAre(
+ ExpectEndpointResult(
+ testing::SizeIs(2),
+ ExpectConnectionEndpointMetadata(
+ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn),
+ testing::IsEmpty(), kName)),
+ ExpectEndpointResult(testing::SizeIs(2)))));
EXPECT_FALSE(response.request()->GetTextResults());
EXPECT_FALSE(response.request()->GetHostnameResults());
EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
@@ -15028,33 +15061,31 @@ class HostResolverManagerBootstrapTest : public HostResolverManagerDnsTest {
using MockResult = MockDnsClientRule::ResultType;
void SetUp() override {
+ // The request host scheme and port are only preserved if the SVCB feature
+ // is enabled.
+ features.InitAndEnableFeature(features::kUseDnsHttpsSvcb);
+
HostResolverManagerDnsTest::SetUp();
// MockHostResolverProc only returns failure if there is at least one
// non-matching rule.
proc_->AddRuleForAllFamilies("other_name", {});
proc_->SignalMultiple(1u); // Allow up to one proc query.
-
- // The request host scheme and port are only preserved if the SVCB feature
- // is enabled.
- features.InitAndEnableFeature(features::kUseDnsHttpsSvcb);
}
const NetworkIsolationKey kIsolationKey;
const url::SchemeHostPort kEndpoint =
url::SchemeHostPort(url::kHttpsScheme, "bootstrap", 443);
- const AddressList kCacheAddrs = AddressList::CreateFromIPAddressList(
- {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
- {192, 0, 2, 1}},
- {});
- const AddressList kBootstrapAddrs = AddressList::CreateFromIPAddressList(
- {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
- {192, 0, 2, 2}},
- {});
+ const std::vector<IPEndPoint> kCacheAddrs = {
+ {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 0},
+ {{192, 0, 2, 1}, 0}};
+ const std::vector<IPEndPoint> kBootstrapAddrs = {
+ {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, 0},
+ {{192, 0, 2, 2}, 0}};
// The mock DNS client always returns localhost.
- const AddressList kRemoteAddrs = AddressList::CreateFromIPAddressList(
- {IPAddress::IPv6Localhost(), IPAddress::IPv4Localhost()},
- {});
+ const std::vector<IPEndPoint> kRemoteAddrs = {
+ {IPAddress::IPv6Localhost(), 0},
+ {IPAddress::IPv4Localhost(), 0}};
static HostResolver::ResolveHostParameters bootstrap_params() {
HostResolver::ResolveHostParameters params;
@@ -15085,7 +15116,8 @@ class HostResolverManagerBootstrapTest : public HostResolverManagerDnsTest {
void PopulateCache(bool secure) {
constexpr base::TimeDelta kTtl = base::Seconds(3600);
- HostCache::Entry entry(OK, kCacheAddrs, HostCache::Entry::SOURCE_DNS, kTtl);
+ HostCache::Entry entry(OK, kCacheAddrs, /*aliases=*/{},
+ HostCache::Entry::SOURCE_DNS, kTtl);
resolve_context_->host_cache()->Set(MakeCacheKey(secure), std::move(entry),
GetMockTickClock()->NowTicks(), kTtl);
}
diff --git a/chromium/net/dns/host_resolver_mdns_listener_impl.cc b/chromium/net/dns/host_resolver_mdns_listener_impl.cc
index fd9e34e4359..a3b9e437106 100644
--- a/chromium/net/dns/host_resolver_mdns_listener_impl.cc
+++ b/chromium/net/dns/host_resolver_mdns_listener_impl.cc
@@ -80,11 +80,10 @@ void HostResolverMdnsListenerImpl::OnRecordUpdate(
break;
case DnsQueryType::A:
case DnsQueryType::AAAA:
- DCHECK(parsed_entry.legacy_addresses());
- DCHECK_EQ(1u, parsed_entry.legacy_addresses().value().size());
- delegate_->OnAddressResult(
- ConvertUpdateType(update), query_type_,
- parsed_entry.legacy_addresses().value().front());
+ DCHECK(parsed_entry.ip_endpoints());
+ DCHECK_EQ(1u, parsed_entry.ip_endpoints()->size());
+ delegate_->OnAddressResult(ConvertUpdateType(update), query_type_,
+ parsed_entry.ip_endpoints()->front());
break;
case DnsQueryType::TXT:
DCHECK(parsed_entry.text_records());
diff --git a/chromium/net/dns/host_resolver_mdns_task.cc b/chromium/net/dns/host_resolver_mdns_task.cc
index 28466b40bb5..79333b94744 100644
--- a/chromium/net/dns/host_resolver_mdns_task.cc
+++ b/chromium/net/dns/host_resolver_mdns_task.cc
@@ -219,16 +219,12 @@ HostCache::Entry HostResolverMdnsTask::ParseResult(
return HostCache::Entry(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN);
case DnsQueryType::A:
return HostCache::Entry(
- OK,
- AddressList(
- IPEndPoint(parsed->rdata<net::ARecordRdata>()->address(), 0)),
- HostCache::Entry::SOURCE_UNKNOWN);
+ OK, {IPEndPoint(parsed->rdata<net::ARecordRdata>()->address(), 0)},
+ /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
case DnsQueryType::AAAA:
return HostCache::Entry(
- OK,
- AddressList(
- IPEndPoint(parsed->rdata<net::AAAARecordRdata>()->address(), 0)),
- HostCache::Entry::SOURCE_UNKNOWN);
+ OK, {IPEndPoint(parsed->rdata<net::AAAARecordRdata>()->address(), 0)},
+ /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN);
case DnsQueryType::TXT:
return HostCache::Entry(OK, parsed->rdata<net::TxtRecordRdata>()->texts(),
HostCache::Entry::SOURCE_UNKNOWN);
diff --git a/chromium/net/dns/host_resolver_proc.cc b/chromium/net/dns/host_resolver_proc.cc
index d43d82ef4e4..08c0105989f 100644
--- a/chromium/net/dns/host_resolver_proc.cc
+++ b/chromium/net/dns/host_resolver_proc.cc
@@ -27,7 +27,7 @@ namespace net {
HostResolverProc* HostResolverProc::default_proc_ = nullptr;
-HostResolverProc::HostResolverProc(HostResolverProc* previous,
+HostResolverProc::HostResolverProc(scoped_refptr<HostResolverProc> previous,
bool allow_fallback_to_system_or_default)
: allow_fallback_to_system_(allow_fallback_to_system_or_default) {
SetPreviousProc(previous);
@@ -44,8 +44,8 @@ int HostResolverProc::Resolve(const std::string& host,
HostResolverFlags host_resolver_flags,
AddressList* addrlist,
int* os_error,
- NetworkChangeNotifier::NetworkHandle network) {
- if (network == NetworkChangeNotifier::kInvalidNetworkHandle)
+ handles::NetworkHandle network) {
+ if (network == handles::kInvalidNetworkHandle)
return Resolve(host, address_family, host_resolver_flags, addrlist,
os_error);
@@ -75,16 +75,17 @@ int HostResolverProc::ResolveUsingPrevious(
addrlist, os_error);
}
-void HostResolverProc::SetPreviousProc(HostResolverProc* proc) {
- HostResolverProc* current_previous = previous_proc_.get();
- previous_proc_ = nullptr;
+void HostResolverProc::SetPreviousProc(scoped_refptr<HostResolverProc> proc) {
+ auto current_previous = std::move(previous_proc_);
// Now that we've guaranteed |this| is the last proc in a chain, we can
// detect potential cycles using GetLastProc().
- previous_proc_ = (GetLastProc(proc) == this) ? current_previous : proc;
+ previous_proc_ = (GetLastProc(proc.get()) == this)
+ ? std::move(current_previous)
+ : std::move(proc);
}
-void HostResolverProc::SetLastProc(HostResolverProc* proc) {
- GetLastProc(this)->SetPreviousProc(proc);
+void HostResolverProc::SetLastProc(scoped_refptr<HostResolverProc> proc) {
+ GetLastProc(this)->SetPreviousProc(std::move(proc));
}
// static
@@ -129,7 +130,7 @@ int SystemHostResolverCall(const std::string& host,
HostResolverFlags host_resolver_flags,
AddressList* addrlist,
int* os_error_opt,
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
// |host| should be a valid domain name. HostResolverImpl::Resolve has checks
// to fail early if this is not the case.
DCHECK(IsValidDNSDomain(host));
@@ -229,13 +230,12 @@ int SystemHostResolverCall(const std::string& host,
SystemHostResolverProc::SystemHostResolverProc() : HostResolverProc(nullptr) {}
-int SystemHostResolverProc::Resolve(
- const std::string& hostname,
- AddressFamily address_family,
- HostResolverFlags host_resolver_flags,
- AddressList* addr_list,
- int* os_error,
- NetworkChangeNotifier::NetworkHandle network) {
+int SystemHostResolverProc::Resolve(const std::string& hostname,
+ AddressFamily address_family,
+ HostResolverFlags host_resolver_flags,
+ AddressList* addr_list,
+ int* os_error,
+ handles::NetworkHandle network) {
return SystemHostResolverCall(hostname, address_family, host_resolver_flags,
addr_list, os_error, network);
}
@@ -246,14 +246,14 @@ int SystemHostResolverProc::Resolve(const std::string& hostname,
AddressList* addr_list,
int* os_error) {
return Resolve(hostname, address_family, host_resolver_flags, addr_list,
- os_error, NetworkChangeNotifier::kInvalidNetworkHandle);
+ os_error, handles::kInvalidNetworkHandle);
}
SystemHostResolverProc::~SystemHostResolverProc() = default;
-ProcTaskParams::ProcTaskParams(HostResolverProc* resolver_proc,
+ProcTaskParams::ProcTaskParams(scoped_refptr<HostResolverProc> resolver_proc,
size_t in_max_retry_attempts)
- : resolver_proc(resolver_proc),
+ : resolver_proc(std::move(resolver_proc)),
max_retry_attempts(in_max_retry_attempts),
unresponsive_delay(kDnsDefaultUnresponsiveDelay) {
// Maximum of 4 retry attempts for host resolution.
diff --git a/chromium/net/dns/host_resolver_proc.h b/chromium/net/dns/host_resolver_proc.h
index 9d33547a344..5c77dbbdf92 100644
--- a/chromium/net/dns/host_resolver_proc.h
+++ b/chromium/net/dns/host_resolver_proc.h
@@ -11,7 +11,7 @@
#include "base/time/time.h"
#include "net/base/address_family.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
namespace net {
@@ -30,7 +30,7 @@ class AddressList;
class NET_EXPORT HostResolverProc
: public base::RefCountedThreadSafe<HostResolverProc> {
public:
- explicit HostResolverProc(HostResolverProc* previous,
+ explicit HostResolverProc(scoped_refptr<HostResolverProc> previous,
bool allow_fallback_to_system_or_default = true);
HostResolverProc(const HostResolverProc&) = delete;
@@ -53,7 +53,7 @@ class NET_EXPORT HostResolverProc
HostResolverFlags host_resolver_flags,
AddressList* addrlist,
int* os_error,
- NetworkChangeNotifier::NetworkHandle network);
+ handles::NetworkHandle network);
protected:
friend class base::RefCountedThreadSafe<HostResolverProc>;
@@ -74,11 +74,11 @@ class NET_EXPORT HostResolverProc
// Sets the previous procedure in the chain. Aborts if this would result in a
// cycle.
- void SetPreviousProc(HostResolverProc* proc);
+ void SetPreviousProc(scoped_refptr<HostResolverProc> proc);
// Sets the last procedure in the chain, i.e. appends |proc| to the end of the
// current chain. Aborts if this would result in a cycle.
- void SetLastProc(HostResolverProc* proc);
+ void SetLastProc(scoped_refptr<HostResolverProc> proc);
// Returns the last procedure in the chain starting at |proc|. Will return
// NULL iff |proc| is NULL.
@@ -101,16 +101,16 @@ class NET_EXPORT HostResolverProc
// `addrlist` with a list of socket addresses. Otherwise returns a
// network error code, and fills `os_error` with a more specific error if it
// was non-NULL.
-// `network` is an optional parameter, when specified (!= kInvalidNetworkHandle)
-// the lookup will be performed specifically for `network`.
+// `network` is an optional parameter, when specified (!=
+// handles::kInvalidNetworkHandle) the lookup will be performed specifically for
+// `network`.
NET_EXPORT_PRIVATE int SystemHostResolverCall(
const std::string& host,
AddressFamily address_family,
HostResolverFlags host_resolver_flags,
AddressList* addrlist,
int* os_error,
- NetworkChangeNotifier::NetworkHandle network =
- NetworkChangeNotifier::kInvalidNetworkHandle);
+ handles::NetworkHandle network = handles::kInvalidNetworkHandle);
// Wraps call to SystemHostResolverCall as an instance of HostResolverProc.
class NET_EXPORT_PRIVATE SystemHostResolverProc : public HostResolverProc {
@@ -131,7 +131,7 @@ class NET_EXPORT_PRIVATE SystemHostResolverProc : public HostResolverProc {
HostResolverFlags host_resolver_flags,
AddressList* addr_list,
int* os_error,
- NetworkChangeNotifier::NetworkHandle network) override;
+ handles::NetworkHandle network) override;
protected:
~SystemHostResolverProc() override;
@@ -158,7 +158,8 @@ struct NET_EXPORT_PRIVATE ProcTaskParams {
base::Seconds(6);
// Sets up defaults.
- ProcTaskParams(HostResolverProc* resolver_proc, size_t max_retry_attempts);
+ ProcTaskParams(scoped_refptr<HostResolverProc> resolver_proc,
+ size_t max_retry_attempts);
ProcTaskParams(const ProcTaskParams& other);
diff --git a/chromium/net/dns/httpssvc_metrics.cc b/chromium/net/dns/httpssvc_metrics.cc
index c29e6a8b3c0..13430c99978 100644
--- a/chromium/net/dns/httpssvc_metrics.cc
+++ b/chromium/net/dns/httpssvc_metrics.cc
@@ -150,12 +150,6 @@ std::string HttpssvcMetrics::BuildMetricName(
}
void HttpssvcMetrics::RecordMetrics() {
- // The HTTPSSVC experiment and its feature param indicating INTEGRITY must
- // both be enabled.
- DCHECK(features::kDnsHttpssvcUseIntegrity.Get() ||
- features::kDnsHttpssvcUseHttpssvc.Get() ||
- base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb));
-
DCHECK(!already_recorded_);
already_recorded_ = true;
diff --git a/chromium/net/dns/mapped_host_resolver_unittest.cc b/chromium/net/dns/mapped_host_resolver_unittest.cc
index 015549181e6..59dc88d6069 100644
--- a/chromium/net/dns/mapped_host_resolver_unittest.cc
+++ b/chromium/net/dns/mapped_host_resolver_unittest.cc
@@ -40,15 +40,15 @@ TEST(MappedHostResolverTest, Inclusion) {
base::test::TaskEnvironment task_environment;
// Create a mock host resolver, with specific hostname to IP mappings.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddSimulatedFailure("*google.com");
resolver_impl->rules()->AddRule("baz.com", "192.168.1.5");
resolver_impl->rules()->AddRule("foo.com", "192.168.1.8");
resolver_impl->rules()->AddRule("proxy", "192.168.1.11");
// Create a remapped resolver that uses |resolver_impl|.
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
// Try resolving "www.google.com:80". There are no mappings yet, so this
// hits |resolver_impl| and fails.
@@ -108,12 +108,12 @@ TEST(MappedHostResolverTest, MapsHostWithScheme) {
base::test::TaskEnvironment task_environment;
// Create a mock host resolver, with specific hostname to IP mappings.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddRule("remapped.test", "192.168.1.22");
// Create a remapped resolver that uses `resolver_impl`.
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
ASSERT_TRUE(resolver->AddRuleFromString("MAP to.map.test remapped.test"));
std::unique_ptr<HostResolver::ResolveHostRequest> request =
@@ -134,12 +134,12 @@ TEST(MappedHostResolverTest, MapsHostWithSchemeToIpLiteral) {
base::test::TaskEnvironment task_environment;
// Create a mock host resolver, with specific hostname to IP mappings.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddRule("host.test", "192.168.1.22");
// Create a remapped resolver that uses `resolver_impl`.
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
ASSERT_TRUE(resolver->AddRuleFromString("MAP host.test [1234:5678::000A]"));
IPAddress expected_address;
@@ -163,12 +163,12 @@ TEST(MappedHostResolverTest, MapsHostWithSchemeToNonCanon) {
base::test::TaskEnvironment task_environment;
// Create a mock host resolver, with specific hostname to IP mappings.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddRule("remapped.test", "192.168.1.23");
// Create a remapped resolver that uses `resolver_impl`.
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
ASSERT_TRUE(resolver->AddRuleFromString("MAP host.test reMapped.TEST"));
std::unique_ptr<HostResolver::ResolveHostRequest> request =
@@ -189,12 +189,12 @@ TEST(MappedHostResolverTest, MapsHostWithSchemeToNameWithPort) {
base::test::TaskEnvironment task_environment;
// Create a mock host resolver, with specific hostname to IP mappings.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddRule("remapped.test", "192.168.1.24");
// Create a remapped resolver that uses `resolver_impl`.
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
ASSERT_TRUE(resolver->AddRuleFromString("MAP host.test remapped.test:258"));
std::unique_ptr<HostResolver::ResolveHostRequest> request =
@@ -215,12 +215,12 @@ TEST(MappedHostResolverTest, HandlesUnmappedHostWithScheme) {
base::test::TaskEnvironment task_environment;
// Create a mock host resolver, with specific hostname to IP mappings.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddRule("unmapped.test", "192.168.1.23");
// Create a remapped resolver that uses `resolver_impl`.
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
std::unique_ptr<HostResolver::ResolveHostRequest> request =
resolver->CreateRequest(
@@ -241,13 +241,13 @@ TEST(MappedHostResolverTest, Exclusion) {
base::test::TaskEnvironment task_environment;
// Create a mock host resolver, with specific hostname to IP mappings.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddRule("baz", "192.168.1.5");
resolver_impl->rules()->AddRule("www.google.com", "192.168.1.3");
// Create a remapped resolver that uses |resolver_impl|.
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
TestCompletionCallback callback;
@@ -284,13 +284,13 @@ TEST(MappedHostResolverTest, SetRulesFromString) {
base::test::TaskEnvironment task_environment;
// Create a mock host resolver, with specific hostname to IP mappings.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddRule("baz", "192.168.1.7");
resolver_impl->rules()->AddRule("bar", "192.168.1.9");
// Create a remapped resolver that uses |resolver_impl|.
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
TestCompletionCallback callback;
@@ -324,8 +324,8 @@ TEST(MappedHostResolverTest, SetRulesFromString) {
TEST(MappedHostResolverTest, ParseInvalidRules) {
base::test::TaskEnvironment task_environment;
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::unique_ptr<HostResolver>()));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::unique_ptr<HostResolver>());
EXPECT_FALSE(resolver->AddRuleFromString("xyz"));
EXPECT_FALSE(resolver->AddRuleFromString(std::string()));
@@ -342,11 +342,11 @@ TEST(MappedHostResolverTest, MapToError) {
base::test::TaskEnvironment task_environment;
// Outstanding request.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddRule("*", "192.168.1.5");
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
// Remap *.google.com to resolving failures.
EXPECT_TRUE(resolver->AddRuleFromString("MAP *.google.com ~NOTFOUND"));
@@ -377,12 +377,12 @@ TEST(MappedHostResolverTest, MapHostWithSchemeToError) {
base::test::TaskEnvironment task_environment;
// Create a mock host resolver, with specific hostname to IP mappings.
- std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
+ auto resolver_impl = std::make_unique<MockHostResolver>();
resolver_impl->rules()->AddRule("host.test", "192.168.1.25");
// Create a remapped resolver that uses `resolver_impl`.
- std::unique_ptr<MappedHostResolver> resolver(
- new MappedHostResolver(std::move(resolver_impl)));
+ auto resolver =
+ std::make_unique<MappedHostResolver>(std::move(resolver_impl));
ASSERT_TRUE(resolver->AddRuleFromString("MAP host.test ~NOTFOUND"));
std::unique_ptr<HostResolver::ResolveHostRequest> request =
diff --git a/chromium/net/dns/mdns_client.cc b/chromium/net/dns/mdns_client.cc
index ed06f649530..00f7b03dc37 100644
--- a/chromium/net/dns/mdns_client.cc
+++ b/chromium/net/dns/mdns_client.cc
@@ -36,12 +36,12 @@ const base::TimeDelta MDnsTransaction::kTransactionTimeout = base::Seconds(3);
// static
std::unique_ptr<MDnsSocketFactory> MDnsSocketFactory::CreateDefault() {
- return std::unique_ptr<MDnsSocketFactory>(new MDnsSocketFactoryImpl);
+ return std::make_unique<MDnsSocketFactoryImpl>();
}
// static
std::unique_ptr<MDnsClient> MDnsClient::CreateDefault() {
- return std::unique_ptr<MDnsClient>(new MDnsClientImpl());
+ return std::make_unique<MDnsClientImpl>();
}
InterfaceIndexFamilyList GetMDnsInterfacesToBind() {
@@ -49,11 +49,11 @@ InterfaceIndexFamilyList GetMDnsInterfacesToBind() {
InterfaceIndexFamilyList interfaces;
if (!GetNetworkList(&network_list, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES))
return interfaces;
- for (size_t i = 0; i < network_list.size(); ++i) {
- AddressFamily family = GetAddressFamily(network_list[i].address);
+ for (const auto& network_interface : network_list) {
+ AddressFamily family = GetAddressFamily(network_interface.address);
if (family == ADDRESS_FAMILY_IPV4 || family == ADDRESS_FAMILY_IPV6) {
interfaces.push_back(
- std::make_pair(network_list[i].interface_index, family));
+ std::make_pair(network_interface.interface_index, family));
}
}
std::sort(interfaces.begin(), interfaces.end());
@@ -67,8 +67,7 @@ std::unique_ptr<DatagramServerSocket> CreateAndBindMDnsSocket(
AddressFamily address_family,
uint32_t interface_index,
NetLog* net_log) {
- std::unique_ptr<DatagramServerSocket> socket(
- new UDPServerSocket(net_log, NetLogSource()));
+ auto socket = std::make_unique<UDPServerSocket>(net_log, NetLogSource());
int rv = Bind(address_family, interface_index, socket.get());
if (rv != OK) {
diff --git a/chromium/net/dns/mdns_client.h b/chromium/net/dns/mdns_client.h
index ba468a7e06d..daca09e1efe 100644
--- a/chromium/net/dns/mdns_client.h
+++ b/chromium/net/dns/mdns_client.h
@@ -74,7 +74,7 @@ class NET_EXPORT MDnsTransaction {
ResultCallback;
// Destroying the transaction cancels it.
- virtual ~MDnsTransaction() {}
+ virtual ~MDnsTransaction() = default;
// Start the transaction. Return true on success. Cache-based transactions
// will execute the callback synchronously.
@@ -106,7 +106,7 @@ class NET_EXPORT MDnsListener {
class Delegate {
public:
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
// Called when a record is added, removed or updated.
virtual void OnRecordUpdate(UpdateType update,
@@ -121,7 +121,7 @@ class NET_EXPORT MDnsListener {
};
// Destroying the listener stops listening.
- virtual ~MDnsListener() {}
+ virtual ~MDnsListener() = default;
// Start the listener. Return true on success.
virtual bool Start() = 0;
@@ -140,7 +140,7 @@ class NET_EXPORT MDnsListener {
// Creates bound datagram sockets ready to use by MDnsClient.
class NET_EXPORT MDnsSocketFactory {
public:
- virtual ~MDnsSocketFactory() {}
+ virtual ~MDnsSocketFactory() = default;
virtual void CreateSockets(
std::vector<std::unique_ptr<DatagramServerSocket>>* sockets) = 0;
@@ -154,7 +154,7 @@ class NET_EXPORT MDnsSocketFactory {
// the client stops listening on the network and destroys the cache.
class NET_EXPORT MDnsClient {
public:
- virtual ~MDnsClient() {}
+ virtual ~MDnsClient() = default;
// Create listener object for RRType |rrtype| and name |name|.
virtual std::unique_ptr<MDnsListener> CreateListener(
diff --git a/chromium/net/dns/mdns_client_impl.cc b/chromium/net/dns/mdns_client_impl.cc
index 2bd3b825b33..6122762037c 100644
--- a/chromium/net/dns/mdns_client_impl.cc
+++ b/chromium/net/dns/mdns_client_impl.cc
@@ -47,11 +47,11 @@ const double kListenerRefreshRatio2 = 0.95;
void MDnsSocketFactoryImpl::CreateSockets(
std::vector<std::unique_ptr<DatagramServerSocket>>* sockets) {
InterfaceIndexFamilyList interfaces(GetMDnsInterfacesToBind());
- for (size_t i = 0; i < interfaces.size(); ++i) {
- DCHECK(interfaces[i].second == ADDRESS_FAMILY_IPV4 ||
- interfaces[i].second == ADDRESS_FAMILY_IPV6);
- std::unique_ptr<DatagramServerSocket> socket(CreateAndBindMDnsSocket(
- interfaces[i].second, interfaces[i].first, net_log_));
+ for (const auto& interface : interfaces) {
+ DCHECK(interface.second == ADDRESS_FAMILY_IPV4 ||
+ interface.second == ADDRESS_FAMILY_IPV6);
+ std::unique_ptr<DatagramServerSocket> socket(
+ CreateAndBindMDnsSocket(interface.second, interface.first, net_log_));
if (socket)
sockets->push_back(std::move(socket));
}
@@ -202,7 +202,8 @@ void MDnsConnection::OnDatagramReceived(
MDnsClientImpl::Core::Core(base::Clock* clock, base::OneShotTimer* timer)
: clock_(clock),
cleanup_timer_(timer),
- connection_(new MDnsConnection(this)) {
+ connection_(
+ std::make_unique<MDnsConnection>((MDnsConnection::Delegate*)this)) {
DCHECK(cleanup_timer_);
DCHECK(!cleanup_timer_->IsRunning());
}
@@ -280,8 +281,8 @@ void MDnsClientImpl::Core::HandlePacket(DnsResponse* response,
update_keys.insert(std::make_pair(update_key, update));
}
- for (auto i = update_keys.begin(); i != update_keys.end(); i++) {
- const RecordParsed* record = cache_.LookupKey(i->first);
+ for (const auto& update_key : update_keys) {
+ const RecordParsed* record = cache_.LookupKey(update_key.first);
if (!record)
continue;
@@ -290,8 +291,8 @@ void MDnsClientImpl::Core::HandlePacket(DnsResponse* response,
NotifyNsecRecord(record);
#endif
} else {
- AlertListeners(i->second, ListenerKey(record->name(), record->type()),
- record);
+ AlertListeners(update_key.second,
+ ListenerKey(record->name(), record->type()), record);
}
}
}
@@ -306,12 +307,12 @@ void MDnsClientImpl::Core::NotifyNsecRecord(const RecordParsed* record) {
cache_.FindDnsRecords(0, record->name(), &records_to_remove, clock_->Now());
- for (auto i = records_to_remove.begin(); i != records_to_remove.end(); i++) {
- if ((*i)->type() == dns_protocol::kTypeNSEC)
+ for (const auto* record_to_remove : records_to_remove) {
+ if (record_to_remove->type() == dns_protocol::kTypeNSEC)
continue;
- if (!rdata->GetBit((*i)->type())) {
+ if (!rdata->GetBit(record_to_remove->type())) {
std::unique_ptr<const RecordParsed> record_removed =
- cache_.RemoveRecord((*i));
+ cache_.RemoveRecord(record_to_remove);
DCHECK(record_removed);
OnRecordRemoved(record_removed.get());
}
@@ -440,7 +441,7 @@ void MDnsClientImpl::Core::QueryCache(
MDnsClientImpl::MDnsClientImpl()
: clock_(base::DefaultClock::GetInstance()),
- cleanup_timer_(new base::OneShotTimer()) {}
+ cleanup_timer_(std::make_unique<base::OneShotTimer>()) {}
MDnsClientImpl::MDnsClientImpl(base::Clock* clock,
std::unique_ptr<base::OneShotTimer> timer)
@@ -473,8 +474,8 @@ std::unique_ptr<MDnsListener> MDnsClientImpl::CreateListener(
uint16_t rrtype,
const std::string& name,
MDnsListener::Delegate* delegate) {
- return std::unique_ptr<MDnsListener>(
- new MDnsListenerImpl(rrtype, name, clock_, delegate, this));
+ return std::make_unique<MDnsListenerImpl>(rrtype, name, clock_, delegate,
+ this);
}
std::unique_ptr<MDnsTransaction> MDnsClientImpl::CreateTransaction(
@@ -482,8 +483,8 @@ std::unique_ptr<MDnsTransaction> MDnsClientImpl::CreateTransaction(
const std::string& name,
int flags,
const MDnsTransaction::ResultCallback& callback) {
- return std::unique_ptr<MDnsTransaction>(
- new MDnsTransactionImpl(rrtype, name, flags, callback, this));
+ return std::make_unique<MDnsTransactionImpl>(rrtype, name, flags, callback,
+ this);
}
MDnsListenerImpl::MDnsListenerImpl(uint16_t rrtype,
diff --git a/chromium/net/dns/mdns_client_impl.h b/chromium/net/dns/mdns_client_impl.h
index d21c1dbb762..17c123432ff 100644
--- a/chromium/net/dns/mdns_client_impl.h
+++ b/chromium/net/dns/mdns_client_impl.h
@@ -45,7 +45,7 @@ class MDnsSocketFactoryImpl : public MDnsSocketFactory {
MDnsSocketFactoryImpl(const MDnsSocketFactoryImpl&) = delete;
MDnsSocketFactoryImpl& operator=(const MDnsSocketFactoryImpl&) = delete;
- ~MDnsSocketFactoryImpl() override {}
+ ~MDnsSocketFactoryImpl() override = default;
void CreateSockets(
std::vector<std::unique_ptr<DatagramServerSocket>>* sockets) override;
@@ -63,7 +63,7 @@ class NET_EXPORT_PRIVATE MDnsConnection {
// Handle an mDNS packet buffered in |response| with a size of |bytes_read|.
virtual void HandlePacket(DnsResponse* response, int bytes_read) = 0;
virtual void OnConnectionError(int error) = 0;
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
};
explicit MDnsConnection(MDnsConnection::Delegate* delegate);
diff --git a/chromium/net/dns/mdns_client_unittest.cc b/chromium/net/dns/mdns_client_unittest.cc
index 7702c12b8b7..896caaa4604 100644
--- a/chromium/net/dns/mdns_client_unittest.cc
+++ b/chromium/net/dns/mdns_client_unittest.cc
@@ -430,7 +430,7 @@ class MockClock : public base::Clock {
class MockTimer : public base::MockOneShotTimer {
public:
- MockTimer() {}
+ MockTimer() = default;
MockTimer(const MockTimer&) = delete;
MockTimer& operator=(const MockTimer&) = delete;
@@ -655,13 +655,13 @@ TEST_F(MDnsTest, CacheCleanupWithShortTTL) {
base::Time start_time = base::Time() + base::Seconds(1);
MockClock clock;
- MockTimer* timer = new MockTimer;
+ auto timer = std::make_unique<MockTimer>();
+ MockTimer* timer_ptr = timer.get();
- test_client_ =
- std::make_unique<MDnsClientImpl>(&clock, base::WrapUnique(timer));
+ test_client_ = std::make_unique<MDnsClientImpl>(&clock, std::move(timer));
ASSERT_THAT(test_client_->StartListening(&socket_factory_), test::IsOk());
- EXPECT_CALL(*timer, StartObserver(_, _)).Times(1);
+ EXPECT_CALL(*timer_ptr, StartObserver(_, _)).Times(1);
EXPECT_CALL(clock, Now())
.Times(3)
.WillRepeatedly(Return(start_time))
@@ -704,9 +704,9 @@ TEST_F(MDnsTest, CacheCleanupWithShortTTL) {
.WillOnce(Return(start_time + base::Seconds(2)))
.RetiresOnSaturation();
- EXPECT_CALL(*timer, StartObserver(_, base::TimeDelta()));
+ EXPECT_CALL(*timer_ptr, StartObserver(_, base::TimeDelta()));
- timer->Fire();
+ timer_ptr->Fire();
}
TEST_F(MDnsTest, StopListening) {
@@ -909,8 +909,8 @@ TEST_F(MDnsTest, TransactionTimeout) {
ASSERT_TRUE(transaction_privet->Start());
- EXPECT_CALL(*this,
- MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, NULL))
+ EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS,
+ nullptr))
.Times(Exactly(1))
.WillOnce(InvokeWithoutArgs(this, &MDnsTest::Stop));
@@ -948,7 +948,8 @@ TEST_F(MDnsTest, TransactionMultipleRecords) {
EXPECT_TRUE(record_privet2.IsRecordWith("_privet._tcp.local",
"zzzzz._privet._tcp.local"));
- EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_DONE, NULL))
+ EXPECT_CALL(*this,
+ MockableRecordCallback(MDnsTransaction::RESULT_DONE, nullptr))
.WillOnce(InvokeWithoutArgs(this, &MDnsTest::Stop));
RunFor(base::Seconds(4));
@@ -967,14 +968,14 @@ TEST_F(MDnsTest, TransactionReentrantDelete) {
ASSERT_TRUE(transaction_->Start());
EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS,
- NULL))
+ nullptr))
.Times(Exactly(1))
.WillOnce(DoAll(InvokeWithoutArgs(this, &MDnsTest::DeleteTransaction),
InvokeWithoutArgs(this, &MDnsTest::Stop)));
RunFor(base::Seconds(4));
- EXPECT_EQ(NULL, transaction_.get());
+ EXPECT_EQ(nullptr, transaction_.get());
}
TEST_F(MDnsTest, TransactionReentrantDeleteFromCache) {
@@ -999,7 +1000,7 @@ TEST_F(MDnsTest, TransactionReentrantDeleteFromCache) {
ASSERT_TRUE(transaction_->Start());
- EXPECT_EQ(NULL, transaction_.get());
+ EXPECT_EQ(nullptr, transaction_.get());
}
TEST_F(MDnsTest, TransactionReentrantCacheLookupStart) {
@@ -1090,8 +1091,8 @@ TEST_F(MDnsTest, ListenerReentrantDelete) {
SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1));
- EXPECT_EQ(NULL, listener1_.get());
- EXPECT_EQ(NULL, listener2_.get());
+ EXPECT_EQ(nullptr, listener1_.get());
+ EXPECT_EQ(nullptr, listener2_.get());
}
ACTION_P(SaveIPAddress, ip_container) {
@@ -1154,7 +1155,7 @@ TEST_F(MDnsTest, NsecWithTransactionFromNetwork) {
ASSERT_TRUE(transaction_privet->Start());
EXPECT_CALL(*this,
- MockableRecordCallback(MDnsTransaction::RESULT_NSEC, NULL));
+ MockableRecordCallback(MDnsTransaction::RESULT_NSEC, nullptr));
SimulatePacketReceive(kSamplePacketNsec,
sizeof(kSamplePacketNsec));
@@ -1172,7 +1173,7 @@ TEST_F(MDnsTest, NsecWithTransactionFromCache) {
sizeof(kSamplePacketNsec));
EXPECT_CALL(*this,
- MockableRecordCallback(MDnsTransaction::RESULT_NSEC, NULL));
+ MockableRecordCallback(MDnsTransaction::RESULT_NSEC, nullptr));
std::unique_ptr<MDnsTransaction> transaction_privet_a =
test_client_->CreateTransaction(
@@ -1351,10 +1352,14 @@ class MDnsConnectionTest : public TestWithTaskEnvironment {
protected:
// Follow successful connection initialization.
void SetUp() override {
- socket_ipv4_ = new MockMDnsDatagramServerSocket(ADDRESS_FAMILY_IPV4);
- socket_ipv6_ = new MockMDnsDatagramServerSocket(ADDRESS_FAMILY_IPV6);
- factory_.PushSocket(base::WrapUnique(socket_ipv6_.get()));
- factory_.PushSocket(base::WrapUnique(socket_ipv4_.get()));
+ auto socket_ipv4 =
+ std::make_unique<MockMDnsDatagramServerSocket>(ADDRESS_FAMILY_IPV4);
+ auto socket_ipv6 =
+ std::make_unique<MockMDnsDatagramServerSocket>(ADDRESS_FAMILY_IPV6);
+ socket_ipv4_ptr_ = socket_ipv4.get();
+ socket_ipv6_ptr_ = socket_ipv6.get();
+ factory_.PushSocket(std::move(socket_ipv4));
+ factory_.PushSocket(std::move(socket_ipv6));
sample_packet_ = MakeString(kSamplePacket1, sizeof(kSamplePacket1));
sample_buffer_ = base::MakeRefCounted<StringIOBuffer>(sample_packet_);
}
@@ -1363,8 +1368,8 @@ class MDnsConnectionTest : public TestWithTaskEnvironment {
StrictMock<MockMDnsConnectionDelegate> delegate_;
- raw_ptr<MockMDnsDatagramServerSocket> socket_ipv4_;
- raw_ptr<MockMDnsDatagramServerSocket> socket_ipv6_;
+ raw_ptr<MockMDnsDatagramServerSocket> socket_ipv4_ptr_;
+ raw_ptr<MockMDnsDatagramServerSocket> socket_ipv6_ptr_;
SimpleMockSocketFactory factory_;
MDnsConnection connection_;
TestCompletionCallback callback_;
@@ -1373,11 +1378,11 @@ class MDnsConnectionTest : public TestWithTaskEnvironment {
};
TEST_F(MDnsConnectionTest, ReceiveSynchronous) {
- socket_ipv6_->SetResponsePacket(sample_packet_);
- EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
+ socket_ipv6_ptr_->SetResponsePacket(sample_packet_);
+ EXPECT_CALL(*socket_ipv4_ptr_, RecvFrom(_, _, _, _))
.WillOnce(Return(ERR_IO_PENDING));
- EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _))
- .WillOnce(Invoke(socket_ipv6_.get(),
+ EXPECT_CALL(*socket_ipv6_ptr_, RecvFrom(_, _, _, _))
+ .WillOnce(Invoke(socket_ipv6_ptr_.get(),
&MockMDnsDatagramServerSocket::HandleRecvNow))
.WillOnce(Return(ERR_IO_PENDING));
@@ -1386,13 +1391,13 @@ TEST_F(MDnsConnectionTest, ReceiveSynchronous) {
}
TEST_F(MDnsConnectionTest, ReceiveAsynchronous) {
- socket_ipv6_->SetResponsePacket(sample_packet_);
+ socket_ipv6_ptr_->SetResponsePacket(sample_packet_);
- EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
+ EXPECT_CALL(*socket_ipv4_ptr_, RecvFrom(_, _, _, _))
.WillOnce(Return(ERR_IO_PENDING));
- EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _))
+ EXPECT_CALL(*socket_ipv6_ptr_, RecvFrom(_, _, _, _))
.Times(2)
- .WillOnce(Invoke(socket_ipv6_.get(),
+ .WillOnce(Invoke(socket_ipv6_ptr_.get(),
&MockMDnsDatagramServerSocket::HandleRecvLater))
.WillOnce(Return(ERR_IO_PENDING));
@@ -1406,9 +1411,9 @@ TEST_F(MDnsConnectionTest, ReceiveAsynchronous) {
TEST_F(MDnsConnectionTest, Error) {
CompletionOnceCallback callback;
- EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
+ EXPECT_CALL(*socket_ipv4_ptr_, RecvFrom(_, _, _, _))
.WillOnce(Return(ERR_IO_PENDING));
- EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _))
+ EXPECT_CALL(*socket_ipv6_ptr_, RecvFrom(_, _, _, _))
.WillOnce([&](auto, auto, auto, auto cb) {
callback = std::move(cb);
return ERR_IO_PENDING;
@@ -1425,27 +1430,27 @@ class MDnsConnectionSendTest : public MDnsConnectionTest {
protected:
void SetUp() override {
MDnsConnectionTest::SetUp();
- EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
+ EXPECT_CALL(*socket_ipv4_ptr_, RecvFrom(_, _, _, _))
.WillOnce(Return(ERR_IO_PENDING));
- EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _))
+ EXPECT_CALL(*socket_ipv6_ptr_, RecvFrom(_, _, _, _))
.WillOnce(Return(ERR_IO_PENDING));
EXPECT_THAT(InitConnection(), test::IsOk());
}
};
TEST_F(MDnsConnectionSendTest, Send) {
- EXPECT_CALL(*socket_ipv4_,
+ EXPECT_CALL(*socket_ipv4_ptr_,
SendToInternal(sample_packet_, "224.0.0.251:5353", _));
- EXPECT_CALL(*socket_ipv6_,
+ EXPECT_CALL(*socket_ipv6_ptr_,
SendToInternal(sample_packet_, "[ff02::fb]:5353", _));
connection_.Send(sample_buffer_, sample_packet_.size());
}
TEST_F(MDnsConnectionSendTest, SendError) {
- EXPECT_CALL(*socket_ipv4_,
+ EXPECT_CALL(*socket_ipv4_ptr_,
SendToInternal(sample_packet_, "224.0.0.251:5353", _));
- EXPECT_CALL(*socket_ipv6_,
+ EXPECT_CALL(*socket_ipv6_ptr_,
SendToInternal(sample_packet_, "[ff02::fb]:5353", _))
.WillOnce(Return(ERR_SOCKET_NOT_CONNECTED));
@@ -1456,14 +1461,14 @@ TEST_F(MDnsConnectionSendTest, SendError) {
TEST_F(MDnsConnectionSendTest, SendQueued) {
// Send data immediately.
- EXPECT_CALL(*socket_ipv4_,
+ EXPECT_CALL(*socket_ipv4_ptr_,
SendToInternal(sample_packet_, "224.0.0.251:5353", _))
.Times(2)
.WillRepeatedly(Return(OK));
CompletionOnceCallback callback;
// Delay sending data. Only the first call should be made.
- EXPECT_CALL(*socket_ipv6_,
+ EXPECT_CALL(*socket_ipv6_ptr_,
SendToInternal(sample_packet_, "[ff02::fb]:5353", _))
.WillOnce([&](auto, auto, auto cb) {
callback = std::move(cb);
@@ -1474,11 +1479,11 @@ TEST_F(MDnsConnectionSendTest, SendQueued) {
connection_.Send(sample_buffer_, sample_packet_.size());
// The second IPv6 packet is not sent yet.
- EXPECT_CALL(*socket_ipv4_,
+ EXPECT_CALL(*socket_ipv4_ptr_,
SendToInternal(sample_packet_, "224.0.0.251:5353", _))
.Times(0);
// Expect call for the second IPv6 packet.
- EXPECT_CALL(*socket_ipv6_,
+ EXPECT_CALL(*socket_ipv6_ptr_,
SendToInternal(sample_packet_, "[ff02::fb]:5353", _))
.WillOnce(Return(OK));
std::move(callback).Run(OK);
diff --git a/chromium/net/dns/mock_host_resolver.cc b/chromium/net/dns/mock_host_resolver.cc
index 03500cf172b..3f662a4c4b3 100644
--- a/chromium/net/dns/mock_host_resolver.cc
+++ b/chromium/net/dns/mock_host_resolver.cc
@@ -48,6 +48,7 @@
#include "net/dns/host_resolver.h"
#include "net/dns/host_resolver_manager.h"
#include "net/dns/host_resolver_results.h"
+#include "net/dns/https_record_rdata.h"
#include "net/dns/public/dns_query_type.h"
#include "net/dns/public/host_resolver_source.h"
#include "net/dns/public/mdns_listener_update_type.h"
@@ -111,13 +112,43 @@ absl::variant<url::SchemeHostPort, std::string> GetCacheHost(
return absl::get<HostPortPair>(endpoint).host();
}
+absl::optional<HostCache::Entry> CreateCacheEntry(
+ const std::vector<HostResolverEndpointResult>& endpoint_results,
+ const std::set<std::string>& aliases) {
+ absl::optional<std::vector<net::IPEndPoint>> ip_endpoints;
+ std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>
+ endpoint_metadatas;
+ for (const auto& endpoint_result : endpoint_results) {
+ if (!ip_endpoints) {
+ ip_endpoints = endpoint_result.ip_endpoints;
+ } else {
+ // TODO(crbug.com/1264933): Support caching different IP endpoints
+ // resutls.
+ CHECK(*ip_endpoints == endpoint_result.ip_endpoints)
+ << "Currently caching MockHostResolver only supports same IP "
+ "endpoints results.";
+ }
+
+ if (!endpoint_result.metadata.supported_protocol_alpns.empty()) {
+ endpoint_metadatas.emplace(/*priority=*/1, endpoint_result.metadata);
+ }
+ }
+ DCHECK(ip_endpoints);
+ auto endpoint_entry = HostCache::Entry(OK, *ip_endpoints, aliases,
+ HostCache::Entry::SOURCE_UNKNOWN);
+ if (endpoint_metadatas.empty()) {
+ return endpoint_entry;
+ }
+ return HostCache::Entry::MergeEntries(
+ HostCache::Entry(OK, std::move(endpoint_metadatas),
+ HostCache::Entry::SOURCE_UNKNOWN),
+ endpoint_entry);
+}
} // namespace
int ParseAddressList(base::StringPiece host_list,
- const std::vector<std::string>& dns_aliases,
- AddressList* addrlist) {
- *addrlist = AddressList();
- addrlist->SetDnsAliases(dns_aliases);
+ std::vector<net::IPEndPoint>* ip_endpoints) {
+ ip_endpoints->clear();
for (const base::StringPiece& address : base::SplitStringPiece(
host_list, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) {
IPAddress ip_address;
@@ -125,7 +156,7 @@ int ParseAddressList(base::StringPiece host_list,
LOG(WARNING) << "Not a supported IP literal: " << address;
return ERR_UNEXPECTED;
}
- addrlist->push_back(IPEndPoint(ip_address, 0));
+ ip_endpoints->push_back(IPEndPoint(ip_address, 0));
}
return OK;
}
@@ -238,58 +269,32 @@ class MockHostResolverBase::RequestImpl
resolve_error_info_ = ResolveErrorInfo(error);
}
- // Sets `address_results_` to `address_results`, after fixing them up. Also
- // sets `error` to OK if the fixed up AddressList is non-empty, or
- // ERR_NAME_NOT_RESOLVED otherwise.
- void SetAddressResults(const AddressList& address_results,
- absl::optional<HostCache::EntryStaleness> staleness) {
- // Should only be called at most once and before request is marked
- // completed.
- DCHECK(!complete_);
- DCHECK(!address_results_);
- DCHECK(!endpoint_results_);
- DCHECK(!parameters_.is_speculative);
-
- address_results_ = FixupAddressList(address_results);
-
- // If there are no addresses, either as a result of FixupAddressList(), as
- // in the originally passed in value, clear results and set an error.
- if (address_results_->empty()) {
- address_results_.reset();
- SetError(ERR_NAME_NOT_RESOLVED);
- return;
- }
-
- SetError(OK);
-
- fixed_up_dns_alias_results_ = dns_alias_utility::FixUpDnsAliases(
- std::set<std::string>(address_results_->dns_aliases().begin(),
- address_results_->dns_aliases().end()));
- staleness_ = std::move(staleness);
-
- endpoint_results_ = AddressListToEndpointResults(address_results_.value());
- }
-
+ // Sets `endpoint_results_`, `fixed_up_dns_alias_results_`,
+ // `address_results_` and `staleness_` after fixing them up.
+ // Also sets `error` to OK.
void SetEndpointResults(
- std::vector<HostResolverEndpointResult> endpoint_results) {
+ std::vector<HostResolverEndpointResult> endpoint_results,
+ std::set<std::string> aliases,
+ absl::optional<HostCache::EntryStaleness> staleness) {
DCHECK(!complete_);
DCHECK(!endpoint_results_);
DCHECK(!parameters_.is_speculative);
- // TODO(crbug.com/1264933): Perform fixups on `endpoint_results`?
endpoint_results_ = std::move(endpoint_results);
+ for (auto& result : *endpoint_results_) {
+ result.ip_endpoints = FixupEndPoints(result.ip_endpoints);
+ }
- // For now, we do not support configuring DNS aliases with endpoint results,
- // but the value is expected to always be present.
- //
- // TODO(crbug.com/1264933): Add some way to configure this, to support code
- // migrating to `HostResolverEndpointResult`.
- fixed_up_dns_alias_results_.emplace();
+ fixed_up_dns_alias_results_ = FixupAliases(aliases);
// `HostResolver` implementations are expected to provide an `AddressList`
// result whenever `HostResolverEndpointResult` is also available.
address_results_ = EndpointResultToAddressList(
*endpoint_results_, *fixed_up_dns_alias_results_);
+
+ staleness_ = std::move(staleness);
+
+ SetError(OK);
}
void OnAsyncCompleted(size_t id, int error) {
@@ -341,31 +346,29 @@ class MockHostResolverBase::RequestImpl
ResolveErrorInfo resolve_error_info() const { return resolve_error_info_; }
private:
- AddressList FixupAddressList(const AddressList& list) {
- // Filter address family by query type and set request port if response port
- // is default.
- AddressList corrected;
- for (const IPEndPoint& endpoint : list.endpoints()) {
+ std::vector<IPEndPoint> FixupEndPoints(
+ const std::vector<IPEndPoint>& endpoints) {
+ std::vector<IPEndPoint> corrected;
+ for (const IPEndPoint& endpoint : endpoints) {
DCHECK_NE(endpoint.GetFamily(), ADDRESS_FAMILY_UNSPECIFIED);
if (parameters_.dns_query_type == DnsQueryType::UNSPECIFIED ||
parameters_.dns_query_type ==
AddressFamilyToDnsQueryType(endpoint.GetFamily())) {
if (endpoint.port() == 0) {
- corrected.push_back(
- IPEndPoint(endpoint.address(), GetPort(request_endpoint_)));
+ corrected.emplace_back(endpoint.address(),
+ GetPort(request_endpoint_));
} else {
corrected.push_back(endpoint);
}
}
}
-
- // Copy over aliases and set to request hostname if empty.
- corrected.SetDnsAliases(list.dns_aliases());
- if (corrected.dns_aliases().empty())
- corrected.SetDnsAliases({std::string(GetHostname(request_endpoint_))});
-
return corrected;
}
+ std::set<std::string> FixupAliases(const std::set<std::string> aliases) {
+ if (aliases.empty())
+ return std::set<std::string>{std::string(GetHostname(request_endpoint_))};
+ return aliases;
+ }
const Host request_endpoint_;
const NetworkIsolationKey network_isolation_key_;
@@ -490,8 +493,31 @@ MockHostResolverBase::RuleResolver::RuleKey::RuleKey(RuleKey&&) = default;
MockHostResolverBase::RuleResolver::RuleKey&
MockHostResolverBase::RuleResolver::RuleKey::operator=(RuleKey&&) = default;
+MockHostResolverBase::RuleResolver::RuleResult::RuleResult() = default;
+
+MockHostResolverBase::RuleResolver::RuleResult::RuleResult(
+ std::vector<HostResolverEndpointResult> endpoints,
+ std::set<std::string> aliases)
+ : endpoints(std::move(endpoints)), aliases(std::move(aliases)) {}
+
+MockHostResolverBase::RuleResolver::RuleResult::~RuleResult() = default;
+
+MockHostResolverBase::RuleResolver::RuleResult::RuleResult(const RuleResult&) =
+ default;
+
+MockHostResolverBase::RuleResolver::RuleResult&
+MockHostResolverBase::RuleResolver::RuleResult::operator=(const RuleResult&) =
+ default;
+
+MockHostResolverBase::RuleResolver::RuleResult::RuleResult(RuleResult&&) =
+ default;
+
+MockHostResolverBase::RuleResolver::RuleResult&
+MockHostResolverBase::RuleResolver::RuleResult::operator=(RuleResult&&) =
+ default;
+
MockHostResolverBase::RuleResolver::RuleResolver(
- absl::optional<RuleResult> default_result)
+ absl::optional<RuleResultOrError> default_result)
: default_result_(std::move(default_result)) {}
MockHostResolverBase::RuleResolver::~RuleResolver() = default;
@@ -506,14 +532,14 @@ MockHostResolverBase::RuleResolver::RuleResolver(RuleResolver&&) = default;
MockHostResolverBase::RuleResolver&
MockHostResolverBase::RuleResolver::operator=(RuleResolver&&) = default;
-const MockHostResolverBase::RuleResolver::RuleResult&
+const MockHostResolverBase::RuleResolver::RuleResultOrError&
MockHostResolverBase::RuleResolver::Resolve(
const Host& request_endpoint,
DnsQueryTypeSet request_types,
HostResolverSource request_source) const {
for (const auto& rule : rules_) {
const RuleKey& key = rule.first;
- const RuleResult& result = rule.second;
+ const RuleResultOrError& result = rule.second;
if (absl::holds_alternative<RuleKey::NoScheme>(key.scheme) &&
absl::holds_alternative<url::SchemeHostPort>(request_endpoint)) {
@@ -556,7 +582,7 @@ MockHostResolverBase::RuleResolver::Resolve(
NOTREACHED() << "Request " << GetHostname(request_endpoint)
<< " did not match any MockHostResolver rules.";
- static const RuleResult kUnexpected = ERR_UNEXPECTED;
+ static const RuleResultOrError kUnexpected = ERR_UNEXPECTED;
return kUnexpected;
}
@@ -565,14 +591,15 @@ void MockHostResolverBase::RuleResolver::ClearRules() {
}
// static
-MockHostResolverBase::RuleResolver::RuleResult
+MockHostResolverBase::RuleResolver::RuleResultOrError
MockHostResolverBase::RuleResolver::GetLocalhostResult() {
- return AddressList::CreateFromIPAddress(IPAddress::IPv4Localhost(),
- /*port=*/0);
+ HostResolverEndpointResult endpoint;
+ endpoint.ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), /*port=*/0)};
+ return RuleResult(std::vector{endpoint});
}
void MockHostResolverBase::RuleResolver::AddRule(RuleKey key,
- RuleResult result) {
+ RuleResultOrError result) {
// Literals are always resolved to themselves by MockHostResolverBase,
// consequently we do not support remapping them.
IPAddress ip_address;
@@ -584,15 +611,15 @@ void MockHostResolverBase::RuleResolver::AddRule(RuleKey key,
void MockHostResolverBase::RuleResolver::AddRule(RuleKey key,
base::StringPiece ip_literal) {
- AddressList results;
- CHECK_EQ(ParseAddressList(ip_literal, /*dns_aliases=*/{}, &results), OK);
-
- AddRule(std::move(key), std::move(results));
+ std::vector<HostResolverEndpointResult> endpoints;
+ endpoints.emplace_back();
+ CHECK_EQ(ParseAddressList(ip_literal, &endpoints[0].ip_endpoints), OK);
+ AddRule(std::move(key), RuleResult(std::move(endpoints)));
}
void MockHostResolverBase::RuleResolver::AddRule(
base::StringPiece hostname_pattern,
- RuleResult result) {
+ RuleResultOrError result) {
RuleKey key;
key.hostname_pattern = std::string(hostname_pattern);
AddRule(std::move(key), std::move(result));
@@ -601,10 +628,10 @@ void MockHostResolverBase::RuleResolver::AddRule(
void MockHostResolverBase::RuleResolver::AddRule(
base::StringPiece hostname_pattern,
base::StringPiece ip_literal) {
- AddressList results;
- CHECK_EQ(ParseAddressList(ip_literal, /*dns_aliases=*/{}, &results), OK);
-
- AddRule(hostname_pattern, std::move(results));
+ std::vector<HostResolverEndpointResult> endpoints;
+ endpoints.emplace_back();
+ CHECK_EQ(ParseAddressList(ip_literal, &endpoints[0].ip_endpoints), OK);
+ AddRule(hostname_pattern, RuleResult(std::move(endpoints)));
}
void MockHostResolverBase::RuleResolver::AddRule(
@@ -623,24 +650,26 @@ void MockHostResolverBase::RuleResolver::AddIPLiteralRule(
RuleKey key;
key.hostname_pattern = std::string(hostname_pattern);
- std::vector<std::string> aliases;
+ std::set<std::string> aliases;
if (!canonical_name.empty())
- aliases.emplace_back(canonical_name);
+ aliases.emplace(canonical_name);
- AddressList results;
- CHECK_EQ(ParseAddressList(ip_literal, aliases, &results), OK);
-
- AddRule(std::move(key), std::move(results));
+ std::vector<HostResolverEndpointResult> endpoints;
+ endpoints.emplace_back();
+ CHECK_EQ(ParseAddressList(ip_literal, &endpoints[0].ip_endpoints), OK);
+ AddRule(std::move(key), RuleResult(std::move(endpoints), std::move(aliases)));
}
void MockHostResolverBase::RuleResolver::AddIPLiteralRuleWithDnsAliases(
base::StringPiece hostname_pattern,
base::StringPiece ip_literal,
std::vector<std::string> dns_aliases) {
- AddressList results;
- CHECK_EQ(ParseAddressList(ip_literal, dns_aliases, &results), OK);
-
- AddRule(hostname_pattern, std::move(results));
+ std::vector<HostResolverEndpointResult> endpoints;
+ endpoints.emplace_back();
+ CHECK_EQ(ParseAddressList(ip_literal, &endpoints[0].ip_endpoints), OK);
+ AddRule(hostname_pattern,
+ RuleResult(std::move(endpoints),
+ std::set(dns_aliases.begin(), dns_aliases.end())));
}
void MockHostResolverBase::RuleResolver::AddIPLiteralRuleWithDnsAliases(
@@ -669,10 +698,12 @@ void MockHostResolverBase::RuleResolver::AddRuleWithFlags(
base::StringPiece ip_literal,
HostResolverFlags /*flags*/,
std::vector<std::string> dns_aliases) {
- AddressList results;
- CHECK_EQ(ParseAddressList(ip_literal, dns_aliases, &results), OK);
-
- AddRule(host_pattern, std::move(results));
+ std::vector<HostResolverEndpointResult> endpoints;
+ endpoints.emplace_back();
+ CHECK_EQ(ParseAddressList(ip_literal, &endpoints[0].ip_endpoints), OK);
+ AddRule(host_pattern,
+ RuleResult(std::move(endpoints),
+ std::set(dns_aliases.begin(), dns_aliases.end())));
}
MockHostResolverBase::State::State() = default;
@@ -747,12 +778,13 @@ int MockHostResolverBase::LoadIntoCache(
ResolveHostParameters parameters =
optional_parameters.value_or(ResolveHostParameters());
- AddressList addresses;
+ std::vector<HostResolverEndpointResult> endpoints;
+ std::set<std::string> aliases;
absl::optional<HostCache::EntryStaleness> stale_info;
int rv = ResolveFromIPLiteralOrCache(
endpoint, network_isolation_key, parameters.dns_query_type,
ParametersToHostResolverFlags(parameters), parameters.source,
- parameters.cache_usage, &addresses, &stale_info);
+ parameters.cache_usage, &endpoints, &aliases, &stale_info);
if (rv != ERR_DNS_CACHE_MISS) {
// Request already in cache (or IP literal). No need to load it.
return rv;
@@ -894,17 +926,19 @@ int MockHostResolverBase::Resolve(RequestImpl* request) {
last_request_network_isolation_key_ = request->network_isolation_key();
last_secure_dns_policy_ = request->parameters().secure_dns_policy;
state_->IncrementNumResolve();
- AddressList addresses;
+ std::vector<HostResolverEndpointResult> endpoints;
+ std::set<std::string> aliases;
absl::optional<HostCache::EntryStaleness> stale_info;
// TODO(crbug.com/1264933): Allow caching `ConnectionEndpoint` results.
int rv = ResolveFromIPLiteralOrCache(
request->request_endpoint(), request->network_isolation_key(),
request->parameters().dns_query_type, request->host_resolver_flags(),
request->parameters().source, request->parameters().cache_usage,
- &addresses, &stale_info);
+ &endpoints, &aliases, &stale_info);
if (rv == OK && !request->parameters().is_speculative) {
- request->SetAddressResults(addresses, std::move(stale_info));
+ request->SetEndpointResults(std::move(endpoints), std::move(aliases),
+ std::move(stale_info));
} else {
request->SetError(rv);
}
@@ -945,10 +979,14 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache(
HostResolverFlags flags,
HostResolverSource source,
HostResolver::ResolveHostParameters::CacheUsage cache_usage,
- AddressList* addresses,
+ std::vector<HostResolverEndpointResult>* out_endpoints,
+ std::set<std::string>* out_aliases,
absl::optional<HostCache::EntryStaleness>* out_stale_info) {
- DCHECK(addresses);
+ DCHECK(out_endpoints);
+ DCHECK(out_aliases);
DCHECK(out_stale_info);
+ out_endpoints->clear();
+ out_aliases->clear();
*out_stale_info = absl::nullopt;
IPAddress ip_address;
@@ -963,16 +1001,20 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache(
return ERR_NAME_NOT_RESOLVED;
}
- *addresses =
- AddressList::CreateFromIPAddress(ip_address, GetPort(endpoint));
+ *out_endpoints = std::vector<HostResolverEndpointResult>(1);
+ (*out_endpoints)[0].ip_endpoints.emplace_back(ip_address,
+ GetPort(endpoint));
if (flags & HOST_RESOLVER_CANONNAME)
- addresses->SetDefaultCanonicalName();
+ *out_aliases = {ip_address.ToString()};
return OK;
}
+ std::vector<IPEndPoint> localhost_endpoints;
// Immediately resolve any "localhost" or recognized similar names.
if (IsAddressType(dns_query_type) &&
- ResolveLocalHostname(GetHostname(endpoint), addresses)) {
+ ResolveLocalHostname(GetHostname(endpoint), &localhost_endpoints)) {
+ *out_endpoints = std::vector<HostResolverEndpointResult>(1);
+ (*out_endpoints)[0].ip_endpoints = localhost_endpoints;
return OK;
}
int rv = ERR_DNS_CACHE_MISS;
@@ -1000,8 +1042,14 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache(
if (cache_result) {
rv = cache_result->second.error();
if (rv == OK) {
- *addresses = AddressList::CopyWithPort(
- cache_result->second.legacy_addresses().value(), GetPort(endpoint));
+ *out_endpoints = std::vector<HostResolverEndpointResult>(1);
+ (*out_endpoints)[0].ip_endpoints = *cache_result->second.ip_endpoints();
+
+ if (cache_result->second.aliases()) {
+ const auto& aliasess = *cache_result->second.aliases();
+ *out_aliases =
+ std::set<std::string>(aliasess.begin(), aliasess.end());
+ }
*out_stale_info = std::move(stale_info);
}
@@ -1024,40 +1072,32 @@ int MockHostResolverBase::ResolveFromIPLiteralOrCache(
int MockHostResolverBase::DoSynchronousResolution(RequestImpl& request) {
state_->IncrementNumNonLocalResolves();
- const RuleResolver::RuleResult& result = rule_resolver_.Resolve(
+ const RuleResolver::RuleResultOrError& result = rule_resolver_.Resolve(
request.request_endpoint(), request.parameters().dns_query_type,
request.parameters().source);
int error = ERR_UNEXPECTED;
absl::optional<HostCache::Entry> cache_entry;
-
- if (absl::holds_alternative<AddressList>(result)) {
- const AddressList& address_results = absl::get<AddressList>(result);
- request.SetAddressResults(address_results,
- /*staleness=*/absl::nullopt);
- error = request.resolve_error_info().error;
- cache_entry =
- request.address_results()
- ? HostCache::Entry(error, *request.address_results(),
- HostCache::Entry::SOURCE_UNKNOWN)
- : HostCache::Entry(error, HostCache::Entry::SOURCE_UNKNOWN);
- } else if (absl::holds_alternative<std::vector<HostResolverEndpointResult>>(
- result)) {
- const auto& endpoint_results =
- absl::get<std::vector<HostResolverEndpointResult>>(result);
- request.SetEndpointResults(endpoint_results);
+ if (absl::holds_alternative<RuleResolver::RuleResult>(result)) {
+ const auto& rule_result = absl::get<RuleResolver::RuleResult>(result);
+ const auto& endpoint_results = rule_result.endpoints;
+ const auto& aliases = rule_result.aliases;
+ request.SetEndpointResults(endpoint_results, aliases,
+ /*staleness=*/absl::nullopt);
// TODO(crbug.com/1264933): Change `error` on empty results?
error = OK;
- // TODO(crbug.com/1264933): Save result to cache.
+ if (cache_.get()) {
+ cache_entry = CreateCacheEntry(endpoint_results, aliases);
+ }
} else {
DCHECK(absl::holds_alternative<RuleResolver::ErrorResult>(result));
error = absl::get<RuleResolver::ErrorResult>(result);
request.SetError(error);
- cache_entry.emplace(error, HostCache::Entry::SOURCE_UNKNOWN);
+ if (cache_.get()) {
+ cache_entry.emplace(error, HostCache::Entry::SOURCE_UNKNOWN);
+ }
}
-
if (cache_.get() && cache_entry.has_value()) {
- DCHECK(cache_entry.has_value());
HostCache::Key key(
GetCacheHost(request.request_endpoint()),
request.parameters().dns_query_type, request.host_resolver_flags(),
@@ -1116,10 +1156,10 @@ std::unique_ptr<HostResolver> MockHostResolverFactory::CreateStandaloneResolver(
//-----------------------------------------------------------------------------
RuleBasedHostResolverProc::Rule::Rule(ResolverType resolver_type,
- const std::string& host_pattern,
+ base::StringPiece host_pattern,
AddressFamily address_family,
HostResolverFlags host_resolver_flags,
- const std::string& replacement,
+ base::StringPiece replacement,
std::vector<std::string> dns_aliases,
int latency_ms)
: resolver_type(resolver_type),
@@ -1136,20 +1176,21 @@ RuleBasedHostResolverProc::Rule::Rule(const Rule& other) = default;
RuleBasedHostResolverProc::Rule::~Rule() = default;
-RuleBasedHostResolverProc::RuleBasedHostResolverProc(HostResolverProc* previous,
- bool allow_fallback)
- : HostResolverProc(previous, allow_fallback) {}
+RuleBasedHostResolverProc::RuleBasedHostResolverProc(
+ scoped_refptr<HostResolverProc> previous,
+ bool allow_fallback)
+ : HostResolverProc(std::move(previous), allow_fallback) {}
-void RuleBasedHostResolverProc::AddRule(const std::string& host_pattern,
- const std::string& replacement) {
+void RuleBasedHostResolverProc::AddRule(base::StringPiece host_pattern,
+ base::StringPiece replacement) {
AddRuleForAddressFamily(host_pattern, ADDRESS_FAMILY_UNSPECIFIED,
replacement);
}
void RuleBasedHostResolverProc::AddRuleForAddressFamily(
- const std::string& host_pattern,
+ base::StringPiece host_pattern,
AddressFamily address_family,
- const std::string& replacement) {
+ base::StringPiece replacement) {
DCHECK(!replacement.empty());
HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY;
Rule rule(Rule::kResolverTypeSystem, host_pattern, address_family, flags,
@@ -1158,8 +1199,8 @@ void RuleBasedHostResolverProc::AddRuleForAddressFamily(
}
void RuleBasedHostResolverProc::AddRuleWithFlags(
- const std::string& host_pattern,
- const std::string& replacement,
+ base::StringPiece host_pattern,
+ base::StringPiece replacement,
HostResolverFlags flags,
std::vector<std::string> dns_aliases) {
DCHECK(!replacement.empty());
@@ -1169,9 +1210,9 @@ void RuleBasedHostResolverProc::AddRuleWithFlags(
}
void RuleBasedHostResolverProc::AddIPLiteralRule(
- const std::string& host_pattern,
- const std::string& ip_literal,
- const std::string& canonical_name) {
+ base::StringPiece host_pattern,
+ base::StringPiece ip_literal,
+ base::StringPiece canonical_name) {
// Literals are always resolved to themselves by HostResolverImpl,
// consequently we do not support remapping them.
IPAddress ip_address;
@@ -1190,8 +1231,8 @@ void RuleBasedHostResolverProc::AddIPLiteralRule(
}
void RuleBasedHostResolverProc::AddIPLiteralRuleWithDnsAliases(
- const std::string& host_pattern,
- const std::string& ip_literal,
+ base::StringPiece host_pattern,
+ base::StringPiece ip_literal,
std::vector<std::string> dns_aliases) {
// Literals are always resolved to themselves by HostResolverImpl,
// consequently we do not support remapping them.
@@ -1208,8 +1249,8 @@ void RuleBasedHostResolverProc::AddIPLiteralRuleWithDnsAliases(
}
void RuleBasedHostResolverProc::AddRuleWithLatency(
- const std::string& host_pattern,
- const std::string& replacement,
+ base::StringPiece host_pattern,
+ base::StringPiece replacement,
int latency_ms) {
DCHECK(!replacement.empty());
HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY;
@@ -1219,7 +1260,7 @@ void RuleBasedHostResolverProc::AddRuleWithLatency(
}
void RuleBasedHostResolverProc::AllowDirectLookup(
- const std::string& host_pattern) {
+ base::StringPiece host_pattern) {
HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY;
Rule rule(Rule::kResolverTypeSystem, host_pattern, ADDRESS_FAMILY_UNSPECIFIED,
flags, std::string(), /*dns_aliases=*/{}, 0);
@@ -1227,7 +1268,7 @@ void RuleBasedHostResolverProc::AllowDirectLookup(
}
void RuleBasedHostResolverProc::AddSimulatedFailure(
- const std::string& host_pattern,
+ base::StringPiece host_pattern,
HostResolverFlags flags) {
Rule rule(Rule::kResolverTypeFail, host_pattern, ADDRESS_FAMILY_UNSPECIFIED,
flags, std::string(), /*dns_aliases=*/{}, 0);
@@ -1235,7 +1276,7 @@ void RuleBasedHostResolverProc::AddSimulatedFailure(
}
void RuleBasedHostResolverProc::AddSimulatedTimeoutFailure(
- const std::string& host_pattern,
+ base::StringPiece host_pattern,
HostResolverFlags flags) {
Rule rule(Rule::kResolverTypeFailTimeout, host_pattern,
ADDRESS_FAMILY_UNSPECIFIED, flags, std::string(),
@@ -1311,17 +1352,17 @@ int RuleBasedHostResolverProc::Resolve(const std::string& host,
aliases = (!r->dns_aliases.empty())
? r->dns_aliases
: std::vector<std::string>({host});
- int result =
- ParseAddressList(effective_host, aliases, &raw_addr_list);
+ std::vector<net::IPEndPoint> ip_endpoints;
+ int result = ParseAddressList(effective_host, &ip_endpoints);
// Filter out addresses with the wrong family.
*addrlist = AddressList();
- for (const auto& address : raw_addr_list) {
+ for (const auto& address : ip_endpoints) {
if (address_family == ADDRESS_FAMILY_UNSPECIFIED ||
address_family == address.GetFamily()) {
addrlist->push_back(address);
}
}
- addrlist->SetDnsAliases(raw_addr_list.dns_aliases());
+ addrlist->SetDnsAliases(aliases);
if (result == OK && addrlist->empty())
return ERR_NAME_NOT_RESOLVED;
@@ -1364,15 +1405,16 @@ void RuleBasedHostResolverProc::AddRuleInternal(const Rule& rule) {
rules_.push_back(fixed_rule);
}
-RuleBasedHostResolverProc* CreateCatchAllHostResolverProc() {
- RuleBasedHostResolverProc* catchall =
- new RuleBasedHostResolverProc(/*previous=*/nullptr,
- /*allow_fallback=*/false);
+scoped_refptr<RuleBasedHostResolverProc> CreateCatchAllHostResolverProc() {
+ auto catchall =
+ base::MakeRefCounted<RuleBasedHostResolverProc>(/*previous=*/nullptr,
+ /*allow_fallback=*/false);
// Note that IPv6 lookups fail.
catchall->AddIPLiteralRule("*", "127.0.0.1", "localhost");
// Next add a rules-based layer that the test controls.
- return new RuleBasedHostResolverProc(catchall, /*allow_fallback=*/false);
+ return base::MakeRefCounted<RuleBasedHostResolverProc>(
+ std::move(catchall), /*allow_fallback=*/false);
}
//-----------------------------------------------------------------------------
@@ -1514,7 +1556,7 @@ ScopedDefaultHostResolverProc::~ScopedDefaultHostResolverProc() {
void ScopedDefaultHostResolverProc::Init(HostResolverProc* proc) {
current_proc_ = proc;
previous_proc_ = HostResolverProc::SetDefault(current_proc_.get());
- current_proc_->SetLastProc(previous_proc_.get());
+ current_proc_->SetLastProc(previous_proc_);
}
} // namespace net
diff --git a/chromium/net/dns/mock_host_resolver.h b/chromium/net/dns/mock_host_resolver.h
index 06f57b1897f..0cf319719ed 100644
--- a/chromium/net/dns/mock_host_resolver.h
+++ b/chromium/net/dns/mock_host_resolver.h
@@ -22,6 +22,7 @@
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread_checker.h"
#include "net/base/address_family.h"
+#include "net/base/address_list.h"
#include "net/base/completion_once_callback.h"
#include "net/base/host_port_pair.h"
#include "net/base/net_errors.h"
@@ -48,15 +49,10 @@ class HostCache;
class IPEndPoint;
class URLRequestContext;
-// Fills `*addrlist` with a socket address for `host_list` which should be a
+// Fills `ip_endpoints` with a socket address for `host_list` which should be a
// comma-separated list of IPv4 or IPv6 literal(s) without enclosing brackets.
-// If `dns_aliases` is non-empty, its first entry is considered the DNS
-// canonical name (i.e. address record name) for the host, and the alias
-// chain is listed in reverse order through to the last entry, the query name.
-// Returns OK on success, ERR_UNEXPECTED otherwise.
int ParseAddressList(base::StringPiece host_list,
- const std::vector<std::string>& dns_aliases,
- AddressList* addrlist);
+ std::vector<net::IPEndPoint>* ip_endpoints);
// In most cases, it is important that unit tests avoid relying on making actual
// DNS queries since the resulting tests can be flaky, especially if the network
@@ -78,7 +74,7 @@ int ParseAddressList(base::StringPiece host_list,
// For more advanced matching, the first parameter may be replaced with a
// MockHostResolverBase::RuleResolver::RuleKey. For more advanced responses, the
// second parameter may be replaced with a
-// MockHostResolverBase::RuleResolver::RuleResult.
+// MockHostResolverBase::RuleResolver::RuleResultOrError.
//
// MockHostResolvers may optionally be created with a default result:
//
@@ -139,14 +135,29 @@ class MockHostResolverBase
absl::optional<HostResolverSource> query_source;
};
+ struct RuleResult {
+ RuleResult();
+ explicit RuleResult(
+ std::vector<HostResolverEndpointResult> endpoints,
+ std::set<std::string> aliases = std::set<std::string>());
+
+ ~RuleResult();
+
+ RuleResult(const RuleResult&);
+ RuleResult& operator=(const RuleResult&);
+ RuleResult(RuleResult&&);
+ RuleResult& operator=(RuleResult&&);
+
+ std::vector<HostResolverEndpointResult> endpoints;
+ std::set<std::string> aliases;
+ };
+
using ErrorResult = Error;
- using RuleResult = absl::variant<AddressList,
- std::vector<HostResolverEndpointResult>,
- ErrorResult>;
+ using RuleResultOrError = absl::variant<RuleResult, ErrorResult>;
// If `default_result` is nullopt, every resolve must match an added rule.
explicit RuleResolver(
- absl::optional<RuleResult> default_result = absl::nullopt);
+ absl::optional<RuleResultOrError> default_result = absl::nullopt);
~RuleResolver();
RuleResolver(const RuleResolver&);
@@ -154,19 +165,21 @@ class MockHostResolverBase
RuleResolver(RuleResolver&&);
RuleResolver& operator=(RuleResolver&&);
- const RuleResult& Resolve(const Host& request_endpoint,
- DnsQueryTypeSet request_types,
- HostResolverSource request_source) const;
+ const RuleResultOrError& Resolve(const Host& request_endpoint,
+ DnsQueryTypeSet request_types,
+ HostResolverSource request_source) const;
void ClearRules();
- static RuleResult GetLocalhostResult();
+ static RuleResultOrError GetLocalhostResult();
- void AddRule(RuleKey key, RuleResult result);
+ void AddRule(RuleKey key, RuleResultOrError result);
void AddRule(RuleKey key, base::StringPiece ip_literal);
- void AddRule(base::StringPiece hostname_pattern, RuleResult result);
+
+ void AddRule(base::StringPiece hostname_pattern, RuleResultOrError result);
void AddRule(base::StringPiece hostname_pattern,
base::StringPiece ip_literal);
+
void AddRule(base::StringPiece hostname_pattern, Error error);
// Legacy rule creation. Only for compatibility with tests written for use
@@ -189,8 +202,8 @@ class MockHostResolverBase
std::vector<std::string> dns_aliases = {});
private:
- std::map<RuleKey, RuleResult> rules_;
- absl::optional<RuleResult> default_result_;
+ std::map<RuleKey, RuleResultOrError> rules_;
+ absl::optional<RuleResultOrError> default_result_;
};
using RequestMap = std::map<size_t, RequestImpl*>;
@@ -406,8 +419,9 @@ class MockHostResolverBase
HostResolverFlags flags,
HostResolverSource source,
HostResolver::ResolveHostParameters::CacheUsage cache_usage,
- AddressList* addresses,
- absl::optional<HostCache::EntryStaleness>* stale_info);
+ std::vector<HostResolverEndpointResult>* out_endpoints,
+ std::set<std::string>* out_aliases,
+ absl::optional<HostCache::EntryStaleness>* out_stale_info);
int DoSynchronousResolution(RequestImpl& request);
void AddListener(MdnsListenerImpl* listener);
@@ -437,8 +451,8 @@ class MockHostResolverBase
class MockHostResolver : public MockHostResolverBase {
public:
- explicit MockHostResolver(
- absl::optional<RuleResolver::RuleResult> default_result = absl::nullopt)
+ explicit MockHostResolver(absl::optional<RuleResolver::RuleResultOrError>
+ default_result = absl::nullopt)
: MockHostResolverBase(/*use_caching=*/false,
/*cache_invalidation_num=*/0,
RuleResolver(std::move(default_result))) {}
@@ -457,7 +471,8 @@ class MockCachingHostResolver : public MockHostResolverBase {
// scenarios.
explicit MockCachingHostResolver(
int cache_invalidation_num = 0,
- absl::optional<RuleResolver::RuleResult> default_result = absl::nullopt)
+ absl::optional<RuleResolver::RuleResultOrError> default_result =
+ absl::nullopt)
: MockHostResolverBase(/*use_caching=*/true,
cache_invalidation_num,
RuleResolver(std::move(default_result))) {}
@@ -509,20 +524,20 @@ class RuleBasedHostResolverProc : public HostResolverProc {
public:
// If `allow_fallback` is false, no Proc fallback is allowed except to
// `previous`.
- explicit RuleBasedHostResolverProc(HostResolverProc* previous,
+ explicit RuleBasedHostResolverProc(scoped_refptr<HostResolverProc> previous,
bool allow_fallback = true);
// Any hostname matching the given pattern will be replaced with the given
// |ip_literal|.
- void AddRule(const std::string& host_pattern, const std::string& ip_literal);
+ void AddRule(base::StringPiece host_pattern, base::StringPiece ip_literal);
// Same as AddRule(), but further restricts to |address_family|.
- void AddRuleForAddressFamily(const std::string& host_pattern,
+ void AddRuleForAddressFamily(base::StringPiece host_pattern,
AddressFamily address_family,
- const std::string& ip_literal);
+ base::StringPiece ip_literal);
- void AddRuleWithFlags(const std::string& host_pattern,
- const std::string& ip_literal,
+ void AddRuleWithFlags(base::StringPiece host_pattern,
+ base::StringPiece ip_literal,
HostResolverFlags flags,
std::vector<std::string> dns_aliases = {});
@@ -533,9 +548,9 @@ class RuleBasedHostResolverProc : public HostResolverProc {
// but does not impact DNS resolution.
// |ip_literal| can be a single IP address like "192.168.1.1" or a comma
// separated list of IP addresses, like "::1,192:168.1.2".
- void AddIPLiteralRule(const std::string& host_pattern,
- const std::string& ip_literal,
- const std::string& canonical_name);
+ void AddIPLiteralRule(base::StringPiece host_pattern,
+ base::StringPiece ip_literal,
+ base::StringPiece canonical_name);
// Same as AddIPLiteralRule, but with a parameter allowing multiple DNS
// aliases, such as CNAME aliases, instead of only the canonical name. While
@@ -544,26 +559,26 @@ class RuleBasedHostResolverProc : public HostResolverProc {
// MockHostResolver who need to be able to obtain aliases and can be
// agnostic about how the host resolution took place, as the alternative,
// MockDnsClient, is not currently hooked up to MockHostResolver.
- void AddIPLiteralRuleWithDnsAliases(const std::string& host_pattern,
- const std::string& ip_literal,
+ void AddIPLiteralRuleWithDnsAliases(base::StringPiece host_pattern,
+ base::StringPiece ip_literal,
std::vector<std::string> dns_aliases);
- void AddRuleWithLatency(const std::string& host_pattern,
- const std::string& replacement,
+ void AddRuleWithLatency(base::StringPiece host_pattern,
+ base::StringPiece replacement,
int latency_ms);
// Make sure that |host| will not be re-mapped or even processed by underlying
// host resolver procedures. It can also be a pattern.
- void AllowDirectLookup(const std::string& host);
+ void AllowDirectLookup(base::StringPiece host);
// Simulate a lookup failure for |host| (it also can be a pattern).
void AddSimulatedFailure(
- const std::string& host,
+ base::StringPiece host,
HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY);
// Simulate a lookup timeout failure for |host| (it also can be a pattern).
void AddSimulatedTimeoutFailure(
- const std::string& host,
+ base::StringPiece host,
HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY);
// Deletes all the rules that have been added.
@@ -593,10 +608,10 @@ class RuleBasedHostResolverProc : public HostResolverProc {
};
Rule(ResolverType resolver_type,
- const std::string& host_pattern,
+ base::StringPiece host_pattern,
AddressFamily address_family,
HostResolverFlags host_resolver_flags,
- const std::string& replacement,
+ base::StringPiece replacement,
std::vector<std::string> dns_aliases,
int latency_ms);
Rule(const Rule& other);
@@ -630,7 +645,7 @@ class RuleBasedHostResolverProc : public HostResolverProc {
};
// Create rules that map all requests to localhost.
-RuleBasedHostResolverProc* CreateCatchAllHostResolverProc();
+scoped_refptr<RuleBasedHostResolverProc> CreateCatchAllHostResolverProc();
// HangingHostResolver never completes its |Resolve| request. As LOCAL_ONLY
// requests are not allowed to complete asynchronously, they will always result
diff --git a/chromium/net/dns/mock_mdns_client.h b/chromium/net/dns/mock_mdns_client.h
index ff4374765b3..9d36e1114fd 100644
--- a/chromium/net/dns/mock_mdns_client.h
+++ b/chromium/net/dns/mock_mdns_client.h
@@ -16,7 +16,7 @@ namespace net {
class MockMDnsTransaction : public MDnsTransaction {
public:
MockMDnsTransaction();
- ~MockMDnsTransaction();
+ ~MockMDnsTransaction() override;
MOCK_METHOD0(Start, bool());
MOCK_CONST_METHOD0(GetName, const std::string&());
@@ -26,7 +26,7 @@ class MockMDnsTransaction : public MDnsTransaction {
class MockMDnsClient : public MDnsClient {
public:
MockMDnsClient();
- ~MockMDnsClient();
+ ~MockMDnsClient() override;
MOCK_METHOD3(CreateListener,
std::unique_ptr<MDnsListener>(uint16_t,
diff --git a/chromium/net/dns/mock_mdns_socket_factory.cc b/chromium/net/dns/mock_mdns_socket_factory.cc
index 175ad137835..560a6e7a263 100644
--- a/chromium/net/dns/mock_mdns_socket_factory.cc
+++ b/chromium/net/dns/mock_mdns_socket_factory.cc
@@ -80,8 +80,9 @@ void MockMDnsSocketFactory::CreateSockets(
void MockMDnsSocketFactory::CreateSocket(
AddressFamily address_family,
std::vector<std::unique_ptr<DatagramServerSocket>>* sockets) {
- std::unique_ptr<testing::NiceMock<MockMDnsDatagramServerSocket>> new_socket(
- new testing::NiceMock<MockMDnsDatagramServerSocket>(address_family));
+ auto new_socket =
+ std::make_unique<testing::NiceMock<MockMDnsDatagramServerSocket>>(
+ address_family);
ON_CALL(*new_socket, SendToInternal(_, _, _))
.WillByDefault(Invoke(
diff --git a/chromium/net/dns/mock_mdns_socket_factory.h b/chromium/net/dns/mock_mdns_socket_factory.h
index 78036efb186..ce50a884b3a 100644
--- a/chromium/net/dns/mock_mdns_socket_factory.h
+++ b/chromium/net/dns/mock_mdns_socket_factory.h
@@ -55,9 +55,6 @@ class MockMDnsDatagramServerSocket : public DatagramServerSocket {
MOCK_CONST_METHOD1(GetPeerAddress, int(IPEndPoint* address));
int GetLocalAddress(IPEndPoint* address) const override;
MOCK_METHOD0(UseNonBlockingIO, void());
- MOCK_METHOD0(UseWriteBatching, void());
- MOCK_METHOD0(UseMultiCore, void());
- MOCK_METHOD0(UseSendmmsg, void());
MOCK_CONST_METHOD0(NetLog, const NetLogWithSource&());
MOCK_METHOD0(AllowAddressReuse, void());
diff --git a/chromium/net/dns/opt_record_rdata.cc b/chromium/net/dns/opt_record_rdata.cc
new file mode 100644
index 00000000000..43768287db6
--- /dev/null
+++ b/chromium/net/dns/opt_record_rdata.cc
@@ -0,0 +1,303 @@
+// Copyright 2022 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.
+
+#include "net/dns/opt_record_rdata.h"
+
+#include <algorithm>
+#include <memory>
+#include <numeric>
+#include <utility>
+
+#include "base/big_endian.h"
+#include "base/check_is_test.h"
+#include "base/containers/contains.h"
+#include "base/memory/ptr_util.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/strings/string_piece.h"
+#include "base/strings/string_util.h"
+#include "net/dns/public/dns_protocol.h"
+
+namespace net {
+
+namespace {
+std::string SerializeEdeOpt(uint16_t info_code, base::StringPiece extra_text) {
+ std::string buf(2 + extra_text.size(), '\0');
+
+ base::BigEndianWriter writer(buf.data(), buf.size());
+ CHECK(writer.WriteU16(info_code));
+ CHECK(writer.WriteBytes(extra_text.data(), extra_text.size()));
+ return buf;
+}
+} // namespace
+
+OptRecordRdata::Opt::Opt(std::string data) : data_(std::move(data)) {}
+
+bool OptRecordRdata::Opt::operator==(const OptRecordRdata::Opt& other) const {
+ return IsEqual(other);
+}
+
+bool OptRecordRdata::Opt::operator!=(const OptRecordRdata::Opt& other) const {
+ return !IsEqual(other);
+}
+
+bool OptRecordRdata::Opt::IsEqual(const OptRecordRdata::Opt& other) const {
+ return GetCode() == other.GetCode() && data() == other.data();
+}
+
+OptRecordRdata::EdeOpt::EdeOpt(uint16_t info_code, std::string extra_text)
+ : Opt(SerializeEdeOpt(info_code, extra_text)),
+ info_code_(info_code),
+ extra_text_(std::move(extra_text)) {
+ CHECK(base::IsStringUTF8(extra_text_));
+}
+
+OptRecordRdata::EdeOpt::~EdeOpt() = default;
+
+std::unique_ptr<OptRecordRdata::EdeOpt> OptRecordRdata::EdeOpt::Create(
+ std::string data) {
+ uint16_t info_code;
+ base::StringPiece extra_text;
+ auto edeReader = base::BigEndianReader::FromStringPiece(data);
+
+ // size must be at least 2: info_code + optional extra_text
+ if (!(edeReader.ReadU16(&info_code) &&
+ edeReader.ReadPiece(&extra_text, edeReader.remaining()))) {
+ return nullptr;
+ }
+
+ if (!base::IsStringUTF8(extra_text)) {
+ return nullptr;
+ }
+
+ std::string extra_text_str(extra_text.data(), extra_text.size());
+ return std::make_unique<EdeOpt>(info_code, std::move(extra_text_str));
+}
+
+uint16_t OptRecordRdata::EdeOpt::GetCode() const {
+ return EdeOpt::kOptCode;
+}
+
+OptRecordRdata::EdeOpt::EdeInfoCode
+OptRecordRdata::EdeOpt::GetEnumFromInfoCode() const {
+ return GetEnumFromInfoCode(info_code_);
+}
+
+OptRecordRdata::EdeOpt::EdeInfoCode OptRecordRdata::EdeOpt::GetEnumFromInfoCode(
+ uint16_t info_code) {
+ switch (info_code) {
+ case 0:
+ return EdeInfoCode::kOtherError;
+ case 1:
+ return EdeInfoCode::kUnsupportedDnskeyAlgorithm;
+ case 2:
+ return EdeInfoCode::kUnsupportedDsDigestType;
+ case 3:
+ return EdeInfoCode::kStaleAnswer;
+ case 4:
+ return EdeInfoCode::kForgedAnswer;
+ case 5:
+ return EdeInfoCode::kDnssecIndeterminate;
+ case 6:
+ return EdeInfoCode::kDnssecBogus;
+ case 7:
+ return EdeInfoCode::kSignatureExpired;
+ case 8:
+ return EdeInfoCode::kSignatureNotYetValid;
+ case 9:
+ return EdeInfoCode::kDnskeyMissing;
+ case 10:
+ return EdeInfoCode::kRrsigsMissing;
+ case 11:
+ return EdeInfoCode::kNoZoneKeyBitSet;
+ case 12:
+ return EdeInfoCode::kNsecMissing;
+ case 13:
+ return EdeInfoCode::kCachedError;
+ case 14:
+ return EdeInfoCode::kNotReady;
+ case 15:
+ return EdeInfoCode::kBlocked;
+ case 16:
+ return EdeInfoCode::kCensored;
+ case 17:
+ return EdeInfoCode::kFiltered;
+ case 18:
+ return EdeInfoCode::kProhibited;
+ case 19:
+ return EdeInfoCode::kStaleNxdomainAnswer;
+ case 20:
+ return EdeInfoCode::kNotAuthoritative;
+ case 21:
+ return EdeInfoCode::kNotSupported;
+ case 22:
+ return EdeInfoCode::kNoReachableAuthority;
+ case 23:
+ return EdeInfoCode::kNetworkError;
+ case 24:
+ return EdeInfoCode::kInvalidData;
+ case 25:
+ return EdeInfoCode::kSignatureExpiredBeforeValid;
+ case 26:
+ return EdeInfoCode::kTooEarly;
+ case 27:
+ return EdeInfoCode::kUnsupportedNsec3IterationsValue;
+ default:
+ return EdeInfoCode::kUnrecognizedErrorCode;
+ }
+}
+
+OptRecordRdata::PaddingOpt::PaddingOpt(std::string padding)
+ : Opt(std::move(padding)) {}
+
+OptRecordRdata::PaddingOpt::PaddingOpt(uint16_t padding_len)
+ : Opt(std::string(base::checked_cast<size_t>(padding_len), '\0')) {}
+
+OptRecordRdata::PaddingOpt::~PaddingOpt() = default;
+
+uint16_t OptRecordRdata::PaddingOpt::GetCode() const {
+ return PaddingOpt::kOptCode;
+}
+
+OptRecordRdata::UnknownOpt::~UnknownOpt() = default;
+
+std::unique_ptr<OptRecordRdata::UnknownOpt>
+OptRecordRdata::UnknownOpt::CreateForTesting(uint16_t code, std::string data) {
+ CHECK_IS_TEST();
+ return base::WrapUnique(
+ new OptRecordRdata::UnknownOpt(code, std::move(data)));
+}
+
+OptRecordRdata::UnknownOpt::UnknownOpt(uint16_t code, std::string data)
+ : Opt(std::move(data)), code_(code) {
+ CHECK(!base::Contains(kOptsWithDedicatedClasses, code));
+}
+
+uint16_t OptRecordRdata::UnknownOpt::GetCode() const {
+ return code_;
+}
+
+OptRecordRdata::OptRecordRdata() = default;
+
+OptRecordRdata::~OptRecordRdata() = default;
+
+bool OptRecordRdata::operator==(const OptRecordRdata& other) const {
+ return IsEqual(&other);
+}
+
+bool OptRecordRdata::operator!=(const OptRecordRdata& other) const {
+ return !IsEqual(&other);
+}
+
+// static
+std::unique_ptr<OptRecordRdata> OptRecordRdata::Create(base::StringPiece data) {
+ auto rdata = std::make_unique<OptRecordRdata>();
+ rdata->buf_.assign(data.begin(), data.end());
+
+ auto reader = base::BigEndianReader::FromStringPiece(data);
+ while (reader.remaining() > 0) {
+ uint16_t opt_code, opt_data_size;
+ base::StringPiece opt_data_sp;
+
+ if (!(reader.ReadU16(&opt_code) && reader.ReadU16(&opt_data_size) &&
+ reader.ReadPiece(&opt_data_sp, opt_data_size))) {
+ return nullptr;
+ }
+
+ std::string opt_data{opt_data_sp.data(), opt_data_sp.size()};
+
+ // After the Opt object has been parsed, parse the contents (the data)
+ // depending on the opt_code. The specific Opt subclasses all inherit from
+ // Opt. If an opt code does not have a matching Opt subclass, a simple Opt
+ // object will be created, and data won't be parsed.
+
+ std::unique_ptr<Opt> opt;
+
+ switch (opt_code) {
+ case dns_protocol::kEdnsPadding:
+ opt = std::make_unique<OptRecordRdata::PaddingOpt>(std::move(opt_data));
+ break;
+ case dns_protocol::kEdnsExtendedDnsError:
+ opt = OptRecordRdata::EdeOpt::Create(std::move(opt_data));
+ break;
+ default:
+ opt = base::WrapUnique(
+ new OptRecordRdata::UnknownOpt(opt_code, std::move(opt_data)));
+ break;
+ }
+
+ // Confirm that opt is not null, which would be the result of a failed
+ // parse.
+ if (!opt) {
+ return nullptr;
+ }
+
+ rdata->opts_.emplace(opt_code, std::move(opt));
+ }
+
+ return rdata;
+}
+
+uint16_t OptRecordRdata::Type() const {
+ return OptRecordRdata::kType;
+}
+
+bool OptRecordRdata::IsEqual(const RecordRdata* other) const {
+ if (other->Type() != Type()) {
+ return false;
+ }
+ const OptRecordRdata* opt_other = static_cast<const OptRecordRdata*>(other);
+ return opt_other->buf_ == buf_;
+}
+
+void OptRecordRdata::AddOpt(std::unique_ptr<Opt> opt) {
+ base::StringPiece opt_data = opt->data();
+
+ // Resize buffer to accommodate new OPT.
+ const size_t orig_rdata_size = buf_.size();
+ buf_.resize(orig_rdata_size + Opt::kHeaderSize + opt_data.size());
+
+ // Start writing from the end of the existing rdata.
+ base::BigEndianWriter writer(buf_.data(), buf_.size());
+ CHECK(writer.Skip(orig_rdata_size));
+ bool success = writer.WriteU16(opt->GetCode()) &&
+ writer.WriteU16(opt_data.size()) &&
+ writer.WriteBytes(opt_data.data(), opt_data.size());
+ DCHECK(success);
+
+ opts_.emplace(opt->GetCode(), std::move(opt));
+}
+
+bool OptRecordRdata::ContainsOptCode(uint16_t opt_code) const {
+ return opts_.find(opt_code) != opts_.end();
+}
+
+std::vector<const OptRecordRdata::Opt*> OptRecordRdata::GetOpts() const {
+ std::vector<const OptRecordRdata::Opt*> opts;
+ opts.reserve(OptCount());
+ for (const auto& elem : opts_) {
+ opts.push_back(elem.second.get());
+ }
+ return opts;
+}
+
+std::vector<const OptRecordRdata::PaddingOpt*> OptRecordRdata::GetPaddingOpts()
+ const {
+ std::vector<const OptRecordRdata::PaddingOpt*> opts;
+ auto range = opts_.equal_range(dns_protocol::kEdnsPadding);
+ for (auto it = range.first; it != range.second; ++it) {
+ opts.push_back(static_cast<const PaddingOpt*>(it->second.get()));
+ }
+ return opts;
+}
+
+std::vector<const OptRecordRdata::EdeOpt*> OptRecordRdata::GetEdeOpts() const {
+ std::vector<const OptRecordRdata::EdeOpt*> opts;
+ auto range = opts_.equal_range(dns_protocol::kEdnsExtendedDnsError);
+ for (auto it = range.first; it != range.second; ++it) {
+ opts.push_back(static_cast<const EdeOpt*>(it->second.get()));
+ }
+ return opts;
+}
+
+} // namespace net
diff --git a/chromium/net/dns/opt_record_rdata.h b/chromium/net/dns/opt_record_rdata.h
new file mode 100644
index 00000000000..ba26e870621
--- /dev/null
+++ b/chromium/net/dns/opt_record_rdata.h
@@ -0,0 +1,225 @@
+// Copyright 2022 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.
+
+#ifndef NET_DNS_OPT_RECORD_RDATA_H_
+#define NET_DNS_OPT_RECORD_RDATA_H_
+
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/strings/string_piece.h"
+#include "net/base/net_export.h"
+#include "net/dns/public/dns_protocol.h"
+#include "net/dns/record_rdata.h"
+
+namespace net {
+
+// OPT record format (https://tools.ietf.org/html/rfc6891):
+class NET_EXPORT_PRIVATE OptRecordRdata : public RecordRdata {
+ public:
+ static std::unique_ptr<OptRecordRdata> Create(base::StringPiece data);
+
+ class NET_EXPORT_PRIVATE Opt {
+ public:
+ static constexpr size_t kHeaderSize = 4; // sizeof(code) + sizeof(size)
+
+ Opt() = delete;
+ explicit Opt(std::string data);
+
+ Opt(const Opt& other) = delete;
+ Opt& operator=(const Opt& other) = delete;
+ Opt(Opt&& other) = delete;
+ Opt& operator=(Opt&& other) = delete;
+ virtual ~Opt() = default;
+
+ bool operator==(const Opt& other) const;
+ bool operator!=(const Opt& other) const;
+
+ virtual uint16_t GetCode() const = 0;
+ base::StringPiece data() const { return data_; }
+
+ private:
+ bool IsEqual(const Opt& other) const;
+ std::string data_;
+ };
+
+ class NET_EXPORT_PRIVATE EdeOpt : public Opt {
+ public:
+ static const uint16_t kOptCode = dns_protocol::kEdnsExtendedDnsError;
+
+ // The following errors are defined by in the IANA registry.
+ // https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#extended-dns-error-codes
+ enum EdeInfoCode {
+ kOtherError,
+ kUnsupportedDnskeyAlgorithm,
+ kUnsupportedDsDigestType,
+ kStaleAnswer,
+ kForgedAnswer,
+ kDnssecIndeterminate,
+ kDnssecBogus,
+ kSignatureExpired,
+ kSignatureNotYetValid,
+ kDnskeyMissing,
+ kRrsigsMissing,
+ kNoZoneKeyBitSet,
+ kNsecMissing,
+ kCachedError,
+ kNotReady,
+ kBlocked,
+ kCensored,
+ kFiltered,
+ kProhibited,
+ kStaleNxdomainAnswer,
+ kNotAuthoritative,
+ kNotSupported,
+ kNoReachableAuthority,
+ kNetworkError,
+ kInvalidData,
+ kSignatureExpiredBeforeValid,
+ kTooEarly,
+ kUnsupportedNsec3IterationsValue,
+ // Note: kUnrecognizedErrorCode is not defined by RFC 8914.
+ // Used when error code does not match existing RFC error code.
+ kUnrecognizedErrorCode
+ };
+
+ EdeOpt(uint16_t info_code, std::string extra_text);
+
+ EdeOpt(const EdeOpt& other) = delete;
+ EdeOpt& operator=(const EdeOpt& other) = delete;
+ EdeOpt(EdeOpt&& other) = delete;
+ EdeOpt& operator=(EdeOpt&& other) = delete;
+ ~EdeOpt() override;
+
+ // Attempts to parse an EDE option from `data`. Returns nullptr on failure.
+ static std::unique_ptr<EdeOpt> Create(std::string data);
+
+ uint16_t GetCode() const override;
+ uint16_t info_code() const { return info_code_; }
+ base::StringPiece extra_text() const { return extra_text_; }
+
+ EdeInfoCode GetEnumFromInfoCode() const;
+
+ // Convert a uint16_t to an EdeInfoCode enum.
+ static EdeInfoCode GetEnumFromInfoCode(uint16_t info_code);
+
+ private:
+ EdeOpt();
+
+ uint16_t info_code_;
+ std::string extra_text_;
+ };
+
+ class NET_EXPORT_PRIVATE PaddingOpt : public Opt {
+ public:
+ static const uint16_t kOptCode = dns_protocol::kEdnsPadding;
+
+ PaddingOpt() = delete;
+ // Construct a PaddingOpt with the specified padding string.
+ explicit PaddingOpt(std::string padding);
+ // Constructs PaddingOpt with '\0' character padding of specified length.
+ // Note: This padding_len only specifies the length of the data section.
+ // Users must take into account the header length `Opt::kHeaderSize`
+ explicit PaddingOpt(uint16_t padding_len);
+
+ PaddingOpt(const PaddingOpt& other) = delete;
+ PaddingOpt& operator=(const PaddingOpt& other) = delete;
+ PaddingOpt(PaddingOpt&& other) = delete;
+ PaddingOpt& operator=(PaddingOpt&& other) = delete;
+ ~PaddingOpt() override;
+
+ uint16_t GetCode() const override;
+ };
+
+ class NET_EXPORT_PRIVATE UnknownOpt : public Opt {
+ public:
+ UnknownOpt() = delete;
+ UnknownOpt(const UnknownOpt& other) = delete;
+ UnknownOpt& operator=(const UnknownOpt& other) = delete;
+ UnknownOpt(UnknownOpt&& other) = delete;
+ UnknownOpt& operator=(UnknownOpt&& other) = delete;
+ ~UnknownOpt() override;
+
+ // Create UnknownOpt with option code and data.
+ // Cannot instantiate UnknownOpt directly in order to prevent Opt with
+ // dedicated class class (ex. EdeOpt) from being stored in UnknownOpt.
+ // object.
+ // This method must purely be used for testing.
+ // Only the parser can instantiate an UnknownOpt object (via friend
+ // classes).
+ static std::unique_ptr<UnknownOpt> CreateForTesting(uint16_t code,
+ std::string data);
+
+ uint16_t GetCode() const override;
+
+ private:
+ UnknownOpt(uint16_t code, std::string data);
+
+ uint16_t code_;
+
+ friend std::unique_ptr<OptRecordRdata> OptRecordRdata::Create(
+ base::StringPiece data);
+ };
+
+ static constexpr uint16_t kOptsWithDedicatedClasses[] = {
+ dns_protocol::kEdnsPadding, dns_protocol::kEdnsExtendedDnsError};
+
+ static const uint16_t kType = dns_protocol::kTypeOPT;
+
+ OptRecordRdata();
+
+ OptRecordRdata(const OptRecordRdata&) = delete;
+ OptRecordRdata& operator=(const OptRecordRdata&) = delete;
+
+ OptRecordRdata(OptRecordRdata&& other) = delete;
+ OptRecordRdata& operator=(OptRecordRdata&& other) = delete;
+
+ ~OptRecordRdata() override;
+
+ bool operator==(const OptRecordRdata& other) const;
+ bool operator!=(const OptRecordRdata& other) const;
+
+ // Checks whether two OptRecordRdata objects are equal. This comparison takes
+ // into account the order of insertion. Two OptRecordRdata objects with
+ // identical Opt records inserted in a different order will not be equal.
+ bool IsEqual(const RecordRdata* other) const override;
+
+ uint16_t Type() const override;
+ const std::vector<char>& buf() const { return buf_; }
+ const std::multimap<uint16_t, const std::unique_ptr<const Opt>>& opts()
+ const {
+ return opts_;
+ }
+
+ // Add specified Opt to rdata. Updates raw buffer as well.
+ void AddOpt(const std::unique_ptr<Opt> opt);
+
+ // Checks if an Opt with the specified opt_code is contained.
+ bool ContainsOptCode(uint16_t opt_code) const;
+
+ size_t OptCount() const { return opts_.size(); }
+
+ // Returns all options sorted by option code, using insertion order to break
+ // ties.
+ std::vector<const Opt*> GetOpts() const;
+
+ // Returns all EDE options in insertion order.
+ std::vector<const EdeOpt*> GetEdeOpts() const;
+
+ // Returns all Padding options in insertion order.
+ std::vector<const PaddingOpt*> GetPaddingOpts() const;
+
+ private:
+ // Opt objects are stored in a multimap; key is the opt code.
+ std::multimap<uint16_t, const std::unique_ptr<const Opt>> opts_;
+ std::vector<char> buf_;
+};
+
+} // namespace net
+
+#endif // NET_DNS_OPT_RECORD_RDATA_H_
diff --git a/chromium/net/dns/opt_record_rdata_unittest.cc b/chromium/net/dns/opt_record_rdata_unittest.cc
new file mode 100644
index 00000000000..7745bbcb08c
--- /dev/null
+++ b/chromium/net/dns/opt_record_rdata_unittest.cc
@@ -0,0 +1,459 @@
+// Copyright 2022 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.
+
+#include "net/dns/opt_record_rdata.h"
+
+#include <algorithm>
+#include <memory>
+#include <utility>
+
+#include "base/big_endian.h"
+#include "net/dns/dns_response.h"
+#include "net/dns/dns_test_util.h"
+#include "net/test/gtest_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace net {
+namespace {
+
+using ::testing::ElementsAreArray;
+using ::testing::IsNull;
+using ::testing::NotNull;
+using ::testing::SizeIs;
+
+base::StringPiece MakeStringPiece(const uint8_t* data, unsigned size) {
+ const char* data_cc = reinterpret_cast<const char*>(data);
+ return base::StringPiece(data_cc, size);
+}
+
+TEST(OptRecordRdataTest, ParseOptRecord) {
+ // This is just the rdata portion of an OPT record, rather than a complete
+ // record.
+ const uint8_t rdata[] = {
+ // First OPT
+ 0x00, 0x01, // OPT code
+ 0x00, 0x02, // OPT data size
+ 0xDE, 0xAD, // OPT data
+ // Second OPT
+ 0x00, 0xFF, // OPT code
+ 0x00, 0x04, // OPT data size
+ 0xDE, 0xAD, 0xBE, 0xEF // OPT data
+ };
+
+ base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
+ std::unique_ptr<OptRecordRdata> rdata_obj =
+ OptRecordRdata::Create(rdata_strpiece);
+
+ ASSERT_THAT(rdata_obj, NotNull());
+ ASSERT_EQ(rdata_obj->OptCount(), 2u);
+
+ // Check contains
+ ASSERT_TRUE(rdata_obj->ContainsOptCode(1));
+ ASSERT_FALSE(rdata_obj->ContainsOptCode(30));
+
+ // Check elements
+
+ // Note: When passing string or StringPiece as argument, make sure to
+ // construct arguments with length. Otherwise, strings containing a '\0'
+ // character will be truncated.
+ // https://crbug.com/1348679
+
+ std::unique_ptr<OptRecordRdata::UnknownOpt> opt0 =
+ OptRecordRdata::UnknownOpt::CreateForTesting(1,
+ std::string("\xde\xad", 2));
+ std::unique_ptr<OptRecordRdata::UnknownOpt> opt1 =
+ OptRecordRdata::UnknownOpt::CreateForTesting(
+ 255, std::string("\xde\xad\xbe\xef", 4));
+
+ ASSERT_EQ(*(rdata_obj->GetOpts()[0]), *(opt0.get()));
+ ASSERT_EQ(*(rdata_obj->GetOpts()[1]), *(opt1.get()));
+}
+
+TEST(OptRecordRdataTest, ParseOptRecordWithShorterSizeThanData) {
+ // This is just the rdata portion of an OPT record, rather than a complete
+ // record.
+ const uint8_t rdata[] = {
+ 0x00, 0xFF, // OPT code
+ 0x00, 0x02, // OPT data size (incorrect, should be 4)
+ 0xDE, 0xAD, 0xBE, 0xEF // OPT data
+ };
+
+ DnsRecordParser parser(rdata, sizeof(rdata), 0, /*num_records=*/0);
+ base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
+
+ std::unique_ptr<OptRecordRdata> rdata_obj =
+ OptRecordRdata::Create(rdata_strpiece);
+ ASSERT_THAT(rdata_obj, IsNull());
+}
+
+TEST(OptRecordRdataTest, ParseOptRecordWithLongerSizeThanData) {
+ // This is just the rdata portion of an OPT record, rather than a complete
+ // record.
+ const uint8_t rdata[] = {
+ 0x00, 0xFF, // OPT code
+ 0x00, 0x04, // OPT data size (incorrect, should be 4)
+ 0xDE, 0xAD // OPT data
+ };
+
+ DnsRecordParser parser(rdata, sizeof(rdata), 0, /*num_records=*/0);
+ base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
+
+ std::unique_ptr<OptRecordRdata> rdata_obj =
+ OptRecordRdata::Create(rdata_strpiece);
+ ASSERT_THAT(rdata_obj, IsNull());
+}
+
+TEST(OptRecordRdataTest, CreateEdeOpt) {
+ OptRecordRdata::EdeOpt opt0(22, std::string("Don Quixote"));
+
+ ASSERT_EQ(opt0.data(), std::string("\x00\x16"
+ "Don Quixote",
+ 13));
+ ASSERT_EQ(opt0.info_code(), 22u);
+ ASSERT_EQ(opt0.extra_text(), std::string("Don Quixote"));
+
+ std::unique_ptr<OptRecordRdata::EdeOpt> opt1 =
+ OptRecordRdata::EdeOpt::Create(std::string("\x00\x08"
+ "Manhattan",
+ 11));
+
+ ASSERT_EQ(opt1->data(), std::string("\x00\x08"
+ "Manhattan",
+ 11));
+ ASSERT_EQ(opt1->info_code(), 8u);
+ ASSERT_EQ(opt1->extra_text(), std::string("Manhattan"));
+}
+
+TEST(OptRecordRdataTest, TestEdeInfoCode) {
+ std::unique_ptr<OptRecordRdata::EdeOpt> edeOpt0 =
+ std::make_unique<OptRecordRdata::EdeOpt>(0, "bullettrain");
+ std::unique_ptr<OptRecordRdata::EdeOpt> edeOpt1 =
+ std::make_unique<OptRecordRdata::EdeOpt>(27, "ferrari");
+ std::unique_ptr<OptRecordRdata::EdeOpt> edeOpt2 =
+ std::make_unique<OptRecordRdata::EdeOpt>(28, "sukrit ganesh");
+ ASSERT_EQ(edeOpt0->GetEnumFromInfoCode(),
+ OptRecordRdata::EdeOpt::EdeInfoCode::kOtherError);
+ ASSERT_EQ(
+ edeOpt1->GetEnumFromInfoCode(),
+ OptRecordRdata::EdeOpt::EdeInfoCode::kUnsupportedNsec3IterationsValue);
+ ASSERT_EQ(edeOpt2->GetEnumFromInfoCode(),
+ OptRecordRdata::EdeOpt::EdeInfoCode::kUnrecognizedErrorCode);
+ ASSERT_EQ(OptRecordRdata::EdeOpt::GetEnumFromInfoCode(15),
+ OptRecordRdata::EdeOpt::kBlocked);
+}
+
+// Test that an Opt EDE record is parsed correctly
+TEST(OptRecordRdataTest, ParseEdeOptRecords) {
+ const uint8_t rdata[] = {
+ // First OPT (non-EDE record)
+ 0x00, 0x06, // OPT code (6)
+ 0x00, 0x04, // OPT data size (4)
+ 0xB0, 0xBA, 0xFE, 0x77, // OPT data (Boba Fett)
+
+ // Second OPT (EDE record)
+ 0x00, 0x0F, // OPT code (15 for EDE)
+ 0x00, 0x05, // OPT data size (info code + extra text)
+ 0x00, 0x0D, // EDE info code (13 for Cached Error)
+ 'M', 'T', 'A', // UTF-8 EDE extra text ("MTA")
+
+ // Third OPT (EDE record)
+ 0x00, 0x0F, // OPT code (15 for EDE)
+ 0x00, 0x06, // OPT data size (info code + extra text)
+ 0x00, 0x10, // EDE info code (16 for Censored)
+ 'M', 'B', 'T', 'A' // UTF-8 EDE extra text ("MBTA")
+ };
+
+ base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
+ std::unique_ptr<OptRecordRdata> rdata_obj =
+ OptRecordRdata::Create(rdata_strpiece);
+
+ // Test Size of Query
+ ASSERT_THAT(rdata_obj, NotNull());
+ ASSERT_EQ(rdata_obj->OptCount(), 3u);
+
+ // Test Unknown Opt
+ std::unique_ptr<OptRecordRdata::UnknownOpt> opt0 =
+ OptRecordRdata::UnknownOpt::CreateForTesting(
+ 6, std::string("\xb0\xba\xfe\x77", 4));
+
+ ASSERT_THAT(rdata_obj->GetOpts(), SizeIs(3));
+ ASSERT_EQ(*rdata_obj->GetOpts()[0], *opt0.get());
+
+ // Test EDE
+ OptRecordRdata::EdeOpt edeOpt0(13, std::string("MTA", 3));
+ OptRecordRdata::EdeOpt edeOpt1(16, std::string("MBTA", 4));
+
+ ASSERT_THAT(rdata_obj->GetEdeOpts(), SizeIs(2));
+ ASSERT_EQ(*rdata_obj->GetEdeOpts()[0], edeOpt0);
+ ASSERT_EQ(*rdata_obj->GetEdeOpts()[1], edeOpt1);
+
+ // Check that member variables are alright
+ ASSERT_EQ(rdata_obj->GetEdeOpts()[0]->data(), edeOpt0.data());
+ ASSERT_EQ(rdata_obj->GetEdeOpts()[1]->data(), edeOpt1.data());
+
+ ASSERT_EQ(rdata_obj->GetEdeOpts()[0]->extra_text(), std::string("MTA", 3));
+ ASSERT_EQ(rdata_obj->GetEdeOpts()[1]->extra_text(), std::string("MBTA", 4));
+
+ ASSERT_EQ(rdata_obj->GetEdeOpts()[0]->info_code(), edeOpt0.info_code());
+ ASSERT_EQ(rdata_obj->GetEdeOpts()[1]->info_code(), edeOpt1.info_code());
+}
+
+// Test the Opt equality operator (and its subclasses as well)
+TEST(OptRecordRdataTest, OptEquality) {
+ // `rdata_obj0` second opt has extra text "BIOS"
+ // `rdata_obj1` second opt has extra text "BIOO"
+ // Note: rdata_obj0 and rdata_obj1 have 2 common Opts and 1 different one.
+ OptRecordRdata rdata_obj0;
+ rdata_obj0.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 6, std::string("\xb0\xba\xfe\x77", 4)));
+ rdata_obj0.AddOpt(
+ std::make_unique<OptRecordRdata::EdeOpt>(13, std::string("USA", 3)));
+ rdata_obj0.AddOpt(
+ std::make_unique<OptRecordRdata::EdeOpt>(16, std::string("BIOS", 4)));
+ ASSERT_EQ(rdata_obj0.OptCount(), 3u);
+
+ OptRecordRdata rdata_obj1;
+ rdata_obj1.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 6, std::string("\xb0\xba\xfe\x77", 4)));
+ rdata_obj1.AddOpt(
+ std::make_unique<OptRecordRdata::EdeOpt>(13, std::string("USA", 3)));
+ rdata_obj1.AddOpt(
+ std::make_unique<OptRecordRdata::EdeOpt>(16, std::string("BIOO", 4)));
+ ASSERT_EQ(rdata_obj1.OptCount(), 3u);
+
+ auto opts0 = rdata_obj0.GetOpts();
+ auto opts1 = rdata_obj1.GetOpts();
+ auto edeOpts0 = rdata_obj0.GetEdeOpts();
+ auto edeOpts1 = rdata_obj1.GetEdeOpts();
+ ASSERT_THAT(opts0, SizeIs(3));
+ ASSERT_THAT(opts1, SizeIs(3));
+ ASSERT_THAT(edeOpts0, SizeIs(2));
+ ASSERT_THAT(edeOpts1, SizeIs(2));
+
+ // Opt equality
+ ASSERT_EQ(*opts0[0], *opts1[0]);
+ ASSERT_EQ(*opts0[1], *opts1[1]);
+ ASSERT_NE(*opts0[0], *opts1[1]);
+
+ // EdeOpt equality
+ ASSERT_EQ(*edeOpts0[0], *edeOpts1[0]);
+ ASSERT_NE(*edeOpts0[1], *edeOpts1[1]);
+
+ // EdeOpt equality with Opt
+ ASSERT_EQ(*edeOpts0[0], *opts1[1]);
+ ASSERT_NE(*edeOpts0[1], *opts1[2]);
+
+ // Opt equality with EdeOpt
+ // Should work if raw data matches
+ ASSERT_EQ(*opts1[1], *edeOpts0[0]);
+ ASSERT_NE(*opts1[2], *edeOpts0[1]);
+}
+
+// Check that rdata is null if the data section of an EDE record is too small
+// (<2 bytes)
+TEST(OptRecordRdataTest, EdeRecordTooSmall) {
+ const uint8_t rdata[] = {
+ 0x00, 0x0F, // OPT code (15 for EDE)
+ 0x00, 0x01, // OPT data size (info code + extra text)
+ 0x00 // Fragment of Info Code
+ };
+
+ base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
+ std::unique_ptr<OptRecordRdata> rdata_obj =
+ OptRecordRdata::Create(rdata_strpiece);
+ ASSERT_THAT(rdata_obj, IsNull());
+}
+
+// Check that an EDE record with no extra text is parsed correctly.
+TEST(OptRecordRdataTest, EdeRecordNoExtraText) {
+ const uint8_t rdata[] = {
+ 0x00, 0x0F, // OPT code (15 for EDE)
+ 0x00, 0x02, // OPT data size (info code + extra text)
+ 0x00, 0x05 // Info Code
+ };
+
+ base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
+ std::unique_ptr<OptRecordRdata> rdata_obj =
+ OptRecordRdata::Create(rdata_strpiece);
+ ASSERT_THAT(rdata_obj, NotNull());
+ ASSERT_THAT(rdata_obj->GetEdeOpts(), SizeIs(1));
+ ASSERT_EQ(rdata_obj->GetEdeOpts()[0]->data(), std::string("\x00\x05", 2));
+ ASSERT_EQ(rdata_obj->GetEdeOpts()[0]->info_code(), 5u);
+ ASSERT_EQ(rdata_obj->GetEdeOpts()[0]->extra_text(), "");
+}
+
+// Check that an EDE record with non-UTF-8 fails to parse.
+TEST(OptRecordRdataTest, EdeRecordExtraTextNonUTF8) {
+ const uint8_t rdata[] = {
+ 0x00, 0x0F, // OPT code (15 for EDE)
+ 0x00, 0x06, // OPT data size (info code + extra text)
+ 0x00, 0x05, // Info Code
+ 0xB1, 0x05, 0xF0, 0x0D // Extra Text (non-UTF-8)
+ };
+
+ ASSERT_FALSE(base::IsStringUTF8(std::string("\xb1\x05\xf0\x0d", 4)));
+
+ base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
+ std::unique_ptr<OptRecordRdata> rdata_obj =
+ OptRecordRdata::Create(rdata_strpiece);
+ ASSERT_THAT(rdata_obj, IsNull());
+}
+
+// Check that an EDE record with an unknown info code is parsed correctly.
+TEST(OptRecordRdataTest, EdeRecordUnknownInfoCode) {
+ const uint8_t rdata[] = {
+ 0x00, 0x0F, // OPT code (15 for EDE)
+ 0x00, 0x08, // OPT data size (info code + extra text)
+ 0x00, 0x44, // Info Code (68 doesn't exist)
+ 'B', 'O', 'S', 'T', 'O', 'N' // Extra Text ("BOSTON")
+ };
+
+ base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
+ std::unique_ptr<OptRecordRdata> rdata_obj =
+ OptRecordRdata::Create(rdata_strpiece);
+ ASSERT_THAT(rdata_obj, NotNull());
+ ASSERT_THAT(rdata_obj->GetEdeOpts(), SizeIs(1));
+ auto* opt = rdata_obj->GetEdeOpts()[0];
+ ASSERT_EQ(opt->data(), std::string("\x00\x44"
+ "BOSTON",
+ 8));
+ ASSERT_EQ(opt->info_code(), 68u);
+ ASSERT_EQ(opt->extra_text(), std::string("BOSTON", 6));
+ ASSERT_EQ(opt->GetEnumFromInfoCode(),
+ OptRecordRdata::EdeOpt::EdeInfoCode::kUnrecognizedErrorCode);
+}
+
+TEST(OptRecordRdataTest, CreatePaddingOpt) {
+ std::unique_ptr<OptRecordRdata::PaddingOpt> opt0 =
+ std::make_unique<OptRecordRdata::PaddingOpt>(12);
+
+ ASSERT_EQ(opt0->data(), std::string(12, '\0'));
+ ASSERT_THAT(opt0->data(), SizeIs(12u));
+
+ std::unique_ptr<OptRecordRdata::PaddingOpt> opt1 =
+ std::make_unique<OptRecordRdata::PaddingOpt>("MASSACHUSETTS");
+
+ ASSERT_EQ(opt1->data(), std::string("MASSACHUSETTS"));
+ ASSERT_THAT(opt1->data(), SizeIs(13u));
+}
+
+TEST(OptRecordRdataTest, ParsePaddingOpt) {
+ const uint8_t rdata[] = {
+ // First OPT
+ 0x00, 0x0C, // OPT code
+ 0x00, 0x07, // OPT data size
+ 0xB0, 0x03, // OPT data padding (Book of Boba Fett)
+ 0x0F, 0xB0, 0xBA, 0xFE, 0x77,
+ };
+
+ base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
+ std::unique_ptr<OptRecordRdata> rdata_obj =
+ OptRecordRdata::Create(rdata_strpiece);
+
+ ASSERT_THAT(rdata_obj, NotNull());
+ ASSERT_EQ(rdata_obj->OptCount(), 1u);
+ ASSERT_THAT(rdata_obj->GetOpts(), SizeIs(1));
+ ASSERT_THAT(rdata_obj->GetPaddingOpts(), SizeIs(1));
+
+ // Check elements
+ OptRecordRdata::PaddingOpt opt0(
+ std::string("\xb0\x03\x0f\xb0\xba\xfe\x77", 7));
+
+ ASSERT_EQ(*(rdata_obj->GetOpts()[0]), opt0);
+ ASSERT_EQ(*(rdata_obj->GetPaddingOpts()[0]), opt0);
+ ASSERT_THAT(opt0.data(), SizeIs(7u));
+}
+
+TEST(OptRecordRdataTest, AddOptToOptRecord) {
+ // This is just the rdata portion of an OPT record, rather than a complete
+ // record.
+ const uint8_t expected_rdata[] = {
+ 0x00, 0xFF, // OPT code
+ 0x00, 0x04, // OPT data size
+ 0xDE, 0xAD, 0xBE, 0xEF // OPT data
+ };
+
+ OptRecordRdata rdata;
+ rdata.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 255, std::string("\xde\xad\xbe\xef", 4)));
+ EXPECT_THAT(rdata.buf(), ElementsAreArray(expected_rdata));
+}
+
+// Test the OptRecordRdata equality operator.
+// Equality must be order sensitive. If Opts are same but inserted in different
+// order, test will fail epically.
+TEST(OptRecordRdataTest, EqualityIsOptOrderSensitive) {
+ // Control rdata
+ OptRecordRdata rdata_obj0;
+ rdata_obj0.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 1, std::string("\xb0\xba\xfe\x77", 4)));
+ rdata_obj0.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 2, std::string("\xb1\x05\xf0\x0d", 4)));
+ ASSERT_EQ(rdata_obj0.OptCount(), 2u);
+
+ // Same as `rdata_obj0`
+ OptRecordRdata rdata_obj1;
+ rdata_obj1.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 1, std::string("\xb0\xba\xfe\x77", 4)));
+ rdata_obj1.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 2, std::string("\xb1\x05\xf0\x0d", 4)));
+ ASSERT_EQ(rdata_obj1.OptCount(), 2u);
+
+ ASSERT_EQ(rdata_obj0, rdata_obj1);
+
+ // Same contents as `rdata_obj0` & `rdata_obj1`, but different order
+ OptRecordRdata rdata_obj2;
+ rdata_obj2.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 2, std::string("\xb1\x05\xf0\x0d", 4)));
+ rdata_obj2.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 1, std::string("\xb0\xba\xfe\x77", 4)));
+ ASSERT_EQ(rdata_obj2.OptCount(), 2u);
+
+ // Order matters! obj0 and obj2 contain same Opts but in different order.
+ ASSERT_FALSE(rdata_obj0.IsEqual(&rdata_obj2));
+
+ // Contains only `rdata_obj0` first opt
+ // 2nd opt is added later
+ OptRecordRdata rdata_obj3;
+ rdata_obj3.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 1, std::string("\xb0\xba\xfe\x77", 4)));
+ ASSERT_EQ(rdata_obj3.OptCount(), 1u);
+
+ ASSERT_FALSE(rdata_obj0.IsEqual(&rdata_obj3));
+
+ rdata_obj3.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 2, std::string("\xb1\x05\xf0\x0d", 4)));
+
+ ASSERT_TRUE(rdata_obj0.IsEqual(&rdata_obj3));
+
+ // Test == operator
+ ASSERT_TRUE(rdata_obj0 == rdata_obj1);
+ ASSERT_EQ(rdata_obj0, rdata_obj1);
+ ASSERT_NE(rdata_obj0, rdata_obj2);
+}
+
+// Test that GetOpts() follows specified order.
+// Sort by key, then by insertion order.
+TEST(OptRecordRdataTest, TestGetOptsOrder) {
+ OptRecordRdata rdata_obj0;
+ rdata_obj0.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 10, std::string("\x33\x33", 2)));
+ rdata_obj0.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 5, std::string("\x11\x11", 2)));
+ rdata_obj0.AddOpt(OptRecordRdata::UnknownOpt::CreateForTesting(
+ 5, std::string("\x22\x22", 2)));
+ ASSERT_EQ(rdata_obj0.OptCount(), 3u);
+
+ auto opts = rdata_obj0.GetOpts();
+ ASSERT_EQ(opts[0]->data(),
+ std::string("\x11\x11", 2)); // opt code 5 (inserted first)
+ ASSERT_EQ(opts[1]->data(),
+ std::string("\x22\x22", 2)); // opt code 5 (inserted second)
+ ASSERT_EQ(opts[2]->data(), std::string("\x33\x33", 2)); // opt code 10
+}
+
+} // namespace
+} // namespace net
diff --git a/chromium/net/dns/public/dns_protocol.h b/chromium/net/dns/public/dns_protocol.h
index 4ce7a4537cd..f3d28dee01a 100644
--- a/chromium/net/dns/public/dns_protocol.h
+++ b/chromium/net/dns/public/dns_protocol.h
@@ -190,7 +190,8 @@ static const uint8_t kRcodeREFUSED = 5;
// DNS EDNS(0) option codes (OPT)
//
// https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-11
-static const uint16_t kEdnsPadding = 12;
+static constexpr uint16_t kEdnsPadding = 12;
+static constexpr uint16_t kEdnsExtendedDnsError = 15;
// DNS header flags.
//
diff --git a/chromium/net/dns/public/resolve_error_info.cc b/chromium/net/dns/public/resolve_error_info.cc
index f61c3a406d4..cffd65f6bd5 100644
--- a/chromium/net/dns/public/resolve_error_info.cc
+++ b/chromium/net/dns/public/resolve_error_info.cc
@@ -6,7 +6,7 @@
namespace net {
-ResolveErrorInfo::ResolveErrorInfo() {}
+ResolveErrorInfo::ResolveErrorInfo() = default;
ResolveErrorInfo::ResolveErrorInfo(int resolve_error,
bool is_secure_network_error)
diff --git a/chromium/net/dns/public/resolve_error_info.h b/chromium/net/dns/public/resolve_error_info.h
index 07274f67ac1..2b8d49cfc35 100644
--- a/chromium/net/dns/public/resolve_error_info.h
+++ b/chromium/net/dns/public/resolve_error_info.h
@@ -13,7 +13,8 @@ namespace net {
// Host resolution error info.
struct NET_EXPORT ResolveErrorInfo {
ResolveErrorInfo();
- ResolveErrorInfo(int resolve_error, bool is_secure_network_error = false);
+ explicit ResolveErrorInfo(int resolve_error,
+ bool is_secure_network_error = false);
ResolveErrorInfo(const ResolveErrorInfo& resolve_error_info);
ResolveErrorInfo(ResolveErrorInfo&& other);
diff --git a/chromium/net/dns/record_parsed.cc b/chromium/net/dns/record_parsed.cc
index acd6a400ea0..3d470349c94 100644
--- a/chromium/net/dns/record_parsed.cc
+++ b/chromium/net/dns/record_parsed.cc
@@ -7,8 +7,10 @@
#include <utility>
#include "base/logging.h"
+#include "base/memory/ptr_util.h"
#include "net/dns/dns_response.h"
#include "net/dns/https_record_rdata.h"
+#include "net/dns/opt_record_rdata.h"
#include "net/dns/record_rdata.h"
namespace net {
@@ -62,7 +64,7 @@ std::unique_ptr<const RecordParsed> RecordParsed::CreateFrom(
rdata = NsecRecordRdata::Create(record.rdata, *parser);
break;
case OptRecordRdata::kType:
- rdata = OptRecordRdata::Create(record.rdata, *parser);
+ rdata = OptRecordRdata::Create(record.rdata);
break;
case IntegrityRecordRdata::kType:
rdata = IntegrityRecordRdata::Create(record.rdata);
@@ -82,9 +84,9 @@ std::unique_ptr<const RecordParsed> RecordParsed::CreateFrom(
if (!rdata.get() && !unrecognized_type)
return nullptr;
- return std::unique_ptr<const RecordParsed>(
- new RecordParsed(record.name, record.type, record.klass, record.ttl,
- std::move(rdata), time_created));
+ return base::WrapUnique(new RecordParsed(record.name, record.type,
+ record.klass, record.ttl,
+ std::move(rdata), time_created));
}
bool RecordParsed::IsEqual(const RecordParsed* other, bool is_mdns) const {
diff --git a/chromium/net/dns/record_rdata.cc b/chromium/net/dns/record_rdata.cc
index 8e969a16d70..a136a10ff36 100644
--- a/chromium/net/dns/record_rdata.cc
+++ b/chromium/net/dns/record_rdata.cc
@@ -65,7 +65,7 @@ std::unique_ptr<SrvRecordRdata> SrvRecordRdata::Create(
if (!HasValidSize(data, kType))
return nullptr;
- std::unique_ptr<SrvRecordRdata> rdata(new SrvRecordRdata);
+ auto rdata = base::WrapUnique(new SrvRecordRdata());
auto reader = base::BigEndianReader::FromStringPiece(data);
// 2 bytes for priority, 2 bytes for weight, 2 bytes for port.
@@ -104,7 +104,7 @@ std::unique_ptr<ARecordRdata> ARecordRdata::Create(
if (!HasValidSize(data, kType))
return nullptr;
- std::unique_ptr<ARecordRdata> rdata(new ARecordRdata);
+ auto rdata = base::WrapUnique(new ARecordRdata());
rdata->address_ =
IPAddress(reinterpret_cast<const uint8_t*>(data.data()), data.length());
return rdata;
@@ -131,7 +131,7 @@ std::unique_ptr<AAAARecordRdata> AAAARecordRdata::Create(
if (!HasValidSize(data, kType))
return nullptr;
- std::unique_ptr<AAAARecordRdata> rdata(new AAAARecordRdata);
+ auto rdata = base::WrapUnique(new AAAARecordRdata());
rdata->address_ =
IPAddress(reinterpret_cast<const uint8_t*>(data.data()), data.length());
return rdata;
@@ -155,7 +155,7 @@ CnameRecordRdata::~CnameRecordRdata() = default;
std::unique_ptr<CnameRecordRdata> CnameRecordRdata::Create(
const base::StringPiece& data,
const DnsRecordParser& parser) {
- std::unique_ptr<CnameRecordRdata> rdata(new CnameRecordRdata);
+ auto rdata = base::WrapUnique(new CnameRecordRdata());
if (!parser.ReadName(data.begin(), &rdata->cname_))
return nullptr;
@@ -182,7 +182,7 @@ PtrRecordRdata::~PtrRecordRdata() = default;
std::unique_ptr<PtrRecordRdata> PtrRecordRdata::Create(
const base::StringPiece& data,
const DnsRecordParser& parser) {
- std::unique_ptr<PtrRecordRdata> rdata(new PtrRecordRdata);
+ auto rdata = base::WrapUnique(new PtrRecordRdata());
if (!parser.ReadName(data.begin(), &rdata->ptrdomain_))
return nullptr;
@@ -208,7 +208,7 @@ TxtRecordRdata::~TxtRecordRdata() = default;
std::unique_ptr<TxtRecordRdata> TxtRecordRdata::Create(
const base::StringPiece& data,
const DnsRecordParser& parser) {
- std::unique_ptr<TxtRecordRdata> rdata(new TxtRecordRdata);
+ auto rdata = base::WrapUnique(new TxtRecordRdata());
for (size_t i = 0; i < data.size(); ) {
uint8_t length = data[i];
@@ -243,7 +243,7 @@ NsecRecordRdata::~NsecRecordRdata() = default;
std::unique_ptr<NsecRecordRdata> NsecRecordRdata::Create(
const base::StringPiece& data,
const DnsRecordParser& parser) {
- std::unique_ptr<NsecRecordRdata> rdata(new NsecRecordRdata);
+ auto rdata = base::WrapUnique(new NsecRecordRdata());
// Read the "next domain". This part for the NSEC record format is
// ignored for mDNS, since it has no semantic meaning.
@@ -302,82 +302,6 @@ bool NsecRecordRdata::GetBit(unsigned i) const {
return (bitmap_[byte_num] & (1 << bit_num)) != 0;
}
-OptRecordRdata::OptRecordRdata() = default;
-
-OptRecordRdata::OptRecordRdata(OptRecordRdata&& other) = default;
-
-OptRecordRdata::~OptRecordRdata() = default;
-
-OptRecordRdata& OptRecordRdata::operator=(OptRecordRdata&& other) = default;
-
-// static
-std::unique_ptr<OptRecordRdata> OptRecordRdata::Create(
- const base::StringPiece& data,
- const DnsRecordParser& parser) {
- std::unique_ptr<OptRecordRdata> rdata(new OptRecordRdata);
- rdata->buf_.assign(data.begin(), data.end());
-
- auto reader = base::BigEndianReader::FromStringPiece(data);
- while (reader.remaining() > 0) {
- uint16_t opt_code, opt_data_size;
- base::StringPiece opt_data;
-
- if (!(reader.ReadU16(&opt_code) && reader.ReadU16(&opt_data_size) &&
- reader.ReadPiece(&opt_data, opt_data_size))) {
- return nullptr;
- }
- rdata->opts_.push_back(Opt(opt_code, opt_data));
- }
-
- return rdata;
-}
-
-uint16_t OptRecordRdata::Type() const {
- return OptRecordRdata::kType;
-}
-
-bool OptRecordRdata::IsEqual(const RecordRdata* other) const {
- if (other->Type() != Type())
- return false;
- const OptRecordRdata* opt_other = static_cast<const OptRecordRdata*>(other);
- return opt_other->opts_ == opts_;
-}
-
-void OptRecordRdata::AddOpt(const Opt& opt) {
- base::StringPiece opt_data = opt.data();
-
- // Resize buffer to accommodate new OPT.
- const size_t orig_rdata_size = buf_.size();
- buf_.resize(orig_rdata_size + Opt::kHeaderSize + opt_data.size());
-
- // Start writing from the end of the existing rdata.
- base::BigEndianWriter writer(buf_.data() + orig_rdata_size, buf_.size());
- bool success = writer.WriteU16(opt.code()) &&
- writer.WriteU16(opt_data.size()) &&
- writer.WriteBytes(opt_data.data(), opt_data.size());
- DCHECK(success);
-
- opts_.push_back(opt);
-}
-
-void OptRecordRdata::AddOpts(const OptRecordRdata& other) {
- buf_.insert(buf_.end(), other.buf_.begin(), other.buf_.end());
- opts_.insert(opts_.end(), other.opts_.begin(), other.opts_.end());
-}
-
-bool OptRecordRdata::ContainsOptCode(uint16_t opt_code) const {
- return std::any_of(
- opts_.begin(), opts_.end(),
- [=](const OptRecordRdata::Opt& opt) { return opt.code() == opt_code; });
-}
-
-OptRecordRdata::Opt::Opt(uint16_t code, base::StringPiece data)
- : code_(code), data_(data) {}
-
-bool OptRecordRdata::Opt::operator==(const OptRecordRdata::Opt& other) const {
- return code_ == other.code_ && data_ == other.data_;
-}
-
IntegrityRecordRdata::IntegrityRecordRdata(Nonce nonce)
: nonce_(std::move(nonce)), digest_(Hash(nonce_)), is_intact_(true) {}
diff --git a/chromium/net/dns/record_rdata.h b/chromium/net/dns/record_rdata.h
index 6097b96bb66..fec14d0078c 100644
--- a/chromium/net/dns/record_rdata.h
+++ b/chromium/net/dns/record_rdata.h
@@ -7,6 +7,7 @@
#include <stdint.h>
+#include <map>
#include <memory>
#include <string>
#include <vector>
@@ -29,7 +30,7 @@ class DnsRecordParser;
// DNS record data such as TTL, Name, Type and Class.
class NET_EXPORT RecordRdata {
public:
- virtual ~RecordRdata() {}
+ virtual ~RecordRdata() = default;
// Return true if `data` represents RDATA in the wire format with a valid size
// for the give `type`. Always returns true for unrecognized `type`s as the
@@ -227,58 +228,6 @@ class NET_EXPORT_PRIVATE NsecRecordRdata : public RecordRdata {
std::vector<uint8_t> bitmap_;
};
-// OPT record format (https://tools.ietf.org/html/rfc6891):
-class NET_EXPORT_PRIVATE OptRecordRdata : public RecordRdata {
- public:
- class NET_EXPORT_PRIVATE Opt {
- public:
- static constexpr size_t kHeaderSize = 4; // sizeof(code) + sizeof(size)
-
- Opt(uint16_t code, base::StringPiece data);
-
- bool operator==(const Opt& other) const;
-
- uint16_t code() const { return code_; }
- base::StringPiece data() const { return data_; }
-
- private:
- uint16_t code_;
- std::string data_;
- };
-
- static const uint16_t kType = dns_protocol::kTypeOPT;
-
- OptRecordRdata();
-
- OptRecordRdata(const OptRecordRdata&) = delete;
- OptRecordRdata& operator=(const OptRecordRdata&) = delete;
-
- OptRecordRdata(OptRecordRdata&& other);
-
- ~OptRecordRdata() override;
-
- OptRecordRdata& operator=(OptRecordRdata&& other);
-
- static std::unique_ptr<OptRecordRdata> Create(const base::StringPiece& data,
- const DnsRecordParser& parser);
- bool IsEqual(const RecordRdata* other) const override;
- uint16_t Type() const override;
-
- const std::vector<char>& buf() const { return buf_; }
-
- const std::vector<Opt>& opts() const { return opts_; }
- void AddOpt(const Opt& opt);
-
- // Add all Opts from |other| to |this|.
- void AddOpts(const OptRecordRdata& other);
-
- bool ContainsOptCode(uint16_t opt_code) const;
-
- private:
- std::vector<Opt> opts_;
- std::vector<char> buf_;
-};
-
// This class parses and serializes the INTEGRITY DNS record.
//
// This RR was invented for a preliminary HTTPSSVC experiment. See the public
diff --git a/chromium/net/dns/record_rdata_unittest.cc b/chromium/net/dns/record_rdata_unittest.cc
index 2f27a63d550..f507d84ebbb 100644
--- a/chromium/net/dns/record_rdata_unittest.cc
+++ b/chromium/net/dns/record_rdata_unittest.cc
@@ -241,82 +241,6 @@ TEST(RecordRdataTest, CreateNsecRecordWithOversizedBitmapReturnsNull) {
ASSERT_FALSE(record_obj);
}
-TEST(RecordRdataTest, ParseOptRecord) {
- // This is just the rdata portion of an OPT record, rather than a complete
- // record.
- const uint8_t rdata[] = {
- // First OPT
- 0x00, 0x01, // OPT code
- 0x00, 0x02, // OPT data size
- 0xDE, 0xAD, // OPT data
- // Second OPT
- 0x00, 0xFF, // OPT code
- 0x00, 0x04, // OPT data size
- 0xDE, 0xAD, 0xBE, 0xEF // OPT data
- };
-
- DnsRecordParser parser(rdata, sizeof(rdata), 0, /*num_records=*/0);
- base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
-
- std::unique_ptr<OptRecordRdata> rdata_obj =
- OptRecordRdata::Create(rdata_strpiece, parser);
- ASSERT_THAT(rdata_obj, NotNull());
- ASSERT_THAT(rdata_obj->opts(), SizeIs(2));
- ASSERT_EQ(1, rdata_obj->opts()[0].code());
- ASSERT_EQ("\xde\xad", rdata_obj->opts()[0].data());
- ASSERT_EQ(255, rdata_obj->opts()[1].code());
- ASSERT_EQ("\xde\xad\xbe\xef", rdata_obj->opts()[1].data());
- ASSERT_TRUE(rdata_obj->IsEqual(rdata_obj.get()));
-}
-
-TEST(RecordRdataTest, ParseOptRecordWithShorterSizeThanData) {
- // This is just the rdata portion of an OPT record, rather than a complete
- // record.
- const uint8_t rdata[] = {
- 0x00, 0xFF, // OPT code
- 0x00, 0x02, // OPT data size (incorrect, should be 4)
- 0xDE, 0xAD, 0xBE, 0xEF // OPT data
- };
-
- DnsRecordParser parser(rdata, sizeof(rdata), 0, /*num_records=*/0);
- base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
-
- std::unique_ptr<OptRecordRdata> rdata_obj =
- OptRecordRdata::Create(rdata_strpiece, parser);
- ASSERT_THAT(rdata_obj, IsNull());
-}
-
-TEST(RecordRdataTest, ParseOptRecordWithLongerSizeThanData) {
- // This is just the rdata portion of an OPT record, rather than a complete
- // record.
- const uint8_t rdata[] = {
- 0x00, 0xFF, // OPT code
- 0x00, 0x04, // OPT data size (incorrect, should be 4)
- 0xDE, 0xAD // OPT data
- };
-
- DnsRecordParser parser(rdata, sizeof(rdata), 0, /*num_records=*/0);
- base::StringPiece rdata_strpiece = MakeStringPiece(rdata, sizeof(rdata));
-
- std::unique_ptr<OptRecordRdata> rdata_obj =
- OptRecordRdata::Create(rdata_strpiece, parser);
- ASSERT_THAT(rdata_obj, IsNull());
-}
-
-TEST(RecordRdataTest, AddOptToOptRecord) {
- // This is just the rdata portion of an OPT record, rather than a complete
- // record.
- const uint8_t expected_rdata[] = {
- 0x00, 0xFF, // OPT code
- 0x00, 0x04, // OPT data size
- 0xDE, 0xAD, 0xBE, 0xEF // OPT data
- };
-
- OptRecordRdata rdata;
- rdata.AddOpt(OptRecordRdata::Opt(255, "\xde\xad\xbe\xef"));
- EXPECT_THAT(rdata.buf(), ElementsAreArray(expected_rdata));
-}
-
// Test that for arbitrary IntegrityRecordRdata r, Parse(Serialize(r)) == r.
TEST(RecordRdataTest, IntegrityParseSerializeInverseProperty) {
IntegrityRecordRdata record(IntegrityRecordRdata::Random());
diff --git a/chromium/net/dns/resolve_context.cc b/chromium/net/dns/resolve_context.cc
index 52ffae34190..4a1a56f8350 100644
--- a/chromium/net/dns/resolve_context.cc
+++ b/chromium/net/dns/resolve_context.cc
@@ -142,10 +142,9 @@ std::unique_ptr<DnsServerIterator> ResolveContext::GetDohIterator(
// Make the iterator even if the session differs. The first call to the member
// functions will catch the out of date session.
- std::unique_ptr<DnsServerIterator> itr(new DohDnsServerIterator(
+ return std::make_unique<DohDnsServerIterator>(
doh_server_stats_.size(), FirstServerIndex(true, session),
- config.doh_attempts, config.attempts, mode, this, session));
- return itr;
+ config.doh_attempts, config.attempts, mode, this, session);
}
std::unique_ptr<DnsServerIterator> ResolveContext::GetClassicDnsIterator(
@@ -154,10 +153,9 @@ std::unique_ptr<DnsServerIterator> ResolveContext::GetClassicDnsIterator(
// Make the iterator even if the session differs. The first call to the member
// functions will catch the out of date session.
- std::unique_ptr<DnsServerIterator> itr(new ClassicDnsServerIterator(
+ return std::make_unique<ClassicDnsServerIterator>(
config.nameservers.size(), FirstServerIndex(false, session),
- config.attempts, config.attempts, this, session));
- return itr;
+ config.attempts, config.attempts, this, session);
}
bool ResolveContext::GetDohServerAvailability(size_t doh_server_index,
@@ -335,7 +333,7 @@ void ResolveContext::InvalidateCachesAndPerSessionData(
bool network_change) {
// Network-bound ResolveContexts should never receive a cache invalidation due
// to a network change.
- DCHECK(GetTargetNetwork() == NetworkChangeNotifier::kInvalidNetworkHandle ||
+ DCHECK(GetTargetNetwork() == handles::kInvalidNetworkHandle ||
!network_change);
if (host_cache_)
host_cache_->Invalidate();
@@ -382,9 +380,9 @@ void ResolveContext::InvalidateCachesAndPerSessionData(
NotifyDohStatusObserversOfUnavailable(network_change);
}
-NetworkChangeNotifier::NetworkHandle ResolveContext::GetTargetNetwork() const {
+handles::NetworkHandle ResolveContext::GetTargetNetwork() const {
if (!url_request_context())
- return NetworkChangeNotifier::kInvalidNetworkHandle;
+ return handles::kInvalidNetworkHandle;
return url_request_context()->bound_network();
}
diff --git a/chromium/net/dns/resolve_context.h b/chromium/net/dns/resolve_context.h
index f9153321cac..86dfdcde1ba 100644
--- a/chromium/net/dns/resolve_context.h
+++ b/chromium/net/dns/resolve_context.h
@@ -18,7 +18,7 @@
#include "base/time/time.h"
#include "net/base/isolation_info.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/dns/dns_config.h"
#include "net/dns/public/secure_dns_mode.h"
@@ -181,10 +181,10 @@ class NET_EXPORT_PRIVATE ResolveContext : public base::CheckedObserver {
// (alternative service info if it supports QUIC, for instance).
const IsolationInfo& isolation_info() const { return isolation_info_; }
- // Network to perform the DNS lookups for. When equal to kInvalidNetworkHandle
- // the decision of which one to target is left to the resolver.
- // Virtual for testing.
- virtual NetworkChangeNotifier::NetworkHandle GetTargetNetwork() const;
+ // Network to perform the DNS lookups for. When equal to
+ // handles::kInvalidNetworkHandle the decision of which one to target is left
+ // to the resolver. Virtual for testing.
+ virtual handles::NetworkHandle GetTargetNetwork() const;
base::SafeRef<ResolveContext> AsSafeRef() {
return weak_ptr_factory_.GetSafeRef();
diff --git a/chromium/net/dns/resolve_context_unittest.cc b/chromium/net/dns/resolve_context_unittest.cc
index 4543399ff67..4414b024b5f 100644
--- a/chromium/net/dns/resolve_context_unittest.cc
+++ b/chromium/net/dns/resolve_context_unittest.cc
@@ -332,7 +332,8 @@ TEST_F(ResolveContextTest, HostCacheInvalidation) {
HostResolverSource::ANY, NetworkIsolationKey());
context.host_cache()->Set(
key,
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN),
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN),
now, base::Seconds(10));
ASSERT_TRUE(context.host_cache()->Lookup(key, now));
@@ -347,7 +348,8 @@ TEST_F(ResolveContextTest, HostCacheInvalidation) {
// Re-add to the host cache and now add some DoH server status.
context.host_cache()->Set(
key,
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN),
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{},
+ HostCache::Entry::SOURCE_UNKNOWN),
now, base::Seconds(10));
context.RecordServerSuccess(0u /* server_index */, true /* is_doh_server */,
session.get());
@@ -383,7 +385,8 @@ TEST_F(ResolveContextTest, HostCacheInvalidation_SameSession) {
HostResolverSource::ANY, NetworkIsolationKey());
context.host_cache()->Set(
key,
- HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN),
+ HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{"example.com"},
+ HostCache::Entry::SOURCE_UNKNOWN),
now, base::Seconds(10));
context.RecordServerSuccess(0u /* server_index */, true /* is_doh_server */,
session.get());
diff --git a/chromium/net/docs/adding_doh_providers.md b/chromium/net/docs/adding_doh_providers.md
index ba05bc2587e..9d299dc1b1c 100644
--- a/chromium/net/docs/adding_doh_providers.md
+++ b/chromium/net/docs/adding_doh_providers.md
@@ -129,7 +129,7 @@ Chrome team on approval of the request.
Investigate any failures, especially concerning the modified
provider(s).
- For new providers, repeat the test 25-100 times (engineer judgement on
+ For new providers, repeat the test 25-100 times (exercise judgment on
how much scrutiny is necessary) for the specific provider to ensure the
provider is reliable:
```shell
@@ -157,27 +157,39 @@ Chrome team on approval of the request.
reviewer in [net OWNERS](/net/OWNERS). The reviewer should confirm that the
process defined in this document has been followed, especially that the bug
tracker request has been properly approved.
-1. If a provider must be intially disabled or partially disabled, e.g. because
+1. If a provider must be initially disabled or partially disabled, e.g. because
a provider with significant usage has requested a gradual controlled
- rollout, a Googler must modify the `DnsOverHttps.gcl` experiment config.
-
- *** aside
- TODO(dmcardle): Document the new procedure here, which will involve creating
- starting a new experiment for each gradual rollout. For some period of time,
- we'll need to mirror changes between new per-provider experiments and the
- old `DnsOverHttps.gcl`. Also mention that changes should be reflected in
- `testing/variations/fieldtrial_testing_config.json`.
- ***
+ rollout, a Googler must:
+ * Create a launch bug, e.g. the [Cox DoH provider launch
+ bug](https://crbug.com/1303146).
+ * Create a Finch config to roll out each DoH provider, e.g.
+ `DnsOverHttpsCox.gcl`.
+ * Ensure that the provider's `DohProviderEntry::feature` is disabled by
+ default and is enabled by the Finch config.
+ * Before landing the Finch config, make the corresponding changes in
+ [fieldtrial_testing_config.json](/testing/variations/fieldtrial_testing_config.json).
+ * Once the DoH provider's feature has been launched and the Finch
+ experiment has expired, `DohProviderEntry::feature` should be enabled
+ by default.
## Dynamic control
-Googlers may modify the `DnsOverHttps.gcl` experiment config to dynamically
-control Chrome DoH via Feature parameters. This support currently allows
-disabling or partially disabling individual providers.
+DoH providers, especially new ones, may have service interruptions or
+performance degradation to the point that it's necessary to disable their
+autoupgrade feature.
+
+If the malfunctioning DoH provider is still in the middle of a gradual rollout,
+Googlers may dynamically disable the provider by modifying its experiment config
+(`DnsOverHttps${ProviderName}.gcl`).
+
+Otherwise, if the provider's autoupgrade feature has already been launched,
+Googlers should create a new "kill switch config" rather than reuse the expired
+gradual rollout config. Follow the guidance at
+[go/finch-killswitch](http://go/finch-killswitch).
*** aside
If a user has selected a provider via the "Secure DNS" settings and that
-provider becomes disabled, the UI option will disapear from the dropdown but
+provider becomes disabled, the UI option will disappear from the dropdown but
selection will convert to a custom text-box entry for the same provider and
continue to be used for that user.
***
diff --git a/chromium/net/docs/bug-triage.md b/chromium/net/docs/bug-triage.md
index 45780fc689c..1db4d62f383 100644
--- a/chromium/net/docs/bug-triage.md
+++ b/chromium/net/docs/bug-triage.md
@@ -8,7 +8,7 @@ of their two days working on bug triage/investigation.
## 1. Review untriaged bugs
Look through [this list of untriaged
-bugs](https://bugs.chromium.org/p/chromium/issues/list?sort=pri%20-stars%20-opened&q=status%3Aunconfirmed%2Cuntriaged%20-Needs%3DFeedback%20-Label%3ANetwork-Triaged%20-has%3ANextAction%20component%3DInternals%3ENetwork%2CInternals%3ENetwork%3ECache%2CInternals%3ENetwork%3ESSL%2CInternals%3ENetwork%3EQUIC%2CInternals%3ENetwork%3EAuth%2CInternals%3ENetwork%3EHTTP2%2CInternals%3ENetwork%3EProxy%2CInternals%3ENetwork%3ELibrary%2CInternals%3ENetwork%3ELogging%2CInternals%3ENetwork%3EConnectivity%2CInternals%3ENetwork%3EDomainSecurityPolicy%2CInternals%3ENetwork%3EFTP).
+bugs](https://bugs.chromium.org/p/chromium/issues/list?sort=pri%20-stars%20-opened&q=status%3Aunconfirmed%2Cuntriaged%20-Needs%3DFeedback%20-Label%3ANetwork-Triaged%20-has%3ANextAction%20component%3DInternals%3ENetwork%2CInternals%3ENetwork%3ECache%2CInternals%3ENetwork%3ESSL%2CInternals%3ENetwork%3EQUIC%2CInternals%3ENetwork%3EAuth%2CInternals%3ENetwork%3EHTTP2%2CInternals%3ENetwork%3EProxy%2CInternals%3ENetwork%3ELibrary%2CInternals%3ENetwork%3ELogging%2CInternals%3ENetwork%3EConnectivity%2CInternals%3ENetwork%3EDomainSecurityPolicy%2CInternals%3ENetwork%3EFTP%2CInternals%3ENetwork%3EDNS).
The goal is for this query to be empty. Bugs can be removed from the triage queue
by doing any of the following:
@@ -72,7 +72,7 @@ crashers](https://goto.google.com/network_triage_internal#investigating-crashers
## 2. Follow-up on issues with the Needs-Feedback label
Look through [this list of Needs=Feedback
-bugs](https://bugs.chromium.org/p/chromium/issues/list?sort=-modified%20-modified&q=Needs%3DFeedback%20component%3DInternals%3ENetwork%2CInternals%3ENetwork%3ECache%2CInternals%3ENetwork%3ESSL%2CInternals%3ENetwork%3EQUIC%2CInternals%3ENetwork%3EAuth%2CInternals%3ENetwork%3EHTTP2%2CInternals%3ENetwork%3EProxy%2CInternals%3ENetwork%3ELibrary%2CInternals%3ENetwork%3ELogging%2CInternals%3ENetwork%3EConnectivity%2CInternals%3ENetwork%3EDomainSecurityPolicy%2CInternals%3ENetwork%3EFTP).
+bugs](https://bugs.chromium.org/p/chromium/issues/list?sort=-modified%20-modified&q=Needs%3DFeedback%20component%3DInternals%3ENetwork%2CInternals%3ENetwork%3ECache%2CInternals%3ENetwork%3ESSL%2CInternals%3ENetwork%3EQUIC%2CInternals%3ENetwork%3EAuth%2CInternals%3ENetwork%3EHTTP2%2CInternals%3ENetwork%3EProxy%2CInternals%3ENetwork%3ELibrary%2CInternals%3ENetwork%3ELogging%2CInternals%3ENetwork%3EConnectivity%2CInternals%3ENetwork%3EDomainSecurityPolicy%2CInternals%3ENetwork%3EFTP%2CInternals%3ENetwork%3EDNS).
* If the requested feedback was provided, review the new information and repeat
the same steps as (1) to re-triage based on the new information.
@@ -82,7 +82,7 @@ bugs](https://bugs.chromium.org/p/chromium/issues/list?sort=-modified%20-modifie
## 3. Ensure P0 and P1 bugs have an owner
Look through [the list of unowned high priority
-bugs](https://bugs.chromium.org/p/chromium/issues/list?sort=pri%20-stars%20-opened&q=Pri%3A0%2C1%20-has%3Aowner%20-label%3ANetwork-Triaged%20component%3DInternals%3ENetwork%2CInternals%3ENetwork%3ECache%2CInternals%3ENetwork%3ESSL%2CInternals%3ENetwork%3EQUIC%2CInternals%3ENetwork%3EAuth%2CInternals%3ENetwork%3EHTTP2%2CInternals%3ENetwork%3EProxy%2CInternals%3ENetwork%3ELibrary%2CInternals%3ENetwork%3ELogging%2CInternals%3ENetwork%3EConnectivity%2CInternals%3ENetwork%3EDomainSecurityPolicy%2CInternals%3ENetwork%3EFTP).
+bugs](https://bugs.chromium.org/p/chromium/issues/list?sort=pri%20-stars%20-opened&q=Pri%3A0%2C1%20-has%3Aowner%20-label%3ANetwork-Triaged%20component%3DInternals%3ENetwork%2CInternals%3ENetwork%3ECache%2CInternals%3ENetwork%3ESSL%2CInternals%3ENetwork%3EQUIC%2CInternals%3ENetwork%3EAuth%2CInternals%3ENetwork%3EHTTP2%2CInternals%3ENetwork%3EProxy%2CInternals%3ENetwork%3ELibrary%2CInternals%3ENetwork%3ELogging%2CInternals%3ENetwork%3EConnectivity%2CInternals%3ENetwork%3EDomainSecurityPolicy%2CInternals%3ENetwork%3EFTP%2CInternals%3ENetwork%3EDNS).
These bugs should either have an owner, or be downgraded to a lower priority.
## 4. (Optional) Look through crash reports
@@ -109,6 +109,7 @@ The ones that are included are:
Internals>Network
Internals>Network>Auth
Internals>Network>Cache
+Internals>Network>DNS
Internals>Network>Connectivity
Internals>Network>DomainSecurityPolicy
Internals>Network>FTP
@@ -129,7 +130,6 @@ Internals>Network>CertTrans
Internals>Network>Cookies
Internals>Network>DataProxy
Internals>Network>DataUse
-Internals>Network>DNS
Internals>Network>DoH
Internals>Network>EV
Internals>Network>NetInfo
diff --git a/chromium/net/docs/net-log.md b/chromium/net/docs/net-log.md
index ebf7ceee681..2a8a4559ad8 100644
--- a/chromium/net/docs/net-log.md
+++ b/chromium/net/docs/net-log.md
@@ -123,14 +123,14 @@ at all capture modes.
```
net_log.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED, [&] {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
base::Value certs(base::Value::Type::LIST);
std::vector<std::string> encoded_chain;
server_cert_->GetPEMEncodedChain(&encoded_chain);
for (auto& pem : encoded_chain)
certs.Append(std::move(pem));
- dict.SetKey("certificates", std::move(certs));
- return dict;
+ dict.Set("certificates", std::move(certs));
+ return base::Value(std::move(dict));
});
```
@@ -156,10 +156,10 @@ net_log.AddEvent(NetLogEventType::COOKIE_STORE_COOKIE_ADDED,
[&](NetLogCaptureMode capture_mode) {
if (!NetLogCaptureIncludesSensitive(capture_mode))
return base::Value();
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("name", cookie->Name());
- dict.SetStringKey("value", cookie->Value());
- return dict;
+ base::Value::Dict dict;
+ dict.Set("name", cookie->Name());
+ dict.Set("value", cookie->Value());
+ return base::Value(std::move(dict));
});
```
diff --git a/chromium/net/extras/preload_data/decoder.cc b/chromium/net/extras/preload_data/decoder.cc
index 3db5c680db3..9404796ca1c 100644
--- a/chromium/net/extras/preload_data/decoder.cc
+++ b/chromium/net/extras/preload_data/decoder.cc
@@ -6,9 +6,7 @@
#include "base/check_op.h"
#include "base/notreached.h"
-namespace net {
-
-namespace extras {
+namespace net::extras {
PreloadDecoder::BitReader::BitReader(const uint8_t* bytes, size_t num_bits)
: bytes_(bytes), num_bits_(num_bits), num_bytes_((num_bits + 7) / 8) {}
@@ -183,7 +181,7 @@ PreloadDecoder::PreloadDecoder(const uint8_t* huffman_tree,
bit_reader_(trie, trie_bits),
trie_root_position_(trie_root_position) {}
-PreloadDecoder::~PreloadDecoder() {}
+PreloadDecoder::~PreloadDecoder() = default;
bool PreloadDecoder::Decode(const std::string& search, bool* out_found) {
size_t bit_offset = trie_root_position_;
@@ -308,6 +306,4 @@ bool PreloadDecoder::Decode(const std::string& search, bool* out_found) {
NOTREACHED();
}
-} // namespace extras
-
-} // namespace net
+} // namespace net::extras
diff --git a/chromium/net/extras/preload_data/decoder.h b/chromium/net/extras/preload_data/decoder.h
index b6076ac344c..9186927f036 100644
--- a/chromium/net/extras/preload_data/decoder.h
+++ b/chromium/net/extras/preload_data/decoder.h
@@ -9,9 +9,7 @@
#include <string>
-namespace net {
-
-namespace extras {
+namespace net::extras {
// Decodes an entry from preloaded data.
// Clients must implement ReadEntry() method to read the specific type of data
@@ -159,8 +157,6 @@ class PreloadDecoder {
const size_t trie_root_position_;
};
-} // namespace extras
-
-} // namespace net
+} // namespace net::extras
#endif // NET_EXTRAS_PRELOAD_DATA_DECODER_H_
diff --git a/chromium/net/extras/sqlite/OWNERS b/chromium/net/extras/sqlite/OWNERS
index f0bb2c05d32..de3c3ef33b2 100644
--- a/chromium/net/extras/sqlite/OWNERS
+++ b/chromium/net/extras/sqlite/OWNERS
@@ -3,6 +3,7 @@ asully@chromium.org
# Secondary
ayui@chromium.org
+estade@chromium.org
per-file sqlite_persistent_cookie_store*=file://net/cookies/OWNERS
per-file sqlite_persistent_reporting_and_nel_store*=file://net/reporting/OWNERS
diff --git a/chromium/net/extras/sqlite/cookie_crypto_delegate.h b/chromium/net/extras/sqlite/cookie_crypto_delegate.h
index f4b466ddf77..389325f66e9 100644
--- a/chromium/net/extras/sqlite/cookie_crypto_delegate.h
+++ b/chromium/net/extras/sqlite/cookie_crypto_delegate.h
@@ -12,7 +12,7 @@ namespace net {
// Implements encryption and decryption for the persistent cookie store.
class COMPONENT_EXPORT(NET_EXTRAS) CookieCryptoDelegate {
public:
- virtual ~CookieCryptoDelegate() {}
+ virtual ~CookieCryptoDelegate() = default;
// Return if cookies should be encrypted on this platform. Decryption of
// previously encrypted cookies is always possible.
diff --git a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store.cc b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store.cc
index 945082ccd1b..071c35bf96f 100644
--- a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store.cc
+++ b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store.cc
@@ -864,8 +864,7 @@ bool SQLitePersistentCookieStore::Backend::DoInitializeDatabase() {
host_keys.push_back(smt.ColumnString(0));
// Build a map of domain keys (always eTLD+1) to domains.
- for (size_t idx = 0; idx < host_keys.size(); ++idx) {
- const std::string& domain = host_keys[idx];
+ for (const auto& domain : host_keys) {
std::string key = CookieMonster::GetKey(domain);
keys_to_load_[key].insert(domain);
}
@@ -1050,10 +1049,10 @@ bool SQLitePersistentCookieStore::Backend::MakeCookiesFromSQLStatement(
statement.ColumnInt(16)); // source_port
if (cc) {
DLOG_IF(WARNING, cc->CreationDate() > Time::Now())
- << L"CreationDate too recent";
+ << "CreationDate too recent";
if (!cc->LastUpdateDate().is_null()) {
DLOG_IF(WARNING, cc->LastUpdateDate() > Time::Now())
- << L"LastUpdateDate too recent";
+ << "LastUpdateDate too recent";
// In order to anticipate the potential effects of the expiry limit in
// rfc6265bis, we need to check how long it's been since the cookie was
// refreshed (if LastUpdateDate is populated). We use 100 buckets for
@@ -1446,7 +1445,7 @@ void SQLitePersistentCookieStore::Backend::BatchOperation(
DCHECK(!background_task_runner()->RunsTasksInCurrentSequence());
// We do a full copy of the cookie here, and hopefully just here.
- std::unique_ptr<PendingOperation> po(new PendingOperation(op, cc));
+ auto po = std::make_unique<PendingOperation>(op, cc);
PendingOperationsMap::size_type num_pending;
{
@@ -1720,12 +1719,11 @@ SQLitePersistentCookieStore::SQLitePersistentCookieStore(
const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
bool restore_old_session_cookies,
CookieCryptoDelegate* crypto_delegate)
- : backend_(new Backend(path,
- client_task_runner,
- background_task_runner,
- restore_old_session_cookies,
- crypto_delegate)) {
-}
+ : backend_(base::MakeRefCounted<Backend>(path,
+ client_task_runner,
+ background_task_runner,
+ restore_old_session_cookies,
+ crypto_delegate)) {}
void SQLitePersistentCookieStore::DeleteAllInList(
const std::list<CookieOrigin>& cookies) {
diff --git a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc
index f4e67841e2f..bd9ca68f816 100644
--- a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc
+++ b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc
@@ -94,7 +94,7 @@ class SQLitePersistentCookieStorePerfTest : public testing::Test {
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
- store_ = new SQLitePersistentCookieStore(
+ store_ = base::MakeRefCounted<SQLitePersistentCookieStore>(
temp_dir_.GetPath().Append(cookie_filename), client_task_runner_,
background_task_runner_, false, nullptr);
std::vector<CanonicalCookie*> cookies;
@@ -113,7 +113,7 @@ class SQLitePersistentCookieStorePerfTest : public testing::Test {
// Flush ThreadPool tasks, causing pending commits to run.
task_environment_.RunUntilIdle();
- store_ = new SQLitePersistentCookieStore(
+ store_ = base::MakeRefCounted<SQLitePersistentCookieStore>(
temp_dir_.GetPath().Append(cookie_filename), client_task_runner_,
background_task_runner_, false, nullptr);
}
diff --git a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
index 6d6e470626f..f71881f972b 100644
--- a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
+++ b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
@@ -149,7 +149,7 @@ class SQLitePersistentCookieStoreTest : public TestWithTaskEnvironment {
if (crypt_cookies)
cookie_crypto_delegate_ = std::make_unique<CookieCryptor>();
- store_ = new SQLitePersistentCookieStore(
+ store_ = base::MakeRefCounted<SQLitePersistentCookieStore>(
temp_dir_.GetPath().Append(kCookieFilename),
use_current_thread ? base::ThreadTaskRunnerHandle::Get()
: client_task_runner_,
@@ -321,7 +321,7 @@ TEST_F(SQLitePersistentCookieStoreTest, TestSessionCookiesDeletedOnStartup) {
// Load the store a second time. Before the store finishes loading, add a
// transient cookie and flush it to disk.
- store_ = new SQLitePersistentCookieStore(
+ store_ = base::MakeRefCounted<SQLitePersistentCookieStore>(
temp_dir_.GetPath().Append(kCookieFilename), client_task_runner_,
background_task_runner_, false, nullptr);
@@ -356,7 +356,7 @@ TEST_F(SQLitePersistentCookieStoreTest, TestSessionCookiesDeletedOnStartup) {
// Load the store a third time, this time restoring session cookies. The
// store should contain exactly 4 cookies: the 3 persistent, and "c.com",
// which was added during the second cookie store load.
- store_ = new SQLitePersistentCookieStore(
+ store_ = base::MakeRefCounted<SQLitePersistentCookieStore>(
temp_dir_.GetPath().Append(kCookieFilename), client_task_runner_,
background_task_runner_, true, nullptr);
store_->Load(base::BindOnce(&SQLitePersistentCookieStoreTest::OnLoaded,
@@ -1178,33 +1178,31 @@ bool AddV9CookiesToDBImpl(sql::Database* db,
return false;
sql::Transaction transaction(db);
transaction.Begin();
- for (size_t i = 0; i < cookies.size(); ++i) {
+ for (const auto& cookie : cookies) {
statement.Reset(true);
statement.BindInt64(
- 0,
- cookies[i].CreationDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
- statement.BindString(1, cookies[i].Domain());
- statement.BindString(2, cookies[i].Name());
- statement.BindString(3, cookies[i].Value());
+ 0, cookie.CreationDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
+ statement.BindString(1, cookie.Domain());
+ statement.BindString(2, cookie.Name());
+ statement.BindString(3, cookie.Value());
statement.BindBlob(4, base::span<uint8_t>()); // encrypted_value
- statement.BindString(5, cookies[i].Path());
+ statement.BindString(5, cookie.Path());
statement.BindInt64(
- 6, cookies[i].ExpiryDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
- statement.BindInt(7, cookies[i].IsSecure());
- statement.BindInt(8, cookies[i].IsHttpOnly());
+ 6, cookie.ExpiryDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
+ statement.BindInt(7, cookie.IsSecure());
+ statement.BindInt(8, cookie.IsHttpOnly());
// Note that this and Priority() below nominally rely on the enums in
// sqlite_persistent_cookie_store.cc having the same values as the
// ones in ../../cookies/cookie_constants.h. But nothing in this test
// relies on that equivalence, so it's not worth the hassle to guarantee
// that.
- statement.BindInt(9, static_cast<int>(cookies[i].SameSite()));
- statement.BindInt64(10, cookies[i]
- .LastAccessDate()
- .ToDeltaSinceWindowsEpoch()
- .InMicroseconds());
- statement.BindInt(11, cookies[i].IsPersistent());
- statement.BindInt(12, cookies[i].IsPersistent());
- statement.BindInt(13, static_cast<int>(cookies[i].Priority()));
+ statement.BindInt(9, static_cast<int>(cookie.SameSite()));
+ statement.BindInt64(
+ 10,
+ cookie.LastAccessDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
+ statement.BindInt(11, cookie.IsPersistent());
+ statement.BindInt(12, cookie.IsPersistent());
+ statement.BindInt(13, static_cast<int>(cookie.Priority()));
if (!statement.Run())
return false;
}
@@ -1655,33 +1653,31 @@ bool AddV10CookiesToDBImpl(sql::Database* db,
return false;
sql::Transaction transaction(db);
transaction.Begin();
- for (size_t i = 0; i < cookies.size(); ++i) {
+ for (const auto& cookie : cookies) {
statement.Reset(true);
statement.BindInt64(
- 0,
- cookies[i].CreationDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
- statement.BindString(1, cookies[i].Domain());
- statement.BindString(2, cookies[i].Name());
- statement.BindString(3, cookies[i].Value());
+ 0, cookie.CreationDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
+ statement.BindString(1, cookie.Domain());
+ statement.BindString(2, cookie.Name());
+ statement.BindString(3, cookie.Value());
statement.BindBlob(4, base::span<uint8_t>()); // encrypted_value
- statement.BindString(5, cookies[i].Path());
+ statement.BindString(5, cookie.Path());
statement.BindInt64(
- 6, cookies[i].ExpiryDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
- statement.BindInt(7, cookies[i].IsSecure());
- statement.BindInt(8, cookies[i].IsHttpOnly());
+ 6, cookie.ExpiryDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
+ statement.BindInt(7, cookie.IsSecure());
+ statement.BindInt(8, cookie.IsHttpOnly());
// Note that this and Priority() below nominally rely on the enums in
// sqlite_persistent_cookie_store.cc having the same values as the
// ones in ../../cookies/cookie_constants.h. But nothing in this test
// relies on that equivalence, so it's not worth the hassle to guarantee
// that.
- statement.BindInt(9, static_cast<int>(cookies[i].SameSite()));
- statement.BindInt64(10, cookies[i]
- .LastAccessDate()
- .ToDeltaSinceWindowsEpoch()
- .InMicroseconds());
- statement.BindInt(11, cookies[i].IsPersistent());
- statement.BindInt(12, cookies[i].IsPersistent());
- statement.BindInt(13, static_cast<int>(cookies[i].Priority()));
+ statement.BindInt(9, static_cast<int>(cookie.SameSite()));
+ statement.BindInt64(
+ 10,
+ cookie.LastAccessDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
+ statement.BindInt(11, cookie.IsPersistent());
+ statement.BindInt(12, cookie.IsPersistent());
+ statement.BindInt(13, static_cast<int>(cookie.Priority()));
if (!statement.Run())
return false;
}
@@ -2031,33 +2027,31 @@ bool AddV11CookiesToDB(sql::Database* db) {
return false;
sql::Transaction transaction(db);
transaction.Begin();
- for (size_t i = 0; i < cookies.size(); ++i) {
+ for (const auto& cookie : cookies) {
statement.Reset(true);
statement.BindInt64(
- 0,
- cookies[i].CreationDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
- statement.BindString(1, cookies[i].Domain());
- statement.BindString(2, cookies[i].Name());
- statement.BindString(3, cookies[i].Value());
+ 0, cookie.CreationDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
+ statement.BindString(1, cookie.Domain());
+ statement.BindString(2, cookie.Name());
+ statement.BindString(3, cookie.Value());
statement.BindBlob(4, base::span<uint8_t>()); // encrypted_value
- statement.BindString(5, cookies[i].Path());
+ statement.BindString(5, cookie.Path());
statement.BindInt64(
- 6, cookies[i].ExpiryDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
- statement.BindInt(7, cookies[i].IsSecure());
- statement.BindInt(8, cookies[i].IsHttpOnly());
+ 6, cookie.ExpiryDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
+ statement.BindInt(7, cookie.IsSecure());
+ statement.BindInt(8, cookie.IsHttpOnly());
// Note that this and Priority() below nominally rely on the enums in
// sqlite_persistent_cookie_store.cc having the same values as the
// ones in ../../cookies/cookie_constants.h. But nothing in this test
// relies on that equivalence, so it's not worth the hassle to guarantee
// that.
- statement.BindInt(9, static_cast<int>(cookies[i].SameSite()));
- statement.BindInt64(10, cookies[i]
- .LastAccessDate()
- .ToDeltaSinceWindowsEpoch()
- .InMicroseconds());
- statement.BindInt(11, cookies[i].IsPersistent());
- statement.BindInt(12, cookies[i].IsPersistent());
- statement.BindInt(13, static_cast<int>(cookies[i].Priority()));
+ statement.BindInt(9, static_cast<int>(cookie.SameSite()));
+ statement.BindInt64(
+ 10,
+ cookie.LastAccessDate().ToDeltaSinceWindowsEpoch().InMicroseconds());
+ statement.BindInt(11, cookie.IsPersistent());
+ statement.BindInt(12, cookie.IsPersistent());
+ statement.BindInt(13, static_cast<int>(cookie.Priority()));
if (!statement.Run())
return false;
}
diff --git a/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc b/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc
index e1fa9d9b6cb..b1fe702a420 100644
--- a/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc
+++ b/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc
@@ -1560,7 +1560,9 @@ SQLitePersistentReportingAndNelStore::SQLitePersistentReportingAndNelStore(
const base::FilePath& path,
const scoped_refptr<base::SequencedTaskRunner>& client_task_runner,
const scoped_refptr<base::SequencedTaskRunner>& background_task_runner)
- : backend_(new Backend(path, client_task_runner, background_task_runner)) {}
+ : backend_(base::MakeRefCounted<Backend>(path,
+ client_task_runner,
+ background_task_runner)) {}
SQLitePersistentReportingAndNelStore::~SQLitePersistentReportingAndNelStore() {
backend_->Close();
diff --git a/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc b/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc
index 5dedb65727c..e00ba9cb61a 100644
--- a/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc
+++ b/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc
@@ -668,7 +668,7 @@ TEST_F(SQLitePersistentReportingAndNelStoreTest,
// can be used by a NetworkErrorLoggingService to persist NEL policies.
class SQLitePersistNelTest : public SQLitePersistentReportingAndNelStoreTest {
public:
- SQLitePersistNelTest() {}
+ SQLitePersistNelTest() = default;
void SetUp() override {
SQLitePersistentReportingAndNelStoreTest::SetUp();
diff --git a/chromium/net/features.gni b/chromium/net/features.gni
index a812f6f75f6..3cf1e4ac161 100644
--- a/chromium/net/features.gni
+++ b/chromium/net/features.gni
@@ -47,5 +47,5 @@ declare_args() {
# Platforms for which the builtin cert verifier can use the Chrome Root Store.
# See https://crbug.com/1216547 for status.
- chrome_root_store_supported = is_win
+ chrome_root_store_supported = is_win || is_mac
}
diff --git a/chromium/net/filter/brotli_source_stream.cc b/chromium/net/filter/brotli_source_stream.cc
index 5e70877957b..82dd4ccc0c1 100644
--- a/chromium/net/filter/brotli_source_stream.cc
+++ b/chromium/net/filter/brotli_source_stream.cc
@@ -80,19 +80,20 @@ class BrotliSourceStream : public FilterSourceStream {
// SourceStream implementation
std::string GetTypeAsString() const override { return kBrotli; }
- int FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool /*upstream_eof_reached*/) override {
+ base::expected<size_t, Error> FilterData(
+ IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool /*upstream_eof_reached*/) override {
if (decoding_status_ == DecodingStatus::DECODING_DONE) {
*consumed_bytes = input_buffer_size;
- return OK;
+ return 0;
}
if (decoding_status_ != DecodingStatus::DECODING_IN_PROGRESS)
- return ERR_CONTENT_DECODING_FAILED;
+ return base::unexpected(ERR_CONTENT_DECODING_FAILED);
const uint8_t* next_in = base::bit_cast<uint8_t*>(input_buffer->data());
size_t available_in = input_buffer_size;
@@ -105,8 +106,8 @@ class BrotliSourceStream : public FilterSourceStream {
size_t bytes_used = input_buffer_size - available_in;
size_t bytes_written = output_buffer_size - available_out;
- CHECK_GE(bytes_used, 0u);
- CHECK_GE(bytes_written, 0u);
+ CHECK_GE(input_buffer_size, available_in);
+ CHECK_GE(output_buffer_size, available_out);
produced_bytes_ += bytes_written;
consumed_bytes_ += bytes_used;
@@ -129,7 +130,7 @@ class BrotliSourceStream : public FilterSourceStream {
// If the decompressor threw an error, fail synchronously.
default:
decoding_status_ = DecodingStatus::DECODING_ERROR;
- return ERR_CONTENT_DECODING_FAILED;
+ return base::unexpected(ERR_CONTENT_DECODING_FAILED);
}
}
diff --git a/chromium/net/filter/brotli_source_stream_fuzzer.cc b/chromium/net/filter/brotli_source_stream_fuzzer.cc
index e721ee1e9f3..1f83f6232e9 100644
--- a/chromium/net/filter/brotli_source_stream_fuzzer.cc
+++ b/chromium/net/filter/brotli_source_stream_fuzzer.cc
@@ -18,8 +18,8 @@
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
net::TestCompletionCallback callback;
FuzzedDataProvider data_provider(data, size);
- std::unique_ptr<net::FuzzedSourceStream> fuzzed_source_stream(
- new net::FuzzedSourceStream(&data_provider));
+ auto fuzzed_source_stream =
+ std::make_unique<net::FuzzedSourceStream>(&data_provider);
std::unique_ptr<net::SourceStream> brotli_stream =
net::CreateBrotliSourceStream(std::move(fuzzed_source_stream));
while (true) {
diff --git a/chromium/net/filter/brotli_source_stream_unittest.cc b/chromium/net/filter/brotli_source_stream_unittest.cc
index 817202b9cd3..9f847192d26 100644
--- a/chromium/net/filter/brotli_source_stream_unittest.cc
+++ b/chromium/net/filter/brotli_source_stream_unittest.cc
@@ -51,7 +51,7 @@ class BrotliSourceStreamTest : public PlatformTest {
ASSERT_TRUE(base::ReadFileToString(encoded_file_path, &encoded_buffer_));
ASSERT_GE(kDefaultBufferSize, encoded_buffer_.size());
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
source_ = source.get();
brotli_stream_ = CreateBrotliSourceStream(std::move(source));
}
diff --git a/chromium/net/filter/filter_source_stream.cc b/chromium/net/filter/filter_source_stream.cc
index ae08a47807a..16b46edc88c 100644
--- a/chromium/net/filter/filter_source_stream.cc
+++ b/chromium/net/filter/filter_source_stream.cc
@@ -56,7 +56,7 @@ int FilterSourceStream::Read(IOBuffer* read_buffer,
}
output_buffer_ = read_buffer;
- output_buffer_size_ = read_buffer_size;
+ output_buffer_size_ = base::checked_cast<size_t>(read_buffer_size);
int rv = DoLoop(OK);
if (rv == ERR_IO_PENDING)
@@ -152,30 +152,40 @@ int FilterSourceStream::DoFilterData() {
DCHECK(output_buffer_);
DCHECK(drainable_input_buffer_);
- int consumed_bytes = 0;
- int bytes_output = FilterData(output_buffer_.get(), output_buffer_size_,
- drainable_input_buffer_.get(),
- drainable_input_buffer_->BytesRemaining(),
- &consumed_bytes, upstream_end_reached_);
- DCHECK_LE(consumed_bytes, drainable_input_buffer_->BytesRemaining());
- DCHECK(bytes_output != 0 ||
- consumed_bytes == drainable_input_buffer_->BytesRemaining());
+ size_t consumed_bytes = 0;
+ base::expected<size_t, Error> bytes_output = FilterData(
+ output_buffer_.get(), output_buffer_size_, drainable_input_buffer_.get(),
+ drainable_input_buffer_->BytesRemaining(), &consumed_bytes,
+ upstream_end_reached_);
+ const auto bytes_remaining =
+ base::checked_cast<size_t>(drainable_input_buffer_->BytesRemaining());
+ if (bytes_output.has_value() && bytes_output.value() == 0) {
+ DCHECK_EQ(consumed_bytes, bytes_remaining);
+ } else {
+ DCHECK_LE(consumed_bytes, bytes_remaining);
+ }
// FilterData() is not allowed to return ERR_IO_PENDING.
- DCHECK_NE(ERR_IO_PENDING, bytes_output);
+ if (!bytes_output.has_value())
+ DCHECK_NE(ERR_IO_PENDING, bytes_output.error());
if (consumed_bytes > 0)
drainable_input_buffer_->DidConsume(consumed_bytes);
// Received data or encountered an error.
- if (bytes_output != 0)
- return bytes_output;
+ if (!bytes_output.has_value()) {
+ CHECK_LT(bytes_output.error(), 0);
+ return bytes_output.error();
+ }
+ if (bytes_output.value() != 0)
+ return base::checked_cast<int>(bytes_output.value());
+
// If no data is returned, continue reading if |this| needs more input.
if (NeedMoreData()) {
DCHECK_EQ(0, drainable_input_buffer_->BytesRemaining());
next_state_ = STATE_READ_DATA;
}
- return bytes_output;
+ return 0;
}
void FilterSourceStream::OnIOComplete(int result) {
diff --git a/chromium/net/filter/filter_source_stream.h b/chromium/net/filter/filter_source_stream.h
index 6450a55f85e..40af692b912 100644
--- a/chromium/net/filter/filter_source_stream.h
+++ b/chromium/net/filter/filter_source_stream.h
@@ -9,6 +9,7 @@
#include <string>
#include "base/memory/ref_counted.h"
+#include "base/types/expected.h"
#include "net/base/completion_once_callback.h"
#include "net/base/net_errors.h"
#include "net/base/net_export.h"
@@ -76,12 +77,13 @@ class NET_EXPORT_PRIVATE FilterSourceStream : public SourceStream {
// with |upstream_eof_reached| = true.
// TODO(xunjieli): consider allowing asynchronous response via callback
// to support off-thread decompression.
- virtual int FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool upstream_eof_reached) = 0;
+ virtual base::expected<size_t, Error> FilterData(
+ IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool upstream_eof_reached) = 0;
// Returns a string representation of the type of this FilterSourceStream.
// This is for UMA logging.
@@ -110,7 +112,7 @@ class NET_EXPORT_PRIVATE FilterSourceStream : public SourceStream {
// Not null if there is a pending Read.
scoped_refptr<IOBuffer> output_buffer_;
- int output_buffer_size_ = 0;
+ size_t output_buffer_size_ = 0;
CompletionOnceCallback callback_;
// Reading from |upstream_| has returned 0 byte or an error code.
diff --git a/chromium/net/filter/filter_source_stream_unittest.cc b/chromium/net/filter/filter_source_stream_unittest.cc
index bba8fab4f2f..16e4079c3e3 100644
--- a/chromium/net/filter/filter_source_stream_unittest.cc
+++ b/chromium/net/filter/filter_source_stream_unittest.cc
@@ -24,7 +24,7 @@ const size_t kSmallBufferSize = 1;
class TestFilterSourceStreamBase : public FilterSourceStream {
public:
- TestFilterSourceStreamBase(std::unique_ptr<SourceStream> upstream)
+ explicit TestFilterSourceStreamBase(std::unique_ptr<SourceStream> upstream)
: FilterSourceStream(SourceStream::TYPE_NONE, std::move(upstream)) {}
TestFilterSourceStreamBase(const TestFilterSourceStreamBase&) = delete;
@@ -42,12 +42,12 @@ class TestFilterSourceStreamBase : public FilterSourceStream {
// Writes contents of |buffer_| to |output_buffer| and returns the number of
// bytes written or an error code. Additionally removes consumed data from
// |buffer_|.
- int WriteBufferToOutput(IOBuffer* output_buffer, int output_buffer_size) {
- size_t bytes_to_filter =
- std::min(buffer_.length(), static_cast<size_t>(output_buffer_size));
+ size_t WriteBufferToOutput(IOBuffer* output_buffer,
+ size_t output_buffer_size) {
+ size_t bytes_to_filter = std::min(buffer_.length(), output_buffer_size);
memcpy(output_buffer->data(), buffer_.data(), bytes_to_filter);
buffer_.erase(0, bytes_to_filter);
- return base::checked_cast<int>(bytes_to_filter);
+ return bytes_to_filter;
}
// Buffer used by subclasses to hold data that is yet to be passed to the
@@ -72,12 +72,12 @@ class NeedsAllInputFilterSourceStream : public TestFilterSourceStreamBase {
NeedsAllInputFilterSourceStream& operator=(
const NeedsAllInputFilterSourceStream&) = delete;
- int FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool upstream_eof_reached) override {
+ base::expected<size_t, Error> FilterData(IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool upstream_eof_reached) override {
buffer_.append(input_buffer->data(), input_buffer_size);
EXPECT_GE(expected_input_bytes_, input_buffer_size);
expected_input_bytes_ -= input_buffer_size;
@@ -86,13 +86,13 @@ class NeedsAllInputFilterSourceStream : public TestFilterSourceStreamBase {
// Keep returning 0 bytes read until all input has been consumed.
return 0;
}
- EXPECT_EQ(0, expected_input_bytes_);
+ EXPECT_EQ(0u, expected_input_bytes_);
return WriteBufferToOutput(output_buffer, output_buffer_size);
}
private:
// Expected remaining bytes to be received from |upstream|.
- int expected_input_bytes_;
+ size_t expected_input_bytes_;
};
// A FilterSourceStream that repeat every input byte by |multiplier| amount of
@@ -106,13 +106,14 @@ class MultiplySourceStream : public TestFilterSourceStreamBase {
MultiplySourceStream(const MultiplySourceStream&) = delete;
MultiplySourceStream& operator=(const MultiplySourceStream&) = delete;
- int FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool /*upstream_eof_reached*/) override {
- for (int i = 0; i < input_buffer_size; i++) {
+ base::expected<size_t, Error> FilterData(
+ IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool /*upstream_eof_reached*/) override {
+ for (size_t i = 0; i < input_buffer_size; i++) {
for (int j = 0; j < multiplier_; j++)
buffer_.append(input_buffer->data() + i, 1);
}
@@ -134,12 +135,13 @@ class PassThroughFilterSourceStream : public TestFilterSourceStreamBase {
PassThroughFilterSourceStream& operator=(
const PassThroughFilterSourceStream&) = delete;
- int FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool /*upstream_eof_reached*/) override {
+ base::expected<size_t, Error> FilterData(
+ IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool /*upstream_eof_reached*/) override {
buffer_.append(input_buffer->data(), input_buffer_size);
*consumed_bytes = input_buffer_size;
return WriteBufferToOutput(output_buffer, output_buffer_size);
@@ -156,15 +158,16 @@ class ThrottleSourceStream : public TestFilterSourceStreamBase {
ThrottleSourceStream(const ThrottleSourceStream&) = delete;
ThrottleSourceStream& operator=(const ThrottleSourceStream&) = delete;
- int FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool /*upstream_eof_reached*/) override {
+ base::expected<size_t, Error> FilterData(
+ IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool /*upstream_eof_reached*/) override {
buffer_.append(input_buffer->data(), input_buffer_size);
*consumed_bytes = input_buffer_size;
- int bytes_to_read = std::min(1, static_cast<int>(buffer_.size()));
+ size_t bytes_to_read = std::min(size_t{1}, buffer_.size());
memcpy(output_buffer->data(), buffer_.data(), bytes_to_read);
buffer_.erase(0, bytes_to_read);
return bytes_to_read;
@@ -182,24 +185,25 @@ class NoOutputSourceStream : public TestFilterSourceStreamBase {
NoOutputSourceStream(const NoOutputSourceStream&) = delete;
NoOutputSourceStream& operator=(const NoOutputSourceStream&) = delete;
- int FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool /*upstream_eof_reached*/) override {
+ base::expected<size_t, Error> FilterData(
+ IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool /*upstream_eof_reached*/) override {
+ EXPECT_GE(expected_input_size_, input_buffer_size);
expected_input_size_ -= input_buffer_size;
*consumed_bytes = input_buffer_size;
- EXPECT_LE(0, expected_input_size_);
consumed_all_input_ = (expected_input_size_ == 0);
- return OK;
+ return 0;
}
bool consumed_all_input() const { return consumed_all_input_; }
private:
// Expected remaining bytes to be received from |upstream|.
- int expected_input_size_;
+ size_t expected_input_size_;
bool consumed_all_input_ = false;
};
@@ -212,13 +216,14 @@ class ErrorFilterSourceStream : public FilterSourceStream {
ErrorFilterSourceStream(const ErrorFilterSourceStream&) = delete;
ErrorFilterSourceStream& operator=(const ErrorFilterSourceStream&) = delete;
- int FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool /*upstream_eof_reached*/) override {
- return ERR_CONTENT_DECODING_FAILED;
+ base::expected<size_t, Error> FilterData(
+ IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool /*upstream_eof_reached*/) override {
+ return base::unexpected(ERR_CONTENT_DECODING_FAILED);
}
std::string GetTypeAsString() const override { return ""; }
};
@@ -257,7 +262,7 @@ INSTANTIATE_TEST_SUITE_P(FilterSourceStreamTests,
// upstream. In this case, FilterSourceStream should continue reading from
// upstream to complete filtering.
TEST_P(FilterSourceStreamTest, FilterDataReturnNoBytesExceptLast) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input("hello, world!");
size_t read_size = 2;
size_t num_reads = 0;
@@ -293,7 +298,7 @@ TEST_P(FilterSourceStreamTest, FilterDataReturnNoBytesExceptLast) {
// Tests that FilterData() returns 0 byte read because the upstream gives an
// EOF.
TEST_P(FilterSourceStreamTest, FilterDataReturnNoByte) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input;
source->AddReadResult(input.data(), 0, OK, GetParam());
MockSourceStream* mock_stream = source.get();
@@ -310,7 +315,7 @@ TEST_P(FilterSourceStreamTest, FilterDataReturnNoByte) {
// Tests that FilterData() returns 0 byte filtered even though the upstream
// produces data.
TEST_P(FilterSourceStreamTest, FilterDataOutputNoData) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input = "hello, world!";
size_t read_size = 2;
size_t num_reads = 0;
@@ -339,7 +344,7 @@ TEST_P(FilterSourceStreamTest, FilterDataOutputNoData) {
// Tests that FilterData() returns non-zero bytes because the upstream
// returns data.
TEST_P(FilterSourceStreamTest, FilterDataReturnData) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input = "hello, world!";
size_t read_size = 2;
// Add a sequence of small reads.
@@ -371,7 +376,7 @@ TEST_P(FilterSourceStreamTest, FilterDataReturnData) {
// Tests that FilterData() returns more data than what it consumed.
TEST_P(FilterSourceStreamTest, FilterDataReturnMoreData) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input = "hello, world!";
size_t read_size = 2;
// Add a sequence of small reads.
@@ -405,7 +410,7 @@ TEST_P(FilterSourceStreamTest, FilterDataReturnMoreData) {
// Tests that FilterData() returns non-zero bytes and output buffer size is
// smaller than the number of bytes read from the upstream.
TEST_P(FilterSourceStreamTest, FilterDataOutputSpace) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input = "hello, world!";
size_t read_size = 2;
// Add a sequence of small reads.
@@ -441,7 +446,7 @@ TEST_P(FilterSourceStreamTest, FilterDataOutputSpace) {
// Tests that FilterData() returns an error code, which is then surfaced as
// the result of calling Read().
TEST_P(FilterSourceStreamTest, FilterDataReturnError) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input;
source->AddReadResult(input.data(), 0, OK, GetParam());
scoped_refptr<IOBufferWithSize> output_buffer =
@@ -460,21 +465,22 @@ TEST_P(FilterSourceStreamTest, FilterDataReturnError) {
}
TEST_P(FilterSourceStreamTest, FilterChaining) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input = "hello, world!";
source->AddReadResult(input.data(), input.length(), OK, GetParam());
source->AddReadResult(input.data(), 0, OK, GetParam()); // EOF
MockSourceStream* mock_stream = source.get();
- std::unique_ptr<PassThroughFilterSourceStream> pass_through_source(
- new PassThroughFilterSourceStream(std::move(source)));
+ auto pass_through_source =
+ std::make_unique<PassThroughFilterSourceStream>(std::move(source));
pass_through_source->set_type_string("FIRST_PASS_THROUGH");
- std::unique_ptr<NeedsAllInputFilterSourceStream> needs_all_input_source(
- new NeedsAllInputFilterSourceStream(std::move(pass_through_source),
- input.length()));
+ auto needs_all_input_source =
+ std::make_unique<NeedsAllInputFilterSourceStream>(
+ std::move(pass_through_source), input.length());
needs_all_input_source->set_type_string("NEEDS_ALL");
- std::unique_ptr<PassThroughFilterSourceStream> second_pass_through_source(
- new PassThroughFilterSourceStream(std::move(needs_all_input_source)));
+ auto second_pass_through_source =
+ std::make_unique<PassThroughFilterSourceStream>(
+ std::move(needs_all_input_source));
second_pass_through_source->set_type_string("SECOND_PASS_THROUGH");
scoped_refptr<IOBufferWithSize> output_buffer =
base::MakeRefCounted<IOBufferWithSize>(kDefaultBufferSize);
@@ -500,7 +506,7 @@ TEST_P(FilterSourceStreamTest, FilterChaining) {
// Tests that FilterData() returns multiple times for a single MockStream
// read, because there is not enough output space.
TEST_P(FilterSourceStreamTest, OutputSpaceForOneRead) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input = "hello, world!";
source->AddReadResult(input.data(), input.length(), OK, GetParam());
// Add a 0 byte read to signal EOF.
@@ -530,7 +536,7 @@ TEST_P(FilterSourceStreamTest, OutputSpaceForOneRead) {
// Tests that FilterData() returns multiple times for a single MockStream
// read, because the filter returns one byte at a time.
TEST_P(FilterSourceStreamTest, ThrottleSourceStream) {
- std::unique_ptr<MockSourceStream> source(new MockSourceStream);
+ auto source = std::make_unique<MockSourceStream>();
std::string input = "hello, world!";
source->AddReadResult(input.data(), input.length(), OK, GetParam());
// Add a 0 byte read to signal EOF.
diff --git a/chromium/net/filter/gzip_header.cc b/chromium/net/filter/gzip_header.cc
index 8c33e543940..d6f09b03ae9 100644
--- a/chromium/net/filter/gzip_header.cc
+++ b/chromium/net/filter/gzip_header.cc
@@ -27,9 +27,9 @@ void GZipHeader::Reset() {
extra_length_ = 0;
}
-GZipHeader::Status GZipHeader::ReadMore(const char* inbuf, int inbuf_len,
+GZipHeader::Status GZipHeader::ReadMore(const char* inbuf,
+ size_t inbuf_len,
const char** header_end) {
- DCHECK_GE(inbuf_len, 0);
const uint8_t* pos = reinterpret_cast<const uint8_t*>(inbuf);
const uint8_t* const end = pos + inbuf_len;
diff --git a/chromium/net/filter/gzip_header.h b/chromium/net/filter/gzip_header.h
index 908cf731ab0..c3bce8c5384 100644
--- a/chromium/net/filter/gzip_header.h
+++ b/chromium/net/filter/gzip_header.h
@@ -15,6 +15,7 @@
#ifndef NET_FILTER_GZIP_HEADER_H_
#define NET_FILTER_GZIP_HEADER_H_
+#include <stddef.h>
#include <stdint.h>
#include "net/base/net_export.h"
@@ -46,9 +47,8 @@ class NET_EXPORT GZipHeader {
// gzip header, return INVALID_HEADER. When we've seen a complete
// gzip header, return COMPLETE_HEADER and set the pointer pointed
// to by header_end to the first byte beyond the gzip header.
- Status ReadMore(const char* inbuf,
- int inbuf_len,
- const char** header_end);
+ Status ReadMore(const char* inbuf, size_t inbuf_len, const char** header_end);
+
private:
enum { // flags (see RFC)
FLAG_FTEXT = 0x01, // bit 0 set: file probably ascii text
diff --git a/chromium/net/filter/gzip_source_stream.cc b/chromium/net/filter/gzip_source_stream.cc
index e68bd1aae50..2c73deb3543 100644
--- a/chromium/net/filter/gzip_source_stream.cc
+++ b/chromium/net/filter/gzip_source_stream.cc
@@ -11,6 +11,7 @@
#include "base/bind.h"
#include "base/bit_cast.h"
#include "base/check_op.h"
+#include "base/memory/ptr_util.h"
#include "base/memory/ref_counted.h"
#include "base/notreached.h"
#include "base/numerics/checked_math.h"
@@ -43,8 +44,8 @@ std::unique_ptr<GzipSourceStream> GzipSourceStream::Create(
std::unique_ptr<SourceStream> upstream,
SourceStream::SourceType type) {
DCHECK(type == TYPE_GZIP || type == TYPE_DEFLATE);
- std::unique_ptr<GzipSourceStream> source(
- new GzipSourceStream(std::move(upstream), type));
+ auto source =
+ base::WrapUnique(new GzipSourceStream(std::move(upstream), type));
if (!source->Init())
return nullptr;
@@ -83,16 +84,17 @@ std::string GzipSourceStream::GetTypeAsString() const {
}
}
-int GzipSourceStream::FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool upstream_end_reached) {
+base::expected<size_t, Error> GzipSourceStream::FilterData(
+ IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool upstream_end_reached) {
*consumed_bytes = 0;
char* input_data = input_buffer->data();
- int input_data_size = input_buffer_size;
- int bytes_out = 0;
+ size_t input_data_size = input_buffer_size;
+ size_t bytes_out = 0;
bool state_compressed_entered = false;
while (input_data_size > 0 && bytes_out < output_buffer_size) {
InputState state = input_state_;
@@ -102,7 +104,7 @@ int GzipSourceStream::FilterData(IOBuffer* output_buffer,
input_state_ = STATE_SNIFFING_DEFLATE_HEADER;
break;
}
- DCHECK_LT(0, input_data_size);
+ DCHECK_GT(input_data_size, 0u);
input_state_ = STATE_GZIP_HEADER;
break;
}
@@ -119,12 +121,12 @@ int GzipSourceStream::FilterData(IOBuffer* output_buffer,
} else if (status == GZipHeader::COMPLETE_HEADER) {
// If there is a valid header, there should also be a valid footer.
gzip_footer_bytes_left_ = kGzipFooterBytes;
- int bytes_consumed = end - input_data;
+ size_t bytes_consumed = static_cast<size_t>(end - input_data);
input_data += bytes_consumed;
input_data_size -= bytes_consumed;
input_state_ = STATE_COMPRESSED_BODY;
} else if (status == GZipHeader::INVALID_HEADER) {
- return ERR_CONTENT_DECODING_FAILED;
+ return base::unexpected(ERR_CONTENT_DECODING_FAILED);
}
break;
}
@@ -145,7 +147,7 @@ int GzipSourceStream::FilterData(IOBuffer* output_buffer,
// calls needs to be replayed.
if (ret != Z_STREAM_END && ret != Z_OK) {
if (!InsertZlibHeader())
- return ERR_CONTENT_DECODING_FAILED;
+ return base::unexpected(ERR_CONTENT_DECODING_FAILED);
input_state_ = STATE_REPLAY_DATA;
// |replay_state_| should still have its initial value.
@@ -153,7 +155,7 @@ int GzipSourceStream::FilterData(IOBuffer* output_buffer,
break;
}
- int bytes_used = input_data_size - zlib_stream_.get()->avail_in;
+ size_t bytes_used = input_data_size - zlib_stream_.get()->avail_in;
bytes_out = output_buffer_size - zlib_stream_.get()->avail_out;
// If any bytes are output, enough total bytes have been received, or at
// the end of the stream, assume the response had a valid Zlib header.
@@ -187,10 +189,10 @@ int GzipSourceStream::FilterData(IOBuffer* output_buffer,
// |replay_data_| and |input_buffer| much simpler than the alternative
// operations, though it's not pretty.
input_state_ = replay_state_;
- int bytes_used;
+ size_t bytes_used;
scoped_refptr<IOBuffer> replay_buffer =
base::MakeRefCounted<WrappedIOBuffer>(replay_data_.data());
- int result =
+ base::expected<size_t, Error> result =
FilterData(output_buffer, output_buffer_size, replay_buffer.get(),
replay_data_.size(), &bytes_used, upstream_end_reached);
replay_data_.erase(0, bytes_used);
@@ -198,16 +200,14 @@ int GzipSourceStream::FilterData(IOBuffer* output_buffer,
replay_state_ = input_state_;
input_state_ = STATE_REPLAY_DATA;
- // On error, or if bytes were read, just return result immediately.
// Could continue consuming data in the success case, but simplest not
// to.
- if (result != 0)
+ if (!result.has_value() || result.value() != 0)
return result;
break;
}
case STATE_COMPRESSED_BODY: {
DCHECK(!state_compressed_entered);
- DCHECK_LE(0, input_data_size);
state_compressed_entered = true;
zlib_stream_.get()->next_in = base::bit_cast<Bytef*>(input_data);
@@ -218,9 +218,9 @@ int GzipSourceStream::FilterData(IOBuffer* output_buffer,
int ret = inflate(zlib_stream_.get(), Z_NO_FLUSH);
if (ret != Z_STREAM_END && ret != Z_OK)
- return ERR_CONTENT_DECODING_FAILED;
+ return base::unexpected(ERR_CONTENT_DECODING_FAILED);
- int bytes_used = input_data_size - zlib_stream_.get()->avail_in;
+ size_t bytes_used = input_data_size - zlib_stream_.get()->avail_in;
bytes_out = output_buffer_size - zlib_stream_.get()->avail_out;
input_data_size -= bytes_used;
input_data += bytes_used;
@@ -232,8 +232,7 @@ int GzipSourceStream::FilterData(IOBuffer* output_buffer,
break;
}
case STATE_GZIP_FOOTER: {
- size_t to_read = std::min(gzip_footer_bytes_left_,
- base::checked_cast<size_t>(input_data_size));
+ size_t to_read = std::min(gzip_footer_bytes_left_, input_data_size);
gzip_footer_bytes_left_ -= to_read;
input_data_size -= to_read;
input_data += to_read;
diff --git a/chromium/net/filter/gzip_source_stream.h b/chromium/net/filter/gzip_source_stream.h
index 80633e406d4..625b0962093 100644
--- a/chromium/net/filter/gzip_source_stream.h
+++ b/chromium/net/filter/gzip_source_stream.h
@@ -75,12 +75,12 @@ class NET_EXPORT_PRIVATE GzipSourceStream : public FilterSourceStream {
// SourceStream implementation
std::string GetTypeAsString() const override;
- int FilterData(IOBuffer* output_buffer,
- int output_buffer_size,
- IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool upstream_end_reached) override;
+ base::expected<size_t, Error> FilterData(IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool upstream_end_reached) override;
// Inserts a zlib header to the data stream before calling zlib inflate.
// This is used to work around server bugs. The function returns true on
diff --git a/chromium/net/filter/gzip_source_stream_unittest.cc b/chromium/net/filter/gzip_source_stream_unittest.cc
index 0fba4bdc4f0..b45ca60c831 100644
--- a/chromium/net/filter/gzip_source_stream_unittest.cc
+++ b/chromium/net/filter/gzip_source_stream_unittest.cc
@@ -72,7 +72,7 @@ class GzipSourceStreamTest : public ::testing::TestWithParam<GzipTestParam> {
&encoded_data_len_, type != SourceStream::TYPE_DEFLATE);
output_buffer_ = base::MakeRefCounted<IOBuffer>(output_buffer_size_);
- std::unique_ptr<MockSourceStream> source(new MockSourceStream());
+ auto source = std::make_unique<MockSourceStream>();
if (GetParam().read_result_type == ReadResultType::ONE_BYTE_AT_A_TIME)
source->set_read_one_byte_at_a_time(true);
source_ = source.get();
diff --git a/chromium/net/http/OWNERS b/chromium/net/http/OWNERS
index 49c38c96624..dd32c76bb0f 100644
--- a/chromium/net/http/OWNERS
+++ b/chromium/net/http/OWNERS
@@ -3,5 +3,8 @@ per-file transport_security_state_static.*=estark@chromium.org
per-file transport_security_state_static.*=cthomp@chromium.org
per-file transport_security_state_static.*=jdeblasio@chromium.org
# For automated updates
+# TODO(crbug.com/1342998): Remove mdb.chrome-pki-metadata@google.com once the
+# pod batch migration is complete.
per-file transport_security_state_static.*=mdb.chrome-pki-metadata@google.com
+per-file transport_security_state_static.*=mdb.chrome-pki-metadata-release-jobs@google.com
per-file *test*=file://net/quic/OWNERS # for QUIC refactors
diff --git a/chromium/net/http/alternative_service.h b/chromium/net/http/alternative_service.h
index 91dbc76a7b1..90656bf0939 100644
--- a/chromium/net/http/alternative_service.h
+++ b/chromium/net/http/alternative_service.h
@@ -27,13 +27,19 @@ enum AlternateProtocolUsage {
// Alternate Protocol was used by winning a race with a normal connection.
ALTERNATE_PROTOCOL_USAGE_WON_RACE = 1,
// Alternate Protocol was not used by losing a race with a normal connection.
- ALTERNATE_PROTOCOL_USAGE_LOST_RACE = 2,
+ ALTERNATE_PROTOCOL_USAGE_MAIN_JOB_WON_RACE = 2,
// Alternate Protocol was not used because no Alternate-Protocol information
// was available when the request was issued, but an Alternate-Protocol header
// was present in the response.
ALTERNATE_PROTOCOL_USAGE_MAPPING_MISSING = 3,
// Alternate Protocol was not used because it was marked broken.
ALTERNATE_PROTOCOL_USAGE_BROKEN = 4,
+ // HTTPS DNS protocol upgrade job was used without racing with a normal
+ // connection and an Alternate Protocol job.
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_WITOUT_RACE = 5,
+ // HTTPS DNS protocol upgrade job won a race with a normal connection and
+ // an Alternate Protocol job.
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_RACE = 6,
// Maximum value for the enum.
ALTERNATE_PROTOCOL_USAGE_MAX,
};
diff --git a/chromium/net/http/bidirectional_stream.cc b/chromium/net/http/bidirectional_stream.cc
index 13faebf3845..28bd9a89f8c 100644
--- a/chromium/net/http/bidirectional_stream.cc
+++ b/chromium/net/http/bidirectional_stream.cc
@@ -29,7 +29,7 @@
#include "net/spdy/spdy_log_util.h"
#include "net/ssl/ssl_cert_request_info.h"
#include "net/ssl/ssl_config.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "url/gurl.h"
diff --git a/chromium/net/http/bidirectional_stream.h b/chromium/net/http/bidirectional_stream.h
index debf81b1ed0..cae471b0f05 100644
--- a/chromium/net/http/bidirectional_stream.h
+++ b/chromium/net/http/bidirectional_stream.h
@@ -21,7 +21,7 @@
#include "net/http/http_stream_factory.h"
#include "net/http/http_stream_request.h"
#include "net/log/net_log_with_source.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
namespace base {
class OneShotTimer;
diff --git a/chromium/net/http/bidirectional_stream_impl.h b/chromium/net/http/bidirectional_stream_impl.h
index 51a068741db..2c151347984 100644
--- a/chromium/net/http/bidirectional_stream_impl.h
+++ b/chromium/net/http/bidirectional_stream_impl.h
@@ -14,7 +14,7 @@
#include "net/base/load_timing_info.h"
#include "net/base/net_export.h"
#include "net/socket/next_proto.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
namespace base {
diff --git a/chromium/net/http/bidirectional_stream_unittest.cc b/chromium/net/http/bidirectional_stream_unittest.cc
index d39ee35be51..e6ac53f5fc1 100644
--- a/chromium/net/http/bidirectional_stream_unittest.cc
+++ b/chromium/net/http/bidirectional_stream_unittest.cc
@@ -377,7 +377,7 @@ class DeleteStreamDelegate : public TestDelegateBase {
// A Timer that does not start a delayed task unless the timer is fired.
class MockTimer : public base::MockOneShotTimer {
public:
- MockTimer() {}
+ MockTimer() = default;
MockTimer(const MockTimer&) = delete;
MockTimer& operator=(const MockTimer&) = delete;
@@ -406,8 +406,9 @@ class BidirectionalStreamTest : public TestWithTaskEnvironment {
ssl_data_.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
net_log_observer_.SetObserverCaptureMode(NetLogCaptureMode::kEverything);
- socket_factory_ = new MockTaggingClientSocketFactory();
- session_deps_.socket_factory.reset(socket_factory_);
+ auto socket_factory = std::make_unique<MockTaggingClientSocketFactory>();
+ socket_factory_ = socket_factory.get();
+ session_deps_.socket_factory = std::move(socket_factory);
}
protected:
@@ -452,15 +453,14 @@ class BidirectionalStreamTest : public TestWithTaskEnvironment {
};
TEST_F(BidirectionalStreamTest, CreateInsecureStream) {
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = GURL("http://www.example.org/");
TestDelegateBase delegate(nullptr, 0);
- std::unique_ptr<HttpNetworkSession> session(new HttpNetworkSession(
+ auto session = std::make_unique<HttpNetworkSession>(
SpdySessionDependencies::CreateSessionParams(&session_deps_),
- SpdySessionDependencies::CreateSessionContext(&session_deps_)));
+ SpdySessionDependencies::CreateSessionContext(&session_deps_));
delegate.SetRunUntilCompletion(true);
delegate.Start(std::move(request_info), session.get());
@@ -485,16 +485,15 @@ TEST_F(BidirectionalStreamTest, SimplePostRequest) {
};
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "POST";
request_info->url = default_url_;
request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength,
base::NumberToString(kBodyDataSize));
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(std::move(request_info), http_session_.get());
sequenced_data_->RunUntilPaused();
@@ -535,13 +534,11 @@ TEST_F(BidirectionalStreamTest, LoadTimingTwoRequests) {
MockRead(ASYNC, 0, 6)};
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->end_stream_on_headers = true;
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info2(
- new BidirectionalStreamRequestInfo);
+ auto request_info2 = std::make_unique<BidirectionalStreamRequestInfo>();
request_info2->method = "GET";
request_info2->url = default_url_;
request_info2->end_stream_on_headers = true;
@@ -550,10 +547,10 @@ TEST_F(BidirectionalStreamTest, LoadTimingTwoRequests) {
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
scoped_refptr<IOBuffer> read_buffer2 =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
- std::unique_ptr<TestDelegateBase> delegate2(
- new TestDelegateBase(read_buffer2.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
+ auto delegate2 =
+ std::make_unique<TestDelegateBase>(read_buffer2.get(), kReadBufferSize);
delegate->Start(std::move(request_info), http_session_.get());
delegate2->Start(std::move(request_info2), http_session_.get());
delegate->SetRunUntilCompletion(true);
@@ -574,15 +571,14 @@ TEST_F(BidirectionalStreamTest, LoadTimingTwoRequests) {
// without waiting for the OnFailed task to be executed.
TEST_F(BidirectionalStreamTest,
CreateInsecureStreamAndDestroyStreamRightAfter) {
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = GURL("http://www.example.org/");
- std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(nullptr, 0));
- std::unique_ptr<HttpNetworkSession> session(new HttpNetworkSession(
+ auto delegate = std::make_unique<TestDelegateBase>(nullptr, 0);
+ auto session = std::make_unique<HttpNetworkSession>(
SpdySessionDependencies::CreateSessionParams(&session_deps_),
- SpdySessionDependencies::CreateSessionContext(&session_deps_)));
+ SpdySessionDependencies::CreateSessionContext(&session_deps_));
delegate->Start(std::move(request_info), session.get());
// Reset stream right before the OnFailed task is executed.
delegate.reset();
@@ -629,8 +625,7 @@ TEST_F(BidirectionalStreamTest, ClientAuthRequestIgnored) {
PRIVACY_MODE_DISABLED,
SpdySessionKey::IsProxySession::kFalse, SocketTag(),
NetworkIsolationKey(), SecureDnsPolicy::kAllow);
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->end_stream_on_headers = true;
@@ -638,8 +633,8 @@ TEST_F(BidirectionalStreamTest, ClientAuthRequestIgnored) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->SetRunUntilCompletion(true);
delegate->Start(std::move(request_info), http_session_.get());
@@ -690,8 +685,7 @@ TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->end_stream_on_headers = true;
@@ -701,23 +695,24 @@ TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) {
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
// Create a MockTimer. Retain a raw pointer since the underlying
// BidirectionalStreamImpl owns it.
- MockTimer* timer = new MockTimer();
- std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(
- read_buffer.get(), kReadBufferSize, base::WrapUnique(timer)));
+ auto timer = std::make_unique<MockTimer>();
+ MockTimer* timer_ptr = timer.get();
+ auto delegate = std::make_unique<TestDelegateBase>(
+ read_buffer.get(), kReadBufferSize, std::move(timer));
delegate->set_do_not_start_read(true);
delegate->Start(std::move(request_info), http_session_.get());
// Write request, and deliver response headers.
sequenced_data_->RunUntilPaused();
- EXPECT_FALSE(timer->IsRunning());
+ EXPECT_FALSE(timer_ptr->IsRunning());
// ReadData returns asynchronously because no data is buffered.
int rv = delegate->ReadData();
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Deliver a DATA frame.
sequenced_data_->Resume();
base::RunLoop().RunUntilIdle();
- timer->Fire();
+ timer_ptr->Fire();
// Asynchronous completion callback is invoke.
EXPECT_EQ(1, delegate->on_data_read_count());
EXPECT_EQ(kUploadDataSize * 1,
@@ -776,8 +771,7 @@ TEST_F(BidirectionalStreamTest, TestNetLogContainEntries) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "POST";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -787,14 +781,15 @@ TEST_F(BidirectionalStreamTest, TestNetLogContainEntries) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- MockTimer* timer = new MockTimer();
- std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(
- read_buffer.get(), kReadBufferSize, base::WrapUnique(timer)));
+ auto timer = std::make_unique<MockTimer>();
+ MockTimer* timer_ptr = timer.get();
+ auto delegate = std::make_unique<TestDelegateBase>(
+ read_buffer.get(), kReadBufferSize, std::move(timer));
delegate->set_do_not_start_read(true);
delegate->Start(std::move(request_info), http_session_.get());
// Send the request and receive response headers.
sequenced_data_->RunUntilPaused();
- EXPECT_FALSE(timer->IsRunning());
+ EXPECT_FALSE(timer_ptr->IsRunning());
scoped_refptr<StringIOBuffer> buf =
base::MakeRefCounted<StringIOBuffer>(kBodyDataString);
@@ -809,7 +804,7 @@ TEST_F(BidirectionalStreamTest, TestNetLogContainEntries) {
// |sequenced_data_| is now stopped after delivering first DATA frame but
// before the second DATA frame.
// Fire the timer to allow the first ReadData to complete asynchronously.
- timer->Fire();
+ timer_ptr->Fire();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, delegate->on_data_read_count());
@@ -913,8 +908,7 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "POST";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -924,14 +918,15 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- MockTimer* timer = new MockTimer();
- std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(
- read_buffer.get(), kReadBufferSize, base::WrapUnique(timer)));
+ auto timer = std::make_unique<MockTimer>();
+ MockTimer* timer_ptr = timer.get();
+ auto delegate = std::make_unique<TestDelegateBase>(
+ read_buffer.get(), kReadBufferSize, std::move(timer));
delegate->set_do_not_start_read(true);
delegate->Start(std::move(request_info), http_session_.get());
// Send the request and receive response headers.
sequenced_data_->RunUntilPaused();
- EXPECT_FALSE(timer->IsRunning());
+ EXPECT_FALSE(timer_ptr->IsRunning());
// Send a DATA frame.
scoped_refptr<StringIOBuffer> buf =
@@ -945,7 +940,7 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) {
// Deliver a DATA frame, and fire the timer.
sequenced_data_->Resume();
sequenced_data_->RunUntilPaused();
- timer->Fire();
+ timer_ptr->Fire();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, delegate->on_data_sent_count());
EXPECT_EQ(1, delegate->on_data_read_count());
@@ -958,7 +953,7 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) {
// Deliver a DATA frame, and fire the timer.
sequenced_data_->Resume();
sequenced_data_->RunUntilPaused();
- timer->Fire();
+ timer_ptr->Fire();
base::RunLoop().RunUntilIdle();
// Last DATA frame is read. Server half closes.
EXPECT_EQ(2, delegate->on_data_read_count());
@@ -1004,8 +999,7 @@ TEST_F(BidirectionalStreamTest, TestCoalesceSmallDataBuffers) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "POST";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1015,9 +1009,9 @@ TEST_F(BidirectionalStreamTest, TestCoalesceSmallDataBuffers) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- MockTimer* timer = new MockTimer();
- std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(
- read_buffer.get(), kReadBufferSize, base::WrapUnique(timer)));
+ auto timer = std::make_unique<MockTimer>();
+ auto delegate = std::make_unique<TestDelegateBase>(
+ read_buffer.get(), kReadBufferSize, std::move(timer));
delegate->set_do_not_start_read(true);
TestCompletionCallback callback;
delegate->Start(std::move(request_info), http_session_.get(),
@@ -1097,8 +1091,7 @@ TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1106,14 +1099,15 @@ TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- MockTimer* timer = new MockTimer();
- std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(
- read_buffer.get(), kReadBufferSize, base::WrapUnique(timer)));
+ auto timer = std::make_unique<MockTimer>();
+ MockTimer* timer_ptr = timer.get();
+ auto delegate = std::make_unique<TestDelegateBase>(
+ read_buffer.get(), kReadBufferSize, std::move(timer));
delegate->set_do_not_start_read(true);
delegate->Start(std::move(request_info), http_session_.get());
// Write request, and deliver response headers.
sequenced_data_->RunUntilPaused();
- EXPECT_FALSE(timer->IsRunning());
+ EXPECT_FALSE(timer_ptr->IsRunning());
// ReadData should return asynchronously because no data is buffered.
int rv = delegate->ReadData();
@@ -1158,8 +1152,7 @@ TEST_F(BidirectionalStreamTest, TestBuffering) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1167,23 +1160,24 @@ TEST_F(BidirectionalStreamTest, TestBuffering) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- MockTimer* timer = new MockTimer();
- std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(
- read_buffer.get(), kReadBufferSize, base::WrapUnique(timer)));
+ auto timer = std::make_unique<MockTimer>();
+ MockTimer* timer_ptr = timer.get();
+ auto delegate = std::make_unique<TestDelegateBase>(
+ read_buffer.get(), kReadBufferSize, std::move(timer));
delegate->Start(std::move(request_info), http_session_.get());
// Deliver two DATA frames together.
sequenced_data_->RunUntilPaused();
- EXPECT_TRUE(timer->IsRunning());
- timer->Fire();
+ EXPECT_TRUE(timer_ptr->IsRunning());
+ timer_ptr->Fire();
base::RunLoop().RunUntilIdle();
// This should trigger |more_read_data_pending_| to execute the task at a
// later time, and Delegate::OnReadComplete should not have been called.
- EXPECT_TRUE(timer->IsRunning());
+ EXPECT_TRUE(timer_ptr->IsRunning());
EXPECT_EQ(0, delegate->on_data_read_count());
// Fire the timer now, the two DATA frame should be combined into one
// single Delegate::OnReadComplete callback.
- timer->Fire();
+ timer_ptr->Fire();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, delegate->on_data_read_count());
EXPECT_EQ(kUploadDataSize * 2,
@@ -1240,12 +1234,12 @@ TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- MockTimer* timer = new MockTimer();
- std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(
- read_buffer.get(), kReadBufferSize, base::WrapUnique(timer)));
+ auto timer = std::make_unique<MockTimer>();
+ MockTimer* timer_ptr = timer.get();
+ auto delegate = std::make_unique<TestDelegateBase>(
+ read_buffer.get(), kReadBufferSize, std::move(timer));
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1254,12 +1248,12 @@ TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) {
delegate->Start(std::move(request_info), http_session_.get());
// Deliver all three DATA frames together.
sequenced_data_->RunUntilPaused();
- EXPECT_TRUE(timer->IsRunning());
- timer->Fire();
+ EXPECT_TRUE(timer_ptr->IsRunning());
+ timer_ptr->Fire();
base::RunLoop().RunUntilIdle();
// This should trigger |more_read_data_pending_| to execute the task at a
// later time, and Delegate::OnReadComplete should not have been called.
- EXPECT_TRUE(timer->IsRunning());
+ EXPECT_TRUE(timer_ptr->IsRunning());
EXPECT_EQ(0, delegate->on_data_read_count());
// Deliver trailers. Remaining read should be completed, since OnClose is
@@ -1305,8 +1299,7 @@ TEST_F(BidirectionalStreamTest, DeleteStreamAfterSendData) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "POST";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1316,8 +1309,8 @@ TEST_F(BidirectionalStreamTest, DeleteStreamAfterSendData) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->set_do_not_start_read(true);
delegate->Start(std::move(request_info), http_session_.get());
// Send the request and receive response headers.
@@ -1369,8 +1362,7 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringReadData) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "POST";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1380,8 +1372,8 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringReadData) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->set_do_not_start_read(true);
delegate->Start(std::move(request_info), http_session_.get());
// Send the request and receive response headers.
@@ -1431,8 +1423,7 @@ TEST_F(BidirectionalStreamTest, PropagateProtocolError) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "POST";
request_info->url = default_url_;
request_info->extra_headers.SetHeader(
@@ -1441,8 +1432,8 @@ TEST_F(BidirectionalStreamTest, PropagateProtocolError) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->SetRunUntilCompletion(true);
delegate->Start(std::move(request_info), http_session_.get());
@@ -1494,8 +1485,7 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnHeadersReceived) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1503,9 +1493,9 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnHeadersReceived) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
read_buffer.get(), kReadBufferSize,
- DeleteStreamDelegate::Phase::ON_HEADERS_RECEIVED));
+ DeleteStreamDelegate::Phase::ON_HEADERS_RECEIVED);
delegate->SetRunUntilCompletion(true);
delegate->Start(std::move(request_info), http_session_.get());
// Makes sure delegate does not get called.
@@ -1549,8 +1539,7 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnDataRead) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1558,9 +1547,9 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnDataRead) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(
- new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize,
- DeleteStreamDelegate::Phase::ON_DATA_READ));
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
+ read_buffer.get(), kReadBufferSize,
+ DeleteStreamDelegate::Phase::ON_DATA_READ);
delegate->SetRunUntilCompletion(true);
delegate->Start(std::move(request_info), http_session_.get());
// Makes sure delegate does not get called.
@@ -1609,8 +1598,7 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnTrailersReceived) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1618,9 +1606,9 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnTrailersReceived) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
read_buffer.get(), kReadBufferSize,
- DeleteStreamDelegate::Phase::ON_TRAILERS_RECEIVED));
+ DeleteStreamDelegate::Phase::ON_TRAILERS_RECEIVED);
delegate->SetRunUntilCompletion(true);
delegate->Start(std::move(request_info), http_session_.get());
// Makes sure delegate does not get called.
@@ -1661,8 +1649,7 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnFailed) {
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1670,9 +1657,9 @@ TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnFailed) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(
- new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize,
- DeleteStreamDelegate::Phase::ON_FAILED));
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
+ read_buffer.get(), kReadBufferSize,
+ DeleteStreamDelegate::Phase::ON_FAILED);
delegate->SetRunUntilCompletion(true);
delegate->Start(std::move(request_info), http_session_.get());
// Makes sure delegate does not get called.
@@ -1716,8 +1703,7 @@ TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) {
session_deps_.enable_quic = true;
InitSession(reads, writes, SocketTag());
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "GET";
request_info->url = default_url_;
request_info->priority = LOWEST;
@@ -1725,9 +1711,9 @@ TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- MockTimer* timer = new MockTimer();
- std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(
- read_buffer.get(), kReadBufferSize, base::WrapUnique(timer)));
+ auto timer = std::make_unique<MockTimer>();
+ auto delegate = std::make_unique<TestDelegateBase>(
+ read_buffer.get(), kReadBufferSize, std::move(timer));
delegate->SetRunUntilCompletion(true);
delegate->Start(std::move(request_info), http_session_.get());
@@ -1774,8 +1760,7 @@ TEST_F(BidirectionalStreamTest, Tagging) {
#endif
InitSession(reads, writes, tag);
- std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
- new BidirectionalStreamRequestInfo);
+ auto request_info = std::make_unique<BidirectionalStreamRequestInfo>();
request_info->method = "POST";
request_info->url = default_url_;
request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength,
@@ -1783,8 +1768,8 @@ TEST_F(BidirectionalStreamTest, Tagging) {
request_info->socket_tag = tag;
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(std::move(request_info), http_session_.get());
sequenced_data_->RunUntilPaused();
diff --git a/chromium/net/http/broken_alternative_services.h b/chromium/net/http/broken_alternative_services.h
index 72a36cbd176..f2e1782445d 100644
--- a/chromium/net/http/broken_alternative_services.h
+++ b/chromium/net/http/broken_alternative_services.h
@@ -50,7 +50,7 @@ typedef std::list<std::pair<BrokenAlternativeService, base::TimeTicks>>
class RecentlyBrokenAlternativeServices
: public base::LRUCache<BrokenAlternativeService, int> {
public:
- RecentlyBrokenAlternativeServices(
+ explicit RecentlyBrokenAlternativeServices(
int max_recently_broken_alternative_service_entries)
: base::LRUCache<BrokenAlternativeService, int>(
max_recently_broken_alternative_service_entries) {}
@@ -74,7 +74,7 @@ class NET_EXPORT_PRIVATE BrokenAlternativeServices {
virtual void OnExpireBrokenAlternativeService(
const AlternativeService& expired_alternative_service,
const NetworkIsolationKey& network_isolation_key) = 0;
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
};
// |delegate| will be notified when a broken alternative service expires. It
diff --git a/chromium/net/http/broken_alternative_services_unittest.cc b/chromium/net/http/broken_alternative_services_unittest.cc
index 1f331acfe6d..a7b58a266f6 100644
--- a/chromium/net/http/broken_alternative_services_unittest.cc
+++ b/chromium/net/http/broken_alternative_services_unittest.cc
@@ -28,7 +28,7 @@ class BrokenAlternativeServicesTest
public ::testing::Test {
public:
BrokenAlternativeServicesTest()
- : test_task_runner_(new base::TestMockTimeTaskRunner()),
+ : test_task_runner_(base::MakeRefCounted<base::TestMockTimeTaskRunner>()),
test_task_runner_context_(test_task_runner_),
broken_services_clock_(test_task_runner_->GetMockTickClock()),
broken_services_(50, this, broken_services_clock_) {
@@ -42,9 +42,9 @@ class BrokenAlternativeServicesTest
void OnExpireBrokenAlternativeService(
const AlternativeService& expired_alternative_service,
const NetworkIsolationKey& network_isolation_key) override {
- expired_alt_svcs_.push_back(BrokenAlternativeService(
- expired_alternative_service, network_isolation_key,
- true /* use_network_isolation_key */));
+ expired_alt_svcs_.emplace_back(expired_alternative_service,
+ network_isolation_key,
+ true /* use_network_isolation_key */);
}
void TestExponentialBackoff(base::TimeDelta initial_delay,
diff --git a/chromium/net/http/http_auth_cache.cc b/chromium/net/http/http_auth_cache.cc
index 81f82ea9555..4ae47ed7cd2 100644
--- a/chromium/net/http/http_auth_cache.cc
+++ b/chromium/net/http/http_auth_cache.cc
@@ -341,7 +341,7 @@ void HttpAuthCache::CopyProxyEntriesFrom(const HttpAuthCache& other) {
continue;
// Sanity check - proxy entries should have an empty NetworkIsolationKey.
- DCHECK_EQ(NetworkIsolationKey(), it->first.network_isolation_key);
+ DCHECK(NetworkIsolationKey() == it->first.network_isolation_key);
// Add an Entry with one of the original entry's paths.
DCHECK(e.paths_.size() > 0);
diff --git a/chromium/net/http/http_auth_controller.cc b/chromium/net/http/http_auth_controller.cc
index 576cfb17e12..01809ad2869 100644
--- a/chromium/net/http/http_auth_controller.cc
+++ b/chromium/net/http/http_auth_controller.cc
@@ -32,10 +32,10 @@ namespace net {
namespace {
base::Value ControllerParamsToValue(HttpAuth::Target target, const GURL& url) {
- base::Value params(base::Value::Type::DICTIONARY);
- params.SetStringPath("target", HttpAuth::GetAuthTargetString(target));
- params.SetStringPath("url", url.spec());
- return params;
+ base::Value::Dict params;
+ params.Set("target", HttpAuth::GetAuthTargetString(target));
+ params.Set("url", url.spec());
+ return base::Value(std::move(params));
}
} // namespace
diff --git a/chromium/net/http/http_auth_controller_unittest.cc b/chromium/net/http/http_auth_controller_unittest.cc
index 68d6df5bbd6..c553b83d33f 100644
--- a/chromium/net/http/http_auth_controller_unittest.cc
+++ b/chromium/net/http/http_auth_controller_unittest.cc
@@ -69,10 +69,11 @@ void RunSingleRoundAuthTest(
"\r\n"));
HttpAuthHandlerMock::Factory auth_handler_factory;
- HttpAuthHandlerMock* auth_handler = new HttpAuthHandlerMock();
+ auto auth_handler = std::make_unique<HttpAuthHandlerMock>();
auth_handler->SetGenerateExpectation((run_mode == RUN_HANDLER_ASYNC),
handler_rv);
- auth_handler_factory.AddMockHandler(auth_handler, HttpAuth::AUTH_PROXY);
+ auth_handler_factory.AddMockHandler(std::move(auth_handler),
+ HttpAuth::AUTH_PROXY);
auth_handler_factory.set_do_init_from_challenge(true);
auto host_resolver = std::make_unique<MockHostResolver>();
@@ -234,29 +235,32 @@ TEST(HttpAuthControllerTest, NoExplicitCredentialsAllowed) {
// Handlers for the first attempt at authentication. AUTH_SCHEME_MOCK handler
// accepts the default identity and successfully constructs a token.
auth_handler_factory.AddMockHandler(
- new MockHandler(OK, HttpAuth::AUTH_SCHEME_MOCK), HttpAuth::AUTH_SERVER);
+ std::make_unique<MockHandler>(OK, HttpAuth::AUTH_SCHEME_MOCK),
+ HttpAuth::AUTH_SERVER);
auth_handler_factory.AddMockHandler(
- new MockHandler(ERR_UNEXPECTED, HttpAuth::AUTH_SCHEME_BASIC),
+ std::make_unique<MockHandler>(ERR_UNEXPECTED,
+ HttpAuth::AUTH_SCHEME_BASIC),
HttpAuth::AUTH_SERVER);
// Handlers for the second attempt. Neither should be used to generate a
// token. Instead the controller should realize that there are no viable
// identities to use with the AUTH_SCHEME_MOCK handler and fail.
auth_handler_factory.AddMockHandler(
- new MockHandler(ERR_UNEXPECTED, HttpAuth::AUTH_SCHEME_MOCK),
+ std::make_unique<MockHandler>(ERR_UNEXPECTED, HttpAuth::AUTH_SCHEME_MOCK),
HttpAuth::AUTH_SERVER);
auth_handler_factory.AddMockHandler(
- new MockHandler(ERR_UNEXPECTED, HttpAuth::AUTH_SCHEME_BASIC),
+ std::make_unique<MockHandler>(ERR_UNEXPECTED,
+ HttpAuth::AUTH_SCHEME_BASIC),
HttpAuth::AUTH_SERVER);
// Fallback handlers for the second attempt. The AUTH_SCHEME_MOCK handler
// should be discarded due to the disabled scheme, and the AUTH_SCHEME_BASIC
// handler should successfully be used to generate a token.
auth_handler_factory.AddMockHandler(
- new MockHandler(ERR_UNEXPECTED, HttpAuth::AUTH_SCHEME_MOCK),
+ std::make_unique<MockHandler>(ERR_UNEXPECTED, HttpAuth::AUTH_SCHEME_MOCK),
HttpAuth::AUTH_SERVER);
auth_handler_factory.AddMockHandler(
- new MockHandler(OK, HttpAuth::AUTH_SCHEME_BASIC),
+ std::make_unique<MockHandler>(OK, HttpAuth::AUTH_SCHEME_BASIC),
HttpAuth::AUTH_SERVER);
auth_handler_factory.set_do_init_from_challenge(true);
diff --git a/chromium/net/http/http_auth_filter.h b/chromium/net/http/http_auth_filter.h
index c0e42b861e2..f24b81dc906 100644
--- a/chromium/net/http/http_auth_filter.h
+++ b/chromium/net/http/http_auth_filter.h
@@ -21,7 +21,7 @@ namespace net {
// allowed for a particular peer.
class NET_EXPORT_PRIVATE HttpAuthFilter {
public:
- virtual ~HttpAuthFilter() {}
+ virtual ~HttpAuthFilter() = default;
// Checks if (`scheme_host_port`, `target`) is supported by the authentication
// scheme. Only the host of `scheme_host_port` is examined.
diff --git a/chromium/net/http/http_auth_filter_unittest.cc b/chromium/net/http/http_auth_filter_unittest.cc
index 5ac316358d0..dae854d45c9 100644
--- a/chromium/net/http/http_auth_filter_unittest.cc
+++ b/chromium/net/http/http_auth_filter_unittest.cc
@@ -67,11 +67,11 @@ TEST(HttpAuthFilterTest, EmptyFilter) {
TEST(HttpAuthFilterTest, NonEmptyFilter) {
// Create an non-empty filter
std::string server_allowlist_filter_string;
- for (size_t i = 0; i < std::size(server_allowlist_array); ++i) {
+ for (const auto* server : server_allowlist_array) {
if (!server_allowlist_filter_string.empty())
server_allowlist_filter_string += ",";
server_allowlist_filter_string += "*";
- server_allowlist_filter_string += server_allowlist_array[i];
+ server_allowlist_filter_string += server;
}
HttpAuthFilterAllowlist filter(server_allowlist_filter_string);
for (const auto& test_case : kTestCases) {
diff --git a/chromium/net/http/http_auth_gssapi_posix.cc b/chromium/net/http/http_auth_gssapi_posix.cc
index e4c25d2b923..e3ab2d76ce6 100644
--- a/chromium/net/http/http_auth_gssapi_posix.cc
+++ b/chromium/net/http/http_auth_gssapi_posix.cc
@@ -12,6 +12,7 @@
#include "base/files/file_path.h"
#include "base/format_macros.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
@@ -79,7 +80,7 @@ class ScopedBuffer {
private:
gss_buffer_t buffer_;
- GSSAPILibrary* gssapi_lib_;
+ raw_ptr<GSSAPILibrary> gssapi_lib_;
};
// ScopedName releases a gss_name_t when it goes out of scope.
@@ -109,7 +110,7 @@ class ScopedName {
private:
gss_name_t name_;
- GSSAPILibrary* gssapi_lib_;
+ raw_ptr<GSSAPILibrary> gssapi_lib_;
};
bool OidEquals(const gss_OID left, const gss_OID right) {
@@ -118,12 +119,12 @@ bool OidEquals(const gss_OID left, const gss_OID right) {
return 0 == memcmp(left->elements, right->elements, right->length);
}
-base::Value GetGssStatusCodeValue(GSSAPILibrary* gssapi_lib,
- OM_uint32 status,
- OM_uint32 status_code_type) {
- base::Value rv{base::Value::Type::DICTIONARY};
+base::Value::Dict GetGssStatusCodeValue(GSSAPILibrary* gssapi_lib,
+ OM_uint32 status,
+ OM_uint32 status_code_type) {
+ base::Value::Dict rv;
- rv.SetIntKey("status", status);
+ rv.Set("status", static_cast<int>(status));
// Message lookups aren't performed if there's no library or if the status
// indicates success.
@@ -148,7 +149,7 @@ base::Value GetGssStatusCodeValue(GSSAPILibrary* gssapi_lib,
// |kMaxMsgLength|. There's no real documented limit to work with here.
constexpr size_t kMaxMsgLength = 4096;
- base::Value messages{base::Value::Type::LIST};
+ base::Value::List messages;
do {
gss_buffer_desc_struct message_buffer = GSS_C_EMPTY_BUFFER;
ScopedBuffer message_buffer_releaser(&message_buffer, gssapi_lib);
@@ -174,41 +175,40 @@ base::Value GetGssStatusCodeValue(GSSAPILibrary* gssapi_lib,
messages.Append(message_string);
} while (message_context != 0 && ++iterations < kMaxDisplayIterations);
- if (messages.GetListDeprecated().size() > 0)
- rv.SetKey("message", std::move(messages));
+ if (!messages.empty())
+ rv.Set("message", std::move(messages));
return rv;
}
-base::Value GetGssStatusValue(GSSAPILibrary* gssapi_lib,
- base::StringPiece method,
- OM_uint32 major_status,
- OM_uint32 minor_status) {
- base::Value params{base::Value::Type::DICTIONARY};
- params.SetStringKey("function", method);
- params.SetKey("major_status", GetGssStatusCodeValue(gssapi_lib, major_status,
- GSS_C_GSS_CODE));
- params.SetKey("minor_status", GetGssStatusCodeValue(gssapi_lib, minor_status,
- GSS_C_MECH_CODE));
+base::Value::Dict GetGssStatusValue(GSSAPILibrary* gssapi_lib,
+ base::StringPiece method,
+ OM_uint32 major_status,
+ OM_uint32 minor_status) {
+ base::Value::Dict params;
+ params.Set("function", method);
+ params.Set("major_status",
+ GetGssStatusCodeValue(gssapi_lib, major_status, GSS_C_GSS_CODE));
+ params.Set("minor_status",
+ GetGssStatusCodeValue(gssapi_lib, minor_status, GSS_C_MECH_CODE));
return params;
}
-base::Value OidToValue(gss_OID oid) {
- base::Value params(base::Value::Type::DICTIONARY);
+base::Value::Dict OidToValue(gss_OID oid) {
+ base::Value::Dict params;
if (!oid || oid->length == 0) {
- params.SetStringKey("oid", "<Empty OID>");
+ params.Set("oid", "<Empty OID>");
return params;
}
- params.SetIntKey("length", oid->length);
+ params.Set("length", static_cast<int>(oid->length));
if (!oid->elements)
return params;
// Cap OID content at arbitrary limit 1k.
constexpr OM_uint32 kMaxOidDataSize = 1024;
- params.SetKey(
- "bytes",
- NetLogBinaryValue(oid->elements, std::min(kMaxOidDataSize, oid->length)));
+ params.Set("bytes", NetLogBinaryValue(oid->elements, std::min(kMaxOidDataSize,
+ oid->length)));
// Based on RFC 2744 Appendix A. Hardcoding the OIDs in the list below to
// avoid having a static dependency on the library.
@@ -232,52 +232,51 @@ base::Value OidToValue(gss_OID oid) {
for (auto& well_known_oid : kWellKnownOIDs) {
if (OidEquals(oid, const_cast<const gss_OID>(&well_known_oid.oid_desc)))
- params.SetStringKey("oid", well_known_oid.symbolic_name);
+ params.Set("oid", well_known_oid.symbolic_name);
}
return params;
}
-base::Value GetDisplayNameValue(GSSAPILibrary* gssapi_lib,
- const gss_name_t gss_name) {
+base::Value::Dict GetDisplayNameValue(GSSAPILibrary* gssapi_lib,
+ const gss_name_t gss_name) {
OM_uint32 major_status = 0;
OM_uint32 minor_status = 0;
gss_buffer_desc_struct name = GSS_C_EMPTY_BUFFER;
gss_OID name_type = GSS_C_NO_OID;
- base::Value rv{base::Value::Type::DICTIONARY};
+ base::Value::Dict rv;
major_status =
gssapi_lib->display_name(&minor_status, gss_name, &name, &name_type);
ScopedBuffer scoped_output_name(&name, gssapi_lib);
if (major_status != GSS_S_COMPLETE) {
- rv.SetKey("error", GetGssStatusValue(gssapi_lib, "gss_display_name",
- major_status, minor_status));
+ rv.Set("error", GetGssStatusValue(gssapi_lib, "gss_display_name",
+ major_status, minor_status));
return rv;
}
auto name_string =
base::StringPiece(reinterpret_cast<const char*>(name.value), name.length);
- rv.SetKey("name", base::IsStringUTF8(name_string)
- ? NetLogStringValue(name_string)
- : NetLogBinaryValue(name.value, name.length));
- rv.SetKey("type", OidToValue(name_type));
+ rv.Set("name", base::IsStringUTF8(name_string)
+ ? NetLogStringValue(name_string)
+ : NetLogBinaryValue(name.value, name.length));
+ rv.Set("type", OidToValue(name_type));
return rv;
}
-base::Value ContextFlagsToValue(OM_uint32 flags) {
- base::Value rv{base::Value::Type::DICTIONARY};
- rv.SetStringKey("value", base::StringPrintf("0x%08x", flags));
- rv.SetBoolKey("delegated", (flags & GSS_C_DELEG_FLAG) == GSS_C_DELEG_FLAG);
- rv.SetBoolKey("mutual", (flags & GSS_C_MUTUAL_FLAG) == GSS_C_MUTUAL_FLAG);
+base::Value::Dict ContextFlagsToValue(OM_uint32 flags) {
+ base::Value::Dict rv;
+ rv.Set("value", base::StringPrintf("0x%08x", flags));
+ rv.Set("delegated", (flags & GSS_C_DELEG_FLAG) == GSS_C_DELEG_FLAG);
+ rv.Set("mutual", (flags & GSS_C_MUTUAL_FLAG) == GSS_C_MUTUAL_FLAG);
return rv;
}
base::Value GetContextStateAsValue(GSSAPILibrary* gssapi_lib,
const gss_ctx_id_t context_handle) {
- base::Value rv{base::Value::Type::DICTIONARY};
+ base::Value::Dict rv;
if (context_handle == GSS_C_NO_CONTEXT) {
- rv.SetKey("error",
- GetGssStatusValue(nullptr, "<none>", GSS_S_NO_CONTEXT, 0));
- return rv;
+ rv.Set("error", GetGssStatusValue(nullptr, "<none>", GSS_S_NO_CONTEXT, 0));
+ return base::Value(std::move(rv));
}
OM_uint32 major_status = 0;
@@ -299,22 +298,22 @@ base::Value GetContextStateAsValue(GSSAPILibrary* gssapi_lib,
&locally_initiated,
&open);
if (major_status != GSS_S_COMPLETE) {
- rv.SetKey("error", GetGssStatusValue(gssapi_lib, "gss_inquire_context",
- major_status, minor_status));
- return rv;
+ rv.Set("error", GetGssStatusValue(gssapi_lib, "gss_inquire_context",
+ major_status, minor_status));
+ return base::Value(std::move(rv));
}
ScopedName scoped_src_name(src_name, gssapi_lib);
ScopedName scoped_targ_name(targ_name, gssapi_lib);
- rv.SetKey("source", GetDisplayNameValue(gssapi_lib, src_name));
- rv.SetKey("target", GetDisplayNameValue(gssapi_lib, targ_name));
+ rv.Set("source", GetDisplayNameValue(gssapi_lib, src_name));
+ rv.Set("target", GetDisplayNameValue(gssapi_lib, targ_name));
// lifetime_rec is a uint32, while base::Value only takes ints. On 32 bit
// platforms uint32 doesn't fit on an int.
- rv.SetStringKey("lifetime", base::NumberToString(lifetime_rec));
- rv.SetKey("mechanism", OidToValue(mech_type));
- rv.SetKey("flags", ContextFlagsToValue(ctx_flags));
- rv.SetBoolKey("open", !!open);
- return rv;
+ rv.Set("lifetime", base::NumberToString(lifetime_rec));
+ rv.Set("mechanism", OidToValue(mech_type));
+ rv.Set("flags", ContextFlagsToValue(ctx_flags));
+ rv.Set("open", !!open);
+ return base::Value(std::move(rv));
}
namespace {
@@ -322,11 +321,11 @@ namespace {
// Return a NetLog value for the result of loading a library.
base::Value LibraryLoadResultParams(base::StringPiece library_name,
base::StringPiece load_result) {
- base::Value params{base::Value::Type::DICTIONARY};
- params.SetStringKey("library_name", library_name);
+ base::Value::Dict params;
+ params.Set("library_name", library_name);
if (!load_result.empty())
- params.SetStringKey("load_result", load_result);
- return params;
+ params.Set("load_result", load_result);
+ return base::Value(std::move(params));
}
} // namespace
@@ -424,10 +423,10 @@ namespace {
base::Value BindFailureParams(base::StringPiece library_name,
base::StringPiece method) {
- base::Value params{base::Value::Type::DICTIONARY};
- params.SetStringKey("library_name", library_name);
- params.SetStringKey("method", method);
- return params;
+ base::Value::Dict params;
+ params.Set("library_name", library_name);
+ params.Set("method", method);
+ return base::Value(std::move(params));
}
void* BindUntypedMethod(base::NativeLibrary lib,
@@ -805,25 +804,25 @@ base::Value ImportNameErrorParams(GSSAPILibrary* library,
base::StringPiece spn,
OM_uint32 major_status,
OM_uint32 minor_status) {
- base::Value params{base::Value::Type::DICTIONARY};
- params.SetStringKey("spn", spn);
+ base::Value::Dict params;
+ params.Set("spn", spn);
if (major_status != GSS_S_COMPLETE)
- params.SetKey("status", GetGssStatusValue(library, "import_name",
- major_status, minor_status));
- return params;
+ params.Set("status", GetGssStatusValue(library, "import_name", major_status,
+ minor_status));
+ return base::Value(std::move(params));
}
base::Value InitSecContextErrorParams(GSSAPILibrary* library,
gss_ctx_id_t context,
OM_uint32 major_status,
OM_uint32 minor_status) {
- base::Value params{base::Value::Type::DICTIONARY};
+ base::Value::Dict params;
if (major_status != GSS_S_COMPLETE)
- params.SetKey("status", GetGssStatusValue(library, "gss_init_sec_context",
- major_status, minor_status));
+ params.Set("status", GetGssStatusValue(library, "gss_init_sec_context",
+ major_status, minor_status));
if (context != GSS_C_NO_CONTEXT)
- params.SetKey("context", GetContextStateAsValue(library, context));
- return params;
+ params.Set("context", GetContextStateAsValue(library, context));
+ return base::Value(std::move(params));
}
} // anonymous namespace
diff --git a/chromium/net/http/http_auth_gssapi_posix.h b/chromium/net/http/http_auth_gssapi_posix.h
index 5c0580a95ec..3acd8bcbffa 100644
--- a/chromium/net/http/http_auth_gssapi_posix.h
+++ b/chromium/net/http/http_auth_gssapi_posix.h
@@ -8,6 +8,7 @@
#include <string>
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/native_library.h"
#include "base/strings/string_piece_forward.h"
#include "base/values.h"
@@ -38,7 +39,7 @@ NET_EXPORT_PRIVATE extern gss_OID CHROME_GSS_SPNEGO_MECH_OID_DESC;
// that implementation.
class NET_EXPORT_PRIVATE GSSAPILibrary {
public:
- virtual ~GSSAPILibrary() {}
+ virtual ~GSSAPILibrary() = default;
// Initializes the library, including any necessary dynamic libraries.
// This is done separately from construction (which happens at startup time)
@@ -214,7 +215,7 @@ class ScopedSecurityContext {
private:
gss_ctx_id_t security_context_ = GSS_C_NO_CONTEXT;
- GSSAPILibrary* gssapi_lib_;
+ raw_ptr<GSSAPILibrary> gssapi_lib_;
};
@@ -247,7 +248,7 @@ class NET_EXPORT_PRIVATE HttpAuthGSSAPI : public HttpAuthMechanism {
const NetLogWithSource& net_log);
gss_OID gss_oid_;
- GSSAPILibrary* library_;
+ raw_ptr<GSSAPILibrary> library_;
std::string decoded_server_auth_token_;
ScopedSecurityContext scoped_sec_context_;
HttpAuth::DelegationType delegation_type_ = HttpAuth::DelegationType::kNone;
@@ -255,8 +256,8 @@ class NET_EXPORT_PRIVATE HttpAuthGSSAPI : public HttpAuthMechanism {
// Diagnostics
-// GetGssStatusCodeValue constructs a base::Value containing a status code and a
-// message.
+// GetGssStatusCodeValue constructs a base::Value::Dict containing a status code
+// and a message.
//
// {
// "status" : <status value as a number>,
@@ -273,12 +274,12 @@ class NET_EXPORT_PRIVATE HttpAuthGSSAPI : public HttpAuthMechanism {
// identified to look up messages if |status_code_type| is |GSS_C_MECH_CODE|.
// Since no mechanism OIDs are passed in, mechanism specific status codes will
// likely not have messages.
-NET_EXPORT_PRIVATE base::Value GetGssStatusCodeValue(
+NET_EXPORT_PRIVATE base::Value::Dict GetGssStatusCodeValue(
GSSAPILibrary* gssapi_lib,
OM_uint32 status,
OM_uint32 status_code_type);
-// Given major and minor GSSAPI status codes, returns a base::Value
+// Given major and minor GSSAPI status codes, returns a base::Value::Dict
// encapsulating the codes as well as their meanings as expanded via
// gss_display_status().
//
@@ -303,21 +304,22 @@ NET_EXPORT_PRIVATE base::Value GetGssStatusCodeValue(
// returned value will be missing the "message" fields. The same is true if the
// message lookup failed for some reason, or if the lookups succeeded but
// yielded an empty message.
-NET_EXPORT_PRIVATE base::Value GetGssStatusValue(GSSAPILibrary* gssapi_lib,
- base::StringPiece method,
- OM_uint32 major_status,
- OM_uint32 minor_status);
+NET_EXPORT_PRIVATE base::Value::Dict GetGssStatusValue(
+ GSSAPILibrary* gssapi_lib,
+ base::StringPiece method,
+ OM_uint32 major_status,
+ OM_uint32 minor_status);
-// OidToValue returns a base::Value representing an OID. The structure of the
-// value is:
+// OidToValue returns a base::Value::Dict representing an OID. The structure of
+// the value is:
// {
// "oid": <symbolic name of OID if it is known>
// "length": <length in bytes of serialized OID>,
// "bytes": <hexdump of up to 1024 bytes of serialized OID>
// }
-NET_EXPORT_PRIVATE base::Value OidToValue(const gss_OID oid);
+NET_EXPORT_PRIVATE base::Value::Dict OidToValue(const gss_OID oid);
-// GetDisplayNameValue returns a base::Value representing a gss_name_t. It
+// GetDisplayNameValue returns a base::Value::Dict representing a gss_name_t. It
// invokes |gss_display_name()| via |gssapi_lib| to determine the display name
// associated with |gss_name|.
//
@@ -335,8 +337,9 @@ NET_EXPORT_PRIVATE base::Value OidToValue(const gss_OID oid);
//
// Note that |gss_name_t| is platform dependent. If |gss_display_name| fails,
// there's no good value to display in its stead.
-NET_EXPORT_PRIVATE base::Value GetDisplayNameValue(GSSAPILibrary* gssapi_lib,
- const gss_name_t gss_name);
+NET_EXPORT_PRIVATE base::Value::Dict GetDisplayNameValue(
+ GSSAPILibrary* gssapi_lib,
+ const gss_name_t gss_name);
// GetContextStateAsValue returns a base::Value that describes the state of a
// GSSAPI context. The structure of the value is:
diff --git a/chromium/net/http/http_auth_gssapi_posix_unittest.cc b/chromium/net/http/http_auth_gssapi_posix_unittest.cc
index 92a9cd7945c..31076e26490 100644
--- a/chromium/net/http/http_auth_gssapi_posix_unittest.cc
+++ b/chromium/net/http/http_auth_gssapi_posix_unittest.cc
@@ -92,7 +92,7 @@ TEST(HttpAuthGSSAPIPOSIXTest, GSSAPIStartup) {
// TODO(ahendrickson): Manipulate the libraries and paths to test each of the
// libraries we expect, and also whether or not they have the interface
// functions we want.
- std::unique_ptr<GSSAPILibrary> gssapi(new GSSAPISharedLibrary(std::string()));
+ auto gssapi = std::make_unique<GSSAPISharedLibrary>(std::string());
DCHECK(gssapi.get());
EXPECT_TRUE(
gssapi.get()->Init(NetLogWithSource::Make(NetLogSourceType::NONE)));
@@ -117,8 +117,8 @@ TEST(HttpAuthGSSAPIPOSIXTest, GSSAPIStartup) {
TEST(HttpAuthGSSAPIPOSIXTest, CustomLibraryMissing) {
RecordingNetLogObserver net_log_observer;
- std::unique_ptr<GSSAPILibrary> gssapi(
- new GSSAPISharedLibrary("/this/library/does/not/exist"));
+ auto gssapi =
+ std::make_unique<GSSAPISharedLibrary>("/this/library/does/not/exist");
EXPECT_FALSE(
gssapi.get()->Init(NetLogWithSource::Make(NetLogSourceType::NONE)));
@@ -182,8 +182,7 @@ TEST(HttpAuthGSSAPIPOSIXTest, CustomLibraryMethodsMissing) {
}
TEST(HttpAuthGSSAPIPOSIXTest, GSSAPICycle) {
- std::unique_ptr<test::MockGSSAPILibrary> mock_library(
- new test::MockGSSAPILibrary);
+ auto mock_library = std::make_unique<test::MockGSSAPILibrary>();
DCHECK(mock_library.get());
mock_library->Init(NetLogWithSource());
const char kAuthResponse[] = "Mary had a little lamb";
@@ -220,13 +219,10 @@ TEST(HttpAuthGSSAPIPOSIXTest, GSSAPICycle) {
kAuthResponse) // Output token
};
- for (size_t i = 0; i < std::size(queries); ++i) {
- mock_library->ExpectSecurityContext(queries[i].expected_package,
- queries[i].response_code,
- queries[i].minor_response_code,
- queries[i].context_info,
- queries[i].expected_input_token,
- queries[i].output_token);
+ for (const auto& query : queries) {
+ mock_library->ExpectSecurityContext(
+ query.expected_package, query.response_code, query.minor_response_code,
+ query.context_info, query.expected_input_token, query.output_token);
}
OM_uint32 major_status = 0;
@@ -243,7 +239,7 @@ TEST(HttpAuthGSSAPIPOSIXTest, GSSAPICycle) {
gss_buffer_desc output_token = {0, nullptr};
OM_uint32 ret_flags = 0;
OM_uint32 time_rec = 0;
- for (size_t i = 0; i < std::size(queries); ++i) {
+ for (const auto& query : queries) {
major_status = mock_library->init_sec_context(&minor_status,
initiator_cred_handle,
&context_handle,
@@ -257,7 +253,7 @@ TEST(HttpAuthGSSAPIPOSIXTest, GSSAPICycle) {
&output_token,
&ret_flags,
&time_rec);
- EXPECT_EQ(queries[i].response_code, major_status);
+ EXPECT_EQ(query.response_code, major_status);
CopyBuffer(&input_token, &output_token);
ClearBuffer(&output_token);
}
diff --git a/chromium/net/http/http_auth_handler_basic.cc b/chromium/net/http/http_auth_handler_basic.cc
index 1b187631747..4314d8b7faf 100644
--- a/chromium/net/http/http_auth_handler_basic.cc
+++ b/chromium/net/http/http_auth_handler_basic.cc
@@ -132,13 +132,13 @@ int HttpAuthHandlerBasic::Factory::CreateAuthHandler(
}
// TODO(cbentzel): Move towards model of parsing in the factory
// method and only constructing when valid.
- std::unique_ptr<HttpAuthHandler> tmp_handler(new HttpAuthHandlerBasic());
+ auto tmp_handler = std::make_unique<HttpAuthHandlerBasic>();
if (!tmp_handler->InitFromChallenge(challenge, target, ssl_info,
network_isolation_key, scheme_host_port,
net_log)) {
return ERR_INVALID_RESPONSE;
}
- handler->swap(tmp_handler);
+ *handler = std::move(tmp_handler);
return OK;
}
diff --git a/chromium/net/http/http_auth_handler_basic.h b/chromium/net/http/http_auth_handler_basic.h
index eb5688c7166..c0391b36998 100644
--- a/chromium/net/http/http_auth_handler_basic.h
+++ b/chromium/net/http/http_auth_handler_basic.h
@@ -35,6 +35,8 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerBasic : public HttpAuthHandler {
std::unique_ptr<HttpAuthHandler>* handler) override;
};
+ ~HttpAuthHandlerBasic() override = default;
+
private:
// HttpAuthHandler
bool Init(HttpAuthChallengeTokenizer* challenge,
@@ -47,9 +49,6 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerBasic : public HttpAuthHandler {
HttpAuth::AuthorizationResult HandleAnotherChallengeImpl(
HttpAuthChallengeTokenizer* challenge) override;
- private:
- ~HttpAuthHandlerBasic() override = default;
-
bool ParseChallenge(HttpAuthChallengeTokenizer* challenge);
};
diff --git a/chromium/net/http/http_auth_handler_basic_unittest.cc b/chromium/net/http/http_auth_handler_basic_unittest.cc
index e87b89b3ee1..136041b70e5 100644
--- a/chromium/net/http/http_auth_handler_basic_unittest.cc
+++ b/chromium/net/http/http_auth_handler_basic_unittest.cc
@@ -44,7 +44,7 @@ TEST(HttpAuthHandlerBasicTest, GenerateAuthToken) {
};
url::SchemeHostPort scheme_host_port(GURL("http://www.example.com"));
HttpAuthHandlerBasic::Factory factory;
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
std::string challenge = "Basic realm=\"Atlantis\"";
SSLInfo null_ssl_info;
auto host_resolver = std::make_unique<MockHostResolver>();
@@ -53,15 +53,15 @@ TEST(HttpAuthHandlerBasicTest, GenerateAuthToken) {
challenge, HttpAuth::AUTH_SERVER, null_ssl_info,
NetworkIsolationKey(), scheme_host_port,
NetLogWithSource(), host_resolver.get(), &basic));
- AuthCredentials credentials(base::ASCIIToUTF16(tests[i].username),
- base::ASCIIToUTF16(tests[i].password));
+ AuthCredentials credentials(base::ASCIIToUTF16(test.username),
+ base::ASCIIToUTF16(test.password));
HttpRequestInfo request_info;
std::string auth_token;
TestCompletionCallback callback;
int rv = basic->GenerateAuthToken(&credentials, &request_info,
callback.callback(), &auth_token);
EXPECT_THAT(rv, IsOk());
- EXPECT_STREQ(tests[i].expected_credentials, auth_token.c_str());
+ EXPECT_STREQ(test.expected_credentials, auth_token.c_str());
}
}
@@ -110,11 +110,11 @@ TEST(HttpAuthHandlerBasicTest, HandleAnotherChallenge) {
NetworkIsolationKey(), scheme_host_port, NetLogWithSource(),
host_resolver.get(), &basic));
- for (size_t i = 0; i < std::size(tests); ++i) {
- std::string challenge(tests[i].challenge);
+ for (const auto& test : tests) {
+ std::string challenge(test.challenge);
HttpAuthChallengeTokenizer tok(challenge.begin(),
challenge.end());
- EXPECT_EQ(tests[i].expected_rv, basic->HandleAnotherChallenge(&tok));
+ EXPECT_EQ(test.expected_rv, basic->HandleAnotherChallenge(&tok));
}
}
@@ -203,17 +203,17 @@ TEST(HttpAuthHandlerBasicTest, InitFromChallenge) {
};
HttpAuthHandlerBasic::Factory factory;
url::SchemeHostPort scheme_host_port(GURL("http://www.example.com"));
- for (size_t i = 0; i < std::size(tests); ++i) {
- std::string challenge = tests[i].challenge;
+ for (const auto& test : tests) {
+ std::string challenge = test.challenge;
SSLInfo null_ssl_info;
auto host_resolver = std::make_unique<MockHostResolver>();
std::unique_ptr<HttpAuthHandler> basic;
int rv = factory.CreateAuthHandlerFromString(
challenge, HttpAuth::AUTH_SERVER, null_ssl_info, NetworkIsolationKey(),
scheme_host_port, NetLogWithSource(), host_resolver.get(), &basic);
- EXPECT_EQ(tests[i].expected_rv, rv);
+ EXPECT_EQ(test.expected_rv, rv);
if (rv == OK)
- EXPECT_EQ(tests[i].expected_realm, basic->realm());
+ EXPECT_EQ(test.expected_realm, basic->realm());
}
}
diff --git a/chromium/net/http/http_auth_handler_digest.cc b/chromium/net/http/http_auth_handler_digest.cc
index 0557b3dc6c5..63c58b6892f 100644
--- a/chromium/net/http/http_auth_handler_digest.cc
+++ b/chromium/net/http/http_auth_handler_digest.cc
@@ -8,6 +8,7 @@
#include "base/hash/md5.h"
#include "base/logging.h"
+#include "base/memory/ptr_util.h"
#include "base/rand_util.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
@@ -78,14 +79,13 @@ std::string HttpAuthHandlerDigest::FixedNonceGenerator::GenerateNonce() const {
}
HttpAuthHandlerDigest::Factory::Factory()
- : nonce_generator_(new DynamicNonceGenerator()) {
-}
+ : nonce_generator_(std::make_unique<DynamicNonceGenerator>()) {}
HttpAuthHandlerDigest::Factory::~Factory() = default;
void HttpAuthHandlerDigest::Factory::set_nonce_generator(
- const NonceGenerator* nonce_generator) {
- nonce_generator_.reset(nonce_generator);
+ std::unique_ptr<const NonceGenerator> nonce_generator) {
+ nonce_generator_ = std::move(nonce_generator);
}
int HttpAuthHandlerDigest::Factory::CreateAuthHandler(
@@ -101,14 +101,14 @@ int HttpAuthHandlerDigest::Factory::CreateAuthHandler(
std::unique_ptr<HttpAuthHandler>* handler) {
// TODO(cbentzel): Move towards model of parsing in the factory
// method and only constructing when valid.
- std::unique_ptr<HttpAuthHandler> tmp_handler(
+ auto tmp_handler = base::WrapUnique(
new HttpAuthHandlerDigest(digest_nonce_count, nonce_generator_.get()));
if (!tmp_handler->InitFromChallenge(challenge, target, ssl_info,
network_isolation_key, scheme_host_port,
net_log)) {
return ERR_INVALID_RESPONSE;
}
- handler->swap(tmp_handler);
+ *handler = std::move(tmp_handler);
return OK;
}
diff --git a/chromium/net/http/http_auth_handler_digest.h b/chromium/net/http/http_auth_handler_digest.h
index a170f7a81e1..1d81a1f518d 100644
--- a/chromium/net/http/http_auth_handler_digest.h
+++ b/chromium/net/http/http_auth_handler_digest.h
@@ -74,7 +74,8 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerDigest : public HttpAuthHandler {
~Factory() override;
// This factory owns the passed in |nonce_generator|.
- void set_nonce_generator(const NonceGenerator* nonce_generator);
+ void set_nonce_generator(
+ std::unique_ptr<const NonceGenerator> nonce_generator);
int CreateAuthHandler(HttpAuthChallengeTokenizer* challenge,
HttpAuth::Target target,
@@ -91,6 +92,8 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerDigest : public HttpAuthHandler {
std::unique_ptr<const NonceGenerator> nonce_generator_;
};
+ ~HttpAuthHandlerDigest() override;
+
private:
// HttpAuthHandler
bool Init(HttpAuthChallengeTokenizer* challenge,
@@ -134,7 +137,6 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerDigest : public HttpAuthHandler {
// the handler. The lifetime of the |nonce_generator| must exceed that of this
// handler.
HttpAuthHandlerDigest(int nonce_count, const NonceGenerator* nonce_generator);
- ~HttpAuthHandlerDigest() override;
// Parse the challenge, saving the results into this instance.
// Returns true on success.
diff --git a/chromium/net/http/http_auth_handler_digest_unittest.cc b/chromium/net/http/http_auth_handler_digest_unittest.cc
index de6b127775f..cba4635bee3 100644
--- a/chromium/net/http/http_auth_handler_digest_unittest.cc
+++ b/chromium/net/http/http_auth_handler_digest_unittest.cc
@@ -55,11 +55,11 @@ bool RespondToChallenge(HttpAuth::Target target,
EXPECT_FALSE(challenge.empty());
token->clear();
- std::unique_ptr<HttpAuthHandlerDigest::Factory> factory(
- new HttpAuthHandlerDigest::Factory());
- HttpAuthHandlerDigest::NonceGenerator* nonce_generator =
- new HttpAuthHandlerDigest::FixedNonceGenerator("client_nonce");
- factory->set_nonce_generator(nonce_generator);
+ auto factory = std::make_unique<HttpAuthHandlerDigest::Factory>();
+ auto nonce_generator =
+ std::make_unique<HttpAuthHandlerDigest::FixedNonceGenerator>(
+ "client_nonce");
+ factory->set_nonce_generator(std::move(nonce_generator));
auto host_resolver = std::make_unique<MockHostResolver>();
std::unique_ptr<HttpAuthHandler> handler;
@@ -80,7 +80,7 @@ bool RespondToChallenge(HttpAuth::Target target,
// completes synchronously. That's why this test can get away with a
// TestCompletionCallback without an IO thread.
TestCompletionCallback callback;
- std::unique_ptr<HttpRequestInfo> request(new HttpRequestInfo());
+ auto request = std::make_unique<HttpRequestInfo>();
request->url = GURL(request_url);
AuthCredentials credentials(u"foo", u"bar");
int rv_generate = handler->GenerateAuthToken(
@@ -362,17 +362,16 @@ TEST(HttpAuthHandlerDigestTest, ParseChallenge) {
};
url::SchemeHostPort scheme_host_port(GURL("http://www.example.com"));
- std::unique_ptr<HttpAuthHandlerDigest::Factory> factory(
- new HttpAuthHandlerDigest::Factory());
- for (size_t i = 0; i < std::size(tests); ++i) {
+ auto factory = std::make_unique<HttpAuthHandlerDigest::Factory>();
+ for (const auto& test : tests) {
SSLInfo null_ssl_info;
auto host_resolver = std::make_unique<MockHostResolver>();
std::unique_ptr<HttpAuthHandler> handler;
int rv = factory->CreateAuthHandlerFromString(
- tests[i].challenge, HttpAuth::AUTH_SERVER, null_ssl_info,
+ test.challenge, HttpAuth::AUTH_SERVER, null_ssl_info,
NetworkIsolationKey(), scheme_host_port, NetLogWithSource(),
host_resolver.get(), &handler);
- if (tests[i].parsed_success) {
+ if (test.parsed_success) {
EXPECT_THAT(rv, IsOk());
} else {
EXPECT_NE(OK, rv);
@@ -382,13 +381,13 @@ TEST(HttpAuthHandlerDigestTest, ParseChallenge) {
ASSERT_TRUE(handler.get() != nullptr);
HttpAuthHandlerDigest* digest =
static_cast<HttpAuthHandlerDigest*>(handler.get());
- EXPECT_STREQ(tests[i].parsed_realm, digest->realm_.c_str());
- EXPECT_STREQ(tests[i].parsed_nonce, digest->nonce_.c_str());
- EXPECT_STREQ(tests[i].parsed_domain, digest->domain_.c_str());
- EXPECT_STREQ(tests[i].parsed_opaque, digest->opaque_.c_str());
- EXPECT_EQ(tests[i].parsed_stale, digest->stale_);
- EXPECT_EQ(tests[i].parsed_algorithm, digest->algorithm_);
- EXPECT_EQ(tests[i].parsed_qop, digest->qop_);
+ EXPECT_STREQ(test.parsed_realm, digest->realm_.c_str());
+ EXPECT_STREQ(test.parsed_nonce, digest->nonce_.c_str());
+ EXPECT_STREQ(test.parsed_domain, digest->domain_.c_str());
+ EXPECT_STREQ(test.parsed_opaque, digest->opaque_.c_str());
+ EXPECT_EQ(test.parsed_stale, digest->stale_);
+ EXPECT_EQ(test.parsed_algorithm, digest->algorithm_);
+ EXPECT_EQ(test.parsed_qop, digest->qop_);
EXPECT_TRUE(handler->encrypts_identity());
EXPECT_FALSE(handler->is_connection_based());
EXPECT_TRUE(handler->NeedsIdentity());
@@ -528,14 +527,13 @@ TEST(HttpAuthHandlerDigestTest, AssembleCredentials) {
}
};
url::SchemeHostPort scheme_host_port(GURL("http://www.example.com"));
- std::unique_ptr<HttpAuthHandlerDigest::Factory> factory(
- new HttpAuthHandlerDigest::Factory());
- for (size_t i = 0; i < std::size(tests); ++i) {
+ auto factory = std::make_unique<HttpAuthHandlerDigest::Factory>();
+ for (const auto& test : tests) {
SSLInfo null_ssl_info;
auto host_resolver = std::make_unique<MockHostResolver>();
std::unique_ptr<HttpAuthHandler> handler;
int rv = factory->CreateAuthHandlerFromString(
- tests[i].challenge, HttpAuth::AUTH_SERVER, null_ssl_info,
+ test.challenge, HttpAuth::AUTH_SERVER, null_ssl_info,
NetworkIsolationKey(), scheme_host_port, NetLogWithSource(),
host_resolver.get(), &handler);
EXPECT_THAT(rv, IsOk());
@@ -543,22 +541,18 @@ TEST(HttpAuthHandlerDigestTest, AssembleCredentials) {
HttpAuthHandlerDigest* digest =
static_cast<HttpAuthHandlerDigest*>(handler.get());
- std::string creds =
- digest->AssembleCredentials(tests[i].req_method,
- tests[i].req_path,
- AuthCredentials(
- base::ASCIIToUTF16(tests[i].username),
- base::ASCIIToUTF16(tests[i].password)),
- tests[i].cnonce,
- tests[i].nonce_count);
-
- EXPECT_STREQ(tests[i].expected_creds, creds.c_str());
+ std::string creds = digest->AssembleCredentials(
+ test.req_method, test.req_path,
+ AuthCredentials(base::ASCIIToUTF16(test.username),
+ base::ASCIIToUTF16(test.password)),
+ test.cnonce, test.nonce_count);
+
+ EXPECT_STREQ(test.expected_creds, creds.c_str());
}
}
TEST(HttpAuthHandlerDigest, HandleAnotherChallenge) {
- std::unique_ptr<HttpAuthHandlerDigest::Factory> factory(
- new HttpAuthHandlerDigest::Factory());
+ auto factory = std::make_unique<HttpAuthHandlerDigest::Factory>();
auto host_resolver = std::make_unique<MockHostResolver>();
std::unique_ptr<HttpAuthHandler> handler;
std::string default_challenge =
diff --git a/chromium/net/http/http_auth_handler_factory.cc b/chromium/net/http/http_auth_handler_factory.cc
index 05e0a4416aa..d3dce69123b 100644
--- a/chromium/net/http/http_auth_handler_factory.cc
+++ b/chromium/net/http/http_auth_handler_factory.cc
@@ -38,16 +38,16 @@ base::Value NetLogParamsForCreateAuth(
const url::SchemeHostPort& scheme_host_port,
const absl::optional<bool>& allows_default_credentials,
net::NetLogCaptureMode capture_mode) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetKey("scheme", net::NetLogStringValue(scheme));
+ base::Value::Dict dict;
+ dict.Set("scheme", net::NetLogStringValue(scheme));
if (net::NetLogCaptureIncludesSensitive(capture_mode))
- dict.SetKey("challenge", net::NetLogStringValue(challenge));
- dict.SetStringKey("origin", scheme_host_port.Serialize());
+ dict.Set("challenge", net::NetLogStringValue(challenge));
+ dict.Set("origin", scheme_host_port.Serialize());
if (allows_default_credentials)
- dict.SetBoolKey("allows_default_credentials", *allows_default_credentials);
+ dict.Set("allows_default_credentials", *allows_default_credentials);
if (net_error < 0)
- dict.SetIntKey("net_error", net_error);
- return dict;
+ dict.Set("net_error", net_error);
+ return base::Value(std::move(dict));
}
} // namespace
@@ -102,11 +102,11 @@ void HttpAuthHandlerRegistryFactory::SetHttpAuthPreferences(
void HttpAuthHandlerRegistryFactory::RegisterSchemeFactory(
const std::string& scheme,
- HttpAuthHandlerFactory* factory) {
+ std::unique_ptr<HttpAuthHandlerFactory> factory) {
std::string lower_scheme = base::ToLowerASCII(scheme);
if (factory) {
factory->set_http_auth_preferences(http_auth_preferences());
- factory_map_[lower_scheme] = base::WrapUnique(factory);
+ factory_map_[lower_scheme] = std::move(factory);
} else {
factory_map_.erase(lower_scheme);
}
@@ -150,26 +150,26 @@ HttpAuthHandlerRegistryFactory::Create(
HttpAuthMechanismFactory negotiate_auth_system_factory
#endif
) {
- std::unique_ptr<HttpAuthHandlerRegistryFactory> registry_factory(
- new HttpAuthHandlerRegistryFactory(prefs));
+ auto registry_factory =
+ std::make_unique<HttpAuthHandlerRegistryFactory>(prefs);
- registry_factory->RegisterSchemeFactory(kBasicAuthScheme,
- new HttpAuthHandlerBasic::Factory());
+ registry_factory->RegisterSchemeFactory(
+ kBasicAuthScheme, std::make_unique<HttpAuthHandlerBasic::Factory>());
- registry_factory->RegisterSchemeFactory(kDigestAuthScheme,
- new HttpAuthHandlerDigest::Factory());
+ registry_factory->RegisterSchemeFactory(
+ kDigestAuthScheme, std::make_unique<HttpAuthHandlerDigest::Factory>());
- HttpAuthHandlerNTLM::Factory* ntlm_factory =
- new HttpAuthHandlerNTLM::Factory();
+ auto ntlm_factory = std::make_unique<HttpAuthHandlerNTLM::Factory>();
#if BUILDFLAG(IS_WIN)
ntlm_factory->set_sspi_library(
std::make_unique<SSPILibraryDefault>(NTLMSP_NAME));
#endif // BUILDFLAG(IS_WIN)
- registry_factory->RegisterSchemeFactory(kNtlmAuthScheme, ntlm_factory);
+ registry_factory->RegisterSchemeFactory(kNtlmAuthScheme,
+ std::move(ntlm_factory));
#if BUILDFLAG(USE_KERBEROS)
- HttpAuthHandlerNegotiate::Factory* negotiate_factory =
- new HttpAuthHandlerNegotiate::Factory(negotiate_auth_system_factory);
+ auto negotiate_factory = std::make_unique<HttpAuthHandlerNegotiate::Factory>(
+ negotiate_auth_system_factory);
#if BUILDFLAG(IS_WIN)
negotiate_factory->set_library(
std::make_unique<SSPILibraryDefault>(NEGOSSP_NAME));
@@ -178,7 +178,7 @@ HttpAuthHandlerRegistryFactory::Create(
std::make_unique<GSSAPISharedLibrary>(gssapi_library_name));
#endif
registry_factory->RegisterSchemeFactory(kNegotiateAuthScheme,
- negotiate_factory);
+ std::move(negotiate_factory));
#endif // BUILDFLAG(USE_KERBEROS)
if (prefs) {
diff --git a/chromium/net/http/http_auth_handler_factory.h b/chromium/net/http/http_auth_handler_factory.h
index d9b9138cc91..4f1b3b466e5 100644
--- a/chromium/net/http/http_auth_handler_factory.h
+++ b/chromium/net/http/http_auth_handler_factory.h
@@ -50,7 +50,7 @@ class NET_EXPORT HttpAuthHandlerFactory {
HttpAuthHandlerFactory(const HttpAuthHandlerFactory&) = delete;
HttpAuthHandlerFactory& operator=(const HttpAuthHandlerFactory&) = delete;
- virtual ~HttpAuthHandlerFactory() {}
+ virtual ~HttpAuthHandlerFactory() = default;
// Sets the source of the HTTP authentication preferences.
// HttpAuthHandlerFactory doesn't own the preferences, and the
@@ -194,7 +194,7 @@ class NET_EXPORT HttpAuthHandlerRegistryFactory
// for |scheme|. If a factory object used to exist for |scheme|, it will be
// deleted.
void RegisterSchemeFactory(const std::string& scheme,
- HttpAuthHandlerFactory* factory);
+ std::unique_ptr<HttpAuthHandlerFactory> factory);
// Creates an HttpAuthHandlerRegistryFactory.
//
diff --git a/chromium/net/http/http_auth_handler_factory_unittest.cc b/chromium/net/http/http_auth_handler_factory_unittest.cc
index ac993f0fe75..49eba343b6e 100644
--- a/chromium/net/http/http_auth_handler_factory_unittest.cc
+++ b/chromium/net/http/http_auth_handler_factory_unittest.cc
@@ -67,16 +67,16 @@ TEST(HttpAuthHandlerFactoryTest, RegistryFactory) {
/*http_auth_preferences=*/nullptr);
url::SchemeHostPort scheme_host_port(GURL("https://www.google.com"));
const int kBasicReturnCode = -1;
- MockHttpAuthHandlerFactory* mock_factory_basic =
- new MockHttpAuthHandlerFactory(kBasicReturnCode);
+ auto mock_factory_basic =
+ std::make_unique<MockHttpAuthHandlerFactory>(kBasicReturnCode);
const int kDigestReturnCode = -2;
- MockHttpAuthHandlerFactory* mock_factory_digest =
- new MockHttpAuthHandlerFactory(kDigestReturnCode);
+ auto mock_factory_digest =
+ std::make_unique<MockHttpAuthHandlerFactory>(kDigestReturnCode);
const int kDigestReturnCodeReplace = -3;
- MockHttpAuthHandlerFactory* mock_factory_digest_replace =
- new MockHttpAuthHandlerFactory(kDigestReturnCodeReplace);
+ auto mock_factory_digest_replace =
+ std::make_unique<MockHttpAuthHandlerFactory>(kDigestReturnCodeReplace);
auto host_resovler = std::make_unique<MockHostResolver>();
std::unique_ptr<HttpAuthHandler> handler;
@@ -89,7 +89,8 @@ TEST(HttpAuthHandlerFactoryTest, RegistryFactory) {
scheme_host_port, NetLogWithSource(), host_resovler.get(), &handler));
// Test what happens with a single scheme.
- registry_factory.RegisterSchemeFactory("Basic", mock_factory_basic);
+ registry_factory.RegisterSchemeFactory("Basic",
+ std::move(mock_factory_basic));
EXPECT_EQ(
kBasicReturnCode,
registry_factory.CreateAuthHandlerFromString(
@@ -102,7 +103,8 @@ TEST(HttpAuthHandlerFactoryTest, RegistryFactory) {
scheme_host_port, NetLogWithSource(), host_resovler.get(), &handler));
// Test multiple schemes
- registry_factory.RegisterSchemeFactory("Digest", mock_factory_digest);
+ registry_factory.RegisterSchemeFactory("Digest",
+ std::move(mock_factory_digest));
EXPECT_EQ(
kBasicReturnCode,
registry_factory.CreateAuthHandlerFromString(
@@ -122,7 +124,8 @@ TEST(HttpAuthHandlerFactoryTest, RegistryFactory) {
scheme_host_port, NetLogWithSource(), host_resovler.get(), &handler));
// Test replacement of existing auth scheme
- registry_factory.RegisterSchemeFactory("Digest", mock_factory_digest_replace);
+ registry_factory.RegisterSchemeFactory(
+ "Digest", std::move(mock_factory_digest_replace));
EXPECT_EQ(
kBasicReturnCode,
registry_factory.CreateAuthHandlerFromString(
@@ -136,7 +139,7 @@ TEST(HttpAuthHandlerFactoryTest, RegistryFactory) {
}
TEST(HttpAuthHandlerFactoryTest, DefaultFactory) {
- std::unique_ptr<HostResolver> host_resolver(new MockHostResolver());
+ auto host_resolver = std::make_unique<MockHostResolver>();
MockAllowHttpAuthPreferences http_auth_preferences;
std::unique_ptr<HttpAuthHandlerRegistryFactory> http_auth_handler_factory(
HttpAuthHandlerFactory::CreateDefault());
@@ -220,7 +223,7 @@ TEST(HttpAuthHandlerFactoryTest, DefaultFactory) {
}
TEST(HttpAuthHandlerFactoryTest, HttpAuthUrlFilter) {
- std::unique_ptr<HostResolver> host_resolver(new MockHostResolver());
+ auto host_resolver = std::make_unique<MockHostResolver>();
MockAllowHttpAuthPreferences http_auth_preferences;
// Set the Preference that blocks Basic Auth over HTTP on all of the
@@ -273,7 +276,7 @@ TEST(HttpAuthHandlerFactoryTest, HttpAuthUrlFilter) {
}
TEST(HttpAuthHandlerFactoryTest, BasicFactoryRespectsHTTPEnabledPref) {
- std::unique_ptr<HostResolver> host_resolver(new MockHostResolver());
+ auto host_resolver = std::make_unique<MockHostResolver>();
std::unique_ptr<HttpAuthHandlerRegistryFactory> http_auth_handler_factory(
HttpAuthHandlerFactory::CreateDefault());
@@ -330,7 +333,7 @@ TEST(HttpAuthHandlerFactoryTest, BasicFactoryRespectsHTTPEnabledPref) {
}
TEST(HttpAuthHandlerFactoryTest, LogCreateAuthHandlerResults) {
- std::unique_ptr<HostResolver> host_resolver(new MockHostResolver());
+ auto host_resolver = std::make_unique<MockHostResolver>();
std::unique_ptr<HttpAuthHandlerRegistryFactory> http_auth_handler_factory(
HttpAuthHandlerFactory::CreateDefault());
url::SchemeHostPort scheme_host_port(GURL("http://www.example.com"));
@@ -378,10 +381,12 @@ TEST(HttpAuthHandlerFactoryTest, LogCreateAuthHandlerResults) {
auto entries = net_log_observer.GetEntriesWithType(
NetLogEventType::AUTH_HANDLER_CREATE_RESULT);
ASSERT_EQ(1u, entries.size());
- const std::string* scheme = entries[0].params.FindStringKey("scheme");
+ const std::string* scheme =
+ entries[0].params.GetDict().FindString("scheme");
ASSERT_NE(nullptr, scheme);
EXPECT_STRCASEEQ(test_case.expected_scheme, scheme->data());
- absl::optional<int> net_error = entries[0].params.FindIntKey("net_error");
+ absl::optional<int> net_error =
+ entries[0].params.GetDict().FindInt("net_error");
if (test_case.expected_net_error) {
ASSERT_TRUE(net_error.has_value());
EXPECT_EQ(test_case.expected_net_error, net_error.value());
@@ -391,7 +396,7 @@ TEST(HttpAuthHandlerFactoryTest, LogCreateAuthHandlerResults) {
// The challenge should be logged only when sensitive logging is enabled.
const std::string* challenge =
- entries[0].params.FindStringKey("challenge");
+ entries[0].params.GetDict().FindString("challenge");
if (capture_mode == NetLogCaptureMode::kDefault) {
ASSERT_EQ(nullptr, challenge);
} else {
diff --git a/chromium/net/http/http_auth_handler_mock.cc b/chromium/net/http/http_auth_handler_mock.cc
index 9e76f02a001..4bffe8b912a 100644
--- a/chromium/net/http/http_auth_handler_mock.cc
+++ b/chromium/net/http/http_auth_handler_mock.cc
@@ -146,8 +146,9 @@ HttpAuthHandlerMock::Factory::Factory() {
HttpAuthHandlerMock::Factory::~Factory() = default;
void HttpAuthHandlerMock::Factory::AddMockHandler(
- HttpAuthHandler* handler, HttpAuth::Target target) {
- handlers_[target].push_back(base::WrapUnique(handler));
+ std::unique_ptr<HttpAuthHandler> handler,
+ HttpAuth::Target target) {
+ handlers_[target].push_back(std::move(handler));
}
int HttpAuthHandlerMock::Factory::CreateAuthHandler(
diff --git a/chromium/net/http/http_auth_handler_mock.h b/chromium/net/http/http_auth_handler_mock.h
index ef2be2f1686..70f1738fe61 100644
--- a/chromium/net/http/http_auth_handler_mock.h
+++ b/chromium/net/http/http_auth_handler_mock.h
@@ -42,7 +42,8 @@ class HttpAuthHandlerMock : public HttpAuthHandler {
Factory();
~Factory() override;
- void AddMockHandler(HttpAuthHandler* handler, HttpAuth::Target target);
+ void AddMockHandler(std::unique_ptr<HttpAuthHandler> handler,
+ HttpAuth::Target target);
void set_do_init_from_challenge(bool do_init_from_challenge) {
do_init_from_challenge_ = do_init_from_challenge;
diff --git a/chromium/net/http/http_auth_handler_negotiate.cc b/chromium/net/http/http_auth_handler_negotiate.cc
index bab8b1b551a..1e83a068a2b 100644
--- a/chromium/net/http/http_auth_handler_negotiate.cc
+++ b/chromium/net/http/http_auth_handler_negotiate.cc
@@ -40,13 +40,13 @@ namespace {
base::Value NetLogParameterChannelBindings(
const std::string& channel_binding_token,
NetLogCaptureMode capture_mode) {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
if (!NetLogCaptureIncludesSocketBytes(capture_mode))
- return dict;
+ return base::Value(std::move(dict));
- dict.SetStringKey("token", base::HexEncode(channel_binding_token.data(),
- channel_binding_token.size()));
- return dict;
+ dict.Set("token", base::HexEncode(channel_binding_token.data(),
+ channel_binding_token.size()));
+ return base::Value(std::move(dict));
}
// Uses |negotiate_auth_system_factory| to create the auth system, otherwise
@@ -101,10 +101,11 @@ int HttpAuthHandlerNegotiate::Factory::CreateAuthHandler(
return ERR_UNSUPPORTED_AUTH_SCHEME;
// TODO(cbentzel): Move towards model of parsing in the factory
// method and only constructing when valid.
- std::unique_ptr<HttpAuthHandler> tmp_handler(new HttpAuthHandlerNegotiate(
- CreateAuthSystem(auth_library_.get(), http_auth_preferences(),
- negotiate_auth_system_factory_),
- http_auth_preferences(), host_resolver));
+ std::unique_ptr<HttpAuthHandler> tmp_handler(
+ std::make_unique<HttpAuthHandlerNegotiate>(
+ CreateAuthSystem(auth_library_.get(), http_auth_preferences(),
+ negotiate_auth_system_factory_),
+ http_auth_preferences(), host_resolver));
#elif BUILDFLAG(IS_ANDROID)
if (is_unsupported_ || !http_auth_preferences() ||
http_auth_preferences()->AuthAndroidNegotiateAccountType().empty() ||
@@ -112,28 +113,31 @@ int HttpAuthHandlerNegotiate::Factory::CreateAuthHandler(
return ERR_UNSUPPORTED_AUTH_SCHEME;
// TODO(cbentzel): Move towards model of parsing in the factory
// method and only constructing when valid.
- std::unique_ptr<HttpAuthHandler> tmp_handler(new HttpAuthHandlerNegotiate(
- CreateAuthSystem(http_auth_preferences(), negotiate_auth_system_factory_),
- http_auth_preferences(), host_resolver));
+ std::unique_ptr<HttpAuthHandler> tmp_handler(
+ std::make_unique<HttpAuthHandlerNegotiate>(
+ CreateAuthSystem(http_auth_preferences(),
+ negotiate_auth_system_factory_),
+ http_auth_preferences(), host_resolver));
#elif BUILDFLAG(IS_POSIX)
if (is_unsupported_)
return ERR_UNSUPPORTED_AUTH_SCHEME;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
// Note: Don't set is_unsupported_ = true here. AllowGssapiLibraryLoad()
// might change to true during a session.
if (!http_auth_preferences()->AllowGssapiLibraryLoad())
return ERR_UNSUPPORTED_AUTH_SCHEME;
-#endif
+#endif // BUILDFLAG(IS_CHROMEOS)
if (!auth_library_->Init(net_log)) {
is_unsupported_ = true;
return ERR_UNSUPPORTED_AUTH_SCHEME;
}
// TODO(ahendrickson): Move towards model of parsing in the factory
// method and only constructing when valid.
- std::unique_ptr<HttpAuthHandler> tmp_handler(new HttpAuthHandlerNegotiate(
- CreateAuthSystem(auth_library_.get(), http_auth_preferences(),
- negotiate_auth_system_factory_),
- http_auth_preferences(), host_resolver));
+ std::unique_ptr<HttpAuthHandler> tmp_handler(
+ std::make_unique<HttpAuthHandlerNegotiate>(
+ CreateAuthSystem(auth_library_.get(), http_auth_preferences(),
+ negotiate_auth_system_factory_),
+ http_auth_preferences(), host_resolver));
#endif
if (!tmp_handler->InitFromChallenge(challenge, target, ssl_info,
network_isolation_key, scheme_host_port,
diff --git a/chromium/net/http/http_auth_handler_negotiate_unittest.cc b/chromium/net/http/http_auth_handler_negotiate_unittest.cc
index 80b03874963..310b2180c1c 100644
--- a/chromium/net/http/http_auth_handler_negotiate_unittest.cc
+++ b/chromium/net/http/http_auth_handler_negotiate_unittest.cc
@@ -62,10 +62,12 @@ class HttpAuthHandlerNegotiateTest : public PlatformTest,
features::kSplitHostCacheByNetworkIsolationKey);
network_isolation_key_ = NetworkIsolationKey::CreateTransient();
#if BUILDFLAG(IS_WIN)
- auth_library_ = new MockAuthLibrary(const_cast<wchar_t*>(NEGOSSP_NAME));
+ auto auth_library =
+ std::make_unique<MockAuthLibrary>(const_cast<wchar_t*>(NEGOSSP_NAME));
#else
- auth_library_ = new MockAuthLibrary();
+ auto auth_library = std::make_unique<MockAuthLibrary>();
#endif
+ auth_library_ = auth_library.get();
resolver_ = std::make_unique<MockCachingHostResolver>(
/*cache_invalidation_num=*/0,
/*default_result=*/MockHostResolverBase::RuleResolver::
@@ -78,11 +80,12 @@ class HttpAuthHandlerNegotiateTest : public PlatformTest,
HttpAuthMechanismFactory());
factory_->set_http_auth_preferences(http_auth_preferences_.get());
#if BUILDFLAG(IS_ANDROID)
+ auth_library_for_android_ = std::move(auth_library);
http_auth_preferences_->set_auth_android_negotiate_account_type(
"org.chromium.test.DummySpnegoAuthenticator");
MockAuthLibrary::EnsureTestAccountExists();
#else
- factory_->set_library(base::WrapUnique(auth_library_.get()));
+ factory_->set_library(std::move(auth_library));
#endif // BUILDFLAG(IS_ANDROID)
}
@@ -178,13 +181,11 @@ class HttpAuthHandlerNegotiateTest : public PlatformTest,
kAuthResponse) // Output token
};
- for (size_t i = 0; i < std::size(queries); ++i) {
- mock_library->ExpectSecurityContext(queries[i].expected_package,
- queries[i].response_code,
- queries[i].minor_response_code,
- queries[i].context_info,
- queries[i].expected_input_token,
- queries[i].output_token);
+ for (const auto& query : queries) {
+ mock_library->ExpectSecurityContext(
+ query.expected_package, query.response_code,
+ query.minor_response_code, query.context_info,
+ query.expected_input_token, query.output_token);
}
#endif // BUILDFLAG(IS_WIN)
}
@@ -266,6 +267,8 @@ class HttpAuthHandlerNegotiateTest : public PlatformTest,
#if BUILDFLAG(IS_WIN)
std::unique_ptr<SecPkgInfoW> security_package_;
+#elif BUILDFLAG(IS_ANDROID)
+ std::unique_ptr<MockAuthLibrary> auth_library_for_android_;
#endif
// |auth_library_| is passed to |factory_|, which assumes ownership of it, but
// can't be a scoped pointer to it since the tests need access when they set
@@ -452,8 +455,8 @@ TEST_F(HttpAuthHandlerNegotiateTest, NoKerberosCredentials) {
#if BUILDFLAG(USE_EXTERNAL_GSSAPI)
TEST_F(HttpAuthHandlerNegotiateTest, MissingGSSAPI) {
MockAllowHttpAuthPreferences http_auth_preferences;
- std::unique_ptr<HttpAuthHandlerNegotiate::Factory> negotiate_factory(
- new HttpAuthHandlerNegotiate::Factory(HttpAuthMechanismFactory()));
+ auto negotiate_factory = std::make_unique<HttpAuthHandlerNegotiate::Factory>(
+ HttpAuthMechanismFactory());
negotiate_factory->set_http_auth_preferences(&http_auth_preferences);
negotiate_factory->set_library(
std::make_unique<GSSAPISharedLibrary>("/this/library/does/not/exist"));
@@ -468,8 +471,8 @@ TEST_F(HttpAuthHandlerNegotiateTest, MissingGSSAPI) {
}
#endif // BUILDFLAG(USE_EXTERNAL_GSSAPI)
-// AllowGssapiLibraryLoad() is only supported on Chrome OS.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+// AllowGssapiLibraryLoad() is only supported on ChromeOS.
+#if BUILDFLAG(IS_CHROMEOS)
TEST_F(HttpAuthHandlerNegotiateTest, AllowGssapiLibraryLoad) {
// Disabling allow_gssapi_library_load should prevent handler creation.
SetupMocks(AuthLibrary());
@@ -485,7 +488,7 @@ TEST_F(HttpAuthHandlerNegotiateTest, AllowGssapiLibraryLoad) {
EXPECT_EQ(OK, rv);
EXPECT_TRUE(auth_handler);
}
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif // BUILDFLAG(IS_CHROMEOS)
#endif // BUILDFLAG(IS_POSIX)
diff --git a/chromium/net/http/http_auth_handler_ntlm.h b/chromium/net/http/http_auth_handler_ntlm.h
index ada68fb3b39..d10b4417af6 100644
--- a/chromium/net/http/http_auth_handler_ntlm.h
+++ b/chromium/net/http/http_auth_handler_ntlm.h
@@ -92,6 +92,8 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerNTLM : public HttpAuthHandler {
HttpAuthHandlerNTLM(const HttpAuthHandlerNTLM&) = delete;
HttpAuthHandlerNTLM& operator=(const HttpAuthHandlerNTLM&) = delete;
+ ~HttpAuthHandlerNTLM() override;
+
// HttpAuthHandler
bool NeedsIdentity() override;
bool AllowsDefaultCredentials() override;
@@ -109,8 +111,6 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerNTLM : public HttpAuthHandler {
HttpAuthChallengeTokenizer* challenge) override;
private:
- ~HttpAuthHandlerNTLM() override;
-
// Parse the challenge, saving the results into this instance.
HttpAuth::AuthorizationResult ParseChallenge(HttpAuthChallengeTokenizer* tok);
diff --git a/chromium/net/http/http_auth_handler_ntlm_portable.cc b/chromium/net/http/http_auth_handler_ntlm_portable.cc
index 2063e5ea5ed..7381263fecf 100644
--- a/chromium/net/http/http_auth_handler_ntlm_portable.cc
+++ b/chromium/net/http/http_auth_handler_ntlm_portable.cc
@@ -29,14 +29,14 @@ int HttpAuthHandlerNTLM::Factory::CreateAuthHandler(
// method and only constructing when valid.
// NOTE: Default credentials are not supported for the portable implementation
// of NTLM.
- std::unique_ptr<HttpAuthHandler> tmp_handler(
- new HttpAuthHandlerNTLM(http_auth_preferences()));
+ auto tmp_handler =
+ std::make_unique<HttpAuthHandlerNTLM>(http_auth_preferences());
if (!tmp_handler->InitFromChallenge(challenge, target, ssl_info,
network_isolation_key, scheme_host_port,
net_log)) {
return ERR_INVALID_RESPONSE;
}
- handler->swap(tmp_handler);
+ *handler = std::move(tmp_handler);
return OK;
}
diff --git a/chromium/net/http/http_auth_handler_ntlm_win.cc b/chromium/net/http/http_auth_handler_ntlm_win.cc
index f54183ad558..2c0bc7bef49 100644
--- a/chromium/net/http/http_auth_handler_ntlm_win.cc
+++ b/chromium/net/http/http_auth_handler_ntlm_win.cc
@@ -33,13 +33,13 @@ int HttpAuthHandlerNTLM::Factory::CreateAuthHandler(
return ERR_UNSUPPORTED_AUTH_SCHEME;
// TODO(cbentzel): Move towards model of parsing in the factory
// method and only constructing when valid.
- std::unique_ptr<HttpAuthHandler> tmp_handler(
- new HttpAuthHandlerNTLM(sspi_library_.get(), http_auth_preferences()));
+ auto tmp_handler = std::make_unique<HttpAuthHandlerNTLM>(
+ sspi_library_.get(), http_auth_preferences());
if (!tmp_handler->InitFromChallenge(challenge, target, ssl_info,
network_isolation_key, scheme_host_port,
net_log))
return ERR_INVALID_RESPONSE;
- handler->swap(tmp_handler);
+ *handler = std::move(tmp_handler);
return OK;
}
@@ -59,7 +59,7 @@ int HttpAuthHandlerNTLM::GenerateAuthTokenImpl(
std::move(callback));
}
-HttpAuthHandlerNTLM::~HttpAuthHandlerNTLM() {}
+HttpAuthHandlerNTLM::~HttpAuthHandlerNTLM() = default;
// Require identity on first pass instead of second.
bool HttpAuthHandlerNTLM::NeedsIdentity() {
diff --git a/chromium/net/http/http_auth_preferences.cc b/chromium/net/http/http_auth_preferences.cc
index 4fa3e69de0e..fac4cde5991 100644
--- a/chromium/net/http/http_auth_preferences.cc
+++ b/chromium/net/http/http_auth_preferences.cc
@@ -31,19 +31,19 @@ bool HttpAuthPreferences::NegotiateEnablePort() const {
bool HttpAuthPreferences::NtlmV2Enabled() const {
return ntlm_v2_enabled_;
}
-#endif
+#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
#if BUILDFLAG(IS_ANDROID)
std::string HttpAuthPreferences::AuthAndroidNegotiateAccountType() const {
return auth_android_negotiate_account_type_;
}
-#endif
+#endif // BUILDFLAG(IS_ANDROID)
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
bool HttpAuthPreferences::AllowGssapiLibraryLoad() const {
return allow_gssapi_library_load_;
}
-#endif
+#endif // BUILDFLAG(IS_CHROMEOS)
bool HttpAuthPreferences::CanUseDefaultCredentials(
const url::SchemeHostPort& auth_scheme_host_port) const {
diff --git a/chromium/net/http/http_auth_preferences.h b/chromium/net/http/http_auth_preferences.h
index 894ffefe5ab..5f7d46c49d7 100644
--- a/chromium/net/http/http_auth_preferences.h
+++ b/chromium/net/http/http_auth_preferences.h
@@ -46,13 +46,13 @@ class NET_EXPORT HttpAuthPreferences {
virtual bool NegotiateEnablePort() const;
#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
virtual bool NtlmV2Enabled() const;
-#endif
+#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
#if BUILDFLAG(IS_ANDROID)
virtual std::string AuthAndroidNegotiateAccountType() const;
#endif
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
virtual bool AllowGssapiLibraryLoad() const;
-#endif
+#endif // BUILDFLAG(IS_CHROMEOS)
virtual bool CanUseDefaultCredentials(
const url::SchemeHostPort& auth_scheme_host_port) const;
virtual HttpAuth::DelegationType GetDelegationType(
@@ -84,13 +84,13 @@ class NET_EXPORT HttpAuthPreferences {
void set_ntlm_v2_enabled(bool ntlm_v2_enabled) {
ntlm_v2_enabled_ = ntlm_v2_enabled;
}
-#endif
+#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
void set_allow_gssapi_library_load(bool allow_gssapi_library_load) {
allow_gssapi_library_load_ = allow_gssapi_library_load;
}
-#endif
+#endif // BUILDFLAG(IS_CHROMEOS)
const absl::optional<std::set<std::string>>& allowed_schemes() const {
return allowed_schemes_;
@@ -119,7 +119,7 @@ class NET_EXPORT HttpAuthPreferences {
const std::string& account_type) {
auth_android_negotiate_account_type_ = account_type;
}
-#endif
+#endif // BUILDFLAG(IS_ANDROID)
private:
bool delegate_by_kdc_policy_ = false;
@@ -131,15 +131,15 @@ class NET_EXPORT HttpAuthPreferences {
#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
bool ntlm_v2_enabled_ = true;
-#endif
+#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
#if BUILDFLAG(IS_ANDROID)
std::string auth_android_negotiate_account_type_;
-#endif
+#endif // BUILDFLAG(IS_ANDROID)
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
bool allow_gssapi_library_load_ = true;
-#endif
+#endif // BUILDFLAG(IS_CHROMEOS)
absl::optional<std::set<std::string>> allowed_schemes_;
std::unique_ptr<URLSecurityManager> security_manager_;
diff --git a/chromium/net/http/http_auth_preferences_unittest.cc b/chromium/net/http/http_auth_preferences_unittest.cc
index c349b729f51..e95f8888c7c 100644
--- a/chromium/net/http/http_auth_preferences_unittest.cc
+++ b/chromium/net/http/http_auth_preferences_unittest.cc
@@ -41,10 +41,10 @@ TEST(HttpAuthPreferencesTest, DisableNtlmV2) {
http_auth_preferences.set_ntlm_v2_enabled(false);
EXPECT_FALSE(http_auth_preferences.NtlmV2Enabled());
}
-#endif
+#endif // BUILDFLAG(IS_POSIX)
#if BUILDFLAG(IS_ANDROID)
-TEST(HttpAuthPreferencesTest, AuthAndroidhNegotiateAccountType) {
+TEST(HttpAuthPreferencesTest, AuthAndroidNegotiateAccountType) {
HttpAuthPreferences http_auth_preferences;
EXPECT_EQ(std::string(),
http_auth_preferences.AuthAndroidNegotiateAccountType());
@@ -52,16 +52,16 @@ TEST(HttpAuthPreferencesTest, AuthAndroidhNegotiateAccountType) {
EXPECT_EQ(std::string("foo"),
http_auth_preferences.AuthAndroidNegotiateAccountType());
}
-#endif
+#endif // BUILDFLAG(IS_ANDROID)
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
TEST(HttpAuthPreferencesTest, AllowGssapiLibraryLoad) {
HttpAuthPreferences http_auth_preferences;
EXPECT_TRUE(http_auth_preferences.AllowGssapiLibraryLoad());
http_auth_preferences.set_allow_gssapi_library_load(false);
EXPECT_FALSE(http_auth_preferences.AllowGssapiLibraryLoad());
}
-#endif
+#endif // BUILDFLAG(IS_CHROMEOS)
TEST(HttpAuthPreferencesTest, AuthServerAllowlist) {
HttpAuthPreferences http_auth_preferences;
diff --git a/chromium/net/http/http_auth_sspi_win.cc b/chromium/net/http/http_auth_sspi_win.cc
index e55a34e1a46..02ce74d36c9 100644
--- a/chromium/net/http/http_auth_sspi_win.cc
+++ b/chromium/net/http/http_auth_sspi_win.cc
@@ -28,47 +28,45 @@ using DelegationType = HttpAuth::DelegationType;
namespace {
base::Value SecurityStatusToValue(Error mapped_error, SECURITY_STATUS status) {
- base::Value params{base::Value::Type::DICTIONARY};
- params.SetIntKey("net_error", mapped_error);
- params.SetIntKey("security_status", status);
- return params;
+ base::Value::Dict params;
+ params.Set("net_error", mapped_error);
+ params.Set("security_status", static_cast<int>(status));
+ return base::Value(std::move(params));
}
base::Value AcquireCredentialsHandleParams(const std::u16string* domain,
const std::u16string* user,
Error result,
SECURITY_STATUS status) {
- base::Value params{base::Value::Type::DICTIONARY};
+ base::Value::Dict params;
if (domain && user) {
- params.SetStringKey("domain", base::UTF16ToUTF8(*domain));
- params.SetStringKey("user", base::UTF16ToUTF8(*user));
+ params.Set("domain", base::UTF16ToUTF8(*domain));
+ params.Set("user", base::UTF16ToUTF8(*user));
}
- params.SetKey("status", SecurityStatusToValue(result, status));
- return params;
+ params.Set("status", SecurityStatusToValue(result, status));
+ return base::Value(std::move(params));
}
base::Value ContextFlagsToValue(DWORD flags) {
- base::Value params{base::Value::Type::DICTIONARY};
- params.SetStringKey("value", base::StringPrintf("0x%08lx", flags));
- params.SetBoolKey("delegated",
- (flags & ISC_RET_DELEGATE) == ISC_RET_DELEGATE);
- params.SetBoolKey("mutual",
- (flags & ISC_RET_MUTUAL_AUTH) == ISC_RET_MUTUAL_AUTH);
- return params;
+ base::Value::Dict params;
+ params.Set("value", base::StringPrintf("0x%08lx", flags));
+ params.Set("delegated", (flags & ISC_RET_DELEGATE) == ISC_RET_DELEGATE);
+ params.Set("mutual", (flags & ISC_RET_MUTUAL_AUTH) == ISC_RET_MUTUAL_AUTH);
+ return base::Value(std::move(params));
}
base::Value ContextAttributesToValue(SSPILibrary* library,
PCtxtHandle handle,
DWORD attributes) {
- base::Value params{base::Value::Type::DICTIONARY};
+ base::Value::Dict params;
SecPkgContext_NativeNames native_names = {0};
auto qc_result = library->QueryContextAttributesEx(
handle, SECPKG_ATTR_NATIVE_NAMES, &native_names, sizeof(native_names));
if (qc_result == SEC_E_OK && native_names.sClientName &&
native_names.sServerName) {
- params.SetStringKey("source", base::as_u16cstr(native_names.sClientName));
- params.SetStringKey("target", base::as_u16cstr(native_names.sServerName));
+ params.Set("source", base::as_u16cstr(native_names.sClientName));
+ params.Set("target", base::as_u16cstr(native_names.sServerName));
}
SecPkgContext_NegotiationInfo negotiation_info = {0};
@@ -77,22 +75,21 @@ base::Value ContextAttributesToValue(SSPILibrary* library,
sizeof(negotiation_info));
if (qc_result == SEC_E_OK && negotiation_info.PackageInfo &&
negotiation_info.PackageInfo->Name) {
- params.SetStringKey("mechanism",
- base::as_u16cstr(negotiation_info.PackageInfo->Name));
- params.SetBoolKey("open", negotiation_info.NegotiationState !=
- SECPKG_NEGOTIATION_COMPLETE);
+ params.Set("mechanism",
+ base::as_u16cstr(negotiation_info.PackageInfo->Name));
+ params.Set("open", negotiation_info.NegotiationState !=
+ SECPKG_NEGOTIATION_COMPLETE);
}
SecPkgContext_Authority authority = {0};
qc_result = library->QueryContextAttributesEx(handle, SECPKG_ATTR_AUTHORITY,
&authority, sizeof(authority));
if (qc_result == SEC_E_OK && authority.sAuthorityName) {
- params.SetStringKey("authority",
- base::as_u16cstr(authority.sAuthorityName));
+ params.Set("authority", base::as_u16cstr(authority.sAuthorityName));
}
- params.SetKey("flags", ContextFlagsToValue(attributes));
- return params;
+ params.Set("flags", ContextFlagsToValue(attributes));
+ return base::Value(std::move(params));
}
base::Value InitializeSecurityContextParams(SSPILibrary* library,
@@ -100,12 +97,13 @@ base::Value InitializeSecurityContextParams(SSPILibrary* library,
Error result,
SECURITY_STATUS status,
DWORD attributes) {
- base::Value params{base::Value::Type::DICTIONARY};
- params.SetKey("status", SecurityStatusToValue(result, status));
- if (result == OK)
- params.SetKey("context",
- ContextAttributesToValue(library, handle, attributes));
- return params;
+ base::Value::Dict params;
+ params.Set("status", SecurityStatusToValue(result, status));
+ if (result == OK) {
+ params.Set("context",
+ ContextAttributesToValue(library, handle, attributes));
+ }
+ return base::Value(std::move(params));
}
Error MapAcquireCredentialsStatusToError(SECURITY_STATUS status) {
@@ -548,10 +546,10 @@ int HttpAuthSSPI::GetNextSecurityToken(const std::string& spn,
context_flags |= (ISC_REQ_DELEGATE | ISC_REQ_MUTUAL_AUTH);
net_log.BeginEvent(NetLogEventType::AUTH_LIBRARY_INIT_SEC_CTX, [&] {
- base::Value params{base::Value::Type::DICTIONARY};
- params.SetStringKey("spn", spn);
- params.SetKey("flags", ContextFlagsToValue(context_flags));
- return params;
+ base::Value::Dict params;
+ params.Set("spn", spn);
+ params.Set("flags", ContextFlagsToValue(context_flags));
+ return base::Value(std::move(params));
});
// This returns a token that is passed to the remote server.
diff --git a/chromium/net/http/http_auth_unittest.cc b/chromium/net/http/http_auth_unittest.cc
index 5bdc7fb2997..7ee55269aab 100644
--- a/chromium/net/http/http_auth_unittest.cc
+++ b/chromium/net/http/http_auth_unittest.cc
@@ -132,16 +132,16 @@ TEST(HttpAuthTest, ChooseBestChallenge) {
url::SchemeHostPort scheme_host_port(GURL("http://www.example.com"));
std::set<HttpAuth::Scheme> disabled_schemes;
MockAllowHttpAuthPreferences http_auth_preferences;
- std::unique_ptr<HostResolver> host_resolver(new MockHostResolver());
+ auto host_resolver = std::make_unique<MockHostResolver>();
std::unique_ptr<HttpAuthHandlerRegistryFactory> http_auth_handler_factory(
HttpAuthHandlerFactory::CreateDefault());
http_auth_handler_factory->SetHttpAuthPreferences(kNegotiateAuthScheme,
&http_auth_preferences);
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
// Make a HttpResponseHeaders object.
std::string headers_with_status_line("HTTP/1.1 401 Unauthorized\n");
- headers_with_status_line += tests[i].headers;
+ headers_with_status_line += test.headers;
scoped_refptr<HttpResponseHeaders> headers =
HeadersFromResponseText(headers_with_status_line);
@@ -153,11 +153,11 @@ TEST(HttpAuthTest, ChooseBestChallenge) {
disabled_schemes, NetLogWithSource(), host_resolver.get(), &handler);
if (handler.get()) {
- EXPECT_EQ(tests[i].challenge_scheme, handler->auth_scheme());
- EXPECT_STREQ(tests[i].challenge_realm, handler->realm().c_str());
+ EXPECT_EQ(test.challenge_scheme, handler->auth_scheme());
+ EXPECT_STREQ(test.challenge_realm, handler->realm().c_str());
} else {
- EXPECT_EQ(HttpAuth::AUTH_SCHEME_MAX, tests[i].challenge_scheme);
- EXPECT_STREQ("", tests[i].challenge_realm);
+ EXPECT_EQ(HttpAuth::AUTH_SCHEME_MAX, test.challenge_scheme);
+ EXPECT_STREQ("", test.challenge_realm);
}
}
}
diff --git a/chromium/net/http/http_basic_state_unittest.cc b/chromium/net/http/http_basic_state_unittest.cc
index 662aef260a7..3cd757a287a 100644
--- a/chromium/net/http/http_basic_state_unittest.cc
+++ b/chromium/net/http/http_basic_state_unittest.cc
@@ -16,10 +16,11 @@ namespace net {
namespace {
TEST(HttpBasicStateTest, ConstructsProperly) {
- ClientSocketHandle* const handle = new ClientSocketHandle;
+ auto handle = std::make_unique<ClientSocketHandle>();
+ ClientSocketHandle* const handle_ptr = handle.get();
// Ownership of |handle| is passed to |state|.
- const HttpBasicState state(base::WrapUnique(handle), true /* using_proxy */);
- EXPECT_EQ(handle, state.connection());
+ const HttpBasicState state(std::move(handle), true /* using_proxy */);
+ EXPECT_EQ(handle_ptr, state.connection());
EXPECT_TRUE(state.using_proxy());
}
@@ -30,13 +31,14 @@ TEST(HttpBasicStateTest, ConstructsProperlyWithDifferentOptions) {
}
TEST(HttpBasicStateTest, ReleaseConnectionWorks) {
- ClientSocketHandle* const handle = new ClientSocketHandle;
+ auto handle = std::make_unique<ClientSocketHandle>();
+ ClientSocketHandle* const handle_ptr = handle.get();
// Ownership of |handle| is passed to |state|.
- HttpBasicState state(base::WrapUnique(handle), false);
+ HttpBasicState state(std::move(handle), false);
const std::unique_ptr<ClientSocketHandle> released_connection(
state.ReleaseConnection());
- EXPECT_EQ(NULL, state.connection());
- EXPECT_EQ(handle, released_connection.get());
+ EXPECT_EQ(nullptr, state.connection());
+ EXPECT_EQ(handle_ptr, released_connection.get());
}
TEST(HttpBasicStateTest, InitializeWorks) {
@@ -62,7 +64,7 @@ TEST(HttpBasicStateTest, DeleteParser) {
state.Initialize(&request_info, LOW, NetLogWithSource());
EXPECT_TRUE(state.parser());
state.DeleteParser();
- EXPECT_EQ(NULL, state.parser());
+ EXPECT_EQ(nullptr, state.parser());
}
TEST(HttpBasicStateTest, GenerateRequestLineNoProxy) {
diff --git a/chromium/net/http/http_basic_stream.cc b/chromium/net/http/http_basic_stream.cc
index 1dcf2b018f0..d3e39277eeb 100644
--- a/chromium/net/http/http_basic_stream.cc
+++ b/chromium/net/http/http_basic_stream.cc
@@ -8,6 +8,7 @@
#include <utility>
#include "base/bind.h"
+#include "net/http/http_network_session.h"
#include "net/http/http_raw_request_headers.h"
#include "net/http/http_request_info.h"
#include "net/http/http_response_body_drainer.h"
@@ -88,17 +89,19 @@ void HttpBasicStream::Close(bool not_reusable) {
StreamSocket* socket = state_.connection()->socket();
if (not_reusable && socket)
socket->Disconnect();
+ parser()->OnConnectionClose();
state_.connection()->Reset();
}
-HttpStream* HttpBasicStream::RenewStreamForAuth() {
+std::unique_ptr<HttpStream> HttpBasicStream::RenewStreamForAuth() {
DCHECK(IsResponseBodyComplete());
DCHECK(!parser()->IsMoreDataBuffered());
// The HttpStreamParser object still has a pointer to the connection. Just to
// be extra-sure it doesn't touch the connection again, delete it here rather
// than leaving it until the destructor is called.
state_.DeleteParser();
- return new HttpBasicStream(state_.ReleaseConnection(), state_.using_proxy());
+ return std::make_unique<HttpBasicStream>(state_.ReleaseConnection(),
+ state_.using_proxy());
}
bool HttpBasicStream::IsResponseBodyComplete() const {
@@ -184,8 +187,8 @@ int HttpBasicStream::GetRemoteEndpoint(IPEndPoint* endpoint) {
}
void HttpBasicStream::Drain(HttpNetworkSession* session) {
- HttpResponseBodyDrainer* drainer = new HttpResponseBodyDrainer(this);
- drainer->Start(session);
+ session->StartResponseDrainer(
+ std::make_unique<HttpResponseBodyDrainer>(this));
// |drainer| will delete itself.
}
diff --git a/chromium/net/http/http_basic_stream.h b/chromium/net/http/http_basic_stream.h
index 2d1c561a2c0..da8e5253743 100644
--- a/chromium/net/http/http_basic_stream.h
+++ b/chromium/net/http/http_basic_stream.h
@@ -64,7 +64,7 @@ class NET_EXPORT_PRIVATE HttpBasicStream : public HttpStream {
void Close(bool not_reusable) override;
- HttpStream* RenewStreamForAuth() override;
+ std::unique_ptr<HttpStream> RenewStreamForAuth() override;
bool IsResponseBodyComplete() const override;
diff --git a/chromium/net/http/http_byte_range_unittest.cc b/chromium/net/http/http_byte_range_unittest.cc
index 4e17e45fffc..845c4bc50fb 100644
--- a/chromium/net/http/http_byte_range_unittest.cc
+++ b/chromium/net/http/http_byte_range_unittest.cc
@@ -28,12 +28,12 @@ TEST(HttpByteRangeTest, ValidRanges) {
{ -1, -1, 100000, true },
};
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
HttpByteRange range;
- range.set_first_byte_position(tests[i].first_byte_position);
- range.set_last_byte_position(tests[i].last_byte_position);
- range.set_suffix_length(tests[i].suffix_length);
- EXPECT_EQ(tests[i].valid, range.IsValid());
+ range.set_first_byte_position(test.first_byte_position);
+ range.set_last_byte_position(test.last_byte_position);
+ range.set_suffix_length(test.suffix_length);
+ EXPECT_EQ(test.valid, range.IsValid());
}
}
@@ -60,24 +60,24 @@ TEST(HttpByteRangeTest, SetInstanceSize) {
{ 10, 10000, -1, 1000000, true, 10, 10000 },
};
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
HttpByteRange range;
- range.set_first_byte_position(tests[i].first_byte_position);
- range.set_last_byte_position(tests[i].last_byte_position);
- range.set_suffix_length(tests[i].suffix_length);
+ range.set_first_byte_position(test.first_byte_position);
+ range.set_last_byte_position(test.last_byte_position);
+ range.set_suffix_length(test.suffix_length);
- bool return_value = range.ComputeBounds(tests[i].instance_size);
- EXPECT_EQ(tests[i].expected_return_value, return_value);
+ bool return_value = range.ComputeBounds(test.instance_size);
+ EXPECT_EQ(test.expected_return_value, return_value);
if (return_value) {
- EXPECT_EQ(tests[i].expected_lower_bound, range.first_byte_position());
- EXPECT_EQ(tests[i].expected_upper_bound, range.last_byte_position());
+ EXPECT_EQ(test.expected_lower_bound, range.first_byte_position());
+ EXPECT_EQ(test.expected_upper_bound, range.last_byte_position());
// Try to call SetInstanceSize the second time.
- EXPECT_FALSE(range.ComputeBounds(tests[i].instance_size));
+ EXPECT_FALSE(range.ComputeBounds(test.instance_size));
// And expect there's no side effect.
- EXPECT_EQ(tests[i].expected_lower_bound, range.first_byte_position());
- EXPECT_EQ(tests[i].expected_upper_bound, range.last_byte_position());
- EXPECT_EQ(tests[i].suffix_length, range.suffix_length());
+ EXPECT_EQ(test.expected_lower_bound, range.first_byte_position());
+ EXPECT_EQ(test.expected_upper_bound, range.last_byte_position());
+ EXPECT_EQ(test.suffix_length, range.suffix_length());
}
}
}
@@ -93,8 +93,8 @@ TEST(HttpByteRangeTest, GetHeaderValue) {
{HttpByteRange::RightUnbounded(100), "bytes=100-"},
{HttpByteRange::Suffix(100), "bytes=-100"},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
- EXPECT_EQ(tests[i].expected, tests[i].range.GetHeaderValue());
+ for (const auto& test : tests) {
+ EXPECT_EQ(test.expected, test.range.GetHeaderValue());
}
}
diff --git a/chromium/net/http/http_cache.cc b/chromium/net/http/http_cache.cc
index 9515e6f0915..1ee1910d709 100644
--- a/chromium/net/http/http_cache.cc
+++ b/chromium/net/http/http_cache.cc
@@ -48,6 +48,7 @@
#include "net/http/http_util.h"
#include "net/log/net_log_with_source.h"
#include "net/quic/quic_server_info.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#if BUILDFLAG(IS_POSIX)
#include <unistd.h>
@@ -95,10 +96,9 @@ std::unique_ptr<HttpCache::BackendFactory> HttpCache::DefaultBackend::InMemory(
base::FilePath(), max_bytes, false);
}
-int HttpCache::DefaultBackend::CreateBackend(
+disk_cache::BackendResult HttpCache::DefaultBackend::CreateBackend(
NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
- CompletionOnceCallback callback) {
+ base::OnceCallback<void(disk_cache::BackendResult)> callback) {
DCHECK_GE(max_bytes_, 0);
disk_cache::ResetHandling reset_handling =
hard_reset_ ? disk_cache::ResetHandling::kReset
@@ -108,13 +108,12 @@ int HttpCache::DefaultBackend::CreateBackend(
if (app_status_listener_) {
return disk_cache::CreateCacheBackend(
type_, backend_type_, file_operations_factory_, path_, max_bytes_,
- reset_handling, net_log, backend, std::move(callback),
- app_status_listener_);
+ reset_handling, net_log, std::move(callback), app_status_listener_);
}
#endif
return disk_cache::CreateCacheBackend(
type_, backend_type_, file_operations_factory_, path_, max_bytes_,
- reset_handling, net_log, backend, std::move(callback));
+ reset_handling, net_log, std::move(callback));
}
#if BUILDFLAG(IS_ANDROID)
@@ -131,9 +130,7 @@ HttpCache::ActiveEntry::ActiveEntry(disk_cache::Entry* entry, bool opened_in)
DCHECK(disk_entry);
}
-HttpCache::ActiveEntry::~ActiveEntry() {
- disk_entry->Close();
-}
+HttpCache::ActiveEntry::~ActiveEntry() = default;
bool HttpCache::ActiveEntry::HasNoTransactions() {
return (!writers || writers->IsEmpty()) && readers.empty() &&
@@ -180,19 +177,14 @@ class HttpCache::WorkItem {
WorkItem(WorkItemOperation operation,
Transaction* transaction,
ActiveEntry** entry)
- : operation_(operation),
- transaction_(transaction),
- entry_(entry),
- backend_(nullptr) {}
+ : operation_(operation), transaction_(transaction), entry_(entry) {}
WorkItem(WorkItemOperation operation,
Transaction* transaction,
- CompletionOnceCallback callback,
- disk_cache::Backend** backend)
+ CompletionOnceCallback callback)
: operation_(operation),
transaction_(transaction),
entry_(nullptr),
- callback_(std::move(callback)),
- backend_(backend) {}
+ callback_(std::move(callback)) {}
~WorkItem() = default;
// Calls back the transaction with the result of the operation.
@@ -205,9 +197,7 @@ class HttpCache::WorkItem {
// Notifies the caller about the operation completion. Returns true if the
// callback was invoked.
- bool DoCallback(int result, disk_cache::Backend* backend) {
- if (backend_)
- *backend_ = backend;
+ bool DoCallback(int result) {
if (!callback_.is_null()) {
std::move(callback_).Run(result);
return true;
@@ -231,7 +221,6 @@ class HttpCache::WorkItem {
raw_ptr<Transaction> transaction_;
raw_ptr<ActiveEntry*> entry_;
CompletionOnceCallback callback_; // User callback.
- raw_ptr<disk_cache::Backend*> backend_;
};
//-----------------------------------------------------------------------------
@@ -284,11 +273,10 @@ HttpCache::~HttpCache() {
// done with said operations, or it will attempt to use deleted data.
disk_cache_.reset();
- for (auto pending_it = pending_ops_.begin(); pending_it != pending_ops_.end();
- ++pending_it) {
+ for (auto& pending_it : pending_ops_) {
// We are not notifying the transactions about the cache going away, even
// though they are waiting for a callback that will never fire.
- PendingOp* pending_op = pending_it->second;
+ PendingOp* pending_op = pending_it.second;
pending_op->writer.reset();
bool delete_pending_op = true;
if (building_backend_ && pending_op->callback_will_delete) {
@@ -312,7 +300,19 @@ int HttpCache::GetBackend(disk_cache::Backend** backend,
return OK;
}
- return CreateBackend(backend, std::move(callback));
+ int rv =
+ CreateBackend(base::BindOnce(&HttpCache::ReportGetBackendResult,
+ GetWeakPtr(), backend, std::move(callback)));
+ if (rv != net::ERR_IO_PENDING)
+ *backend = disk_cache_.get();
+ return rv;
+}
+
+void HttpCache::ReportGetBackendResult(disk_cache::Backend** backend,
+ CompletionOnceCallback callback,
+ int net_error) {
+ *backend = disk_cache_.get();
+ std::move(callback).Run(net_error);
}
disk_cache::Backend* HttpCache::GetCurrentBackend() const {
@@ -349,6 +349,9 @@ void HttpCache::OnExternalCacheHit(
if (!disk_cache_.get() || mode_ == DISABLE)
return;
+ if (IsSplitCacheEnabled() && network_isolation_key.IsTransient())
+ return;
+
HttpRequestInfo request_info;
request_info.url = url;
request_info.method = http_method;
@@ -361,8 +364,8 @@ void HttpCache::OnExternalCacheHit(
request_info.load_flags |= ~LOAD_DO_NOT_SAVE_COOKIES;
}
- std::string key =
- GenerateCacheKey(&request_info, /*use_single_keyed_cache=*/false);
+ std::string key = *GenerateCacheKeyForRequest(
+ &request_info, /*use_single_keyed_cache=*/false);
disk_cache_->OnExternalCacheHit(key);
}
@@ -372,11 +375,11 @@ int HttpCache::CreateTransaction(
// Do lazy initialization of disk cache if needed.
if (!disk_cache_.get()) {
// We don't care about the result.
- CreateBackend(nullptr, CompletionOnceCallback());
+ CreateBackend(CompletionOnceCallback());
}
- HttpCache::Transaction* new_transaction =
- new HttpCache::Transaction(priority, this);
+ auto new_transaction =
+ std::make_unique<HttpCache::Transaction>(priority, this);
if (bypass_lock_for_test_)
new_transaction->BypassLockForTest();
if (bypass_lock_after_headers_for_test_)
@@ -384,7 +387,7 @@ int HttpCache::CreateTransaction(
if (fail_conditionalization_for_test_)
new_transaction->FailConditionalizationForTest();
- transaction->reset(new_transaction);
+ *transaction = std::move(new_transaction);
return OK;
}
@@ -443,39 +446,75 @@ std::string HttpCache::GetResourceURLFromHttpCacheKey(const std::string& key) {
return key.substr(pos);
}
-Error HttpCache::CheckResourceExistence(
+// static
+// Generate a key that can be used inside the cache.
+absl::optional<std::string> HttpCache::GenerateCacheKey(
const GURL& url,
- const base::StringPiece method,
+ int load_flags,
const NetworkIsolationKey& network_isolation_key,
- bool is_subframe,
- base::OnceCallback<void(Error)> callback) {
- if (!disk_cache_)
- return ERR_CACHE_MISS;
-
- HttpRequestInfo request_info;
- request_info.url = url;
- request_info.method = std::string(method);
- request_info.network_isolation_key = network_isolation_key;
- request_info.is_subframe_document_resource = is_subframe;
+ int64_t upload_data_identifier,
+ bool is_subframe_document_resource,
+ bool use_single_keyed_cache,
+ const std::string& single_key_checksum) {
+ // The first character of the key may vary depending on whether or not sending
+ // credentials is permitted for this request. This only happens if the
+ // SplitCacheByIncludeCredentials feature is enabled, or if the single-keyed
+ // cache is enabled. The single-keyed cache must always be split by
+ // credentials in order to make coep:credentialless work safely.
+ const char credential_key =
+ ((base::FeatureList::IsEnabled(
+ features::kSplitCacheByIncludeCredentials) ||
+ use_single_keyed_cache) &&
+ (load_flags & LOAD_DO_NOT_SAVE_COOKIES))
+ ? '0'
+ : '1';
- // TODO(https://crbug.com/1325315): Support looking in the single-keyed cache
- // for the resource.
- std::string key =
- GenerateCacheKey(&request_info, /*use_single_keyed_cache=*/false);
- disk_cache::EntryResult entry_result = disk_cache_->OpenEntry(
- key, net::IDLE,
- base::BindOnce(&HttpCache::ResourceExistenceCheckCallback, GetWeakPtr(),
- std::move(callback)));
+ std::string isolation_key;
+ if (use_single_keyed_cache) {
+ DCHECK(IsSplitCacheEnabled());
+ DCHECK(!(load_flags &
+ (net::LOAD_VALIDATE_CACHE | net::LOAD_BYPASS_CACHE |
+ net::LOAD_SKIP_CACHE_VALIDATION | net::LOAD_ONLY_FROM_CACHE |
+ net::LOAD_DISABLE_CACHE | net::LOAD_SKIP_VARY_CHECK)));
+ isolation_key = base::StrCat(
+ {kSingleKeyPrefix, single_key_checksum, kSingleKeySeparator});
+ } else if (IsSplitCacheEnabled()) {
+ // Prepend the key with |kDoubleKeyPrefix| = "_dk_" to mark it as
+ // double-keyed (and makes it an invalid url so that it doesn't get
+ // confused with a single-keyed entry). Separate the origin and url
+ // with invalid whitespace character |kDoubleKeySeparator|.
+ if (network_isolation_key.IsTransient())
+ return absl::nullopt;
+ std::string subframe_document_resource_prefix =
+ is_subframe_document_resource ? kSubframeDocumentResourcePrefix : "";
+ isolation_key = base::StrCat(
+ {kDoubleKeyPrefix, subframe_document_resource_prefix,
+ *network_isolation_key.ToCacheKeyString(), kDoubleKeySeparator});
+ }
- if (entry_result.net_error() == OK && !entry_result.opened())
- return ERR_CACHE_MISS;
+ // The key format is:
+ // credential_key/upload_data_identifier/[isolation_key]url
- return entry_result.net_error();
+ // Strip out the reference, username, and password sections of the URL and
+ // concatenate with the credential_key, the post_key, and the network
+ // isolation key if we are splitting the cache.
+ return base::StringPrintf("%c/%" PRId64 "/%s%s", credential_key,
+ upload_data_identifier, isolation_key.c_str(),
+ HttpUtil::SpecForRequest(url).c_str());
}
// static
-std::string HttpCache::GenerateCacheKeyForTest(const HttpRequestInfo* request) {
- return GenerateCacheKey(request, /*use_single_keyed_cache=*/false);
+absl::optional<std::string> HttpCache::GenerateCacheKeyForRequest(
+ const HttpRequestInfo* request,
+ bool use_single_keyed_cache) {
+ DCHECK(request);
+ const int64_t upload_data_identifier =
+ request->upload_data_stream ? request->upload_data_stream->identifier()
+ : int64_t(0);
+ return GenerateCacheKey(
+ request->url, request->load_flags, request->network_isolation_key,
+ upload_data_identifier, request->is_subframe_document_resource,
+ use_single_keyed_cache, request->checksum);
}
// static
@@ -520,8 +559,9 @@ net::Error HttpCache::CreateAndSetWorkItem(ActiveEntry** entry,
return OK;
}
-int HttpCache::CreateBackend(disk_cache::Backend** backend,
- CompletionOnceCallback callback) {
+int HttpCache::CreateBackend(CompletionOnceCallback callback) {
+ DCHECK(!disk_cache_);
+
if (!backend_factory_.get())
return ERR_FAILED;
@@ -529,7 +569,7 @@ int HttpCache::CreateBackend(disk_cache::Backend** backend,
const bool callback_is_null = callback.is_null();
std::unique_ptr<WorkItem> item = std::make_unique<WorkItem>(
- WI_CREATE_BACKEND, nullptr, std::move(callback), backend);
+ WI_CREATE_BACKEND, nullptr, std::move(callback));
// This is the only operation that we can do that is not related to any given
// entry, so we use an empty key for it.
@@ -544,17 +584,18 @@ int HttpCache::CreateBackend(disk_cache::Backend** backend,
pending_op->writer = std::move(item);
- int rv = backend_factory_->CreateBackend(
- net_log_, &pending_op->backend,
- base::BindOnce(&HttpCache::OnPendingOpComplete, GetWeakPtr(),
- pending_op));
- if (rv == ERR_IO_PENDING) {
+ disk_cache::BackendResult result = backend_factory_->CreateBackend(
+ net_log_, base::BindOnce(&HttpCache::OnPendingBackendCreationOpComplete,
+ GetWeakPtr(), pending_op));
+ if (result.net_error == ERR_IO_PENDING) {
pending_op->callback_will_delete = true;
- return rv;
+ return result.net_error;
}
pending_op->writer->ClearCallback();
- OnPendingOpComplete(GetWeakPtr(), pending_op, rv);
+ int rv = result.net_error;
+ OnPendingBackendCreationOpComplete(GetWeakPtr(), pending_op,
+ std::move(result));
return rv;
}
@@ -566,68 +607,13 @@ int HttpCache::GetBackendForTransaction(Transaction* transaction) {
return ERR_FAILED;
std::unique_ptr<WorkItem> item = std::make_unique<WorkItem>(
- WI_CREATE_BACKEND, transaction, CompletionOnceCallback(), nullptr);
+ WI_CREATE_BACKEND, transaction, CompletionOnceCallback());
PendingOp* pending_op = GetPendingOp(std::string());
DCHECK(pending_op->writer);
pending_op->pending_queue.push_back(std::move(item));
return ERR_IO_PENDING;
}
-// static
-// Generate a key that can be used inside the cache.
-std::string HttpCache::GenerateCacheKey(const HttpRequestInfo* request,
- bool use_single_keyed_cache) {
- // The first character of the key may vary depending on whether or not sending
- // credentials is permitted for this request. This only happens if the
- // SplitCacheByIncludeCredentials feature is enabled, or if the single-keyed
- // cache is enabled. The single-keyed cache must always be split by
- // credentials in order to make coep:credentialless work safely.
- const char credential_key =
- ((base::FeatureList::IsEnabled(
- features::kSplitCacheByIncludeCredentials) ||
- use_single_keyed_cache) &&
- (request->load_flags & LOAD_DO_NOT_SAVE_COOKIES))
- ? '0'
- : '1';
-
- const int64_t post_key = request->upload_data_stream
- ? request->upload_data_stream->identifier()
- : int64_t(0);
- std::string isolation_key;
- if (use_single_keyed_cache) {
- DCHECK(IsSplitCacheEnabled());
- DCHECK(!request->checksum.empty());
- DCHECK(!(request->load_flags &
- (net::LOAD_VALIDATE_CACHE | net::LOAD_BYPASS_CACHE |
- net::LOAD_SKIP_CACHE_VALIDATION | net::LOAD_ONLY_FROM_CACHE |
- net::LOAD_DISABLE_CACHE | net::LOAD_SKIP_VARY_CHECK)));
- isolation_key = base::StrCat(
- {kSingleKeyPrefix, request->checksum, kSingleKeySeparator});
- } else if (IsSplitCacheEnabled()) {
- // Prepend the key with |kDoubleKeyPrefix| = "_dk_" to mark it as
- // double-keyed (and makes it an invalid url so that it doesn't get
- // confused with a single-keyed entry). Separate the origin and url
- // with invalid whitespace character |kDoubleKeySeparator|.
- DCHECK(request->network_isolation_key.IsFullyPopulated());
- std::string subframe_document_resource_prefix =
- request->is_subframe_document_resource ? kSubframeDocumentResourcePrefix
- : "";
- isolation_key = base::StrCat(
- {kDoubleKeyPrefix, subframe_document_resource_prefix,
- request->network_isolation_key.ToString(), kDoubleKeySeparator});
- }
-
- // The key format is:
- // credential_key/post_key/[isolation_key]url
-
- // Strip out the reference, username, and password sections of the URL and
- // concatenate with the credential_key, the post_key, and the network
- // isolation key if we are splitting the cache.
- return base::StringPrintf("%c/%" PRId64 "/%s%s", credential_key, post_key,
- isolation_key.c_str(),
- HttpUtil::SpecForRequest(request->url).c_str());
-}
-
void HttpCache::DoomActiveEntry(const std::string& key) {
auto it = active_entries_.find(key);
if (it == active_entries_.end())
@@ -659,7 +645,7 @@ int HttpCache::DoomEntry(const std::string& key, Transaction* transaction) {
DCHECK_EQ(0u, doomed_entries_.count(entry_ptr));
doomed_entries_[entry_ptr] = std::move(entry);
- entry_ptr->disk_entry->Doom();
+ entry_ptr->GetEntry()->Doom();
entry_ptr->doomed = true;
DCHECK(!entry_ptr->SafeToDestroy());
@@ -695,6 +681,9 @@ void HttpCache::DoomMainEntryForUrl(const GURL& url,
if (!disk_cache_)
return;
+ if (IsSplitCacheEnabled() && isolation_key.IsTransient())
+ return;
+
HttpRequestInfo temp_info;
temp_info.url = url;
temp_info.method = "GET";
@@ -704,7 +693,7 @@ void HttpCache::DoomMainEntryForUrl(const GURL& url,
// single-keyed cache, so therefore it is correct that use_single_keyed_cache
// be false.
std::string key =
- GenerateCacheKey(&temp_info, /*use_single_keyed_cache=*/false);
+ *GenerateCacheKeyForRequest(&temp_info, /*use_single_keyed_cache=*/false);
// Defer to DoomEntry if there is an active entry, otherwise call
// AsyncDoomEntry without triggering a callback.
@@ -731,16 +720,17 @@ HttpCache::ActiveEntry* HttpCache::FindActiveEntry(const std::string& key) {
HttpCache::ActiveEntry* HttpCache::ActivateEntry(disk_cache::Entry* disk_entry,
bool opened) {
DCHECK(!FindActiveEntry(disk_entry->GetKey()));
- ActiveEntry* entry = new ActiveEntry(disk_entry, opened);
- active_entries_[disk_entry->GetKey()] = base::WrapUnique(entry);
- return entry;
+ auto entry = std::make_unique<ActiveEntry>(disk_entry, opened);
+ ActiveEntry* entry_ptr = entry.get();
+ active_entries_[disk_entry->GetKey()] = std::move(entry);
+ return entry_ptr;
}
void HttpCache::DeactivateEntry(ActiveEntry* entry) {
DCHECK(!entry->doomed);
DCHECK(entry->SafeToDestroy());
- std::string key = entry->disk_entry->GetKey();
+ std::string key = entry->GetEntry()->GetKey();
if (key.empty())
return SlowDeactivateEntry(entry);
@@ -888,7 +878,7 @@ void HttpCache::DestroyEntry(ActiveEntry* entry) {
int HttpCache::AddTransactionToEntry(ActiveEntry* entry,
Transaction* transaction) {
DCHECK(entry);
- DCHECK(entry->disk_entry);
+ DCHECK(entry->GetEntry());
// Always add a new transaction to the queue to maintain FIFO order.
entry->add_to_entry_queue.push_back(transaction);
ProcessQueuedTransactions(entry);
@@ -934,7 +924,7 @@ void HttpCache::DoneWithEntry(ActiveEntry* entry,
bool is_mode_read_only = transaction->mode() == Transaction::READ;
if (!entry_is_complete && !is_mode_read_only && is_partial)
- entry->disk_entry->CancelSparseIO();
+ entry->GetEntry()->CancelSparseIO();
// Transaction is waiting in the done_headers_queue.
auto it = std::find(entry->done_headers_queue.begin(),
@@ -1031,12 +1021,12 @@ void HttpCache::DoomEntryValidationNoMatch(ActiveEntry* entry) {
entry->headers_transaction = nullptr;
if (entry->SafeToDestroy()) {
- entry->disk_entry->Doom();
+ entry->GetEntry()->Doom();
DestroyEntry(entry);
return;
}
- DoomActiveEntry(entry->disk_entry->GetKey());
+ DoomActiveEntry(entry->GetEntry()->GetKey());
// Restart only add_to_entry_queue transactions.
// Post task here to avoid a race in creating the entry between |transaction|
@@ -1077,10 +1067,10 @@ void HttpCache::ProcessEntryFailure(ActiveEntry* entry) {
RemoveAllQueuedTransactions(entry, &list);
if (entry->SafeToDestroy()) {
- entry->disk_entry->Doom();
+ entry->GetEntry()->Doom();
DestroyEntry(entry);
} else {
- DoomActiveEntry(entry->disk_entry->GetKey());
+ DoomActiveEntry(entry->GetEntry()->GetKey());
}
// ERR_CACHE_RACE causes the transaction to restart the whole process.
for (auto* queued_transaction : list)
@@ -1468,7 +1458,7 @@ void HttpCache::OnIOComplete(int result, PendingOp* pending_op) {
}
// static
-void HttpCache::OnPendingOpComplete(const base::WeakPtr<HttpCache>& cache,
+void HttpCache::OnPendingOpComplete(base::WeakPtr<HttpCache> cache,
PendingOp* pending_op,
int rv) {
if (cache.get()) {
@@ -1482,10 +1472,9 @@ void HttpCache::OnPendingOpComplete(const base::WeakPtr<HttpCache>& cache,
}
// static
-void HttpCache::OnPendingCreationOpComplete(
- const base::WeakPtr<HttpCache>& cache,
- PendingOp* pending_op,
- disk_cache::EntryResult result) {
+void HttpCache::OnPendingCreationOpComplete(base::WeakPtr<HttpCache> cache,
+ PendingOp* pending_op,
+ disk_cache::EntryResult result) {
if (!cache.get()) {
// The callback was cancelled so we should delete the pending_op that
// was used with this callback. If |result| contains a fresh entry
@@ -1501,6 +1490,25 @@ void HttpCache::OnPendingCreationOpComplete(
cache->OnIOComplete(rv, pending_op);
}
+// static
+void HttpCache::OnPendingBackendCreationOpComplete(
+ base::WeakPtr<HttpCache> cache,
+ PendingOp* pending_op,
+ disk_cache::BackendResult result) {
+ if (!cache.get()) {
+ // The callback was cancelled so we should delete the pending_op that
+ // was used with this callback. If `result` contains a cache backend,
+ // it will be destroyed with it.
+ delete pending_op;
+ return;
+ }
+
+ int rv = result.net_error;
+ pending_op->backend = std::move(result.backend);
+ pending_op->callback_will_delete = false;
+ cache->OnIOComplete(rv, pending_op);
+}
+
void HttpCache::OnBackendCreated(int result, PendingOp* pending_op) {
std::unique_ptr<WorkItem> item = std::move(pending_op->writer);
WorkItemOperation op = item->operation();
@@ -1537,17 +1545,8 @@ void HttpCache::OnBackendCreated(int result, PendingOp* pending_op) {
}
// The cache may be gone when we return from the callback.
- if (!item->DoCallback(result, disk_cache_.get()))
+ if (!item->DoCallback(result))
item->NotifyTransaction(result, nullptr);
}
-void HttpCache::ResourceExistenceCheckCallback(
- base::OnceCallback<void(Error)> callback,
- disk_cache::EntryResult entry_result) {
- Error result = (entry_result.net_error() == OK && entry_result.opened())
- ? OK
- : ERR_CACHE_MISS;
- std::move(callback).Run(result);
-}
-
} // namespace net
diff --git a/chromium/net/http/http_cache.h b/chromium/net/http/http_cache.h
index c97adfe07fa..987e073e93e 100644
--- a/chromium/net/http/http_cache.h
+++ b/chromium/net/http/http_cache.h
@@ -35,22 +35,15 @@
#include "net/base/net_errors.h"
#include "net/base/net_export.h"
#include "net/base/request_priority.h"
+#include "net/disk_cache/disk_cache.h"
#include "net/http/http_transaction_factory.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
class GURL;
-namespace base {
-namespace android {
+namespace base::android {
class ApplicationStatusListener;
-} // namespace android
-} // namespace base
-
-namespace disk_cache {
-class Backend;
-class BackendFileOperationsFactory;
-class Entry;
-class EntryResult;
-} // namespace disk_cache
+} // namespace base::android
namespace net {
@@ -74,17 +67,16 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
// A BackendFactory creates a backend object to be used by the HttpCache.
class NET_EXPORT BackendFactory {
public:
- virtual ~BackendFactory() {}
+ virtual ~BackendFactory() = default;
- // The actual method to build the backend. Returns a net error code. If
- // ERR_IO_PENDING is returned, the |callback| will be notified when the
- // operation completes, and |backend| must remain valid until the
- // notification arrives.
+ // The actual method to build the backend. The return value and `callback`
+ // conventions match disk_cache::CreateCacheBackend
+ //
// The implementation must not access the factory object after invoking the
- // |callback| because the object can be deleted from within the callback.
- virtual int CreateBackend(NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
- CompletionOnceCallback callback) = 0;
+ // `callback` because the object can be deleted from within the callback.
+ virtual disk_cache::BackendResult CreateBackend(
+ NetLog* net_log,
+ base::OnceCallback<void(disk_cache::BackendResult)> callback) = 0;
#if BUILDFLAG(IS_ANDROID)
virtual void SetAppStatusListener(
@@ -112,9 +104,9 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
static std::unique_ptr<BackendFactory> InMemory(int max_bytes);
// BackendFactory implementation.
- int CreateBackend(NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
- CompletionOnceCallback callback) override;
+ disk_cache::BackendResult CreateBackend(
+ NetLog* net_log,
+ base::OnceCallback<void(disk_cache::BackendResult)> callback) override;
#if BUILDFLAG(IS_ANDROID)
void SetAppStatusListener(
@@ -186,8 +178,9 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
// Retrieves the cache backend for this HttpCache instance. If the backend
// is not initialized yet, this method will initialize it. The return value is
// a network error code, and it could be ERR_IO_PENDING, in which case the
- // |callback| will be notified when the operation completes. The pointer that
- // receives the |backend| must remain valid until the operation completes.
+ // `callback` will be notified when the operation completes. The pointer that
+ // receives the `backend` must remain valid until the operation completes.
+ // `callback` will get cancelled if the HttpCache is destroyed.
int GetBackend(disk_cache::Backend** backend,
CompletionOnceCallback callback);
@@ -259,8 +252,21 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
// Get the URL from the entry's cache key.
static std::string GetResourceURLFromHttpCacheKey(const std::string& key);
- // Function to generate cache key for testing.
- static std::string GenerateCacheKeyForTest(const HttpRequestInfo* request);
+ // Generates the cache key for a request. Returns nullopt if the cache is
+ // configured to be split by the NetworkIsolationKey, and the
+ // NetworkIsolationKey is transient, in which case nothing should generally be
+ // stored to disk.
+ static absl::optional<std::string> GenerateCacheKey(
+ const GURL& url,
+ int load_flags,
+ const NetworkIsolationKey& network_isolation_key,
+ int64_t upload_data_identifier,
+ bool is_subframe_document_resource,
+ bool use_single_keyed_cache,
+ const std::string& single_key_checksum);
+ static absl::optional<std::string> GenerateCacheKeyForRequest(
+ const HttpRequestInfo* request,
+ bool use_single_keyed_cache = false);
// Enable split cache feature if not already overridden in the feature list.
// Should only be invoked during process initialization before the HTTP
@@ -274,12 +280,6 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
// Resets g_init_cache and g_enable_split_cache for tests.
static void ClearGlobalsForTesting();
- Error CheckResourceExistence(const GURL& url,
- const base::StringPiece method,
- const NetworkIsolationKey& network_isolation_key,
- bool is_subframe,
- base::OnceCallback<void(Error)>);
-
private:
// Types --------------------------------------------------------------------
@@ -360,7 +360,9 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
bool TransactionInReaders(Transaction* transaction) const;
- const raw_ptr<disk_cache::Entry> disk_entry;
+ disk_cache::Entry* GetEntry() { return disk_entry.get(); }
+
+ disk_cache::ScopedEntryPtr disk_entry;
// Indicates if the disk_entry was opened or not (i.e.: created).
// It is set to true when a transaction is added to an entry so that other,
@@ -407,10 +409,13 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
WorkItemOperation operation,
PendingOp* pending_op);
- // Creates the |backend| object and notifies the |callback| when the operation
- // completes. Returns an error code.
- int CreateBackend(disk_cache::Backend** backend,
- CompletionOnceCallback callback);
+ // Creates the `disk_cache_` object and notifies the `callback` when the
+ // operation completes. Returns an error code.
+ int CreateBackend(CompletionOnceCallback callback);
+
+ void ReportGetBackendResult(disk_cache::Backend** backend,
+ CompletionOnceCallback callback,
+ int net_error);
// Makes sure that the backend creation is complete before allowing the
// provided transaction to use the object. Returns an error code.
@@ -419,10 +424,6 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
// time after receiving the notification.
int GetBackendForTransaction(Transaction* transaction);
- // Generates the cache key for this request.
- static std::string GenerateCacheKey(const HttpRequestInfo*,
- bool use_single_keyed_cache);
-
// Dooms the entry selected by |key|, if it is currently in the list of active
// entries.
void DoomActiveEntry(const std::string& key);
@@ -624,21 +625,24 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
// This is necessary because |pending_op| owns a disk_cache::Backend that has
// been passed in to CreateCacheBackend(), therefore must live until callback
// is called.
- static void OnPendingOpComplete(const base::WeakPtr<HttpCache>& cache,
+ static void OnPendingOpComplete(base::WeakPtr<HttpCache> cache,
PendingOp* pending_op,
int result);
// Variant for Open/Create method family, which has a different signature.
- static void OnPendingCreationOpComplete(const base::WeakPtr<HttpCache>& cache,
+ static void OnPendingCreationOpComplete(base::WeakPtr<HttpCache> cache,
PendingOp* pending_op,
disk_cache::EntryResult result);
+ // Variant for CreateCacheBackend, which has a different signature.
+ static void OnPendingBackendCreationOpComplete(
+ base::WeakPtr<HttpCache> cache,
+ PendingOp* pending_op,
+ disk_cache::BackendResult result);
+
// Processes the backend creation notification.
void OnBackendCreated(int result, PendingOp* pending_op);
- void ResourceExistenceCheckCallback(base::OnceCallback<void(Error)> callback,
- disk_cache::EntryResult entry_result);
-
// Constants ----------------------------------------------------------------
// Used when generating and accessing keys if cache is split.
diff --git a/chromium/net/http/http_cache_lookup_manager.cc b/chromium/net/http/http_cache_lookup_manager.cc
index 6ed9cd0d36e..194eb3fba6c 100644
--- a/chromium/net/http/http_cache_lookup_manager.cc
+++ b/chromium/net/http/http_cache_lookup_manager.cc
@@ -19,17 +19,17 @@ namespace net {
base::Value NetLogPushLookupTransactionParams(
const NetLogSource& net_log,
const ServerPushDelegate::ServerPushHelper* push_helper) {
- base::Value dict(base::Value::Type::DICTIONARY);
- net_log.AddToEventParameters(&dict);
- dict.SetStringKey("push_url", push_helper->GetURL().possibly_invalid_spec());
- return dict;
+ base::Value::Dict dict;
+ net_log.AddToEventParameters(dict);
+ dict.Set("push_url", push_helper->GetURL().possibly_invalid_spec());
+ return base::Value(std::move(dict));
}
HttpCacheLookupManager::LookupTransaction::LookupTransaction(
std::unique_ptr<ServerPushHelper> server_push_helper,
NetLog* net_log)
: push_helper_(std::move(server_push_helper)),
- request_(new HttpRequestInfo()),
+ request_(std::make_unique<HttpRequestInfo>()),
net_log_(NetLogWithSource::Make(
net_log,
NetLogSourceType::SERVER_PUSH_LOOKUP_TRANSACTION)) {}
diff --git a/chromium/net/http/http_cache_transaction.cc b/chromium/net/http/http_cache_transaction.cc
index 764fd4d65bc..fc53e0bb1ac 100644
--- a/chromium/net/http/http_cache_transaction.cc
+++ b/chromium/net/http/http_cache_transaction.cc
@@ -4,7 +4,7 @@
#include "net/http/http_cache_transaction.h"
-#include "build/build_config.h" // For OS_POSIX
+#include "build/build_config.h" // For IS_POSIX
#if BUILDFLAG(IS_POSIX)
#include <unistd.h>
@@ -70,6 +70,13 @@ namespace {
constexpr base::TimeDelta kStaleRevalidateTimeout = base::Seconds(60);
+uint64_t GetNextTraceId(HttpCache* cache) {
+ static uint32_t sNextTraceId = 0;
+
+ DCHECK(cache);
+ return (reinterpret_cast<uint64_t>(cache) << 32) | sNextTraceId++;
+}
+
// From http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-21#section-6
// a "non-error response" is one with a 2xx (Successful) or 3xx
// (Redirection) status code.
@@ -91,6 +98,14 @@ enum ExternallyConditionalizedType {
EXTERNALLY_CONDITIONALIZED_MAX
};
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class RestrictedPrefetchReused {
+ kNotReused = 0,
+ kReused = 1,
+ kMaxValue = kReused
+};
+
void RecordPervasivePayloadIndex(const char* histogram_name, int index) {
if (index != -1) {
base::UmaHistogramExactLinear(histogram_name, index, 101);
@@ -161,7 +176,9 @@ static bool HeaderMatches(const HttpRequestHeaders& headers,
//-----------------------------------------------------------------------------
HttpCache::Transaction::Transaction(RequestPriority priority, HttpCache* cache)
- : priority_(priority), cache_(cache->GetWeakPtr()) {
+ : trace_id_(GetNextTraceId(cache)),
+ priority_(priority),
+ cache_(cache->GetWeakPtr()) {
TRACE_EVENT1("net", "HttpCacheTransaction::Transaction", "priority",
RequestPriorityToString(priority));
static_assert(HttpCache::Transaction::kNumValidationHeaders ==
@@ -212,8 +229,8 @@ int HttpCache::Transaction::Start(const HttpRequestInfo* request,
DCHECK(request);
DCHECK(!callback.is_null());
TRACE_EVENT_WITH_FLOW1("net", "HttpCacheTransaction::Start",
- net_log.source().id, TRACE_EVENT_FLAG_FLOW_OUT, "url",
- request->url.spec());
+ TRACE_ID_LOCAL(trace_id_), TRACE_EVENT_FLAG_FLOW_OUT,
+ "url", request->url.spec());
// Ensure that we only have one asynchronous call at a time.
DCHECK(callback_.is_null());
@@ -310,9 +327,15 @@ bool HttpCache::Transaction::IsReadyToRestartForAuth() {
int HttpCache::Transaction::Read(IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) {
+ TRACE_EVENT_WITH_FLOW1(
+ "net", "HttpCacheTransaction::Read", TRACE_ID_LOCAL(trace_id_),
+ TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "buf_len", buf_len);
+
DCHECK_EQ(next_state_, STATE_NONE);
DCHECK(buf);
- DCHECK_GT(buf_len, 0);
+ // TODO(https://crbug.com/1335423): Change to DCHECK_GT() or remove after bug
+ // is fixed.
+ CHECK_GT(buf_len, 0);
DCHECK(!callback.is_null());
DCHECK(callback_.is_null());
@@ -397,7 +420,7 @@ int HttpCache::Transaction::TransitionToReadingState() {
// Full request.
// If it's a writer and a full request then it may read from the cache if its
// offset is behind the current offset else from the network.
- int disk_entry_size = entry_->disk_entry->GetDataSize(kResponseContentIndex);
+ int disk_entry_size = entry_->GetEntry()->GetDataSize(kResponseContentIndex);
if (read_offset_ == disk_entry_size || entry_->writers->network_read_only()) {
next_state_ = STATE_NETWORK_READ_CACHE_WRITE;
} else {
@@ -612,7 +635,7 @@ void HttpCache::Transaction::SetValidatingCannotProceed() {
void HttpCache::Transaction::WriterAboutToBeRemovedFromEntry(int result) {
TRACE_EVENT_WITH_FLOW1(
"net", "HttpCacheTransaction::WriterAboutToBeRemovedFromEntry",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "result", result);
// Since the transaction can no longer access the network transaction, save
// all network related info now.
@@ -634,7 +657,7 @@ void HttpCache::Transaction::WriterAboutToBeRemovedFromEntry(int result) {
void HttpCache::Transaction::WriteModeTransactionAboutToBecomeReader() {
TRACE_EVENT_WITH_FLOW0(
"net", "HttpCacheTransaction::WriteModeTransactionAboutToBecomeReader",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
mode_ = READ;
if (moved_network_transaction_to_writers_ &&
@@ -1023,12 +1046,12 @@ int HttpCache::Transaction::DoGetBackendComplete(int result) {
mode_ = NONE;
if (!ShouldPassThrough()) {
- // The flag LOAD_USE_SINGLE_KEYED_CACHE will have been changed to false if
- // the entry was marked unusable and the transaction was restarted in
- // DoCacheReadResponseComplete(), so it will no longer match the value in
- // `request_`. So we pass it through explicitly.
- cache_key_ = cache_->GenerateCacheKey(
- request_, effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE);
+ // The flag `use_single_keyed_cache_` will have been changed back to false
+ // if the entry was marked unusable and the transaction was restarted in
+ // DoCacheReadResponseComplete(), even though `request_` will still have a
+ // checksum. So it needs to be passed explicitly.
+ cache_key_ =
+ *cache_->GenerateCacheKeyForRequest(request_, use_single_keyed_cache_);
// Requested cache access mode.
if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) {
@@ -1095,7 +1118,7 @@ int HttpCache::Transaction::DoGetBackendComplete(int result) {
int HttpCache::Transaction::DoInitEntry() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoInitEntry",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(!new_entry_);
@@ -1115,7 +1138,7 @@ int HttpCache::Transaction::DoInitEntry() {
int HttpCache::Transaction::DoOpenOrCreateEntry() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoOpenOrCreateEntry",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(!new_entry_);
TransitionToState(STATE_OPEN_OR_CREATE_ENTRY_COMPLETE);
@@ -1176,7 +1199,7 @@ int HttpCache::Transaction::DoOpenOrCreateEntry() {
int HttpCache::Transaction::DoOpenOrCreateEntryComplete(int result) {
TRACE_EVENT_WITH_FLOW1(
"net", "HttpCacheTransaction::DoOpenOrCreateEntryComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "result",
(result == OK ? (new_entry_->opened ? "opened" : "created") : "failed"));
@@ -1266,7 +1289,7 @@ int HttpCache::Transaction::DoOpenOrCreateEntryComplete(int result) {
int HttpCache::Transaction::DoDoomEntry() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoDoomEntry",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
TransitionToState(STATE_DOOM_ENTRY_COMPLETE);
cache_pending_ = true;
@@ -1277,9 +1300,10 @@ int HttpCache::Transaction::DoDoomEntry() {
}
int HttpCache::Transaction::DoDoomEntryComplete(int result) {
- TRACE_EVENT_WITH_FLOW1(
- "net", "HttpCacheTransaction::DoDoomEntryComplete", net_log().source().id,
- TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "result", result);
+ TRACE_EVENT_WITH_FLOW1("net", "HttpCacheTransaction::DoDoomEntryComplete",
+ TRACE_ID_LOCAL(trace_id_),
+ TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
+ "result", result);
net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_DOOM_ENTRY,
result);
cache_pending_ = false;
@@ -1291,7 +1315,7 @@ int HttpCache::Transaction::DoDoomEntryComplete(int result) {
int HttpCache::Transaction::DoCreateEntry() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoCreateEntry",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(!new_entry_);
TransitionToState(STATE_CREATE_ENTRY_COMPLETE);
@@ -1302,7 +1326,7 @@ int HttpCache::Transaction::DoCreateEntry() {
int HttpCache::Transaction::DoCreateEntryComplete(int result) {
TRACE_EVENT_WITH_FLOW1("net", "HttpCacheTransaction::DoCreateEntryComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"result", result);
// It is important that we go to STATE_ADD_TO_ENTRY whenever the result is
@@ -1345,7 +1369,7 @@ int HttpCache::Transaction::DoCreateEntryComplete(int result) {
int HttpCache::Transaction::DoAddToEntry() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoAddToEntry",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(new_entry_);
cache_pending_ = true;
@@ -1421,14 +1445,17 @@ void HttpCache::Transaction::AddCacheLockTimeoutHandler(ActiveEntry* entry) {
int HttpCache::Transaction::DoAddToEntryComplete(int result) {
TRACE_EVENT_WITH_FLOW1("net", "HttpCacheTransaction::DoAddToEntryComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"result", result);
net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_ADD_TO_ENTRY,
result);
- const base::TimeDelta entry_lock_wait =
- TimeTicks::Now() - entry_lock_waiting_since_;
- UMA_HISTOGRAM_TIMES("HttpCache.EntryLockWait", entry_lock_wait);
+ if (cache_ && cache_->GetCurrentBackend() &&
+ cache_->GetCurrentBackend()->GetCacheType() != MEMORY_CACHE) {
+ const base::TimeDelta entry_lock_wait =
+ TimeTicks::Now() - entry_lock_waiting_since_;
+ base::UmaHistogramTimes("HttpCache.AddTransactionToEntry", entry_lock_wait);
+ }
entry_lock_waiting_since_ = TimeTicks();
DCHECK(new_entry_);
@@ -1464,8 +1491,8 @@ int HttpCache::Transaction::DoAddToEntryComplete(int result) {
// TODO(crbug.com/713354) Access timestamp for histograms only if entry is
// already written, to avoid data race since cache thread can also access
// this.
- if (!cache_->IsWritingInProgress(entry_))
- open_entry_last_used_ = entry_->disk_entry->GetLastUsed();
+ if (!cache_->IsWritingInProgress(entry()))
+ open_entry_last_used_ = entry_->GetEntry()->GetLastUsed();
// TODO(jkarlin): We should either handle the case or DCHECK.
if (result != OK) {
@@ -1489,7 +1516,7 @@ int HttpCache::Transaction::DoAddToEntryComplete(int result) {
int HttpCache::Transaction::DoDoneHeadersAddToEntryComplete(int result) {
TRACE_EVENT_WITH_FLOW1(
"net", "HttpCacheTransaction::DoDoneHeadersAddToEntryComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "result", result);
// This transaction's response headers did not match its ActiveEntry so it
// created a new ActiveEntry (new_entry_) to write to (and doomed the old
@@ -1520,23 +1547,23 @@ int HttpCache::Transaction::DoDoneHeadersAddToEntryComplete(int result) {
int HttpCache::Transaction::DoCacheReadResponse() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoCacheReadResponse",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(entry_);
TransitionToState(STATE_CACHE_READ_RESPONSE_COMPLETE);
- io_buf_len_ = entry_->disk_entry->GetDataSize(kResponseInfoIndex);
+ io_buf_len_ = entry_->GetEntry()->GetDataSize(kResponseInfoIndex);
read_buf_ = base::MakeRefCounted<IOBuffer>(io_buf_len_);
net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_READ_INFO);
- return entry_->disk_entry->ReadData(kResponseInfoIndex, 0, read_buf_.get(),
+ return entry_->GetEntry()->ReadData(kResponseInfoIndex, 0, read_buf_.get(),
io_buf_len_, io_callback_);
}
int HttpCache::Transaction::DoCacheReadResponseComplete(int result) {
TRACE_EVENT_WITH_FLOW2("net",
"HttpCacheTransaction::DoCacheReadResponseComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"result", result, "io_buf_len", io_buf_len_);
net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_READ_INFO,
@@ -1556,9 +1583,9 @@ int HttpCache::Transaction::DoCacheReadResponseComplete(int result) {
// We've read the single keyed entry and it turned out to be unusable. Let's
// retry reading from the split cache.
- if (effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE) {
+ if (use_single_keyed_cache_) {
DCHECK(!network_trans_);
- effective_load_flags_ &= ~LOAD_USE_SINGLE_KEYED_CACHE;
+ use_single_keyed_cache_ = false;
DoneWithEntryForRestartWithCache();
TransitionToState(STATE_GET_BACKEND);
return OK;
@@ -1572,8 +1599,8 @@ int HttpCache::Transaction::DoCacheReadResponseComplete(int result) {
// TODO(crbug.com/713354) Only get data size if there is no other transaction
// currently writing the response body due to the data race mentioned in the
// associated bug.
- if (!cache_->IsWritingInProgress(entry_)) {
- int current_size = entry_->disk_entry->GetDataSize(kResponseContentIndex);
+ if (!cache_->IsWritingInProgress(entry())) {
+ int current_size = entry_->GetEntry()->GetDataSize(kResponseContentIndex);
int64_t full_response_length = response_.headers->GetContentLength();
// Some resources may have slipped in as truncated when they're not.
@@ -1627,6 +1654,11 @@ int HttpCache::Transaction::DoCacheReadResponseComplete(int result) {
updated_prefetch_response_->restricted_prefetch = false;
}
+ base::UmaHistogramEnumeration("HttpCache.RestrictedPrefetchReuse",
+ restricted_prefetch_reuse
+ ? RestrictedPrefetchReused::kReused
+ : RestrictedPrefetchReused::kNotReused);
+
TransitionToState(STATE_WRITE_UPDATED_PREFETCH_RESPONSE);
return OK;
}
@@ -1638,7 +1670,7 @@ int HttpCache::Transaction::DoCacheReadResponseComplete(int result) {
int HttpCache::Transaction::DoCacheWriteUpdatedPrefetchResponse(int result) {
TRACE_EVENT_WITH_FLOW0(
"net", "HttpCacheTransaction::DoCacheWriteUpdatedPrefetchResponse",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(updated_prefetch_response_);
// TODO(jkarlin): If DoUpdateCachedResponse is also called for this
@@ -1653,7 +1685,7 @@ int HttpCache::Transaction::DoCacheWriteUpdatedPrefetchResponseComplete(
TRACE_EVENT_WITH_FLOW0(
"net",
"HttpCacheTransaction::DoCacheWriteUpdatedPrefetchResponseComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
updated_prefetch_response_.reset();
TransitionToState(STATE_CACHE_DISPATCH_VALIDATION);
@@ -1663,7 +1695,7 @@ int HttpCache::Transaction::DoCacheWriteUpdatedPrefetchResponseComplete(
int HttpCache::Transaction::DoCacheDispatchValidation() {
TRACE_EVENT_WITH_FLOW0("net",
"HttpCacheTransaction::DoCacheDispatchValidation",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
if (!entry_) {
// Entry got destroyed when twiddling unused-since-prefetch bit.
@@ -1705,7 +1737,7 @@ int HttpCache::Transaction::DoCacheDispatchValidation() {
int HttpCache::Transaction::DoCacheQueryData() {
TransitionToState(STATE_CACHE_QUERY_DATA_COMPLETE);
- return entry_->disk_entry->ReadyForSparseIO(io_callback_);
+ return entry_->GetEntry()->ReadyForSparseIO(io_callback_);
}
int HttpCache::Transaction::DoCacheQueryDataComplete(int result) {
@@ -1726,7 +1758,7 @@ int HttpCache::Transaction::DoStartPartialCacheValidation() {
}
TransitionToState(STATE_COMPLETE_PARTIAL_CACHE_VALIDATION);
- return partial_->ShouldValidateCache(entry_->disk_entry, io_callback_);
+ return partial_->ShouldValidateCache(entry_->GetEntry(), io_callback_);
}
int HttpCache::Transaction::DoCompletePartialCacheValidation(int result) {
@@ -1742,7 +1774,7 @@ int HttpCache::Transaction::DoCompletePartialCacheValidation(int result) {
return result;
}
- partial_->PrepareCacheValidation(entry_->disk_entry,
+ partial_->PrepareCacheValidation(entry_->GetEntry(),
&custom_request_->extra_headers);
if (reading_ && partial_->IsCurrentRangeCached()) {
@@ -1758,7 +1790,7 @@ int HttpCache::Transaction::DoCompletePartialCacheValidation(int result) {
int HttpCache::Transaction::DoCacheUpdateStaleWhileRevalidateTimeout() {
TRACE_EVENT_WITH_FLOW0(
"net", "HttpCacheTransaction::DoCacheUpdateStaleWhileRevalidateTimeout",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
response_.stale_revalidate_timeout =
cache_->clock_->Now() + kStaleRevalidateTimeout;
@@ -1771,7 +1803,7 @@ int HttpCache::Transaction::DoCacheUpdateStaleWhileRevalidateTimeoutComplete(
TRACE_EVENT_WITH_FLOW0(
"net",
"HttpCacheTransaction::DoCacheUpdateStaleWhileRevalidateTimeoutComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(!reading_);
TransitionToState(STATE_CONNECTED_CALLBACK);
@@ -1780,7 +1812,7 @@ int HttpCache::Transaction::DoCacheUpdateStaleWhileRevalidateTimeoutComplete(
int HttpCache::Transaction::DoSendRequest() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoSendRequest",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(mode_ & WRITE || mode_ == NONE);
DCHECK(!network_trans_.get());
@@ -1819,7 +1851,7 @@ int HttpCache::Transaction::DoSendRequest() {
int HttpCache::Transaction::DoSendRequestComplete(int result) {
TRACE_EVENT_WITH_FLOW1("net", "HttpCacheTransaction::DoSendRequestComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"result", result);
if (!cache_.get()) {
@@ -1867,7 +1899,7 @@ int HttpCache::Transaction::DoSendRequestComplete(int result) {
// We received the response headers and there is no error.
int HttpCache::Transaction::DoSuccessfulSendRequest() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoSuccessfulSendRequest",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(!new_response_);
const HttpResponseInfo* new_response = network_trans_->GetResponseInfo();
@@ -1907,7 +1939,7 @@ int HttpCache::Transaction::DoSuccessfulSendRequest() {
// The single-keyed cache only accepts responses with code 200 or 304.
// Anything else is considered unusable.
- if ((effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE) &&
+ if (use_single_keyed_cache_ &&
!(new_response->headers->response_code() == 200 ||
new_response->headers->response_code() == 304)) {
// Either the new response will be written back to the cache, in which case
@@ -1994,7 +2026,7 @@ int HttpCache::Transaction::DoSuccessfulSendRequest() {
// We received 304 or 206 and we want to update the cached response headers.
int HttpCache::Transaction::DoUpdateCachedResponse() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoUpdateCachedResponse",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
int rv = OK;
// Update the cached response based on the headers and properties of
@@ -2014,15 +2046,11 @@ int HttpCache::Transaction::DoUpdateCachedResponse() {
if (mark_single_keyed_cache_entry_unusable_) {
response_.single_keyed_cache_entry_unusable = true;
}
- if (new_response_->vary_data.is_valid()) {
- response_.vary_data = new_response_->vary_data;
- } else if (response_.vary_data.is_valid()) {
- // There is a vary header in the stored response but not in the current one.
- // Update the data with the new request headers.
- HttpVaryData new_vary_data;
- new_vary_data.Init(*request_, *response_.headers.get());
- response_.vary_data = new_vary_data;
- }
+
+ // If the new response didn't have a vary header, we continue to use the
+ // header from the stored response per the effect of headers->Update().
+ // Update the data with the new/updated request headers.
+ response_.vary_data.Init(*request_, *response_.headers);
if (ShouldDisableCaching(*response_.headers)) {
if (!entry_->doomed) {
@@ -2031,7 +2059,7 @@ int HttpCache::Transaction::DoUpdateCachedResponse() {
}
TransitionToState(STATE_UPDATE_CACHED_RESPONSE_COMPLETE);
} else {
- if (effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE) {
+ if (use_single_keyed_cache_) {
DCHECK_EQ(method_, "GET");
ChecksumHeaders();
}
@@ -2052,7 +2080,7 @@ int HttpCache::Transaction::DoUpdateCachedResponse() {
int HttpCache::Transaction::DoCacheWriteUpdatedResponse() {
TRACE_EVENT_WITH_FLOW0("net",
"HttpCacheTransaction::DoCacheWriteUpdatedResponse",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
TransitionToState(STATE_CACHE_WRITE_UPDATED_RESPONSE_COMPLETE);
return WriteResponseInfoToEntry(response_, false);
@@ -2061,7 +2089,7 @@ int HttpCache::Transaction::DoCacheWriteUpdatedResponse() {
int HttpCache::Transaction::DoCacheWriteUpdatedResponseComplete(int result) {
TRACE_EVENT_WITH_FLOW0(
"net", "HttpCacheTransaction::DoCacheWriteUpdatedResponseComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
TransitionToState(STATE_UPDATE_CACHED_RESPONSE_COMPLETE);
return OnWriteResponseInfoToEntryComplete(result);
@@ -2070,7 +2098,7 @@ int HttpCache::Transaction::DoCacheWriteUpdatedResponseComplete(int result) {
int HttpCache::Transaction::DoUpdateCachedResponseComplete(int result) {
TRACE_EVENT_WITH_FLOW1(
"net", "HttpCacheTransaction::DoUpdateCachedResponseComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "result", result);
if (mode_ == UPDATE) {
DCHECK(!handling_206_);
@@ -2109,7 +2137,7 @@ int HttpCache::Transaction::DoUpdateCachedResponseComplete(int result) {
int HttpCache::Transaction::DoOverwriteCachedResponse() {
TRACE_EVENT_WITH_FLOW0("net",
"HttpCacheTransaction::DoOverwriteCachedResponse",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
if (mode_ & READ) {
TransitionToState(STATE_PARTIAL_HEADERS_RECEIVED);
@@ -2122,7 +2150,7 @@ int HttpCache::Transaction::DoOverwriteCachedResponse() {
SetResponse(*new_response_);
- if (effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE) {
+ if (use_single_keyed_cache_) {
DCHECK_EQ(method_, "GET");
ChecksumHeaders();
}
@@ -2151,7 +2179,7 @@ int HttpCache::Transaction::DoOverwriteCachedResponse() {
int HttpCache::Transaction::DoCacheWriteResponse() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoCacheWriteResponse",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
DCHECK(response_.headers);
// Invalidate any current entry with a successful response if this transaction
@@ -2187,7 +2215,7 @@ int HttpCache::Transaction::DoCacheWriteResponse() {
int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) {
TRACE_EVENT_WITH_FLOW1(
"net", "HttpCacheTransaction::DoCacheWriteResponseComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "result", result);
TransitionToState(STATE_TRUNCATE_CACHED_DATA);
return OnWriteResponseInfoToEntryComplete(result);
@@ -2195,14 +2223,14 @@ int HttpCache::Transaction::DoCacheWriteResponseComplete(int result) {
int HttpCache::Transaction::DoTruncateCachedData() {
TRACE_EVENT_WITH_FLOW0("net", "HttpCacheTransaction::DoTruncateCachedData",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
TransitionToState(STATE_TRUNCATE_CACHED_DATA_COMPLETE);
if (!entry_)
return OK;
net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_WRITE_DATA);
// Truncate the stream.
- return entry_->disk_entry->WriteData(kResponseContentIndex, /*offset=*/0,
+ return entry_->GetEntry()->WriteData(kResponseContentIndex, /*offset=*/0,
/*buf=*/nullptr, /*buf_len=*/0,
io_callback_, /*truncate=*/true);
}
@@ -2210,7 +2238,7 @@ int HttpCache::Transaction::DoTruncateCachedData() {
int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) {
TRACE_EVENT_WITH_FLOW1(
"net", "HttpCacheTransaction::DoTruncateCachedDataComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "result", result);
if (entry_) {
net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_WRITE_DATA,
@@ -2263,7 +2291,7 @@ int HttpCache::Transaction::DoHeadersPhaseCannotProceed(int result) {
int HttpCache::Transaction::DoFinishHeaders(int result) {
TRACE_EVENT_WITH_FLOW1(
- "net", "HttpCacheTransaction::DoFinishHeaders", net_log().source().id,
+ "net", "HttpCacheTransaction::DoFinishHeaders", TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "result", result);
if (!cache_.get() || !entry_ || result != OK) {
TransitionToState(STATE_NONE);
@@ -2296,7 +2324,7 @@ int HttpCache::Transaction::DoFinishHeaders(int result) {
int HttpCache::Transaction::DoFinishHeadersComplete(int rv) {
TRACE_EVENT_WITH_FLOW1("net", "HttpCacheTransaction::DoFinishHeadersComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"result", rv);
entry_lock_waiting_since_ = TimeTicks();
@@ -2325,7 +2353,7 @@ int HttpCache::Transaction::DoFinishHeadersComplete(int rv) {
int HttpCache::Transaction::DoNetworkReadCacheWrite() {
TRACE_EVENT_WITH_FLOW2("net", "HttpCacheTransaction::DoNetworkReadCacheWrite",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"read_offset", read_offset_, "read_buf_len",
read_buf_len_);
@@ -2337,7 +2365,7 @@ int HttpCache::Transaction::DoNetworkReadCacheWrite() {
int HttpCache::Transaction::DoNetworkReadCacheWriteComplete(int result) {
TRACE_EVENT_WITH_FLOW1(
"net", "HttpCacheTransaction::DoNetworkReadCacheWriteComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "result", result);
if (!cache_.get()) {
TransitionToState(STATE_NONE);
@@ -2408,7 +2436,7 @@ int HttpCache::Transaction::DoPartialNetworkReadCompleted(int result) {
int HttpCache::Transaction::DoNetworkRead() {
TRACE_EVENT_WITH_FLOW2(
- "net", "HttpCacheTransaction::DoNetworkRead", net_log().source().id,
+ "net", "HttpCacheTransaction::DoNetworkRead", TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "read_offset",
read_offset_, "read_buf_len", read_buf_len_);
TransitionToState(STATE_NETWORK_READ_COMPLETE);
@@ -2417,7 +2445,7 @@ int HttpCache::Transaction::DoNetworkRead() {
int HttpCache::Transaction::DoNetworkReadComplete(int result) {
TRACE_EVENT_WITH_FLOW1("net", "HttpCacheTransaction::DoNetworkReadComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"result", result);
@@ -2435,7 +2463,7 @@ int HttpCache::Transaction::DoNetworkReadComplete(int result) {
int HttpCache::Transaction::DoCacheReadData() {
TRACE_EVENT_WITH_FLOW2(
- "net", "HttpCacheTransaction::DoCacheReadData", net_log().source().id,
+ "net", "HttpCacheTransaction::DoCacheReadData", TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "read_offset",
read_offset_, "read_buf_len", read_buf_len_);
@@ -2449,18 +2477,18 @@ int HttpCache::Transaction::DoCacheReadData() {
net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_READ_DATA);
if (partial_) {
- return partial_->CacheRead(entry_->disk_entry, read_buf_.get(),
+ return partial_->CacheRead(entry_->GetEntry(), read_buf_.get(),
read_buf_len_, io_callback_);
}
- return entry_->disk_entry->ReadData(kResponseContentIndex, read_offset_,
+ return entry_->GetEntry()->ReadData(kResponseContentIndex, read_offset_,
read_buf_.get(), read_buf_len_,
io_callback_);
}
int HttpCache::Transaction::DoCacheReadDataComplete(int result) {
TRACE_EVENT_WITH_FLOW1("net", "HttpCacheTransaction::DoCacheReadDataComplete",
- net_log().source().id,
+ TRACE_ID_LOCAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"result", result);
net_log_.EndEventWithNetErrorCode(NetLogEventType::HTTP_CACHE_READ_DATA,
@@ -2498,7 +2526,7 @@ int HttpCache::Transaction::DoCacheReadDataComplete(int result) {
}
int HttpCache::Transaction::DoMarkSingleKeyedCacheEntryUnusable() {
- DCHECK(effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE);
+ DCHECK(use_single_keyed_cache_);
response_.single_keyed_cache_entry_unusable = true;
TransitionToState(STATE_MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE_COMPLETE);
return WriteResponseInfoToEntry(response_, /*truncated=*/false);
@@ -2534,6 +2562,9 @@ void HttpCache::Transaction::SetRequest(const NetLogWithSource& net_log) {
effective_load_flags_ = request_->load_flags;
method_ = request_->method;
+ if (!request_->checksum.empty())
+ use_single_keyed_cache_ = true;
+
if (cache_->mode() == DISABLE)
effective_load_flags_ |= LOAD_DISABLE_CACHE;
@@ -2562,9 +2593,9 @@ void HttpCache::Transaction::SetRequest(const NetLogWithSource& net_log) {
if (request_->extra_headers.HasHeader(HttpRequestHeaders::kRange))
range_found = true;
- for (size_t i = 0; i < std::size(kSpecialHeaders); ++i) {
- if (HeaderMatches(request_->extra_headers, kSpecialHeaders[i].search)) {
- effective_load_flags_ |= kSpecialHeaders[i].load_flag;
+ for (const auto& special_header : kSpecialHeaders) {
+ if (HeaderMatches(request_->extra_headers, special_header.search)) {
+ effective_load_flags_ |= special_header.load_flag;
special_headers = true;
break;
}
@@ -2821,9 +2852,9 @@ int HttpCache::Transaction::BeginPartialCacheValidation() {
int HttpCache::Transaction::ValidateEntryHeadersAndContinue() {
DCHECK_EQ(mode_, READ_WRITE);
- if (!partial_->UpdateFromStoredHeaders(response_.headers.get(),
- entry_->disk_entry, truncated_,
- cache_->IsWritingInProgress(entry_))) {
+ if (!partial_->UpdateFromStoredHeaders(
+ response_.headers.get(), entry_->GetEntry(), truncated_,
+ cache_->IsWritingInProgress(entry()))) {
return DoRestartPartialRequest();
}
@@ -3273,6 +3304,15 @@ int HttpCache::Transaction::DoConnectedCallback() {
int HttpCache::Transaction::DoConnectedCallbackComplete(int result) {
if (result != OK) {
+ if (result ==
+ ERR_CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_PRIVATE_NETWORK_ACCESS_POLICY) {
+ DoomInconsistentEntry();
+ UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_OTHER);
+ TransitionToState(reading_ ? STATE_SEND_REQUEST
+ : STATE_HEADERS_PHASE_CANNOT_PROCEED);
+ return OK;
+ }
+
if (result == ERR_INCONSISTENT_IP_ADDRESS_SPACE) {
DoomInconsistentEntry();
} else {
@@ -3392,7 +3432,7 @@ int HttpCache::Transaction::WriteResponseInfoToEntry(
// When writing headers, we normally only write the non-transient headers.
bool skip_transient_headers = true;
- scoped_refptr<PickledIOBuffer> data(new PickledIOBuffer());
+ auto data = base::MakeRefCounted<PickledIOBuffer>();
response.Persist(data->pickle(), skip_transient_headers, truncated);
data->Done();
@@ -3618,7 +3658,7 @@ HttpTransaction* HttpCache::Transaction::network_transaction() {
//
bool HttpCache::Transaction::CanResume(bool has_data) {
// Double check that there is something worth keeping.
- if (has_data && !entry_->disk_entry->GetDataSize(kResponseContentIndex))
+ if (has_data && !entry_->GetEntry()->GetDataSize(kResponseContentIndex))
return false;
if (method_ != "GET")
@@ -3637,6 +3677,12 @@ bool HttpCache::Transaction::CanResume(bool has_data) {
void HttpCache::Transaction::SetResponse(const HttpResponseInfo& response) {
response_ = response;
+
+ if (response_.headers) {
+ DCHECK(request_);
+ response_.vary_data.Init(*request_, *response_.headers);
+ }
+
SyncCacheEntryStatusToResponse();
}
@@ -3912,7 +3958,7 @@ void HttpCache::Transaction::UpdateSecurityHeadersBeforeForwarding() {
}
void HttpCache::Transaction::ChecksumHeaders() {
- DCHECK(effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE);
+ DCHECK(use_single_keyed_cache_);
DCHECK(!checksum_);
checksum_ = crypto::SecureHash::Create(crypto::SecureHash::SHA256);
// For efficiency and concision, we list known headers matching a wildcard
@@ -3933,7 +3979,7 @@ void HttpCache::Transaction::ChecksumHeaders() {
"cross-origin-embedder-policy",
"cross-origin-opener-policy",
"cross-origin-resource-policy",
- "location"
+ "location",
"sec-websocket-accept",
"sec-websocket-extensions",
"sec-websocket-key",
@@ -3942,20 +3988,22 @@ void HttpCache::Transaction::ChecksumHeaders() {
"upgrade",
"vary",
});
- // Iterate the response headers looking for matches.
- size_t iter = 0;
- std::string name;
- std::string value;
// Pairs of (lower_case_header_name, header_value).
std::vector<std::pair<std::string, std::string>> filtered_headers;
// It's good to set the initial allocation size of the vector to the
// expected size to avoid a lot of reallocations. This value was chosen as
// it is a nice round number.
filtered_headers.reserve(16);
- while (response_.headers->EnumerateHeaderLines(&iter, &name, &value)) {
- std::string lowered_name = base::ToLowerASCII(name);
- if (kHeadersToInclude.contains(lowered_name)) {
- filtered_headers.emplace_back(lowered_name, value);
+ {
+ // Iterate the response headers looking for matches.
+ size_t iter = 0;
+ std::string name;
+ std::string value;
+ while (response_.headers->EnumerateHeaderLines(&iter, &name, &value)) {
+ std::string lowered_name = base::ToLowerASCII(name);
+ if (kHeadersToInclude.contains(lowered_name)) {
+ filtered_headers.emplace_back(lowered_name, value);
+ }
}
}
std::sort(filtered_headers.begin(), filtered_headers.end());
@@ -3972,7 +4020,7 @@ bool HttpCache::Transaction::FinishAndCheckChecksum() {
if (!checksum_)
return true;
- DCHECK(effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE);
+ DCHECK(use_single_keyed_cache_);
return ResponseChecksumMatches(std::move(checksum_));
}
diff --git a/chromium/net/http/http_cache_transaction.h b/chromium/net/http/http_cache_transaction.h
index 88ed80876e4..0a937a3b13e 100644
--- a/chromium/net/http/http_cache_transaction.h
+++ b/chromium/net/http/http_cache_transaction.h
@@ -610,21 +610,28 @@ class NET_EXPORT_PRIVATE HttpCache::Transaction : public HttpTransaction {
State next_state_{STATE_NONE};
+ // Used for tracing.
+ const uint64_t trace_id_;
+
// Initial request with which Start() was invoked.
raw_ptr<const HttpRequestInfo> initial_request_ = nullptr;
+ // `custom_request_` is assigned to `request_` after allocation. It must be
+ // declared before `request_` so that it will be destroyed afterwards to
+ // prevent that pointer from dangling.
+ std::unique_ptr<HttpRequestInfo> custom_request_;
+
raw_ptr<const HttpRequestInfo> request_ = nullptr;
std::string method_;
RequestPriority priority_;
NetLogWithSource net_log_;
- std::unique_ptr<HttpRequestInfo> custom_request_;
HttpRequestHeaders request_headers_copy_;
// If extra_headers specified a "if-modified-since" or "if-none-match",
// |external_validation_| contains the value of those headers.
ValidationHeaders external_validation_;
base::WeakPtr<HttpCache> cache_;
- raw_ptr<HttpCache::ActiveEntry> entry_ = nullptr;
+ raw_ptr<HttpCache::ActiveEntry, DanglingUntriaged> entry_ = nullptr;
HttpCache::ActiveEntry* new_entry_ = nullptr;
std::unique_ptr<HttpTransaction> network_trans_;
CompletionOnceCallback callback_; // Consumer's callback.
@@ -640,7 +647,7 @@ class NET_EXPORT_PRIVATE HttpCache::Transaction : public HttpTransaction {
// WriteResponseInfoToEntry() resets this to absl::nullopt.
std::unique_ptr<HttpResponseInfo> updated_prefetch_response_;
- raw_ptr<const HttpResponseInfo> new_response_ = nullptr;
+ raw_ptr<const HttpResponseInfo, DanglingUntriaged> new_response_ = nullptr;
std::string cache_key_;
Mode mode_ = NONE;
bool reading_ = false; // We are already reading. Never reverts to
@@ -666,6 +673,8 @@ class NET_EXPORT_PRIVATE HttpCache::Transaction : public HttpTransaction {
false; // Fail ConditionalizeRequest.
bool mark_single_keyed_cache_entry_unusable_ =
false; // Set single_keyed_cache_entry_unusable.
+ // This is initialised in Start().
+ bool use_single_keyed_cache_ = false;
scoped_refptr<IOBuffer> read_buf_;
diff --git a/chromium/net/http/http_cache_unittest.cc b/chromium/net/http/http_cache_unittest.cc
index 09f1f94f4a6..931e1322fc7 100644
--- a/chromium/net/http/http_cache_unittest.cc
+++ b/chromium/net/http/http_cache_unittest.cc
@@ -174,8 +174,8 @@ void DeferCallback(bool* defer) {
class DeleteCacheCompletionCallback : public TestCompletionCallbackBase {
public:
- explicit DeleteCacheCompletionCallback(MockHttpCache* cache)
- : cache_(cache) {}
+ explicit DeleteCacheCompletionCallback(std::unique_ptr<MockHttpCache> cache)
+ : cache_(std::move(cache)) {}
DeleteCacheCompletionCallback(const DeleteCacheCompletionCallback&) = delete;
DeleteCacheCompletionCallback& operator=(
@@ -188,11 +188,11 @@ class DeleteCacheCompletionCallback : public TestCompletionCallbackBase {
private:
void OnComplete(int result) {
- delete cache_;
+ cache_.reset();
SetResult(result);
}
- raw_ptr<MockHttpCache> cache_;
+ std::unique_ptr<MockHttpCache> cache_;
};
//-----------------------------------------------------------------------------
@@ -772,7 +772,7 @@ std::string GenerateCacheKey(const std::string& url) {
using HttpCacheTest = TestWithTaskEnvironment;
class HttpCacheIOCallbackTest : public HttpCacheTest {
public:
- HttpCacheIOCallbackTest() {}
+ HttpCacheIOCallbackTest() = default;
~HttpCacheIOCallbackTest() override = default;
// HttpCache::ActiveEntry is private, doing this allows tests to use it
@@ -814,7 +814,7 @@ class HttpCacheIOCallbackTest : public HttpCacheTest {
class HttpSplitCacheKeyTest : public HttpCacheTest {
public:
- HttpSplitCacheKeyTest() {}
+ HttpSplitCacheKeyTest() = default;
~HttpSplitCacheKeyTest() override = default;
std::string ComputeCacheKey(const std::string& url_string) {
@@ -825,7 +825,7 @@ class HttpSplitCacheKeyTest : public HttpCacheTest {
request_info.method = "GET";
request_info.network_isolation_key = net::NetworkIsolationKey(site, site);
MockHttpCache cache;
- return cache.http_cache()->GenerateCacheKeyForTest(&request_info);
+ return *cache.http_cache()->GenerateCacheKeyForRequest(&request_info);
}
};
@@ -1075,6 +1075,73 @@ TEST_F(HttpCacheTest,
}
}
+// This test verifies that when the callback passed to SetConnectedCallback()
+// returns
+// `ERR_CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_PRIVATE_NETWORK_ACCESS_POLICY`, the
+// cache entry is invalidated, and we'll retry the connection from the network.
+TEST_F(
+ HttpCacheTest,
+ SimpleGET_ConnectedCallbackOnCacheHitReturnPrivateNetworkAccessBlockedError) {
+ MockHttpCache cache;
+
+ ScopedMockTransaction mock_transaction(kSimpleGET_Transaction);
+ mock_transaction.transport_info = TestTransportInfo();
+
+ // Populate the cache.
+ RunTransactionTest(cache.http_cache(), mock_transaction);
+
+ MockHttpRequest request(kSimpleGET_Transaction);
+
+ {
+ // Attempt to read from cache entry, but abort transaction due to a
+ // connected callback error.
+ ConnectedHandler connected_handler;
+ connected_handler.set_result(
+ ERR_CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_PRIVATE_NETWORK_ACCESS_POLICY);
+
+ std::unique_ptr<HttpTransaction> transaction;
+ EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
+ ASSERT_THAT(transaction, NotNull());
+
+ transaction->SetConnectedCallback(connected_handler.Callback());
+
+ TestCompletionCallback callback;
+ ASSERT_THAT(
+ transaction->Start(&request, callback.callback(), NetLogWithSource()),
+ IsError(ERR_IO_PENDING));
+ EXPECT_THAT(
+ callback.WaitForResult(),
+ IsError(
+ ERR_CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_PRIVATE_NETWORK_ACCESS_POLICY));
+
+ // Used the cache entry only.
+ EXPECT_THAT(connected_handler.transports(),
+ ElementsAre(CachedTestTransportInfo(), TestTransportInfo()));
+ }
+
+ {
+ // Request the same resource once more, observe that it is not read from
+ // cache.
+ ConnectedHandler connected_handler;
+
+ std::unique_ptr<HttpTransaction> transaction;
+ EXPECT_THAT(cache.CreateTransaction(&transaction), IsOk());
+ ASSERT_THAT(transaction, NotNull());
+
+ transaction->SetConnectedCallback(connected_handler.Callback());
+
+ TestCompletionCallback callback;
+ ASSERT_THAT(
+ transaction->Start(&request, callback.callback(), NetLogWithSource()),
+ IsError(ERR_IO_PENDING));
+ EXPECT_THAT(callback.WaitForResult(), IsOk());
+
+ // Used the network only.
+ EXPECT_THAT(connected_handler.transports(),
+ ElementsAre(TestTransportInfo()));
+ }
+}
+
// This test verifies that the callback passed to SetConnectedCallback() is
// called with the right transport type when the cached entry was originally
// fetched via proxy.
@@ -3804,12 +3871,11 @@ TEST_F(HttpCacheTest, SimpleGET_ParallelValidationNoMatch1) {
EXPECT_EQ(LOAD_STATE_IDLE, context->trans->GetLoadState());
}
- for (size_t i = 0; i < context_list.size(); i++) {
- if (context_list[i]->result == ERR_IO_PENDING)
- context_list[i]->result = context_list[i]->callback.WaitForResult();
+ for (auto& context : context_list) {
+ if (context->result == ERR_IO_PENDING)
+ context->result = context->callback.WaitForResult();
- ReadAndVerifyTransaction(context_list[i]->trans.get(),
- kSimpleGET_Transaction);
+ ReadAndVerifyTransaction(context->trans.get(), kSimpleGET_Transaction);
}
EXPECT_EQ(2, cache.network_layer()->transaction_count());
@@ -5336,7 +5402,8 @@ TEST_F(HttpCacheTest, SimpleGET_ManyWriters_CancelFirst) {
// Allow all requests to move from the Create queue to the active entry.
// All would have been added to writers.
base::RunLoop().RunUntilIdle();
- std::string cache_key = cache.http_cache()->GenerateCacheKeyForTest(&request);
+ std::string cache_key =
+ *cache.http_cache()->GenerateCacheKeyForRequest(&request);
EXPECT_EQ(kNumTransactions, cache.GetCountWriterTransactions(cache_key));
// The second transaction skipped validation, thus only one network
@@ -5601,8 +5668,9 @@ TEST_F(HttpCacheTest, SimpleGET_ManyWriters_DeleteCache) {
// Tests that we queue requests when initializing the backend.
TEST_F(HttpCacheTest, SimpleGET_WaitForBackend) {
- MockBlockingBackendFactory* factory = new MockBlockingBackendFactory();
- MockHttpCache cache(base::WrapUnique(factory));
+ auto factory = std::make_unique<MockBlockingBackendFactory>();
+ MockBlockingBackendFactory* factory_ptr = factory.get();
+ MockHttpCache cache(std::move(factory));
MockHttpRequest request0(kSimpleGET_Transaction);
MockHttpRequest request1(kTypicalGET_Transaction);
@@ -5632,7 +5700,7 @@ TEST_F(HttpCacheTest, SimpleGET_WaitForBackend) {
// The first request should be creating the disk cache.
EXPECT_FALSE(context_list[0]->callback.have_result());
- factory->FinishCreation();
+ factory_ptr->FinishCreation();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(3, cache.network_layer()->transaction_count());
@@ -5647,8 +5715,9 @@ TEST_F(HttpCacheTest, SimpleGET_WaitForBackend) {
// Tests that we can cancel requests that are queued waiting for the backend
// to be initialized.
TEST_F(HttpCacheTest, SimpleGET_WaitForBackend_CancelCreate) {
- MockBlockingBackendFactory* factory = new MockBlockingBackendFactory();
- MockHttpCache cache(base::WrapUnique(factory));
+ auto factory = std::make_unique<MockBlockingBackendFactory>();
+ MockBlockingBackendFactory* factory_ptr = factory.get();
+ MockHttpCache cache(std::move(factory));
MockHttpRequest request0(kSimpleGET_Transaction);
MockHttpRequest request1(kTypicalGET_Transaction);
@@ -5685,7 +5754,7 @@ TEST_F(HttpCacheTest, SimpleGET_WaitForBackend_CancelCreate) {
context_list[0].reset();
// Complete the last transaction.
- factory->FinishCreation();
+ factory_ptr->FinishCreation();
context_list[2]->result =
context_list[2]->callback.GetResult(context_list[2]->result);
@@ -5695,10 +5764,11 @@ TEST_F(HttpCacheTest, SimpleGET_WaitForBackend_CancelCreate) {
EXPECT_EQ(1, cache.disk_cache()->create_count());
}
-// Tests that we can delete the cache while creating the backend.
+// Tests that we can delete the HttpCache while creating the backend.
TEST_F(HttpCacheTest, DeleteCacheWaitingForBackend) {
- MockBlockingBackendFactory* factory = new MockBlockingBackendFactory();
- auto cache = std::make_unique<MockHttpCache>(base::WrapUnique(factory));
+ auto factory = std::make_unique<MockBlockingBackendFactory>();
+ MockBlockingBackendFactory* factory_ptr = factory.get();
+ auto cache = std::make_unique<MockHttpCache>(std::move(factory));
MockHttpRequest request(kSimpleGET_Transaction);
@@ -5714,45 +5784,43 @@ TEST_F(HttpCacheTest, DeleteCacheWaitingForBackend) {
// The request should be creating the disk cache.
EXPECT_FALSE(c->callback.have_result());
- // We cannot call FinishCreation because the factory itself will go away with
- // the cache.
- CompletionOnceCallback callback = factory->ReleaseCallback();
- std::unique_ptr<disk_cache::Backend>* backend = factory->backend();
+ // Manually arrange for completion to happen after ~HttpCache.
+ // This can't be done via FinishCreation() since that's in `factory`, and
+ // that's owned by `cache`.
+ disk_cache::BackendResultCallback callback = factory_ptr->ReleaseCallback();
cache.reset();
base::RunLoop().RunUntilIdle();
- // Even though |HttpCache| is destroyed, the Backend that was passed in to
- // disk_cache::CreateCacheBackend() must still be valid until the callback is
- // called.
- backend->reset();
- // |callback| will destroy |backend|.
- std::move(callback).Run(ERR_ABORTED);
+ // Simulate the backend completion callback running now the HttpCache is gone.
+ std::move(callback).Run(disk_cache::BackendResult::MakeError(ERR_ABORTED));
}
// Tests that we can delete the cache while creating the backend, from within
// one of the callbacks.
TEST_F(HttpCacheTest, DeleteCacheWaitingForBackend2) {
- MockBlockingBackendFactory* factory = new MockBlockingBackendFactory();
- MockHttpCache* cache = new MockHttpCache(base::WrapUnique(factory));
+ auto factory = std::make_unique<MockBlockingBackendFactory>();
+ MockBlockingBackendFactory* factory_ptr = factory.get();
+ auto cache = std::make_unique<MockHttpCache>(std::move(factory));
+ auto* cache_ptr = cache.get();
- DeleteCacheCompletionCallback cb(cache);
+ DeleteCacheCompletionCallback cb(std::move(cache));
disk_cache::Backend* backend;
- int rv = cache->http_cache()->GetBackend(&backend, cb.callback());
+ int rv = cache_ptr->http_cache()->GetBackend(&backend, cb.callback());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Now let's queue a regular transaction
MockHttpRequest request(kSimpleGET_Transaction);
auto c = std::make_unique<Context>();
- c->result = cache->CreateTransaction(&c->trans);
+ c->result = cache_ptr->CreateTransaction(&c->trans);
ASSERT_THAT(c->result, IsOk());
c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
// And another direct backend request.
TestCompletionCallback cb2;
- rv = cache->http_cache()->GetBackend(&backend, cb2.callback());
+ rv = cache_ptr->http_cache()->GetBackend(&backend, cb2.callback());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Just to make sure that everything is still pending.
@@ -5762,7 +5830,7 @@ TEST_F(HttpCacheTest, DeleteCacheWaitingForBackend2) {
EXPECT_FALSE(c->callback.have_result());
// Generate the callback.
- factory->FinishCreation();
+ factory_ptr->FinishCreation();
rv = cb.WaitForResult();
// The cache should be gone by now.
@@ -8309,7 +8377,8 @@ TEST_F(HttpCacheTest, Sparse_WaitForEntry) {
// Simulate a previous transaction being cancelled.
disk_cache::Entry* entry;
MockHttpRequest request(transaction);
- std::string cache_key = cache.http_cache()->GenerateCacheKeyForTest(&request);
+ std::string cache_key =
+ *cache.http_cache()->GenerateCacheKeyForRequest(&request);
ASSERT_TRUE(cache.OpenBackendEntry(cache_key, &entry));
entry->CancelSparseIO();
@@ -9737,7 +9806,8 @@ TEST_F(HttpCacheTest, PersistHttpResponseInfo) {
HttpResponseInfo response1;
response1.was_cached = false;
response1.remote_endpoint = expected_endpoint;
- response1.headers = new HttpResponseHeaders("HTTP/1.1 200 OK");
+ response1.headers =
+ base::MakeRefCounted<HttpResponseHeaders>("HTTP/1.1 200 OK");
// Pickle.
base::Pickle pickle;
@@ -10916,7 +10986,7 @@ TEST_F(HttpCacheTest, SplitCacheWithNetworkIsolationKey) {
// Now make a request with an opaque subframe site. It shouldn't be
// cached.
trans_info.network_isolation_key = NetworkIsolationKey(site_a, site_data);
- EXPECT_TRUE(trans_info.network_isolation_key.ToString().empty());
+ EXPECT_EQ(absl::nullopt, trans_info.network_isolation_key.ToCacheKeyString());
RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction,
trans_info, &response);
EXPECT_FALSE(response.was_cached);
@@ -11140,7 +11210,7 @@ TEST_F(HttpCacheTest, SplitCache) {
// Now make a request with an opaque top frame origin. It shouldn't be
// cached.
trans_info.network_isolation_key = NetworkIsolationKey(site_data, site_data);
- EXPECT_TRUE(trans_info.network_isolation_key.ToString().empty());
+ EXPECT_EQ(absl::nullopt, trans_info.network_isolation_key.ToCacheKeyString());
RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction,
trans_info, &response);
EXPECT_FALSE(response.was_cached);
@@ -11811,7 +11881,7 @@ HttpCacheHugeResourceTest::GetTestModes() {
for (const auto phase : kTransactionPhases)
for (const auto initializer : kInitializers)
- test_modes.push_back(std::make_pair(phase, initializer));
+ test_modes.emplace_back(phase, initializer);
return test_modes;
}
@@ -12754,7 +12824,7 @@ TEST_F(HttpCacheTest, GetResourceURLFromHttpCacheKey) {
class TestCompletionCallbackForHttpCache : public TestCompletionCallbackBase {
public:
- TestCompletionCallbackForHttpCache() {}
+ TestCompletionCallbackForHttpCache() = default;
~TestCompletionCallbackForHttpCache() override = default;
CompletionRepeatingCallback callback() {
@@ -13516,10 +13586,8 @@ class HttpCacheSingleKeyedCacheTest : public HttpCacheTest {
const MockTransaction& trans_info,
const NetworkIsolationKey& network_isolation_key,
const std::string& checksum) {
- MockTransaction transaction(trans_info);
- transaction.load_flags |= LOAD_USE_SINGLE_KEYED_CACHE;
+ ScopedMockTransaction transaction(trans_info);
- AddMockTransaction(&transaction);
MockHttpRequest request(transaction);
request.network_isolation_key = network_isolation_key;
request.checksum = checksum;
@@ -13640,6 +13708,38 @@ TEST_F(HttpCacheSingleKeyedCacheTest, GETWithBadResponseCode) {
}
}
+// This is identical to GETWithBadResponseCode but with a different response
+// code. It's not very realistic as it doesn't call DoneReading(), but it covers
+// the relevant code path.
+TEST_F(HttpCacheSingleKeyedCacheTest, RedirectUnusable) {
+ MockHttpCache cache;
+ MockTransaction transaction = kSimpleGET_Transaction;
+ transaction.status = "HTTP/1.1 301 Moved Permanently";
+ const auto site_a = SchemefulSite(GURL("https://a.com/"));
+ // The first request adds the item to the single-keyed cache.
+ {
+ RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+ NetworkIsolationKey(site_a, site_a),
+ kChecksumForSimpleGET);
+
+ EXPECT_EQ(1, cache.network_layer()->transaction_count());
+ EXPECT_EQ(0, cache.disk_cache()->open_count());
+ EXPECT_EQ(1, cache.disk_cache()->create_count());
+ }
+
+ // The second request verifies that the cache entry is not re-used
+ // but a new one is created in the split cache.
+ {
+ RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+ NetworkIsolationKey(site_a, site_a),
+ kChecksumForSimpleGET);
+
+ EXPECT_EQ(2, cache.network_layer()->transaction_count());
+ EXPECT_EQ(1, cache.disk_cache()->open_count());
+ EXPECT_EQ(2, cache.disk_cache()->create_count());
+ }
+}
+
TEST_F(HttpCacheSingleKeyedCacheTest, SuccessfulRevalidation) {
MockHttpCache cache;
MockTransaction transaction = kSimpleGET_Transaction;
diff --git a/chromium/net/http/http_cache_writers.cc b/chromium/net/http/http_cache_writers.cc
index 9a9b3b9647a..76b70c258b5 100644
--- a/chromium/net/http/http_cache_writers.cc
+++ b/chromium/net/http/http_cache_writers.cc
@@ -81,7 +81,9 @@ int HttpCache::Writers::Read(scoped_refptr<IOBuffer> buf,
CompletionOnceCallback callback,
Transaction* transaction) {
DCHECK(buf);
- DCHECK_GT(buf_len, 0);
+ // TODO(https://crbug.com/1335423): Change to DCHECK_GT() or remove after bug
+ // is fixed.
+ CHECK_GT(buf_len, 0);
DCHECK(!callback.is_null());
DCHECK(transaction);
@@ -279,8 +281,7 @@ void HttpCache::Writers::ProcessFailure(int error) {
void HttpCache::Writers::TruncateEntry() {
DCHECK(ShouldTruncate());
-
- scoped_refptr<PickledIOBuffer> data(new PickledIOBuffer());
+ auto data = base::MakeRefCounted<PickledIOBuffer>();
response_info_truncation_.Persist(data->pickle(),
true /* skip_transient_headers*/,
true /* response_truncated */);
@@ -496,7 +497,7 @@ int HttpCache::Writers::DoCacheWriteData(int num_bytes) {
read_buf_.get(), num_bytes,
std::move(io_callback), true);
} else {
- rv = partial->CacheWrite(entry_->disk_entry, read_buf_.get(), num_bytes,
+ rv = partial->CacheWrite(entry_->GetEntry(), read_buf_.get(), num_bytes,
std::move(io_callback));
}
return rv;
@@ -504,32 +505,38 @@ int HttpCache::Writers::DoCacheWriteData(int num_bytes) {
int HttpCache::Writers::DoCacheWriteDataComplete(int result) {
DCHECK(!all_writers_.empty());
- next_state_ = State::NONE;
+ DCHECK_GE(write_len_, 0);
+
+ if (result != write_len_) {
+ next_state_ = State::NONE;
+
+ // Note that it is possible for cache write to fail if the size of the file
+ // exceeds the per-file limit.
+ OnCacheWriteFailure();
+
+ // |active_transaction_| can continue reading from the network.
+ return write_len_;
+ }
+
if (checksum_) {
if (write_len_ > 0) {
checksum_->Update(read_buf_->data(), write_len_);
} else {
- // The write to the cache may have failed if result < 0, but even in that
- // case we want to check whether the data we've read from the network is
- // valid or not.
CHECK(active_transaction_);
if (!active_transaction_->ResponseChecksumMatches(std::move(checksum_))) {
next_state_ = State::MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE;
+ return result;
}
}
}
- if (result != write_len_) {
- // Note that it is possible for cache write to fail if the size of the file
- // exceeds the per-file limit.
- OnCacheWriteFailure();
+ next_state_ = State::NONE;
+ OnDataReceived(write_len_);
- // |active_transaction_| can continue reading from the network.
- result = write_len_;
- } else {
- OnDataReceived(result);
- }
- return result;
+ // If we came from DoMarkSingleKeyedCacheUnusableComplete() then result will
+ // be the size of the metadata that was written. But DoLoop() needs to know
+ // the number of bytes of data that were written. So return that instead.
+ return write_len_;
}
int HttpCache::Writers::DoMarkSingleKeyedCacheEntryUnusable() {
@@ -555,15 +562,11 @@ int HttpCache::Writers::DoMarkSingleKeyedCacheEntryUnusable() {
int HttpCache::Writers::DoMarkSingleKeyedCacheEntryUnusableComplete(
int result) {
- next_state_ = State::NONE;
-
- if (result < 0) {
- OnCacheWriteFailure();
- }
-
- // DoLoop() wants the size of the data write, not the size of the metadata
- // write.
- return write_len_;
+ DCHECK(!checksum_);
+ // We run DoCacheWriteDataComplete again, but this time `checksum_` is null so
+ // we won't come back here.
+ next_state_ = State::CACHE_WRITE_DATA_COMPLETE;
+ return result < 0 ? result : write_len_;
}
void HttpCache::Writers::OnDataReceived(int result) {
@@ -607,6 +610,8 @@ void HttpCache::Writers::OnDataReceived(int result) {
make_readers.insert(writer.first);
all_writers_.clear();
SetCacheCallback(true, make_readers);
+ // We assume the set callback will be called immediately.
+ DCHECK_EQ(next_state_, State::NONE);
return;
}
diff --git a/chromium/net/http/http_chunked_decoder_unittest.cc b/chromium/net/http/http_chunked_decoder_unittest.cc
index 4dbefb346f1..f3a34c1ba91 100644
--- a/chromium/net/http/http_chunked_decoder_unittest.cc
+++ b/chromium/net/http/http_chunked_decoder_unittest.cc
@@ -397,7 +397,7 @@ TEST(HttpChunkedDecoderTest, MultipleExtraDataBlocks) {
// Test when the line with the chunk length is too long.
TEST(HttpChunkedDecoderTest, LongChunkLengthLine) {
int big_chunk_length = HttpChunkedDecoder::kMaxLineBufLen;
- std::unique_ptr<char[]> big_chunk(new char[big_chunk_length + 1]);
+ auto big_chunk = std::make_unique<char[]>(big_chunk_length + 1);
memset(big_chunk.get(), '0', big_chunk_length);
big_chunk[big_chunk_length] = 0;
const char* const inputs[] = {
@@ -411,7 +411,7 @@ TEST(HttpChunkedDecoderTest, LongChunkLengthLine) {
// long.
TEST(HttpChunkedDecoderTest, LongLengthLengthLine) {
int big_chunk_length = HttpChunkedDecoder::kMaxLineBufLen;
- std::unique_ptr<char[]> big_chunk(new char[big_chunk_length + 1]);
+ auto big_chunk = std::make_unique<char[]>(big_chunk_length + 1);
memset(big_chunk.get(), '0', big_chunk_length);
big_chunk[big_chunk_length] = 0;
const char* const inputs[] = {
diff --git a/chromium/net/http/http_content_disposition_unittest.cc b/chromium/net/http/http_content_disposition_unittest.cc
index 2e3dfb25e82..d526dbfc716 100644
--- a/chromium/net/http/http_content_disposition_unittest.cc
+++ b/chromium/net/http/http_content_disposition_unittest.cc
@@ -201,11 +201,10 @@ TEST(HttpContentDispositionTest, Filename) {
{"attachment; foobar=x; filename=\"foo.html\"", "",
L"foo.html"},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
- HttpContentDisposition header(tests[i].header, tests[i].referrer_charset);
- EXPECT_EQ(tests[i].expected,
- base::UTF8ToWide(header.filename()))
- << "Failed on input: " << tests[i].header;
+ for (const auto& test : tests) {
+ HttpContentDisposition header(test.header, test.referrer_charset);
+ EXPECT_EQ(test.expected, base::UTF8ToWide(header.filename()))
+ << "Failed on input: " << test.header;
}
}
@@ -414,12 +413,12 @@ TEST(HttpContentDispositionTest, tc2231) {
// TODO(abarth): http://greenbytes.de/tech/tc2231/#attrfc2047token
// TODO(abarth): http://greenbytes.de/tech/tc2231/#attrfc2047quoted
};
- for (size_t i = 0; i < std::size(tests); ++i) {
- HttpContentDisposition header(tests[i].header, std::string());
- EXPECT_EQ(tests[i].expected_type, header.type())
- << "Failed on input: " << tests[i].header;
- EXPECT_EQ(tests[i].expected_filename, base::UTF8ToWide(header.filename()))
- << "Failed on input: " << tests[i].header;
+ for (const auto& test : tests) {
+ HttpContentDisposition header(test.header, std::string());
+ EXPECT_EQ(test.expected_type, header.type())
+ << "Failed on input: " << test.header;
+ EXPECT_EQ(test.expected_filename, base::UTF8ToWide(header.filename()))
+ << "Failed on input: " << test.header;
}
}
diff --git a/chromium/net/http/http_network_session.cc b/chromium/net/http/http_network_session.cc
index 457bb677150..e90b6c1c30b 100644
--- a/chromium/net/http/http_network_session.cc
+++ b/chromium/net/http/http_network_session.cc
@@ -72,6 +72,10 @@ spdy::SettingsMap AddDefaultHttp2Settings(spdy::SettingsMap http2_settings) {
http2_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] =
kSpdyMaxHeaderListSize;
+ it = http2_settings.find(spdy::SETTINGS_ENABLE_PUSH);
+ if (it == http2_settings.end())
+ http2_settings[spdy::SETTINGS_ENABLE_PUSH] = kSpdyDisablePush;
+
return http2_settings;
}
@@ -83,6 +87,8 @@ HttpNetworkSessionParams::HttpNetworkSessionParams()
time_func(&base::TimeTicks::Now) {
enable_early_data =
base::FeatureList::IsEnabled(features::kEnableTLS13EarlyData);
+ use_dns_https_svcb_alpn =
+ base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcbAlpn);
}
HttpNetworkSessionParams::HttpNetworkSessionParams(
@@ -228,18 +234,19 @@ HttpNetworkSession::~HttpNetworkSession() {
spdy_session_pool_.CloseAllSessions();
}
-void HttpNetworkSession::AddResponseDrainer(
+void HttpNetworkSession::StartResponseDrainer(
std::unique_ptr<HttpResponseBodyDrainer> drainer) {
DCHECK(!base::Contains(response_drainers_, drainer.get()));
HttpResponseBodyDrainer* drainer_ptr = drainer.get();
- response_drainers_[drainer_ptr] = std::move(drainer);
+ response_drainers_.insert(std::move(drainer));
+ drainer_ptr->Start(this);
}
void HttpNetworkSession::RemoveResponseDrainer(
HttpResponseBodyDrainer* drainer) {
DCHECK(base::Contains(response_drainers_, drainer));
- response_drainers_[drainer].release();
- response_drainers_.erase(drainer);
+
+ response_drainers_.erase(response_drainers_.find(drainer));
}
ClientSocketPool* HttpNetworkSession::GetSocketPool(
diff --git a/chromium/net/http/http_network_session.h b/chromium/net/http/http_network_session.h
index e963d52b9dd..e447de32fc9 100644
--- a/chromium/net/http/http_network_session.h
+++ b/chromium/net/http/http_network_session.h
@@ -17,6 +17,7 @@
#include "base/bind.h"
#include "base/containers/flat_set.h"
+#include "base/containers/unique_ptr_adapters.h"
#include "base/memory/memory_pressure_monitor.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
@@ -82,8 +83,11 @@ const uint32_t kSpdyMaxHeaderListSize = 256 * 1024;
// Specifies the maximum concurrent streams server could send (via push).
const uint32_t kSpdyMaxConcurrentPushedStreams = 1000;
- // Self-contained structure with all the simple configuration options
- // supported by the HttpNetworkSession.
+// Specifies the the default value for the push setting, which is disabled.
+const uint32_t kSpdyDisablePush = 0;
+
+// Self-contained structure with all the simple configuration options
+// supported by the HttpNetworkSession.
struct NET_EXPORT HttpNetworkSessionParams {
HttpNetworkSessionParams();
HttpNetworkSessionParams(const HttpNetworkSessionParams& other);
@@ -178,6 +182,9 @@ struct NET_EXPORT HttpNetworkSessionParams {
// default network does (hence underlying objects should not drop their
// state).
bool ignore_ip_address_changes = false;
+
+ // Whether to use the ALPN information in the DNS HTTPS record.
+ bool use_dns_https_svcb_alpn = false;
};
// Structure with pointers to the dependencies of the HttpNetworkSession.
@@ -204,8 +211,9 @@ struct NET_EXPORT HttpNetworkSessionContext {
raw_ptr<NetworkQualityEstimator> network_quality_estimator;
raw_ptr<QuicContext> quic_context;
#if BUILDFLAG(ENABLE_REPORTING)
- raw_ptr<ReportingService> reporting_service;
- raw_ptr<NetworkErrorLoggingService> network_error_logging_service;
+ raw_ptr<ReportingService, DanglingUntriaged> reporting_service;
+ raw_ptr<NetworkErrorLoggingService, DanglingUntriaged>
+ network_error_logging_service;
#endif
// Optional factory to use for creating QuicCryptoClientStreams.
@@ -228,9 +236,9 @@ class NET_EXPORT HttpNetworkSession {
HttpAuthCache* http_auth_cache() { return &http_auth_cache_; }
SSLClientContext* ssl_client_context() { return &ssl_client_context_; }
- void AddResponseDrainer(std::unique_ptr<HttpResponseBodyDrainer> drainer);
+ void StartResponseDrainer(std::unique_ptr<HttpResponseBodyDrainer> drainer);
- // Removes the drainer from the session. Does not dispose of it.
+ // Removes the drainer from the session.
void RemoveResponseDrainer(HttpResponseBodyDrainer* drainer);
// Returns the socket pool of the given type for use with the specified
@@ -330,8 +338,9 @@ class NET_EXPORT HttpNetworkSession {
const raw_ptr<HostResolver> host_resolver_;
#if BUILDFLAG(ENABLE_REPORTING)
- const raw_ptr<ReportingService> reporting_service_;
- const raw_ptr<NetworkErrorLoggingService> network_error_logging_service_;
+ const raw_ptr<ReportingService, DanglingUntriaged> reporting_service_;
+ const raw_ptr<NetworkErrorLoggingService, DanglingUntriaged>
+ network_error_logging_service_;
#endif
const raw_ptr<ProxyResolutionService> proxy_resolution_service_;
const raw_ptr<SSLConfigService> ssl_config_service_;
@@ -346,7 +355,7 @@ class NET_EXPORT HttpNetworkSession {
QuicStreamFactory quic_stream_factory_;
SpdySessionPool spdy_session_pool_;
std::unique_ptr<HttpStreamFactory> http_stream_factory_;
- std::map<HttpResponseBodyDrainer*, std::unique_ptr<HttpResponseBodyDrainer>>
+ std::set<std::unique_ptr<HttpResponseBodyDrainer>, base::UniquePtrComparator>
response_drainers_;
NextProtoVector next_protos_;
SSLConfig::ApplicationSettings application_settings_;
diff --git a/chromium/net/http/http_network_transaction.cc b/chromium/net/http/http_network_transaction.cc
index 5f530c81fcc..180daca912d 100644
--- a/chromium/net/http/http_network_transaction.cc
+++ b/chromium/net/http/http_network_transaction.cc
@@ -338,7 +338,7 @@ void HttpNetworkTransaction::DidDrainBodyForAuthRestart(bool keep_alive) {
if (stream_.get()) {
total_received_bytes_ += stream_->GetTotalReceivedBytes();
total_sent_bytes_ += stream_->GetTotalSentBytes();
- HttpStream* new_stream = nullptr;
+ std::unique_ptr<HttpStream> new_stream;
if (keep_alive && stream_->CanReuseConnection()) {
// We should call connection_->set_idle_time(), but this doesn't occur
// often enough to be worth the trouble.
@@ -358,7 +358,7 @@ void HttpNetworkTransaction::DidDrainBodyForAuthRestart(bool keep_alive) {
DCHECK_EQ(0, new_stream->GetTotalSentBytes());
next_state_ = STATE_CONNECTED_CALLBACK;
}
- stream_.reset(new_stream);
+ stream_ = std::move(new_stream);
}
// Reset the other member variables.
@@ -1203,13 +1203,18 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) {
// Unless this is a WebSocket request, in which case we pass it on up.
if (response_.headers->response_code() / 100 == 1 &&
!ForWebSocketHandshake()) {
- response_.headers = new HttpResponseHeaders(std::string());
+ response_.headers =
+ base::MakeRefCounted<HttpResponseHeaders>(std::string());
next_state_ = STATE_READ_HEADERS;
return OK;
}
+ const bool has_body_with_null_source =
+ request_->upload_data_stream &&
+ request_->upload_data_stream->has_null_source();
if (response_.headers->response_code() == 421 &&
- (enable_ip_based_pooling_ || enable_alternative_services_)) {
+ (enable_ip_based_pooling_ || enable_alternative_services_) &&
+ !has_body_with_null_source) {
#if BUILDFLAG(ENABLE_REPORTING)
GenerateNetworkErrorLoggingReport(OK);
#endif // BUILDFLAG(ENABLE_REPORTING)
@@ -1281,7 +1286,9 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) {
int HttpNetworkTransaction::DoReadBody() {
DCHECK(read_buf_.get());
- DCHECK_GT(read_buf_len_, 0);
+ // TODO(https://crbug.com/1335423): Change to DCHECK_GT() or remove after bug
+ // is fixed.
+ CHECK_GT(read_buf_len_, 0);
DCHECK(stream_ != nullptr);
next_state_ = STATE_READ_BODY_COMPLETE;
diff --git a/chromium/net/http/http_network_transaction_unittest.cc b/chromium/net/http/http_network_transaction_unittest.cc
index 26120aade9c..0897eb3e2ba 100644
--- a/chromium/net/http/http_network_transaction_unittest.cc
+++ b/chromium/net/http/http_network_transaction_unittest.cc
@@ -193,7 +193,7 @@ bool IsTransportSocketPoolStalled(HttpNetworkSession* session) {
std::string GetHeaders(const base::Value& params) {
if (!params.is_dict())
return "";
- const base::Value* header_list = params.FindListKey("headers");
+ const base::Value::List* header_list = params.GetDict().FindList("headers");
if (!header_list)
return "";
std::string headers;
@@ -914,10 +914,10 @@ TEST_F(HttpNetworkTransactionTest, SimpleGETHostResolutionFailure) {
request.traffic_annotation =
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
- MockHostResolver* resolver = new MockHostResolver();
+ auto resolver = std::make_unique<MockHostResolver>();
resolver->rules()->AddSimulatedTimeoutFailure("www.example.org");
session_deps_.net_log = net::NetLog::Get();
- session_deps_.host_resolver.reset(resolver);
+ session_deps_.host_resolver = std::move(resolver);
std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
TestCompletionCallback callback;
@@ -1576,7 +1576,7 @@ TEST_F(HttpNetworkTransactionTest, ReuseConnection) {
"hello", "world"
};
- for (int i = 0; i < 2; ++i) {
+ for (const auto* expected_response_data : kExpectedResponseData) {
HttpRequestInfo request;
request.method = "GET";
request.url = GURL("http://www.example.org/");
@@ -1603,7 +1603,7 @@ TEST_F(HttpNetworkTransactionTest, ReuseConnection) {
std::string response_data;
rv = ReadTransaction(&trans, &response_data);
EXPECT_THAT(rv, IsOk());
- EXPECT_EQ(kExpectedResponseData[i], response_data);
+ EXPECT_EQ(expected_response_data, response_data);
}
}
@@ -2086,7 +2086,7 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
if (write_failure) {
ASSERT_FALSE(read_failure);
data1_writes.push_back(*write_failure);
- data1_reads.push_back(MockRead(ASYNC, OK));
+ data1_reads.emplace_back(ASYNC, OK);
} else {
ASSERT_TRUE(read_failure);
if (use_spdy) {
@@ -2094,10 +2094,10 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
if (chunked_upload)
data1_writes.push_back(CreateMockWrite(spdy_request_body));
} else {
- data1_writes.push_back(MockWrite(kHttpRequest));
+ data1_writes.emplace_back(kHttpRequest);
if (chunked_upload) {
- data1_writes.push_back(MockWrite("6\r\nfoobar\r\n"));
- data1_writes.push_back(MockWrite("0\r\n\r\n"));
+ data1_writes.emplace_back("6\r\nfoobar\r\n");
+ data1_writes.emplace_back("0\r\n\r\n");
}
}
data1_reads.push_back(*read_failure);
@@ -2116,19 +2116,18 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
data2_writes.push_back(CreateMockWrite(spdy_request_body, seq++, ASYNC));
data2_reads.push_back(CreateMockRead(spdy_response, seq++, ASYNC));
data2_reads.push_back(CreateMockRead(spdy_data, seq++, ASYNC));
- data2_reads.push_back(MockRead(ASYNC, OK, seq++));
+ data2_reads.emplace_back(ASYNC, OK, seq++);
} else {
int seq = 0;
- data2_writes.push_back(
- MockWrite(ASYNC, kHttpRequest, strlen(kHttpRequest), seq++));
+ data2_writes.emplace_back(ASYNC, kHttpRequest, strlen(kHttpRequest), seq++);
if (chunked_upload) {
- data2_writes.push_back(MockWrite(ASYNC, "6\r\nfoobar\r\n", 11, seq++));
- data2_writes.push_back(MockWrite(ASYNC, "0\r\n\r\n", 5, seq++));
+ data2_writes.emplace_back(ASYNC, "6\r\nfoobar\r\n", 11, seq++);
+ data2_writes.emplace_back(ASYNC, "0\r\n\r\n", 5, seq++);
}
- data2_reads.push_back(
- MockRead(ASYNC, kHttpResponse, strlen(kHttpResponse), seq++));
- data2_reads.push_back(MockRead(ASYNC, kHttpData, strlen(kHttpData), seq++));
- data2_reads.push_back(MockRead(ASYNC, OK, seq++));
+ data2_reads.emplace_back(ASYNC, kHttpResponse, strlen(kHttpResponse),
+ seq++);
+ data2_reads.emplace_back(ASYNC, kHttpData, strlen(kHttpData), seq++);
+ data2_reads.emplace_back(ASYNC, OK, seq++);
}
SequencedSocketData data2(data2_reads, data2_writes);
session_deps_.socket_factory->AddSocketDataProvider(&data2);
@@ -3043,14 +3042,15 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthWithAddressChange) {
request.traffic_annotation =
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
- MockHostResolver* resolver = new MockHostResolver();
+ auto resolver = std::make_unique<MockHostResolver>();
+ auto* resolver_ptr = resolver.get();
session_deps_.net_log = net::NetLog::Get();
- session_deps_.host_resolver.reset(resolver);
+ session_deps_.host_resolver = std::move(resolver);
std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
- resolver->rules()->ClearRules();
- resolver->rules()->AddRule("www.example.org", "127.0.0.1");
+ resolver_ptr->rules()->ClearRules();
+ resolver_ptr->rules()->AddRule("www.example.org", "127.0.0.1");
MockWrite data_writes1[] = {
MockWrite("GET / HTTP/1.1\r\n"
@@ -3115,8 +3115,8 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthWithAddressChange) {
ASSERT_FALSE(endpoint.address().empty());
EXPECT_EQ("127.0.0.1:80", endpoint.ToString());
- resolver->rules()->ClearRules();
- resolver->rules()->AddRule("www.example.org", "127.0.0.2");
+ resolver_ptr->rules()->ClearRules();
+ resolver_ptr->rules()->AddRule("www.example.org", "127.0.0.2");
TestCompletionCallback callback2;
@@ -3608,7 +3608,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyNoKeepAliveHttp10) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
NetLogWithSource net_log_with_source =
@@ -3758,7 +3758,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyNoKeepAliveHttp11) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
session_deps_.net_log = NetLog::Get();
@@ -3906,7 +3906,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyKeepAliveHttp10) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
session_deps_.net_log = NetLog::Get();
@@ -4019,7 +4019,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyKeepAliveHttp11) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
session_deps_.net_log = NetLog::Get();
@@ -4133,7 +4133,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyKeepAliveExtraData) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
session_deps_.net_log = NetLog::Get();
@@ -4260,7 +4260,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyKeepAliveHangupDuringBody) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
@@ -4349,7 +4349,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyCancelTunnel) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -4410,7 +4410,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyMatchesServerAuthNoTunnel) {
// Proxy matches request URL.
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
NetLogWithSource net_log_with_source =
NetLogWithSource::Make(NetLogSourceType::NONE);
@@ -4567,7 +4567,7 @@ TEST_F(HttpNetworkTransactionTest,
// Proxy matches request URL.
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
NetLogWithSource net_log_with_source =
NetLogWithSource::Make(NetLogSourceType::NONE);
@@ -4821,7 +4821,7 @@ TEST_F(HttpNetworkTransactionTest,
// Proxy matches request URL.
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
NetLogWithSource net_log_with_source =
NetLogWithSource::Make(NetLogSourceType::NONE);
@@ -5088,7 +5088,7 @@ TEST_F(HttpNetworkTransactionTest, SanitizeProxyAuthHeaders) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -5195,7 +5195,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsServerRequestsProxyAuthThroughProxy) {
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
session_deps_.net_log = NetLog::Get();
@@ -5258,14 +5258,14 @@ TEST_F(HttpNetworkTransactionTest,
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
auto auth_handler_factory = std::make_unique<HttpAuthHandlerMock::Factory>();
auth_handler_factory->set_do_init_from_challenge(true);
auto mock_handler = std::make_unique<HttpAuthHandlerMock>();
mock_handler->set_allows_default_credentials(true);
- auth_handler_factory->AddMockHandler(mock_handler.release(),
+ auth_handler_factory->AddMockHandler(std::move(mock_handler),
HttpAuth::AUTH_PROXY);
session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
@@ -5374,14 +5374,14 @@ TEST_F(HttpNetworkTransactionTest,
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
auto auth_handler_factory = std::make_unique<HttpAuthHandlerMock::Factory>();
auth_handler_factory->set_do_init_from_challenge(true);
auto mock_handler = std::make_unique<HttpAuthHandlerMock>();
mock_handler->set_allows_default_credentials(true);
- auth_handler_factory->AddMockHandler(mock_handler.release(),
+ auth_handler_factory->AddMockHandler(std::move(mock_handler),
HttpAuth::AUTH_PROXY);
session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
@@ -5495,14 +5495,14 @@ TEST_F(HttpNetworkTransactionTest,
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
auto auth_handler_factory = std::make_unique<HttpAuthHandlerMock::Factory>();
auth_handler_factory->set_do_init_from_challenge(true);
auto mock_handler = std::make_unique<HttpAuthHandlerMock>();
mock_handler->set_allows_default_credentials(true);
- auth_handler_factory->AddMockHandler(mock_handler.release(),
+ auth_handler_factory->AddMockHandler(std::move(mock_handler),
HttpAuth::AUTH_PROXY);
session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
@@ -5595,7 +5595,7 @@ TEST_F(HttpNetworkTransactionTest,
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
auto auth_handler_factory = std::make_unique<HttpAuthHandlerMock::Factory>();
@@ -5612,13 +5612,13 @@ TEST_F(HttpNetworkTransactionTest,
mock_handler->set_allows_default_credentials(true);
mock_handler->set_allows_explicit_credentials(true);
mock_handler->set_connection_based(true);
- auth_handler_factory->AddMockHandler(mock_handler.release(),
+ auth_handler_factory->AddMockHandler(std::move(mock_handler),
HttpAuth::AUTH_PROXY);
mock_handler = std::make_unique<HttpAuthHandlerMock>();
mock_handler->set_allows_default_credentials(true);
mock_handler->set_allows_explicit_credentials(true);
mock_handler->set_connection_based(true);
- auth_handler_factory->AddMockHandler(mock_handler.release(),
+ auth_handler_factory->AddMockHandler(std::move(mock_handler),
HttpAuth::AUTH_PROXY);
session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
@@ -5713,20 +5713,20 @@ TEST_F(HttpNetworkTransactionTest,
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
auto auth_handler_factory = std::make_unique<HttpAuthHandlerMock::Factory>();
auth_handler_factory->set_do_init_from_challenge(true);
auto mock_handler = std::make_unique<HttpAuthHandlerMock>();
mock_handler->set_allows_default_credentials(true);
- auth_handler_factory->AddMockHandler(mock_handler.release(),
+ auth_handler_factory->AddMockHandler(std::move(mock_handler),
HttpAuth::AUTH_PROXY);
// Add another handler for the second challenge. It supports default
// credentials, but they shouldn't be used, since they were already tried.
mock_handler = std::make_unique<HttpAuthHandlerMock>();
mock_handler->set_allows_default_credentials(true);
- auth_handler_factory->AddMockHandler(mock_handler.release(),
+ auth_handler_factory->AddMockHandler(std::move(mock_handler),
HttpAuth::AUTH_PROXY);
session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
@@ -5824,7 +5824,7 @@ TEST_F(HttpNetworkTransactionTest, NonPermanentGenerateAuthTokenError) {
mock_handler->set_allows_explicit_credentials(true);
mock_handler->set_connection_based(true);
mock_handler->SetGenerateExpectation(true, ERR_INVALID_AUTH_CREDENTIALS);
- auth_handler_factory->AddMockHandler(mock_handler.release(),
+ auth_handler_factory->AddMockHandler(std::move(mock_handler),
HttpAuth::AUTH_SERVER);
// Add another handler for the second challenge. It supports default
@@ -5833,7 +5833,7 @@ TEST_F(HttpNetworkTransactionTest, NonPermanentGenerateAuthTokenError) {
mock_handler->set_allows_default_credentials(true);
mock_handler->set_allows_explicit_credentials(true);
mock_handler->set_connection_based(true);
- auth_handler_factory->AddMockHandler(mock_handler.release(),
+ auth_handler_factory->AddMockHandler(std::move(mock_handler),
HttpAuth::AUTH_SERVER);
session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
@@ -5937,14 +5937,14 @@ TEST_F(HttpNetworkTransactionTest, NonPermanentGenerateAuthTokenError) {
// schemes, based on the path of the URL being requests.
class SameProxyWithDifferentSchemesProxyResolver : public ProxyResolver {
public:
- SameProxyWithDifferentSchemesProxyResolver() {}
+ SameProxyWithDifferentSchemesProxyResolver() = default;
SameProxyWithDifferentSchemesProxyResolver(
const SameProxyWithDifferentSchemesProxyResolver&) = delete;
SameProxyWithDifferentSchemesProxyResolver& operator=(
const SameProxyWithDifferentSchemesProxyResolver&) = delete;
- ~SameProxyWithDifferentSchemesProxyResolver() override {}
+ ~SameProxyWithDifferentSchemesProxyResolver() override = default;
static constexpr uint16_t kProxyPort = 10000;
@@ -6216,7 +6216,7 @@ TEST_F(HttpNetworkTransactionTest, HttpProxyLoadTimingNoPacTwoRequests) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
NetLogWithSource net_log_with_source =
NetLogWithSource::Make(NetLogSourceType::NONE);
@@ -6321,7 +6321,7 @@ TEST_F(HttpNetworkTransactionTest, HttpProxyLoadTimingWithPacTwoRequests) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
NetLogWithSource net_log_with_source =
NetLogWithSource::Make(NetLogSourceType::NONE);
@@ -6458,12 +6458,12 @@ TEST_F(HttpNetworkTransactionTest, ProxyHostResolutionFailure) {
// Configure against https proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
- MockHostResolver* resolver = new MockHostResolver();
+ auto resolver = std::make_unique<MockHostResolver>();
resolver->rules()->AddSimulatedTimeoutFailure("proxy");
session_deps_.net_log = net::NetLog::Get();
- session_deps_.host_resolver.reset(resolver);
+ session_deps_.host_resolver = std::move(resolver);
std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
TestCompletionCallback callback;
@@ -6487,7 +6487,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxyGet) {
// Configure against https proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -6569,7 +6569,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyGet) {
// Configure against https proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -6650,7 +6650,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyGetWithSessionRace) {
// Configure SPDY proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
NetLogWithSource net_log_with_source =
NetLogWithSource::Make(NetLogSourceType::NONE);
@@ -6723,7 +6723,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyGetWithProxyAuth) {
// Configure against https proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -6821,7 +6821,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectHttps) {
// Configure against https proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -6908,7 +6908,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectSpdy) {
// Configure against https proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -7001,7 +7001,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectFailure) {
// Configure against https proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -7222,7 +7222,7 @@ TEST_F(HttpNetworkTransactionTest,
HttpsProxySpdyConnectHttpsLoadTimingTwoRequestsTwoServers) {
// Configure against https proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(
@@ -7360,7 +7360,7 @@ TEST_F(HttpNetworkTransactionTest,
HttpsProxySpdyConnectHttpsLoadTimingTwoRequestsSameServer) {
// Configure against https proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(
@@ -7487,7 +7487,7 @@ TEST_F(HttpNetworkTransactionTest,
TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyLoadTimingTwoHttpRequests) {
// Configure against https proxy server "proxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(
@@ -7866,7 +7866,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxyAuthRetry) {
// Configure against https proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -7972,7 +7972,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxyAuthRetryNoKeepAlive) {
// Configure against https proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -8094,7 +8094,7 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxyAuthRetryNoKeepAliveChangeProxy) {
// Configure against https proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.proxy_resolution_service->SetProxyDelegate(
proxy_delegate.get());
@@ -8220,7 +8220,7 @@ TEST_F(HttpNetworkTransactionTest,
// Configure against https proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.proxy_resolution_service->SetProxyDelegate(
proxy_delegate.get());
@@ -8334,7 +8334,7 @@ void HttpNetworkTransactionTest::ConnectStatusHelperWithExpectedStatus(
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -8551,7 +8551,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyThenServer) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -9448,7 +9448,7 @@ TEST_F(HttpNetworkTransactionTest, NTLMProxyTLSHandshakeReset) {
// The NTLM test data expects the proxy to be named 'server'. The origin is
// https://origin/.
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY server", TRAFFIC_ANNOTATION_FOR_TESTS);
SSLContextConfig config;
@@ -9645,7 +9645,7 @@ TEST_F(HttpNetworkTransactionTest, DontRecycleTransportSocketForSSLTunnel) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -11020,12 +11020,12 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthCacheAndPreauth) {
// Tests that nonce count increments when multiple auth attempts
// are started with the same nonce.
TEST_F(HttpNetworkTransactionTest, DigestPreAuthNonceCount) {
- HttpAuthHandlerDigest::Factory* digest_factory =
- new HttpAuthHandlerDigest::Factory();
- HttpAuthHandlerDigest::FixedNonceGenerator* nonce_generator =
- new HttpAuthHandlerDigest::FixedNonceGenerator("0123456789abcdef");
- digest_factory->set_nonce_generator(nonce_generator);
- session_deps_.http_auth_handler_factory.reset(digest_factory);
+ auto digest_factory = std::make_unique<HttpAuthHandlerDigest::Factory>();
+ auto nonce_generator =
+ std::make_unique<HttpAuthHandlerDigest::FixedNonceGenerator>(
+ "0123456789abcdef");
+ digest_factory->set_nonce_generator(std::move(nonce_generator));
+ session_deps_.http_auth_handler_factory = std::move(digest_factory);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
// Transaction 1: authenticate (foo, bar) on MyRealm1
@@ -11170,16 +11170,6 @@ TEST_F(HttpNetworkTransactionTest, ResetStateForRestart) {
response->response_time = base::Time::Now();
response->was_cached = true; // (Wouldn't ever actually be true...)
- { // Setup state for response_.vary_data
- HttpRequestInfo request;
- std::string temp("HTTP/1.1 200 OK\nVary: foo, bar\n\n");
- std::replace(temp.begin(), temp.end(), '\n', '\0');
- scoped_refptr<HttpResponseHeaders> headers(new HttpResponseHeaders(temp));
- request.extra_headers.SetHeader("Foo", "1");
- request.extra_headers.SetHeader("bar", "23");
- EXPECT_TRUE(response->vary_data.Init(request, *headers.get()));
- }
-
// Cause the above state to be reset.
trans.ResetStateForRestart();
@@ -11191,7 +11181,6 @@ TEST_F(HttpNetworkTransactionTest, ResetStateForRestart) {
EXPECT_FALSE(response->headers);
EXPECT_FALSE(response->was_cached);
EXPECT_EQ(0U, response->ssl_info.cert_status);
- EXPECT_FALSE(response->vary_data.is_valid());
}
// Test HTTPS connections to a site with a bad certificate
@@ -11253,7 +11242,7 @@ TEST_F(HttpNetworkTransactionTest, HTTPSBadCertificate) {
// proxy
TEST_F(HttpNetworkTransactionTest, HTTPSBadCertificateViaProxy) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
HttpRequestInfo request;
@@ -11331,7 +11320,7 @@ TEST_F(HttpNetworkTransactionTest, HTTPSBadCertificateViaProxy) {
// Test HTTPS connections to a site, going through an HTTPS proxy
TEST_F(HttpNetworkTransactionTest, HTTPSViaHttpsProxy) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
@@ -11395,7 +11384,7 @@ TEST_F(HttpNetworkTransactionTest, HTTPSViaHttpsProxy) {
// Test that an HTTPS Proxy cannot redirect a CONNECT request for main frames.
TEST_F(HttpNetworkTransactionTest, RedirectOfHttpsConnectViaHttpsProxy) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
@@ -11462,7 +11451,7 @@ TEST_F(HttpNetworkTransactionTest,
RedirectOfHttpsConnectSubresourceViaHttpsProxy) {
base::HistogramTester histograms;
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
@@ -11508,9 +11497,9 @@ TEST_F(HttpNetworkTransactionTest,
TEST_F(HttpNetworkTransactionTest,
RedirectOfHttpsConnectViaAutoDetectedHttpsProxy) {
base::HistogramTester histograms;
- session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromAutoDetectedPacResult(
- "HTTPS proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
+ session_deps_.proxy_resolution_service = ConfiguredProxyResolutionService::
+ CreateFixedFromAutoDetectedPacResultForTest("HTTPS proxy:70",
+ TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
HttpRequestInfo request;
@@ -11556,7 +11545,7 @@ TEST_F(HttpNetworkTransactionTest,
TEST_F(HttpNetworkTransactionTest, RedirectOfHttpsConnectViaSpdyProxy) {
base::HistogramTester histograms;
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
@@ -11627,7 +11616,7 @@ TEST_F(HttpNetworkTransactionTest, RedirectOfHttpsConnectViaSpdyProxy) {
// Test that an HTTPS proxy's response to a CONNECT request is filtered.
TEST_F(HttpNetworkTransactionTest, ErrorResponseToHttpsConnectViaHttpsProxy) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
HttpRequestInfo request;
@@ -11672,7 +11661,7 @@ TEST_F(HttpNetworkTransactionTest, ErrorResponseToHttpsConnectViaHttpsProxy) {
// Test that a SPDY proxy's response to a CONNECT request is filtered.
TEST_F(HttpNetworkTransactionTest, ErrorResponseToHttpsConnectViaSpdyProxy) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
HttpRequestInfo request;
@@ -11737,7 +11726,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthSpdyProxy) {
// Configure against https proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
session_deps_.net_log = NetLog::Get();
@@ -11870,7 +11859,7 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthSpdyProxy) {
// HTTPS proxy
TEST_F(HttpNetworkTransactionTest, HTTPSBadCertificateViaHttpsProxy) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
HttpRequestInfo request;
@@ -12002,7 +11991,7 @@ TEST_F(HttpNetworkTransactionTest, BuildRequest_UserAgentOverTunnel) {
std::string() /* accept-language */, setting_user_agent);
}
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
for (const char* request_user_agent : kTestUserAgents) {
@@ -12378,7 +12367,7 @@ TEST_F(HttpNetworkTransactionTest, SOCKS4_HTTP_GET) {
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"SOCKS myproxy:1080", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
@@ -12434,7 +12423,7 @@ TEST_F(HttpNetworkTransactionTest, SOCKS4_SSL_GET) {
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"SOCKS myproxy:1080", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
@@ -12495,7 +12484,7 @@ TEST_F(HttpNetworkTransactionTest, SOCKS4_HTTP_GET_no_PAC) {
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"socks4://myproxy:1080", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
@@ -12550,7 +12539,7 @@ TEST_F(HttpNetworkTransactionTest, SOCKS5_HTTP_GET) {
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"SOCKS5 myproxy:1080", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
@@ -12618,7 +12607,7 @@ TEST_F(HttpNetworkTransactionTest, SOCKS5_SSL_GET) {
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"SOCKS5 myproxy:1080", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
@@ -12781,26 +12770,28 @@ TEST_F(HttpNetworkTransactionTest, GroupIdForDirectConnections) {
},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
- tests[i].proxy_server, TRAFFIC_ANNOTATION_FOR_TESTS);
+ ConfiguredProxyResolutionService::CreateFixedForTest(
+ test.proxy_server, TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(
SetupSessionForGroupIdTests(&session_deps_));
HttpNetworkSessionPeer peer(session.get());
- CaptureGroupIdTransportSocketPool* transport_conn_pool =
- new CaptureGroupIdTransportSocketPool(&dummy_connect_job_params_);
+ auto transport_conn_pool =
+ std::make_unique<CaptureGroupIdTransportSocketPool>(
+ &dummy_connect_job_params_);
+ auto* transport_conn_pool_ptr = transport_conn_pool.get();
auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
mock_pool_manager->SetSocketPool(ProxyServer::Direct(),
- base::WrapUnique(transport_conn_pool));
+ std::move(transport_conn_pool));
peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
EXPECT_EQ(ERR_IO_PENDING,
- GroupIdTransactionHelper(tests[i].url, session.get()));
- EXPECT_EQ(tests[i].expected_group_id,
- transport_conn_pool->last_group_id_received());
- EXPECT_TRUE(transport_conn_pool->socket_requested());
+ GroupIdTransactionHelper(test.url, session.get()));
+ EXPECT_EQ(test.expected_group_id,
+ transport_conn_pool_ptr->last_group_id_received());
+ EXPECT_TRUE(transport_conn_pool_ptr->socket_requested());
}
}
@@ -12839,10 +12830,10 @@ TEST_F(HttpNetworkTransactionTest, GroupIdForHTTPProxyConnections) {
},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
- tests[i].proxy_server, TRAFFIC_ANNOTATION_FOR_TESTS);
+ ConfiguredProxyResolutionService::CreateFixedForTest(
+ test.proxy_server, TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(
SetupSessionForGroupIdTests(&session_deps_));
@@ -12850,17 +12841,17 @@ TEST_F(HttpNetworkTransactionTest, GroupIdForHTTPProxyConnections) {
ProxyServer proxy_server(ProxyServer::SCHEME_HTTP,
HostPortPair("http_proxy", 80));
- CaptureGroupIdTransportSocketPool* http_proxy_pool =
- new CaptureGroupIdTransportSocketPool(&dummy_connect_job_params_);
+ auto http_proxy_pool = std::make_unique<CaptureGroupIdTransportSocketPool>(
+ &dummy_connect_job_params_);
+ auto* http_proxy_pool_ptr = http_proxy_pool.get();
auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
- mock_pool_manager->SetSocketPool(proxy_server,
- base::WrapUnique(http_proxy_pool));
+ mock_pool_manager->SetSocketPool(proxy_server, std::move(http_proxy_pool));
peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
EXPECT_EQ(ERR_IO_PENDING,
- GroupIdTransactionHelper(tests[i].url, session.get()));
- EXPECT_EQ(tests[i].expected_group_id,
- http_proxy_pool->last_group_id_received());
+ GroupIdTransactionHelper(test.url, session.get()));
+ EXPECT_EQ(test.expected_group_id,
+ http_proxy_pool_ptr->last_group_id_received());
}
}
@@ -12917,31 +12908,31 @@ TEST_F(HttpNetworkTransactionTest, GroupIdForSOCKSConnections) {
},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
- tests[i].proxy_server, TRAFFIC_ANNOTATION_FOR_TESTS);
+ ConfiguredProxyResolutionService::CreateFixedForTest(
+ test.proxy_server, TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(
SetupSessionForGroupIdTests(&session_deps_));
HttpNetworkSessionPeer peer(session.get());
ProxyServer proxy_server(
- ProxyUriToProxyServer(tests[i].proxy_server, ProxyServer::SCHEME_HTTP));
+ ProxyUriToProxyServer(test.proxy_server, ProxyServer::SCHEME_HTTP));
ASSERT_TRUE(proxy_server.is_valid());
- CaptureGroupIdTransportSocketPool* socks_conn_pool =
- new CaptureGroupIdTransportSocketPool(&dummy_connect_job_params_);
+ auto socks_conn_pool = std::make_unique<CaptureGroupIdTransportSocketPool>(
+ &dummy_connect_job_params_);
+ auto* socks_conn_pool_ptr = socks_conn_pool.get();
auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
- mock_pool_manager->SetSocketPool(proxy_server,
- base::WrapUnique(socks_conn_pool));
+ mock_pool_manager->SetSocketPool(proxy_server, std::move(socks_conn_pool));
peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
EXPECT_EQ(ERR_IO_PENDING,
- GroupIdTransactionHelper(tests[i].url, session.get()));
- EXPECT_EQ(tests[i].expected_group_id,
- socks_conn_pool->last_group_id_received());
+ GroupIdTransactionHelper(test.url, session.get()));
+ EXPECT_EQ(test.expected_group_id,
+ socks_conn_pool_ptr->last_group_id_received());
}
}
@@ -12953,7 +12944,7 @@ TEST_F(HttpNetworkTransactionTest, ReconsiderProxyAfterFailedConnection) {
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70;foobar:80", TRAFFIC_ANNOTATION_FOR_TESTS);
// This simulates failure resolving all hostnames; that means we will fail
@@ -13126,7 +13117,7 @@ TEST_F(HttpNetworkTransactionTest, DrainResetOK) {
// Test HTTPS connections going through a proxy that sends extra data.
TEST_F(HttpNetworkTransactionTest, HTTPSViaProxyWithExtraData) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
HttpRequestInfo request;
@@ -13308,9 +13299,10 @@ TEST_F(HttpNetworkTransactionTest, CancelDuringInitRequestBody) {
CompletionOnceCallback callback_;
};
- FakeUploadElementReader* fake_reader = new FakeUploadElementReader;
+ auto fake_reader = std::make_unique<FakeUploadElementReader>();
+ auto* fake_reader_ptr = fake_reader.get();
std::vector<std::unique_ptr<UploadElementReader>> element_readers;
- element_readers.push_back(base::WrapUnique(fake_reader));
+ element_readers.push_back(std::move(fake_reader));
ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0);
HttpRequestInfo request;
@@ -13333,7 +13325,7 @@ TEST_F(HttpNetworkTransactionTest, CancelDuringInitRequestBody) {
base::RunLoop().RunUntilIdle();
// Transaction is pending on request body initialization.
- CompletionOnceCallback init_callback = fake_reader->TakeCallback();
+ CompletionOnceCallback init_callback = fake_reader_ptr->TakeCallback();
ASSERT_FALSE(init_callback.is_null());
// Return Init()'s result after the transaction gets destroyed.
@@ -15849,15 +15841,15 @@ TEST_F(HttpNetworkTransactionTest, GenerateAuthToken) {
for (const auto& test_config : test_configs) {
SCOPED_TRACE(::testing::Message() << "Test config at "
<< test_config.line_number);
- HttpAuthHandlerMock::Factory* auth_factory(
- new HttpAuthHandlerMock::Factory());
- session_deps_.http_auth_handler_factory.reset(auth_factory);
+ auto auth_factory = std::make_unique<HttpAuthHandlerMock::Factory>();
+ auto* auth_factory_ptr = auth_factory.get();
+ session_deps_.http_auth_handler_factory = std::move(auth_factory);
SSLInfo empty_ssl_info;
// Set up authentication handlers as necessary.
if (test_config.proxy_auth_timing != AUTH_NONE) {
for (int n = 0; n < 3; n++) {
- HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock());
+ auto auth_handler = std::make_unique<HttpAuthHandlerMock>();
std::string auth_challenge = "Mock realm=proxy";
url::SchemeHostPort scheme_host_port(GURL(test_config.proxy_url));
HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(),
@@ -15868,11 +15860,12 @@ TEST_F(HttpNetworkTransactionTest, GenerateAuthToken) {
auth_handler->SetGenerateExpectation(
test_config.proxy_auth_timing == AUTH_ASYNC,
n == 0 ? test_config.first_generate_proxy_token_rv : OK);
- auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_PROXY);
+ auth_factory_ptr->AddMockHandler(std::move(auth_handler),
+ HttpAuth::AUTH_PROXY);
}
}
if (test_config.server_auth_timing != AUTH_NONE) {
- HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock());
+ auto auth_handler = std::make_unique<HttpAuthHandlerMock>();
std::string auth_challenge = "Mock realm=server";
url::SchemeHostPort scheme_host_port(GURL(test_config.server_url));
HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(),
@@ -15883,7 +15876,8 @@ TEST_F(HttpNetworkTransactionTest, GenerateAuthToken) {
auth_handler->SetGenerateExpectation(
test_config.server_auth_timing == AUTH_ASYNC,
test_config.first_generate_server_token_rv);
- auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_SERVER);
+ auth_factory_ptr->AddMockHandler(std::move(auth_handler),
+ HttpAuth::AUTH_SERVER);
// The second handler always succeeds. It should only be used where there
// are multiple auth sessions for server auth in the same network
@@ -15894,12 +15888,12 @@ TEST_F(HttpNetworkTransactionTest, GenerateAuthToken) {
empty_ssl_info, NetworkIsolationKey(),
scheme_host_port, NetLogWithSource());
second_handler->SetGenerateExpectation(true, OK);
- auth_factory->AddMockHandler(second_handler.release(),
- HttpAuth::AUTH_SERVER);
+ auth_factory_ptr->AddMockHandler(std::move(second_handler),
+ HttpAuth::AUTH_SERVER);
}
if (test_config.proxy_url) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
test_config.proxy_url, TRAFFIC_ANNOTATION_FOR_TESTS);
} else {
session_deps_.proxy_resolution_service =
@@ -15929,8 +15923,8 @@ TEST_F(HttpNetworkTransactionTest, GenerateAuthToken) {
// kProxyChallenge uses Proxy-Connection: close which means that the
// socket is closed and a new one will be created for the next request.
if (read_write_round.read.data == kProxyChallenge.data) {
- mock_reads.push_back(std::vector<MockRead>());
- mock_writes.push_back(std::vector<MockWrite>());
+ mock_reads.emplace_back();
+ mock_writes.emplace_back();
}
if (read_write_round.extra_read) {
@@ -15992,14 +15986,15 @@ TEST_F(HttpNetworkTransactionTest, GenerateAuthToken) {
TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
// Do multi-round authentication and make sure it works correctly.
- HttpAuthHandlerMock::Factory* auth_factory(
- new HttpAuthHandlerMock::Factory());
- session_deps_.http_auth_handler_factory.reset(auth_factory);
+ auto auth_factory = std::make_unique<HttpAuthHandlerMock::Factory>();
+ auto* auth_factory_ptr = auth_factory.get();
+ session_deps_.http_auth_handler_factory = std::move(auth_factory);
session_deps_.proxy_resolution_service =
ConfiguredProxyResolutionService::CreateDirect();
session_deps_.host_resolver->rules()->AddRule("www.example.com", "10.0.0.1");
- HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock());
+ auto auth_handler = std::make_unique<HttpAuthHandlerMock>();
+ auto* auth_handler_ptr = auth_handler.get();
auth_handler->set_connection_based(true);
std::string auth_challenge = "Mock realm=server";
GURL url("http://www.example.com");
@@ -16009,7 +16004,8 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
auth_handler->InitFromChallenge(&tokenizer, HttpAuth::AUTH_SERVER,
empty_ssl_info, NetworkIsolationKey(),
url::SchemeHostPort(url), NetLogWithSource());
- auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_SERVER);
+ auth_factory_ptr->AddMockHandler(std::move(auth_handler),
+ HttpAuth::AUTH_SERVER);
int rv = OK;
const HttpResponseInfo* response = nullptr;
@@ -16027,15 +16023,16 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
HttpNetworkSessionPeer session_peer(session.get());
CommonConnectJobParams common_connect_job_params(
session->CreateCommonConnectJobParams());
- TransportClientSocketPool* transport_pool = new TransportClientSocketPool(
+ auto transport_pool = std::make_unique<TransportClientSocketPool>(
50, // Max sockets for pool
1, // Max sockets per group
base::Seconds(10), // unused_idle_socket_timeout
ProxyServer::Direct(), false, // is_for_websockets
&common_connect_job_params);
+ auto* transport_pool_ptr = transport_pool.get();
auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
mock_pool_manager->SetSocketPool(ProxyServer::Direct(),
- base::WrapUnique(transport_pool));
+ std::move(transport_pool));
session_peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
@@ -16096,7 +16093,7 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
SecureDnsPolicy::kAllow);
// First round of authentication.
- auth_handler->SetGenerateExpectation(false, OK);
+ auth_handler_ptr->SetGenerateExpectation(false, OK);
rv = trans.Start(&request, callback.callback(), NetLogWithSource());
if (rv == ERR_IO_PENDING)
rv = callback.WaitForResult();
@@ -16104,9 +16101,9 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
response = trans.GetResponseInfo();
ASSERT_TRUE(response);
EXPECT_TRUE(response->auth_challenge.has_value());
- EXPECT_EQ(0u, transport_pool->IdleSocketCountInGroup(kSocketGroup));
+ EXPECT_EQ(0u, transport_pool_ptr->IdleSocketCountInGroup(kSocketGroup));
EXPECT_EQ(HttpAuthHandlerMock::State::WAIT_FOR_GENERATE_AUTH_TOKEN,
- auth_handler->state());
+ auth_handler_ptr->state());
// In between rounds, another request comes in for the same domain.
// It should not be able to grab the TCP socket that trans has already
@@ -16121,7 +16118,7 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
// the pool until after authentication completes.
// Second round of authentication.
- auth_handler->SetGenerateExpectation(false, OK);
+ auth_handler_ptr->SetGenerateExpectation(false, OK);
rv = trans.RestartWithAuth(AuthCredentials(kFoo, kBar), callback.callback());
if (rv == ERR_IO_PENDING)
rv = callback.WaitForResult();
@@ -16129,12 +16126,12 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
response = trans.GetResponseInfo();
ASSERT_TRUE(response);
EXPECT_FALSE(response->auth_challenge.has_value());
- EXPECT_EQ(0u, transport_pool->IdleSocketCountInGroup(kSocketGroup));
+ EXPECT_EQ(0u, transport_pool_ptr->IdleSocketCountInGroup(kSocketGroup));
EXPECT_EQ(HttpAuthHandlerMock::State::WAIT_FOR_GENERATE_AUTH_TOKEN,
- auth_handler->state());
+ auth_handler_ptr->state());
// Third round of authentication.
- auth_handler->SetGenerateExpectation(false, OK);
+ auth_handler_ptr->SetGenerateExpectation(false, OK);
rv = trans.RestartWithAuth(AuthCredentials(), callback.callback());
if (rv == ERR_IO_PENDING)
rv = callback.WaitForResult();
@@ -16142,12 +16139,12 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
response = trans.GetResponseInfo();
ASSERT_TRUE(response);
EXPECT_FALSE(response->auth_challenge.has_value());
- EXPECT_EQ(0u, transport_pool->IdleSocketCountInGroup(kSocketGroup));
+ EXPECT_EQ(0u, transport_pool_ptr->IdleSocketCountInGroup(kSocketGroup));
EXPECT_EQ(HttpAuthHandlerMock::State::WAIT_FOR_GENERATE_AUTH_TOKEN,
- auth_handler->state());
+ auth_handler_ptr->state());
// Fourth round of authentication, which completes successfully.
- auth_handler->SetGenerateExpectation(false, OK);
+ auth_handler_ptr->SetGenerateExpectation(false, OK);
rv = trans.RestartWithAuth(AuthCredentials(), callback.callback());
if (rv == ERR_IO_PENDING)
rv = callback.WaitForResult();
@@ -16155,13 +16152,13 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
response = trans.GetResponseInfo();
ASSERT_TRUE(response);
EXPECT_FALSE(response->auth_challenge.has_value());
- EXPECT_EQ(0u, transport_pool->IdleSocketCountInGroup(kSocketGroup));
+ EXPECT_EQ(0u, transport_pool_ptr->IdleSocketCountInGroup(kSocketGroup));
// In WAIT_FOR_CHALLENGE, although in reality the auth handler is done. A real
// auth handler should transition to a DONE state in concert with the remote
// server. But that's not something we can test here with a mock handler.
EXPECT_EQ(HttpAuthHandlerMock::State::WAIT_FOR_CHALLENGE,
- auth_handler->state());
+ auth_handler_ptr->state());
// Read the body since the fourth round was successful. This will also
// release the socket back to the pool.
@@ -16175,7 +16172,7 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
EXPECT_EQ(0, rv);
// There are still 0 idle sockets, since the trans_compete transaction
// will be handed it immediately after trans releases it to the group.
- EXPECT_EQ(0u, transport_pool->IdleSocketCountInGroup(kSocketGroup));
+ EXPECT_EQ(0u, transport_pool_ptr->IdleSocketCountInGroup(kSocketGroup));
// The competing request can now finish. Wait for the headers and then
// read the body.
@@ -16189,7 +16186,7 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
EXPECT_EQ(0, rv);
// Finally, the socket is released to the group.
- EXPECT_EQ(1u, transport_pool->IdleSocketCountInGroup(kSocketGroup));
+ EXPECT_EQ(1u, transport_pool_ptr->IdleSocketCountInGroup(kSocketGroup));
}
// This tests the case that a request is issued via http instead of spdy after
@@ -16398,7 +16395,7 @@ TEST_F(HttpNetworkTransactionTest, CancelAfterHeaders) {
// Test a basic GET request through a proxy.
TEST_F(HttpNetworkTransactionTest, ProxyGet) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -16465,7 +16462,7 @@ TEST_F(HttpNetworkTransactionTest, ProxyGet) {
// Test a basic HTTPS GET request through a proxy.
TEST_F(HttpNetworkTransactionTest, ProxyTunnelGet) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
session_deps_.net_log = NetLog::Get();
@@ -16550,7 +16547,7 @@ TEST_F(HttpNetworkTransactionTest, ProxyTunnelGet) {
// literal host.
TEST_F(HttpNetworkTransactionTest, ProxyTunnelGetIPv6) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
session_deps_.net_log = NetLog::Get();
@@ -16628,7 +16625,7 @@ TEST_F(HttpNetworkTransactionTest, ProxyTunnelGetIPv6) {
// while establishing the tunnel.
TEST_F(HttpNetworkTransactionTest, ProxyTunnelGetHangup) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
RecordingNetLogObserver net_log_observer;
session_deps_.net_log = NetLog::Get();
@@ -16762,9 +16759,9 @@ TEST_F(HttpNetworkTransactionTest, SSLWriteCertError) {
ERR_CERT_AUTHORITY_INVALID,
ERR_CERT_DATE_INVALID,
};
- for (size_t i = 0; i < std::size(kErrors); i++) {
- CheckErrorIsPassedBack(kErrors[i], ASYNC);
- CheckErrorIsPassedBack(kErrors[i], SYNCHRONOUS);
+ for (int error : kErrors) {
+ CheckErrorIsPassedBack(error, ASYNC);
+ CheckErrorIsPassedBack(error, SYNCHRONOUS);
}
}
@@ -16986,7 +16983,7 @@ TEST_F(HttpNetworkTransactionTest, ClientAuthCertCache_Direct_FalseStart) {
// proxy.
TEST_F(HttpNetworkTransactionTest, ClientAuthCertCache_Proxy_Fail) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
@@ -17637,6 +17634,164 @@ TEST_F(HttpNetworkTransactionTest, ReturnHTTP421OnRetry) {
}
TEST_F(HttpNetworkTransactionTest,
+ Response421WithStreamingBodyWithNonNullSource) {
+ const std::string ip_addr = "1.2.3.4";
+ IPAddress ip;
+ ASSERT_TRUE(ip.AssignFromIPLiteral(ip_addr));
+ IPEndPoint peer_addr = IPEndPoint(ip, 443);
+
+ session_deps_.host_resolver = std::make_unique<MockCachingHostResolver>();
+ session_deps_.host_resolver->rules()->AddRule("www.example.org", ip_addr);
+ std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
+
+ const std::string request_body = "hello";
+ spdy::SpdySerializedFrame req1 = spdy_util_.ConstructChunkedSpdyPost({}, 0);
+ spdy::SpdySerializedFrame req1_body =
+ spdy_util_.ConstructSpdyDataFrame(1, request_body, /*fin=*/true);
+ spdy::SpdySerializedFrame rst =
+ spdy_util_.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL);
+ MockWrite writes1[] = {
+ CreateMockWrite(req1, 0),
+ CreateMockWrite(req1_body, 1),
+ CreateMockWrite(rst, 4),
+ };
+
+ spdy::Http2HeaderBlock response_headers;
+ response_headers[spdy::kHttp2StatusHeader] = "421";
+ spdy::SpdySerializedFrame resp1 =
+ spdy_util_.ConstructSpdyReply(1, std::move(response_headers));
+ MockRead reads1[] = {CreateMockRead(resp1, 2), MockRead(ASYNC, 0, 3)};
+
+ MockConnect connect1(ASYNC, OK, peer_addr);
+ SequencedSocketData data1(connect1, reads1, writes1);
+ session_deps_.socket_factory->AddSocketDataProvider(&data1);
+
+ AddSSLSocketData();
+
+ SpdyTestUtil spdy_util2;
+ spdy::SpdySerializedFrame req2 = spdy_util2.ConstructChunkedSpdyPost({}, 0);
+ spdy::SpdySerializedFrame req2_body =
+ spdy_util2.ConstructSpdyDataFrame(1, request_body, /*fin=*/true);
+ MockWrite writes2[] = {
+ CreateMockWrite(req2, 0),
+ CreateMockWrite(req2_body, 1),
+ };
+
+ spdy::Http2HeaderBlock resp2_headers;
+ resp2_headers[spdy::kHttp2StatusHeader] = "200";
+ spdy::SpdySerializedFrame resp2 =
+ spdy_util2.ConstructSpdyReply(1, std::move(resp2_headers));
+ spdy::SpdySerializedFrame resp2_body(
+ spdy_util2.ConstructSpdyDataFrame(1, true));
+ MockRead reads2[] = {CreateMockRead(resp2, 2), CreateMockRead(resp2_body, 3),
+ MockRead(ASYNC, 0, 4)};
+
+ MockConnect connect2(ASYNC, OK, peer_addr);
+ SequencedSocketData data2(connect2, reads2, writes2);
+ session_deps_.socket_factory->AddSocketDataProvider(&data2);
+
+ AddSSLSocketData();
+
+ TestCompletionCallback callback;
+ HttpRequestInfo request;
+ ChunkedUploadDataStream upload_data_stream(0, /*has_null_source=*/false);
+ upload_data_stream.AppendData(request_body.data(), request_body.size(),
+ /*is_done=*/true);
+ request.method = "POST";
+ request.url = GURL("https://www.example.org");
+ request.load_flags = 0;
+ request.traffic_annotation =
+ net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+ request.upload_data_stream = &upload_data_stream;
+ HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
+
+ int rv = trans.Start(&request, callback.callback(),
+ NetLogWithSource::Make(NetLogSourceType::NONE));
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+ rv = callback.WaitForResult();
+ EXPECT_THAT(rv, IsOk());
+
+ const HttpResponseInfo* response = trans.GetResponseInfo();
+ std::string response_data;
+ ASSERT_TRUE(response);
+ ASSERT_TRUE(response->headers);
+ EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine());
+ EXPECT_TRUE(response->was_fetched_via_spdy);
+ EXPECT_TRUE(response->was_alpn_negotiated);
+ EXPECT_TRUE(response->ssl_info.cert);
+ ASSERT_THAT(ReadTransaction(&trans, &response_data), IsOk());
+ EXPECT_EQ("hello!", response_data);
+}
+
+TEST_F(HttpNetworkTransactionTest, Response421WithStreamingBodyWithNullSource) {
+ const std::string ip_addr = "1.2.3.4";
+ IPAddress ip;
+ ASSERT_TRUE(ip.AssignFromIPLiteral(ip_addr));
+ IPEndPoint peer_addr = IPEndPoint(ip, 443);
+
+ session_deps_.host_resolver = std::make_unique<MockCachingHostResolver>();
+ session_deps_.host_resolver->rules()->AddRule("www.example.org", ip_addr);
+ std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
+
+ const std::string request_body = "hello";
+ spdy::SpdySerializedFrame req1 = spdy_util_.ConstructChunkedSpdyPost({}, 0);
+ spdy::SpdySerializedFrame req1_body =
+ spdy_util_.ConstructSpdyDataFrame(1, request_body, /*fin=*/true);
+ spdy::SpdySerializedFrame rst =
+ spdy_util_.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL);
+ MockWrite writes1[] = {
+ CreateMockWrite(req1, 0),
+ CreateMockWrite(req1_body, 1),
+ CreateMockWrite(rst, 5),
+ };
+
+ spdy::Http2HeaderBlock response_headers;
+ response_headers[spdy::kHttp2StatusHeader] = "421";
+ spdy::SpdySerializedFrame resp1 =
+ spdy_util_.ConstructSpdyReply(1, std::move(response_headers));
+ spdy::SpdySerializedFrame resp1_body(
+ spdy_util_.ConstructSpdyDataFrame(1, true));
+ MockRead reads1[] = {CreateMockRead(resp1, 2), CreateMockRead(resp1_body, 3),
+ MockRead(ASYNC, 0, 4)};
+
+ MockConnect connect1(ASYNC, OK, peer_addr);
+ SequencedSocketData data1(connect1, reads1, writes1);
+ session_deps_.socket_factory->AddSocketDataProvider(&data1);
+
+ AddSSLSocketData();
+
+ TestCompletionCallback callback;
+ HttpRequestInfo request;
+ ChunkedUploadDataStream upload_data_stream(0, /*has_null_source=*/true);
+ upload_data_stream.AppendData(request_body.data(), request_body.size(),
+ /*is_done=*/true);
+ request.method = "POST";
+ request.url = GURL("https://www.example.org");
+ request.load_flags = 0;
+ request.traffic_annotation =
+ net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+ request.upload_data_stream = &upload_data_stream;
+ HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
+
+ int rv = trans.Start(&request, callback.callback(),
+ NetLogWithSource::Make(NetLogSourceType::NONE));
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+ rv = callback.WaitForResult();
+ EXPECT_THAT(rv, IsOk());
+
+ const HttpResponseInfo* response = trans.GetResponseInfo();
+ std::string response_data;
+ ASSERT_TRUE(response);
+ ASSERT_TRUE(response->headers);
+ EXPECT_EQ("HTTP/1.1 421", response->headers->GetStatusLine());
+ EXPECT_TRUE(response->was_fetched_via_spdy);
+ EXPECT_TRUE(response->was_alpn_negotiated);
+ EXPECT_TRUE(response->ssl_info.cert);
+ ASSERT_THAT(ReadTransaction(&trans, &response_data), IsOk());
+ EXPECT_EQ("hello!", response_data);
+}
+
+TEST_F(HttpNetworkTransactionTest,
UseIPConnectionPoolingWithHostCacheExpiration) {
// Set up HostResolver to invalidate cached entries after 1 cached resolve.
session_deps_.host_resolver =
@@ -18136,7 +18291,7 @@ TEST_F(HttpNetworkTransactionTest, DoNotUseSpdySessionForHttpOverTunnel) {
data1.set_connect_data(connect_data1);
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = net::NetLog::Get();
SSLSocketDataProvider ssl1(ASYNC, OK); // to the proxy
@@ -19477,7 +19632,7 @@ TEST_F(HttpNetworkTransactionTest, ProxyHeadersNotSentOverWssTunnel) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -19584,7 +19739,7 @@ TEST_F(HttpNetworkTransactionTest, ProxyHeadersNotSentOverWsTunnel) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -19657,7 +19812,7 @@ TEST_F(HttpNetworkTransactionTest, WebSocketNotSentOverQuicProxy) {
for (bool secure : {true, false}) {
SCOPED_TRACE(secure);
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.enable_quic = true;
@@ -19930,15 +20085,16 @@ TEST_F(HttpNetworkTransactionTest, ProxyResolutionFailsAsync) {
ProxyConfig proxy_config;
proxy_config.set_pac_url(GURL("http://fooproxyurl"));
proxy_config.set_pac_mandatory(true);
- MockAsyncProxyResolverFactory* proxy_resolver_factory =
- new MockAsyncProxyResolverFactory(false);
+ auto proxy_resolver_factory =
+ std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* proxy_resolver_factory_ptr = proxy_resolver_factory.get();
MockAsyncProxyResolver resolver;
session_deps_.proxy_resolution_service =
std::make_unique<ConfiguredProxyResolutionService>(
std::make_unique<ProxyConfigServiceFixed>(ProxyConfigWithAnnotation(
proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS)),
- base::WrapUnique(proxy_resolver_factory), nullptr,
+ std::move(proxy_resolver_factory), nullptr,
/*quick_check_enabled=*/true);
HttpRequestInfo request;
request.method = "GET";
@@ -19953,7 +20109,7 @@ TEST_F(HttpNetworkTransactionTest, ProxyResolutionFailsAsync) {
int rv = trans.Start(&request, callback.callback(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
- proxy_resolver_factory->pending_requests()[0]->CompleteNowWithForwarder(
+ proxy_resolver_factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(
ERR_FAILED, &resolver);
EXPECT_THAT(callback.WaitForResult(),
IsError(ERR_MANDATORY_PROXY_CONFIGURATION_FAILED));
@@ -19961,7 +20117,7 @@ TEST_F(HttpNetworkTransactionTest, ProxyResolutionFailsAsync) {
TEST_F(HttpNetworkTransactionTest, NoSupportedProxies) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.enable_quic = false;
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -20244,7 +20400,7 @@ TEST_F(HttpNetworkTransactionNetworkErrorLoggingTest,
TEST_F(HttpNetworkTransactionNetworkErrorLoggingTest,
DontProcessNelHeaderProxy) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.net_log = NetLog::Get();
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -21194,7 +21350,7 @@ TEST_F(HttpNetworkTransactionNetworkErrorLoggingTest, DontCreateReportProxy) {
// Configure against proxy server "myproxy:70".
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
@@ -21879,7 +22035,7 @@ TEST_F(HttpNetworkTransactionTest, ZeroRTTConfirmErrorAsync) {
TEST_F(HttpNetworkTransactionTest, AuthEverything) {
// Note these hosts must match the CheckBasic*Auth() functions.
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
auto cert_request_info_proxy = base::MakeRefCounted<SSLCertRequestInfo>();
@@ -22066,7 +22222,7 @@ TEST_F(HttpNetworkTransactionTest, AuthEverything) {
TEST_F(HttpNetworkTransactionTest, AuthEverythingWithConnectClose) {
// Note these hosts must match the CheckBasic*Auth() functions.
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
auto cert_request_info_proxy = base::MakeRefCounted<SSLCertRequestInfo>();
@@ -22306,7 +22462,7 @@ TEST_F(HttpNetworkTransactionTest, AuthEverythingWithConnectClose) {
TEST_F(HttpNetworkTransactionTest, ProxyHTTPAndServerTLSAuth) {
// Note these hosts must match the CheckBasic*Auth() functions.
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
auto cert_request_info_origin = base::MakeRefCounted<SSLCertRequestInfo>();
@@ -22664,7 +22820,7 @@ TEST_F(HttpNetworkTransactionTest, NetworkIsolationH2) {
SCOPED_TRACE(use_proxy);
if (use_proxy) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS proxy:443", TRAFFIC_ANNOTATION_FOR_TESTS);
} else {
session_deps_.proxy_resolution_service =
@@ -23120,7 +23276,7 @@ TEST_F(HttpNetworkTransactionTest, NetworkIsolationSSLProxy) {
{});
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
const SchemefulSite kSite1(GURL("http://origin1/"));
diff --git a/chromium/net/http/http_proxy_client_socket.cc b/chromium/net/http/http_proxy_client_socket.cc
index 80623ee1e66..59e203f374a 100644
--- a/chromium/net/http/http_proxy_client_socket.cc
+++ b/chromium/net/http/http_proxy_client_socket.cc
@@ -36,14 +36,14 @@ HttpProxyClientSocket::HttpProxyClientSocket(
const std::string& user_agent,
const HostPortPair& endpoint,
const ProxyServer& proxy_server,
- HttpAuthController* http_auth_controller,
+ scoped_refptr<HttpAuthController> http_auth_controller,
ProxyDelegate* proxy_delegate,
const NetworkTrafficAnnotationTag& traffic_annotation)
: io_callback_(base::BindRepeating(&HttpProxyClientSocket::OnIOComplete,
base::Unretained(this))),
socket_(std::move(socket)),
endpoint_(endpoint),
- auth_(http_auth_controller),
+ auth_(std::move(http_auth_controller)),
proxy_server_(proxy_server),
proxy_delegate_(proxy_delegate),
traffic_annotation_(traffic_annotation),
diff --git a/chromium/net/http/http_proxy_client_socket.h b/chromium/net/http/http_proxy_client_socket.h
index 4c82607381c..4ac6588f139 100644
--- a/chromium/net/http/http_proxy_client_socket.h
+++ b/chromium/net/http/http_proxy_client_socket.h
@@ -44,7 +44,7 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket {
const std::string& user_agent,
const HostPortPair& endpoint,
const ProxyServer& proxy_server,
- HttpAuthController* http_auth_controller,
+ scoped_refptr<HttpAuthController> http_auth_controller,
ProxyDelegate* proxy_delegate,
const NetworkTrafficAnnotationTag& traffic_annotation);
diff --git a/chromium/net/http/http_proxy_client_socket_fuzzer.cc b/chromium/net/http/http_proxy_client_socket_fuzzer.cc
index ad3397f5681..fc3af857cd8 100644
--- a/chromium/net/http/http_proxy_client_socket_fuzzer.cc
+++ b/chromium/net/http/http_proxy_client_socket_fuzzer.cc
@@ -43,8 +43,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
net::RecordingNetLogObserver net_log_observer;
net::TestCompletionCallback callback;
- std::unique_ptr<net::FuzzedSocket> fuzzed_socket(
- new net::FuzzedSocket(&data_provider, net::NetLog::Get()));
+ auto fuzzed_socket =
+ std::make_unique<net::FuzzedSocket>(&data_provider, net::NetLog::Get());
CHECK_EQ(net::OK, fuzzed_socket->Connect(callback.callback()));
// Create auth handler supporting basic and digest schemes. Other schemes can
diff --git a/chromium/net/http/http_proxy_client_socket_unittest.cc b/chromium/net/http/http_proxy_client_socket_unittest.cc
index 236542a093f..7fb2455eea4 100644
--- a/chromium/net/http/http_proxy_client_socket_unittest.cc
+++ b/chromium/net/http/http_proxy_client_socket_unittest.cc
@@ -20,22 +20,23 @@ namespace {
TEST(HttpProxyClientSocketTest, Tag) {
StaticSocketDataProvider data;
- MockTaggingStreamSocket* tagging_sock =
- new MockTaggingStreamSocket(std::make_unique<MockTCPClientSocket>(
- AddressList(), nullptr /* net_log */, &data));
+ auto tagging_sock = std::make_unique<MockTaggingStreamSocket>(
+ std::make_unique<MockTCPClientSocket>(AddressList(),
+ nullptr /* net_log */, &data));
+ auto* tagging_sock_ptr = tagging_sock.get();
// |socket| takes ownership of |tagging_sock|, but the test keeps a non-owning
// pointer to it.
HttpProxyClientSocket socket(
- std::unique_ptr<StreamSocket>(tagging_sock), /*user_agent=*/"",
- HostPortPair(), ProxyServer(), /*http_auth_controller=*/nullptr,
+ std::move(tagging_sock), /*user_agent=*/"", HostPortPair(), ProxyServer(),
+ /*http_auth_controller=*/nullptr,
/*proxy_delegate=*/nullptr, TRAFFIC_ANNOTATION_FOR_TESTS);
- EXPECT_EQ(tagging_sock->tag(), SocketTag());
+ EXPECT_EQ(tagging_sock_ptr->tag(), SocketTag());
#if BUILDFLAG(IS_ANDROID)
SocketTag tag(0x12345678, 0x87654321);
socket.ApplySocketTag(tag);
- EXPECT_EQ(tagging_sock->tag(), tag);
+ EXPECT_EQ(tagging_sock_ptr->tag(), tag);
#endif // BUILDFLAG(IS_ANDROID)
}
diff --git a/chromium/net/http/http_proxy_connect_job.cc b/chromium/net/http/http_proxy_connect_job.cc
index 9a95455672c..47bcec0954a 100644
--- a/chromium/net/http/http_proxy_connect_job.cc
+++ b/chromium/net/http/http_proxy_connect_job.cc
@@ -200,7 +200,7 @@ HttpProxyConnectJob::HttpProxyConnectJob(
host_resolver())
: nullptr) {}
-HttpProxyConnectJob::~HttpProxyConnectJob() {}
+HttpProxyConnectJob::~HttpProxyConnectJob() = default;
const RequestPriority HttpProxyConnectJob::kH2QuicTunnelPriority =
DEFAULT_PRIORITY;
@@ -532,7 +532,7 @@ int HttpProxyConnectJob::DoHttpProxyConnect() {
transport_socket_ = std::make_unique<HttpProxyClientSocket>(
nested_connect_job_->PassSocket(), GetUserAgent(), params_->endpoint(),
ProxyServer(GetProxyServerScheme(), GetDestination()),
- http_auth_controller_.get(), common_connect_job_params()->proxy_delegate,
+ http_auth_controller_, common_connect_job_params()->proxy_delegate,
params_->traffic_annotation());
nested_connect_job_.reset();
return transport_socket_->Connect(base::BindOnce(
@@ -624,8 +624,8 @@ int HttpProxyConnectJob::DoSpdyProxyCreateStreamComplete(int result) {
// |transport_socket_| will set itself as |stream|'s delegate.
transport_socket_ = std::make_unique<SpdyProxyClientSocket>(
stream, ProxyServer(GetProxyServerScheme(), GetDestination()),
- GetUserAgent(), params_->endpoint(), net_log(),
- http_auth_controller_.get(), common_connect_job_params()->proxy_delegate);
+ GetUserAgent(), params_->endpoint(), net_log(), http_auth_controller_,
+ common_connect_job_params()->proxy_delegate);
return transport_socket_->Connect(base::BindOnce(
&HttpProxyConnectJob::OnIOComplete, base::Unretained(this)));
}
@@ -699,7 +699,7 @@ int HttpProxyConnectJob::DoQuicProxyCreateStreamComplete(int result) {
transport_socket_ = std::make_unique<QuicProxyClientSocket>(
std::move(quic_stream), std::move(quic_session_),
ProxyServer(GetProxyServerScheme(), GetDestination()), GetUserAgent(),
- params_->endpoint(), net_log(), http_auth_controller_.get(),
+ params_->endpoint(), net_log(), http_auth_controller_,
common_connect_job_params()->proxy_delegate);
return transport_socket_->Connect(base::BindOnce(
&HttpProxyConnectJob::OnIOComplete, base::Unretained(this)));
diff --git a/chromium/net/http/http_proxy_connect_job_unittest.cc b/chromium/net/http/http_proxy_connect_job_unittest.cc
index e35978efa98..b433ca83e12 100644
--- a/chromium/net/http/http_proxy_connect_job_unittest.cc
+++ b/chromium/net/http/http_proxy_connect_job_unittest.cc
@@ -76,7 +76,7 @@ class HttpProxyConnectJobTest : public ::testing::TestWithParam<HttpProxyType>,
InitCommonConnectJobParams();
}
- virtual ~HttpProxyConnectJobTest() {
+ ~HttpProxyConnectJobTest() override {
// Reset global field trial parameters to defaults values.
base::FieldTrialParamAssociator::GetInstance()->ClearAllParamsForTesting();
HttpProxyConnectJob::UpdateFieldTrialParametersForTesting();
diff --git a/chromium/net/http/http_request_headers.cc b/chromium/net/http/http_request_headers.cc
index ea36ce6f63d..55e366bf4cd 100644
--- a/chromium/net/http/http_request_headers.cc
+++ b/chromium/net/http/http_request_headers.cc
@@ -14,6 +14,7 @@
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/values.h"
+#include "net/base/url_util.h"
#include "net/http/http_log_util.h"
#include "net/http/http_util.h"
#include "net/log/net_log_capture_mode.h"
@@ -21,6 +22,19 @@
namespace net {
+namespace {
+
+bool SupportsStreamType(
+ const absl::optional<base::flat_set<SourceStream::SourceType>>&
+ accepted_stream_types,
+ SourceStream::SourceType type) {
+ if (!accepted_stream_types)
+ return true;
+ return accepted_stream_types->contains(type);
+}
+
+} // namespace
+
const char HttpRequestHeaders::kConnectMethod[] = "CONNECT";
const char HttpRequestHeaders::kDeleteMethod[] = "DELETE";
const char HttpRequestHeaders::kGetMethod[] = "GET";
@@ -180,16 +194,16 @@ void HttpRequestHeaders::AddHeadersFromString(
}
void HttpRequestHeaders::MergeFrom(const HttpRequestHeaders& other) {
- for (auto it = other.headers_.begin(); it != other.headers_.end(); ++it) {
- SetHeader(it->key, it->value);
+ for (const auto& header : other.headers_) {
+ SetHeader(header.key, header.value);
}
}
std::string HttpRequestHeaders::ToString() const {
std::string output;
- for (auto it = headers_.begin(); it != headers_.end(); ++it) {
- base::StringAppendF(&output, "%s: %s\r\n", it->key.c_str(),
- it->value.c_str());
+ for (const auto& header : headers_) {
+ base::StringAppendF(&output, "%s: %s\r\n", header.key.c_str(),
+ header.value.c_str());
}
output.append("\r\n");
return output;
@@ -198,17 +212,61 @@ std::string HttpRequestHeaders::ToString() const {
base::Value HttpRequestHeaders::NetLogParams(
const std::string& request_line,
NetLogCaptureMode capture_mode) const {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetKey("line", NetLogStringValue(request_line));
- base::Value headers(base::Value::Type::LIST);
+ base::Value::Dict dict;
+ dict.Set("line", NetLogStringValue(request_line));
+ base::Value::List headers;
for (const auto& header : headers_) {
std::string log_value =
ElideHeaderValueForNetLog(capture_mode, header.key, header.value);
headers.Append(
NetLogStringValue(base::StrCat({header.key, ": ", log_value})));
}
- dict.SetKey("headers", std::move(headers));
- return dict;
+ dict.Set("headers", std::move(headers));
+ return base::Value(std::move(dict));
+}
+
+void HttpRequestHeaders::SetAcceptEncodingIfMissing(
+ const GURL& url,
+ const absl::optional<base::flat_set<SourceStream::SourceType>>&
+ accepted_stream_types,
+ bool enable_brotli) {
+ if (HasHeader(kAcceptEncoding))
+ return;
+
+ // If a range is specifically requested, set the "Accepted Encoding" header to
+ // "identity".
+ if (HasHeader(kRange)) {
+ SetHeader(kAcceptEncoding, "identity");
+ return;
+ }
+
+ // Supply Accept-Encoding headers first so that it is more likely that they
+ // will be in the first transmitted packet. This can sometimes make it easier
+ // to filter and analyze the streams to assure that a proxy has not damaged
+ // these headers. Some proxies deliberately corrupt Accept-Encoding headers.
+ std::vector<std::string> advertised_encoding_names;
+ if (SupportsStreamType(accepted_stream_types,
+ SourceStream::SourceType::TYPE_GZIP)) {
+ advertised_encoding_names.push_back("gzip");
+ }
+ if (SupportsStreamType(accepted_stream_types,
+ SourceStream::SourceType::TYPE_DEFLATE)) {
+ advertised_encoding_names.push_back("deflate");
+ }
+ // Advertise "br" encoding only if transferred data is opaque to proxy.
+ if (enable_brotli &&
+ SupportsStreamType(accepted_stream_types,
+ SourceStream::SourceType::TYPE_BROTLI)) {
+ if (url.SchemeIsCryptographic() || IsLocalhost(url)) {
+ advertised_encoding_names.push_back("br");
+ }
+ }
+ if (!advertised_encoding_names.empty()) {
+ // Tell the server what compression formats are supported.
+ SetHeader(
+ kAcceptEncoding,
+ base::JoinString(base::make_span(advertised_encoding_names), ", "));
+ }
}
HttpRequestHeaders::HeaderVector::iterator HttpRequestHeaders::FindHeader(
diff --git a/chromium/net/http/http_request_headers.h b/chromium/net/http/http_request_headers.h
index c1a956e0a80..0f4257c657f 100644
--- a/chromium/net/http/http_request_headers.h
+++ b/chromium/net/http/http_request_headers.h
@@ -14,9 +14,13 @@
#include <string>
#include <vector>
+#include "base/containers/flat_set.h"
#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
+#include "net/filter/source_stream.h"
#include "net/log/net_log_capture_mode.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
namespace base {
class Value;
@@ -186,6 +190,14 @@ class NET_EXPORT HttpRequestHeaders {
const HeaderVector& GetHeaderVector() const { return headers_; }
+ // Sets Accept-Encoding header based on `url` and `accepted_stream_types`, if
+ // it does not exist. "br" is appended only when `enable_brotli` is true.
+ void SetAcceptEncodingIfMissing(
+ const GURL& url,
+ const absl::optional<base::flat_set<SourceStream::SourceType>>&
+ accepted_stream_types,
+ bool enable_brotli);
+
private:
HeaderVector::iterator FindHeader(const base::StringPiece& key);
HeaderVector::const_iterator FindHeader(const base::StringPiece& key) const;
diff --git a/chromium/net/http/http_response_body_drainer.cc b/chromium/net/http/http_response_body_drainer.cc
index 9591c58c96f..0be2c28d986 100644
--- a/chromium/net/http/http_response_body_drainer.cc
+++ b/chromium/net/http/http_response_body_drainer.cc
@@ -25,6 +25,7 @@ HttpResponseBodyDrainer::HttpResponseBodyDrainer(HttpStream* stream)
HttpResponseBodyDrainer::~HttpResponseBodyDrainer() = default;
void HttpResponseBodyDrainer::Start(HttpNetworkSession* session) {
+ session_ = session;
read_buf_ = base::MakeRefCounted<IOBuffer>(kDrainBodyBufferSize);
next_state_ = STATE_DRAIN_RESPONSE_BODY;
int rv = DoLoop(OK);
@@ -32,8 +33,6 @@ void HttpResponseBodyDrainer::Start(HttpNetworkSession* session) {
if (rv == ERR_IO_PENDING) {
timer_.Start(FROM_HERE, base::Seconds(kTimeoutInSeconds), this,
&HttpResponseBodyDrainer::OnTimerFired);
- session_ = session;
- session->AddResponseDrainer(base::WrapUnique(this));
return;
}
@@ -110,9 +109,6 @@ void HttpResponseBodyDrainer::OnTimerFired() {
void HttpResponseBodyDrainer::Finish(int result) {
DCHECK_NE(ERR_IO_PENDING, result);
- if (session_)
- session_->RemoveResponseDrainer(this);
-
if (result < 0 || !stream_->CanReuseConnection()) {
stream_->Close(true /* no keep-alive */);
} else {
@@ -120,7 +116,7 @@ void HttpResponseBodyDrainer::Finish(int result) {
stream_->Close(false /* keep-alive */);
}
- delete this;
+ session_->RemoveResponseDrainer(this);
}
} // namespace net
diff --git a/chromium/net/http/http_response_body_drainer.h b/chromium/net/http/http_response_body_drainer.h
index 5ba92fa0be1..c1007ab08e7 100644
--- a/chromium/net/http/http_response_body_drainer.h
+++ b/chromium/net/http/http_response_body_drainer.h
@@ -33,8 +33,8 @@ class NET_EXPORT_PRIVATE HttpResponseBodyDrainer {
~HttpResponseBodyDrainer();
// Starts reading the body until completion, or we hit the buffer limit, or we
- // timeout. After Start(), |this| will eventually delete itself. If it
- // doesn't complete immediately, it will add itself to |session|.
+ // timeout. After Start(), |this| will eventually delete itself via
+ // HttpNetworkSession::RemoveResponseDrainer().
void Start(HttpNetworkSession* session);
private:
diff --git a/chromium/net/http/http_response_body_drainer_unittest.cc b/chromium/net/http/http_response_body_drainer_unittest.cc
index 13cdd3c74eb..d4bc1bdec10 100644
--- a/chromium/net/http/http_response_body_drainer_unittest.cc
+++ b/chromium/net/http/http_response_body_drainer_unittest.cc
@@ -128,7 +128,7 @@ class MockHttpStream : public HttpStream {
result_waiter_->set_result(not_reusable);
}
- HttpStream* RenewStreamForAuth() override { return nullptr; }
+ std::unique_ptr<HttpStream> RenewStreamForAuth() override { return nullptr; }
bool IsResponseBodyComplete() const override { return is_complete_; }
@@ -238,15 +238,16 @@ class HttpResponseBodyDrainerTest : public TestWithTaskEnvironment {
HttpResponseBodyDrainerTest()
: proxy_resolution_service_(
ConfiguredProxyResolutionService::CreateDirect()),
- ssl_config_service_(new SSLConfigServiceDefaults),
- http_server_properties_(new HttpServerProperties()),
+ ssl_config_service_(std::make_unique<SSLConfigServiceDefaults>()),
+ http_server_properties_(std::make_unique<HttpServerProperties>()),
session_(CreateNetworkSession()),
- mock_stream_(new MockHttpStream(&result_waiter_)),
- drainer_(new HttpResponseBodyDrainer(mock_stream_)) {}
+ mock_stream_(new MockHttpStream(&result_waiter_)) {
+ drainer_ = std::make_unique<HttpResponseBodyDrainer>(mock_stream_);
+ }
~HttpResponseBodyDrainerTest() override = default;
- HttpNetworkSession* CreateNetworkSession() {
+ std::unique_ptr<HttpNetworkSession> CreateNetworkSession() {
HttpNetworkSessionContext context;
context.client_socket_factory = &socket_factory_;
context.proxy_resolution_service = proxy_resolution_service_.get();
@@ -256,7 +257,8 @@ class HttpResponseBodyDrainerTest : public TestWithTaskEnvironment {
context.transport_security_state = &transport_security_state_;
context.ct_policy_enforcer = &ct_policy_enforcer_;
context.quic_context = &quic_context_;
- return new HttpNetworkSession(HttpNetworkSessionParams(), context);
+ return std::make_unique<HttpNetworkSession>(HttpNetworkSessionParams(),
+ context);
}
std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
@@ -269,27 +271,27 @@ class HttpResponseBodyDrainerTest : public TestWithTaskEnvironment {
MockClientSocketFactory socket_factory_;
const std::unique_ptr<HttpNetworkSession> session_;
CloseResultWaiter result_waiter_;
- const raw_ptr<MockHttpStream> mock_stream_; // Owned by |drainer_|.
- const raw_ptr<HttpResponseBodyDrainer> drainer_; // Deletes itself.
+ const raw_ptr<MockHttpStream> mock_stream_; // Owned by |drainer_|.
+ std::unique_ptr<HttpResponseBodyDrainer> drainer_;
};
TEST_F(HttpResponseBodyDrainerTest, DrainBodySyncSingleOK) {
mock_stream_->set_num_chunks(1);
mock_stream_->set_sync();
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
EXPECT_FALSE(result_waiter_.WaitForResult());
}
TEST_F(HttpResponseBodyDrainerTest, DrainBodySyncOK) {
mock_stream_->set_num_chunks(3);
mock_stream_->set_sync();
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
EXPECT_FALSE(result_waiter_.WaitForResult());
}
TEST_F(HttpResponseBodyDrainerTest, DrainBodyAsyncOK) {
mock_stream_->set_num_chunks(3);
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
EXPECT_FALSE(result_waiter_.WaitForResult());
}
@@ -299,7 +301,7 @@ TEST_F(HttpResponseBodyDrainerTest, DrainBodyAsyncOK) {
TEST_F(HttpResponseBodyDrainerTest, DrainBodyAsyncEmptyChunk) {
mock_stream_->set_num_chunks(4);
mock_stream_->set_is_last_chunk_zero_size();
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
EXPECT_FALSE(result_waiter_.WaitForResult());
}
@@ -307,28 +309,28 @@ TEST_F(HttpResponseBodyDrainerTest, DrainBodySyncEmptyChunk) {
mock_stream_->set_num_chunks(4);
mock_stream_->set_sync();
mock_stream_->set_is_last_chunk_zero_size();
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
EXPECT_FALSE(result_waiter_.WaitForResult());
}
TEST_F(HttpResponseBodyDrainerTest, DrainBodySizeEqualsDrainBuffer) {
mock_stream_->set_num_chunks(
HttpResponseBodyDrainer::kDrainBodyBufferSize / kMagicChunkSize);
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
EXPECT_FALSE(result_waiter_.WaitForResult());
}
TEST_F(HttpResponseBodyDrainerTest, DrainBodyTimeOut) {
mock_stream_->set_num_chunks(2);
mock_stream_->set_stall_reads_forever();
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
EXPECT_TRUE(result_waiter_.WaitForResult());
}
TEST_F(HttpResponseBodyDrainerTest, CancelledBySession) {
mock_stream_->set_num_chunks(2);
mock_stream_->set_stall_reads_forever();
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
// HttpNetworkSession should delete |drainer_|.
}
@@ -338,14 +340,14 @@ TEST_F(HttpResponseBodyDrainerTest, DrainBodyTooLarge) {
too_many_chunks += 1; // Now it's too large.
mock_stream_->set_num_chunks(too_many_chunks);
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
EXPECT_TRUE(result_waiter_.WaitForResult());
}
TEST_F(HttpResponseBodyDrainerTest, DrainBodyCantReuse) {
mock_stream_->set_num_chunks(1);
mock_stream_->set_can_reuse_connection(false);
- drainer_->Start(session_.get());
+ session_->StartResponseDrainer(std::move(drainer_));
EXPECT_TRUE(result_waiter_.WaitForResult());
}
diff --git a/chromium/net/http/http_response_headers.cc b/chromium/net/http/http_response_headers.cc
index 727cebff27e..54a82879c64 100644
--- a/chromium/net/http/http_response_headers.cc
+++ b/chromium/net/http/http_response_headers.cc
@@ -110,13 +110,12 @@ const char* const kNonUpdatedHeaderPrefixes[] = {
};
bool ShouldUpdateHeader(base::StringPiece name) {
- for (size_t i = 0; i < std::size(kNonUpdatedHeaders); ++i) {
- if (base::EqualsCaseInsensitiveASCII(name, kNonUpdatedHeaders[i]))
+ for (const auto* header : kNonUpdatedHeaders) {
+ if (base::EqualsCaseInsensitiveASCII(name, header))
return false;
}
- for (size_t i = 0; i < std::size(kNonUpdatedHeaderPrefixes); ++i) {
- if (base::StartsWith(name, kNonUpdatedHeaderPrefixes[i],
- base::CompareCase::INSENSITIVE_ASCII))
+ for (const auto* prefix : kNonUpdatedHeaderPrefixes) {
+ if (base::StartsWith(name, prefix, base::CompareCase::INSENSITIVE_ASCII))
return false;
}
return true;
@@ -141,6 +140,7 @@ void CheckDoesNotHaveEmbeddedNulls(base::StringPiece str) {
const char HttpResponseHeaders::kContentRange[] = "Content-Range";
const char HttpResponseHeaders::kLastModified[] = "Last-Modified";
+const char HttpResponseHeaders::kVary[] = "Vary";
struct HttpResponseHeaders::ParsedHeader {
// A header "continuation" contains only a subsequent value for the
@@ -636,9 +636,9 @@ HttpVersion HttpResponseHeaders::ParseVersion(
std::string::const_iterator line_end) {
std::string::const_iterator p = line_begin;
- // RFC2616 sec 3.1: HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
- // TODO: (1*DIGIT apparently means one or more digits, but we only handle 1).
- // TODO: handle leading zeros, which is allowed by the rfc1616 sec 3.1.
+ // RFC9112 Section 2.3:
+ // HTTP-version = HTTP-name "/" DIGIT "." DIGIT
+ // HTTP-name = %s"HTTP"
if (!base::StartsWith(base::MakeStringPiece(line_begin, line_end), "http",
base::CompareCase::INSENSITIVE_ASCII)) {
@@ -887,18 +887,18 @@ void HttpResponseHeaders::AddNonCacheableHeaders(HeaderSet* result) const {
}
void HttpResponseHeaders::AddHopByHopHeaders(HeaderSet* result) {
- for (size_t i = 0; i < std::size(kHopByHopResponseHeaders); ++i)
- result->insert(std::string(kHopByHopResponseHeaders[i]));
+ for (const auto* header : kHopByHopResponseHeaders)
+ result->insert(std::string(header));
}
void HttpResponseHeaders::AddCookieHeaders(HeaderSet* result) {
- for (size_t i = 0; i < std::size(kCookieResponseHeaders); ++i)
- result->insert(std::string(kCookieResponseHeaders[i]));
+ for (const auto* header : kCookieResponseHeaders)
+ result->insert(std::string(header));
}
void HttpResponseHeaders::AddChallengeHeaders(HeaderSet* result) {
- for (size_t i = 0; i < std::size(kChallengeResponseHeaders); ++i)
- result->insert(std::string(kChallengeResponseHeaders[i]));
+ for (const auto* header : kChallengeResponseHeaders)
+ result->insert(std::string(header));
}
void HttpResponseHeaders::AddHopContentRangeHeaders(HeaderSet* result) {
@@ -906,8 +906,8 @@ void HttpResponseHeaders::AddHopContentRangeHeaders(HeaderSet* result) {
}
void HttpResponseHeaders::AddSecurityStateHeaders(HeaderSet* result) {
- for (size_t i = 0; i < std::size(kSecurityStateHeaders); ++i)
- result->insert(std::string(kSecurityStateHeaders[i]));
+ for (const auto* header : kSecurityStateHeaders)
+ result->insert(std::string(header));
}
void HttpResponseHeaders::GetMimeTypeAndCharset(std::string* mime_type,
@@ -1373,8 +1373,8 @@ bool HttpResponseHeaders::GetContentRangeFor206(
base::Value HttpResponseHeaders::NetLogParams(
NetLogCaptureMode capture_mode) const {
- base::Value dict(base::Value::Type::DICTIONARY);
- base::Value headers(base::Value::Type::LIST);
+ base::Value::Dict dict;
+ base::Value::List headers;
headers.Append(NetLogStringValue(GetStatusLine()));
size_t iterator = 0;
std::string name;
@@ -1384,8 +1384,8 @@ base::Value HttpResponseHeaders::NetLogParams(
ElideHeaderValueForNetLog(capture_mode, name, value);
headers.Append(NetLogStringValue(base::StrCat({name, ": ", log_value})));
}
- dict.SetKey("headers", std::move(headers));
- return dict;
+ dict.Set("headers", std::move(headers));
+ return base::Value(std::move(dict));
}
bool HttpResponseHeaders::IsChunkEncoded() const {
diff --git a/chromium/net/http/http_response_headers.h b/chromium/net/http/http_response_headers.h
index 469d5719f57..d49f1f66f36 100644
--- a/chromium/net/http/http_response_headers.h
+++ b/chromium/net/http/http_response_headers.h
@@ -64,6 +64,7 @@ class NET_EXPORT HttpResponseHeaders
static const char kContentRange[];
static const char kLastModified[];
+ static const char kVary[];
HttpResponseHeaders() = delete;
diff --git a/chromium/net/http/http_response_headers_unittest.cc b/chromium/net/http/http_response_headers_unittest.cc
index 79634446e54..0007e534e87 100644
--- a/chromium/net/http/http_response_headers_unittest.cc
+++ b/chromium/net/http/http_response_headers_unittest.cc
@@ -59,7 +59,7 @@ class HttpResponseHeadersCacheControlTest : public HttpResponseHeadersTest {
raw_headers += cache_control;
raw_headers += "\n";
HeadersToRaw(&raw_headers);
- headers_ = new HttpResponseHeaders(raw_headers);
+ headers_ = base::MakeRefCounted<HttpResponseHeaders>(raw_headers);
}
const scoped_refptr<HttpResponseHeaders>& headers() { return headers_; }
@@ -138,8 +138,7 @@ TEST_P(CommonHttpResponseHeadersTest, TestCommon) {
HeadersToRaw(&raw_headers);
std::string expected_headers(test.expected_headers);
- scoped_refptr<HttpResponseHeaders> parsed(
- new HttpResponseHeaders(raw_headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(raw_headers);
std::string headers = ToSimpleString(parsed);
// Transform to readable output format (so it's easier to see diffs).
@@ -325,13 +324,13 @@ TEST_P(PersistenceTest, Persist) {
std::string headers = test.raw_headers;
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed1(new HttpResponseHeaders(headers));
+ auto parsed1 = base::MakeRefCounted<HttpResponseHeaders>(headers);
base::Pickle pickle;
parsed1->Persist(&pickle, test.options);
base::PickleIterator iter(pickle);
- scoped_refptr<HttpResponseHeaders> parsed2(new HttpResponseHeaders(&iter));
+ auto parsed2 = base::MakeRefCounted<HttpResponseHeaders>(&iter);
EXPECT_EQ(std::string(test.expected_headers), ToSimpleString(parsed2));
}
@@ -507,7 +506,7 @@ TEST(HttpResponseHeadersTest, EnumerateHeader_Coalesced) {
"cache-Control: no-store\n"
"cache-Control:\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
size_t iter = 0;
std::string value;
@@ -536,7 +535,7 @@ TEST(HttpResponseHeadersTest, EnumerateHeader_Challenge) {
"WWW-Authenticate:Digest realm=foobar, nonce=x, domain=y\n"
"WWW-Authenticate:Basic realm=quatar\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
size_t iter = 0;
std::string value;
@@ -555,7 +554,7 @@ TEST(HttpResponseHeadersTest, EnumerateHeader_DateValued) {
"Date: Tue, 07 Aug 2007 23:10:55 GMT\n"
"Last-Modified: Wed, 01 Aug 2007 23:23:45 GMT\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
std::string value;
EXPECT_TRUE(parsed->EnumerateHeader(nullptr, "date", &value));
@@ -573,7 +572,7 @@ TEST(HttpResponseHeadersTest, DefaultDateToGMT) {
"Last-Modified: Tue, 07 Aug 2007 19:10:55 EDT\n"
"Expires: Tue, 07 Aug 2007 23:10:55 UTC\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
base::Time expected_value;
ASSERT_TRUE(base::Time::FromString("Tue, 07 Aug 2007 23:10:55 GMT",
&expected_value));
@@ -598,7 +597,7 @@ TEST(HttpResponseHeadersTest, GetAgeValue10) {
"HTTP/1.1 200 OK\n"
"Age: 10\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
base::TimeDelta age;
ASSERT_TRUE(parsed->GetAgeValue(&age));
EXPECT_EQ(10, age.InSeconds());
@@ -609,7 +608,7 @@ TEST(HttpResponseHeadersTest, GetAgeValue0) {
"HTTP/1.1 200 OK\n"
"Age: 0\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
base::TimeDelta age;
ASSERT_TRUE(parsed->GetAgeValue(&age));
EXPECT_EQ(0, age.InSeconds());
@@ -620,7 +619,7 @@ TEST(HttpResponseHeadersTest, GetAgeValueBogus) {
"HTTP/1.1 200 OK\n"
"Age: donkey\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
base::TimeDelta age;
ASSERT_FALSE(parsed->GetAgeValue(&age));
}
@@ -630,7 +629,7 @@ TEST(HttpResponseHeadersTest, GetAgeValueNegative) {
"HTTP/1.1 200 OK\n"
"Age: -10\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
base::TimeDelta age;
ASSERT_FALSE(parsed->GetAgeValue(&age));
}
@@ -640,7 +639,7 @@ TEST(HttpResponseHeadersTest, GetAgeValueLeadingPlus) {
"HTTP/1.1 200 OK\n"
"Age: +10\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
base::TimeDelta age;
ASSERT_FALSE(parsed->GetAgeValue(&age));
}
@@ -650,7 +649,7 @@ TEST(HttpResponseHeadersTest, GetAgeValueOverflow) {
"HTTP/1.1 200 OK\n"
"Age: 999999999999999999999999999999999999999999\n";
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
base::TimeDelta age;
ASSERT_TRUE(parsed->GetAgeValue(&age));
@@ -677,7 +676,7 @@ TEST_P(ContentTypeTest, GetMimeType) {
std::string headers(test.raw_headers);
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
std::string value;
EXPECT_EQ(test.has_mimetype, parsed->GetMimeType(&value));
@@ -850,7 +849,7 @@ TEST_P(RequiresValidationTest, RequiresValidation) {
std::string headers(test.headers);
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
ValidationType validation_type =
parsed->RequiresValidation(request_time, response_time, current_time);
@@ -1041,13 +1040,11 @@ TEST_P(UpdateTest, Update) {
std::string orig_headers(test.orig_headers);
HeadersToRaw(&orig_headers);
- scoped_refptr<HttpResponseHeaders> parsed(
- new HttpResponseHeaders(orig_headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(orig_headers);
std::string new_headers(test.new_headers);
HeadersToRaw(&new_headers);
- scoped_refptr<HttpResponseHeaders> new_parsed(
- new HttpResponseHeaders(new_headers));
+ auto new_parsed = base::MakeRefCounted<HttpResponseHeaders>(new_headers);
parsed->Update(*new_parsed.get());
@@ -1177,7 +1174,7 @@ TEST_P(EnumerateHeaderLinesTest, EnumerateHeaderLines) {
std::string headers(test.headers);
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
std::string name, value, lines;
@@ -1236,7 +1233,7 @@ TEST_P(IsRedirectTest, IsRedirect) {
std::string headers(test.headers);
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
std::string location;
EXPECT_EQ(parsed->IsRedirect(&location), test.is_redirect);
@@ -1322,7 +1319,7 @@ TEST_P(GetContentLengthTest, GetContentLength) {
std::string headers(test.headers);
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
EXPECT_EQ(test.expected_len, parsed->GetContentLength());
}
@@ -1402,7 +1399,7 @@ TEST_P(ContentRangeTest, GetContentRangeFor206) {
std::string headers(test.headers);
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
int64_t first_byte_position;
int64_t last_byte_position;
@@ -1461,7 +1458,7 @@ TEST_P(IsKeepAliveTest, IsKeepAlive) {
std::string headers(test.headers);
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
EXPECT_EQ(test.expected_keep_alive, parsed->IsKeepAlive());
}
@@ -1621,7 +1618,7 @@ TEST_P(HasStrongValidatorsTest, HasStrongValidators) {
std::string headers(test.headers);
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
EXPECT_EQ(test.expected_result, parsed->HasStrongValidators());
}
@@ -1679,7 +1676,7 @@ INSTANTIATE_TEST_SUITE_P(HttpResponseHeaders,
TEST(HttpResponseHeadersTest, HasValidatorsNone) {
std::string headers("HTTP/1.1 200 OK");
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
EXPECT_FALSE(parsed->HasValidators());
}
@@ -1688,7 +1685,7 @@ TEST(HttpResponseHeadersTest, HasValidatorsEtag) {
"HTTP/1.1 200 OK\n"
"etag: \"anything\"");
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
EXPECT_TRUE(parsed->HasValidators());
}
@@ -1697,7 +1694,7 @@ TEST(HttpResponseHeadersTest, HasValidatorsLastModified) {
"HTTP/1.1 200 OK\n"
"Last-Modified: Wed, 28 Nov 2007 00:40:10 GMT");
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
EXPECT_TRUE(parsed->HasValidators());
}
@@ -1706,7 +1703,7 @@ TEST(HttpResponseHeadersTest, HasValidatorsWeakEtag) {
"HTTP/1.1 200 OK\n"
"etag: W/\"anything\"");
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
EXPECT_TRUE(parsed->HasValidators());
}
@@ -1853,8 +1850,7 @@ TEST_P(RemoveHeaderTest, RemoveHeader) {
std::string orig_headers(test.orig_headers);
HeadersToRaw(&orig_headers);
- scoped_refptr<HttpResponseHeaders> parsed(
- new HttpResponseHeaders(orig_headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(orig_headers);
std::string name(test.to_remove);
parsed->RemoveHeader(name);
@@ -1906,8 +1902,7 @@ TEST_P(RemoveHeadersTest, RemoveHeaders) {
std::string orig_headers(test.orig_headers);
HeadersToRaw(&orig_headers);
- scoped_refptr<HttpResponseHeaders> parsed(
- new HttpResponseHeaders(orig_headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(orig_headers);
std::unordered_set<std::string> to_remove;
for (auto* header : test.to_remove) {
@@ -1970,8 +1965,7 @@ TEST_P(RemoveIndividualHeaderTest, RemoveIndividualHeader) {
std::string orig_headers(test.orig_headers);
HeadersToRaw(&orig_headers);
- scoped_refptr<HttpResponseHeaders> parsed(
- new HttpResponseHeaders(orig_headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(orig_headers);
std::string name(test.to_remove_name);
std::string value(test.to_remove_value);
@@ -2072,8 +2066,7 @@ TEST_P(ReplaceStatusTest, ReplaceStatus) {
std::string orig_headers(test.orig_headers);
HeadersToRaw(&orig_headers);
- scoped_refptr<HttpResponseHeaders> parsed(
- new HttpResponseHeaders(orig_headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(orig_headers);
std::string name(test.new_status);
parsed->ReplaceStatusLine(name);
@@ -2138,8 +2131,7 @@ TEST_P(UpdateWithNewRangeTest, UpdateWithNewRange) {
std::string orig_headers(test.orig_headers);
std::replace(orig_headers.begin(), orig_headers.end(), '\n', '\0');
- scoped_refptr<HttpResponseHeaders> parsed(
- new HttpResponseHeaders(orig_headers + '\0'));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(orig_headers + '\0');
int64_t content_size = parsed->GetContentLength();
// Update headers without replacing status line.
@@ -2342,7 +2334,7 @@ TEST_P(GetCurrentAgeTest, GetCurrentAge) {
std::string headers(test.headers);
HeadersToRaw(&headers);
- scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
+ auto parsed = base::MakeRefCounted<HttpResponseHeaders>(headers);
base::TimeDelta age =
parsed->GetCurrentAge(request_time, response_time, current_time);
diff --git a/chromium/net/http/http_response_info.cc b/chromium/net/http/http_response_info.cc
index e96d6da97c1..d0b6fc231c3 100644
--- a/chromium/net/http/http_response_info.cc
+++ b/chromium/net/http/http_response_info.cc
@@ -121,8 +121,12 @@ enum {
// unusable due to the checksum not matching.
RESPONSE_INFO_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE = 1 << 28,
- // TODO(darin): Add other bits to indicate alternate request methods.
- // For now, we don't support storing those.
+ // This bit is set if the response has `encrypted_client_hello` set.
+ RESPONSE_INFO_ENCRYPTED_CLIENT_HELLO = 1 << 29,
+
+ // This enum only has a few bits (`1 << 31` is the limit). If allocating the
+ // last flag, instead allocate it as `RESPONSE_INFO_HAS_EXTRA_FLAGS` to
+ // signal another flags word.
};
HttpResponseInfo::ConnectionInfoCoarse HttpResponseInfo::ConnectionInfoToCoarse(
@@ -224,7 +228,7 @@ bool HttpResponseInfo::InitFromPickle(const base::Pickle& pickle,
response_time = Time::FromInternalValue(time_val);
// Read response-headers
- headers = new HttpResponseHeaders(&iter);
+ headers = base::MakeRefCounted<HttpResponseHeaders>(&iter);
if (headers->response_code() == -1)
return false;
@@ -381,6 +385,9 @@ bool HttpResponseInfo::InitFromPickle(const base::Pickle& pickle,
}
}
+ ssl_info.encrypted_client_hello =
+ (flags & RESPONSE_INFO_ENCRYPTED_CLIENT_HELLO) != 0;
+
return true;
}
@@ -426,6 +433,8 @@ void HttpResponseInfo::Persist(base::Pickle* pickle,
flags |= RESPONSE_INFO_HAS_STALENESS;
if (!dns_aliases.empty())
flags |= RESPONSE_INFO_HAS_DNS_ALIASES;
+ if (ssl_info.encrypted_client_hello)
+ flags |= RESPONSE_INFO_ENCRYPTED_CLIENT_HELLO;
pickle->WriteInt(flags);
pickle->WriteInt64(request_time.ToInternalValue());
diff --git a/chromium/net/http/http_response_info.h b/chromium/net/http/http_response_info.h
index e09a96c4b5c..b96254383e8 100644
--- a/chromium/net/http/http_response_info.h
+++ b/chromium/net/http/http_response_info.h
@@ -252,6 +252,8 @@ class NET_EXPORT HttpResponseInfo {
scoped_refptr<HttpResponseHeaders> headers;
// The "Vary" header data for this response.
+ // Initialized and used by HttpCache::Transaction. May also be passed to an
+ // auxiliary in-memory cache in the network service.
HttpVaryData vary_data;
// Any DNS aliases for the remote endpoint. Includes all known aliases, e.g.
diff --git a/chromium/net/http/http_response_info_unittest.cc b/chromium/net/http/http_response_info_unittest.cc
index 43c8770a273..921c71ca66a 100644
--- a/chromium/net/http/http_response_info_unittest.cc
+++ b/chromium/net/http/http_response_info_unittest.cc
@@ -22,7 +22,7 @@ namespace {
class HttpResponseInfoTest : public testing::Test {
protected:
void SetUp() override {
- response_info_.headers = new HttpResponseHeaders("");
+ response_info_.headers = base::MakeRefCounted<HttpResponseHeaders>("");
}
void PickleAndRestore(const HttpResponseInfo& response_info,
@@ -196,6 +196,24 @@ TEST_F(HttpResponseInfoTest, PeerSignatureAlgorithm) {
EXPECT_EQ(0x0804, restored_response_info.ssl_info.peer_signature_algorithm);
}
+// Test that encrypted_client_hello is preserved.
+TEST_F(HttpResponseInfoTest, EncryptedClientHello) {
+ response_info_.ssl_info.cert =
+ ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+ {
+ net::HttpResponseInfo restored_response_info;
+ PickleAndRestore(response_info_, &restored_response_info);
+ EXPECT_FALSE(restored_response_info.ssl_info.encrypted_client_hello);
+ }
+
+ response_info_.ssl_info.encrypted_client_hello = true;
+ {
+ net::HttpResponseInfo restored_response_info;
+ PickleAndRestore(response_info_, &restored_response_info);
+ EXPECT_TRUE(restored_response_info.ssl_info.encrypted_client_hello);
+ }
+}
+
// Tests that cache entries loaded over SSLv3 (no longer supported) are dropped.
TEST_F(HttpResponseInfoTest, FailsInitFromPickleWithSSLV3) {
// A valid certificate is needed for ssl_info.is_valid() to be true.
diff --git a/chromium/net/http/http_server_properties.cc b/chromium/net/http/http_server_properties.cc
index 3adcc93fcbd..887ffee8148 100644
--- a/chromium/net/http/http_server_properties.cc
+++ b/chromium/net/http/http_server_properties.cc
@@ -378,11 +378,11 @@ void HttpServerProperties::OnDefaultNetworkChanged() {
base::Value HttpServerProperties::GetAlternativeServiceInfoAsValue() const {
const base::Time now = clock_->Now();
const base::TimeTicks now_ticks = tick_clock_->NowTicks();
- base::Value dict_list(base::Value::Type::LIST);
+ base::Value::List dict_list;
for (const auto& server_info : server_info_map_) {
if (!server_info.second.alternative_services.has_value())
continue;
- base::Value alternative_service_list(base::Value::Type::LIST);
+ base::Value::List alternative_service_list;
const ServerInfoMapKey& key = server_info.first;
for (const AlternativeServiceInfo& alternative_service_info :
server_info.second.alternative_services.value()) {
@@ -415,16 +415,16 @@ base::Value HttpServerProperties::GetAlternativeServiceInfoAsValue() const {
}
alternative_service_list.Append(std::move(alternative_service_string));
}
- if (alternative_service_list.GetListDeprecated().empty())
+ if (alternative_service_list.empty())
continue;
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("server", key.server.Serialize());
- dict.SetStringKey("network_isolation_key",
- key.network_isolation_key.ToDebugString());
- dict.SetKey("alternative_service", std::move(alternative_service_list));
+ base::Value::Dict dict;
+ dict.Set("server", key.server.Serialize());
+ dict.Set("network_isolation_key",
+ key.network_isolation_key.ToDebugString());
+ dict.Set("alternative_service", std::move(alternative_service_list));
dict_list.Append(std::move(dict));
}
- return dict_list;
+ return base::Value(std::move(dict_list));
}
bool HttpServerProperties::WasLastLocalAddressWhenQuicWorked(
@@ -1151,19 +1151,19 @@ void HttpServerProperties::OnServerInfoLoaded(
// Attempt to find canonical servers. Canonical suffix only apply to HTTPS.
const uint16_t kCanonicalPort = 443;
const char* kCanonicalScheme = "https";
- for (auto it = server_info_map_.begin(); it != server_info_map_.end(); ++it) {
- if (!it->second.alternative_services ||
- it->first.server.scheme() != kCanonicalScheme) {
+ for (const auto& it : server_info_map_) {
+ if (!it.second.alternative_services ||
+ it.first.server.scheme() != kCanonicalScheme) {
continue;
}
const std::string* canonical_suffix =
- GetCanonicalSuffix(it->first.server.host());
+ GetCanonicalSuffix(it.first.server.host());
if (!canonical_suffix)
continue;
ServerInfoMapKey key = CreateServerInfoKey(
url::SchemeHostPort(kCanonicalScheme, *canonical_suffix,
kCanonicalPort),
- it->first.network_isolation_key);
+ it.first.network_isolation_key);
// If we already have a valid canonical server, we're done.
if (base::Contains(canonical_alt_svc_map_, key)) {
auto key_it = server_info_map_.Peek(key);
@@ -1172,7 +1172,7 @@ void HttpServerProperties::OnServerInfoLoaded(
continue;
}
}
- canonical_alt_svc_map_[key] = it->first.server;
+ canonical_alt_svc_map_[key] = it.first.server;
}
}
diff --git a/chromium/net/http/http_server_properties.h b/chromium/net/http/http_server_properties.h
index 94c1573e620..e262aad6098 100644
--- a/chromium/net/http/http_server_properties.h
+++ b/chromium/net/http/http_server_properties.h
@@ -234,10 +234,11 @@ class NET_EXPORT HttpServerProperties
//
// |clock| is used for converting base::TimeTicks to base::Time for
// wherever base::Time is preferable.
- HttpServerProperties(std::unique_ptr<PrefDelegate> pref_delegate = nullptr,
- NetLog* net_log = nullptr,
- const base::TickClock* tick_clock = nullptr,
- base::Clock* clock = nullptr);
+ explicit HttpServerProperties(
+ std::unique_ptr<PrefDelegate> pref_delegate = nullptr,
+ NetLog* net_log = nullptr,
+ const base::TickClock* tick_clock = nullptr,
+ base::Clock* clock = nullptr);
HttpServerProperties(const HttpServerProperties&) = delete;
HttpServerProperties& operator=(const HttpServerProperties&) = delete;
@@ -464,6 +465,15 @@ class NET_EXPORT HttpServerProperties
return server_info_map_;
}
+ const BrokenAlternativeServices& broken_alternative_services_for_testing()
+ const {
+ return broken_alternative_services_;
+ }
+
+ const QuicServerInfoMap& quic_server_info_map_for_testing() const {
+ return quic_server_info_map_;
+ }
+
// TODO(mmenke): Look into removing this.
HttpServerPropertiesManager* properties_manager_for_testing() {
return properties_manager_.get();
diff --git a/chromium/net/http/http_server_properties_manager.cc b/chromium/net/http/http_server_properties_manager.cc
index 7f7e696bea7..a383e1c7d79 100644
--- a/chromium/net/http/http_server_properties_manager.cc
+++ b/chromium/net/http/http_server_properties_manager.cc
@@ -4,6 +4,7 @@
#include "net/http/http_server_properties_manager.h"
+#include <algorithm>
#include <utility>
#include "base/bind.h"
@@ -246,9 +247,9 @@ void HttpServerPropertiesManager::ReadPrefs(
}
// For Version 5, data is stored in the following format.
- // |servers| are saved in MRU order. |servers| are in the format flattened
- // representation of (scheme/host/port) where port might be ignored if is
- // default with scheme.
+ // `servers` are saved in LRU order (least-recently-used item is in the
+ // front). `servers` are in the format flattened representation of
+ // (scheme/host/port) where port might be ignored if is default with scheme.
//
// "http_server_properties": {
// "servers": [
@@ -276,16 +277,14 @@ void HttpServerPropertiesManager::ReadPrefs(
bool use_network_isolation_key = base::FeatureList::IsEnabled(
features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
- // Iterate servers list in reverse MRU order so that entries are inserted
- // into |spdy_servers_map|, |alternative_service_map|, and
- // |server_network_stats_map| from oldest to newest.
- for (auto it = servers_list->end(); it != servers_list->begin();) {
- --it;
- if (!it->is_dict()) {
+ // Iterate `servers_list` (least-recently-used item is in the front) so that
+ // entries are inserted into `server_info_map` from oldest to newest.
+ for (const auto& server_dict_value : *servers_list) {
+ if (!server_dict_value.is_dict()) {
DVLOG(1) << "Malformed http_server_properties for servers dictionary.";
continue;
}
- AddServerData(it->GetDict(), server_info_map->get(),
+ AddServerData(server_dict_value.GetDict(), server_info_map->get(),
use_network_isolation_key);
}
@@ -303,16 +302,16 @@ void HttpServerPropertiesManager::ReadPrefs(
std::make_unique<RecentlyBrokenAlternativeServices>(
kMaxRecentlyBrokenAlternativeServiceEntries);
- // Iterate list in reverse-MRU order
- for (auto it = broken_alt_svc_list->end();
- it != broken_alt_svc_list->begin();) {
- --it;
- if (!it->is_dict()) {
+ // Iterate `broken_alt_svc_list` (least-recently-used item is in the front)
+ // so that entries are inserted into `recently_broken_alternative_services`
+ // from oldest to newest.
+ for (const auto& broken_alt_svc_entry_dict_value : *broken_alt_svc_list) {
+ if (!broken_alt_svc_entry_dict_value.is_dict()) {
DVLOG(1) << "Malformed broken alterantive service entry.";
continue;
}
AddToBrokenAlternativeServices(
- it->GetDict(), use_network_isolation_key,
+ broken_alt_svc_entry_dict_value.GetDict(), use_network_isolation_key,
broken_alternative_service_list->get(),
recently_broken_alternative_services->get());
}
@@ -710,14 +709,12 @@ void HttpServerPropertiesManager::WriteToPrefs(
std::set<std::pair<std::string, NetworkIsolationKey>>
persisted_canonical_suffix_set;
const base::Time now = base::Time::Now();
- base::Value http_server_properties_value(base::Value::Type::DICTIONARY);
- base::Value::Dict& http_server_properties_dict =
- http_server_properties_value.GetDict();
+ base::Value::Dict http_server_properties_dict;
// Convert |server_info_map| to a list Value and add it to
// |http_server_properties_dict|.
base::Value::List servers_list;
- for (const auto& [key, server_info] : base::Reversed(server_info_map)) {
+ for (const auto& [key, server_info] : server_info_map) {
// If can't convert the NetworkIsolationKey to a value, don't save to disk.
// Generally happens because the key is for a unique origin.
base::Value network_isolation_key_value;
@@ -752,6 +749,9 @@ void HttpServerPropertiesManager::WriteToPrefs(
std::move(network_isolation_key_value));
servers_list.Append(std::move(server_dict));
}
+ // Reverse `servers_list`. The least recently used item will be in the front.
+ std::reverse(servers_list.begin(), servers_list.end());
+
http_server_properties_dict.Set(kServersKey, std::move(servers_list));
http_server_properties_dict.Set(kVersionKey, kVersionNumber);
@@ -766,11 +766,12 @@ void HttpServerPropertiesManager::WriteToPrefs(
broken_alternative_service_list, kMaxBrokenAlternativeServicesToPersist,
recently_broken_alternative_services, http_server_properties_dict);
- pref_delegate_->SetServerProperties(http_server_properties_value,
- std::move(callback));
+ pref_delegate_->SetServerProperties(
+ base::Value(http_server_properties_dict.Clone()), std::move(callback));
- net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_PREFS,
- [&] { return http_server_properties_value.Clone(); });
+ net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_PREFS, [&] {
+ return base::Value(std::move(http_server_properties_dict));
+ });
}
void HttpServerPropertiesManager::SaveAlternativeServiceToServerPrefs(
@@ -868,8 +869,8 @@ void HttpServerPropertiesManager::SaveBrokenAlternativeServicesToPrefs(
return;
}
- // JSON list will be in MRU order according to
- // |recently_broken_alternative_services|.
+ // JSON list will be in LRU order (least-recently-used item is in the front)
+ // according to `recently_broken_alternative_services`.
base::Value::List json_list;
// Maps recently-broken alternative services to the index where it's stored
diff --git a/chromium/net/http/http_server_properties_manager_unittest.cc b/chromium/net/http/http_server_properties_manager_unittest.cc
index df6ed2e114e..3ba9c9b6249 100644
--- a/chromium/net/http/http_server_properties_manager_unittest.cc
+++ b/chromium/net/http/http_server_properties_manager_unittest.cc
@@ -225,11 +225,11 @@ class HttpServerPropertiesManagerTest : public testing::Test,
void SetUp() override {
one_day_from_now_ = base::Time::Now() + base::Days(1);
advertised_versions_ = DefaultSupportedQuicVersions();
- pref_delegate_ = new MockPrefDelegate;
+ auto pref_delegate = std::make_unique<MockPrefDelegate>();
+ pref_delegate_ = pref_delegate.get();
http_server_props_ = std::make_unique<HttpServerProperties>(
- base::WrapUnique(pref_delegate_.get()), /*net_log=*/nullptr,
- GetMockTickClock());
+ std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
EXPECT_FALSE(http_server_props_->IsInitialized());
EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
@@ -2376,22 +2376,19 @@ TEST_F(HttpServerPropertiesManagerTest,
std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
unowned_pref_delegate->InitializePrefs(saved_value);
- // Only the first of the values learned for kNetworkIsolationKey1 should have
+ // Only the last of the values learned for kNetworkIsolationKey1 should have
// been saved, and the value for kNetworkIsolationKey2 as well. The canonical
// suffix logic should still be respected.
- //
- // TODO(mmenke): Preferring the oldest value seems unexpected.
- // https://crbug.com/994842.
EXPECT_EQ(
- 1u,
+ 2u,
properties->GetAlternativeServiceInfos(kServer1, kNetworkIsolationKey1)
.size());
EXPECT_EQ(
- 1u,
+ 2u,
properties->GetAlternativeServiceInfos(kServer2, kNetworkIsolationKey1)
.size());
EXPECT_EQ(
- 1u,
+ 2u,
properties->GetAlternativeServiceInfos(kServer3, kNetworkIsolationKey1)
.size());
EXPECT_EQ(
@@ -3050,4 +3047,153 @@ TEST_F(HttpServerPropertiesManagerTest, AdvertisedVersionsRoundTrip) {
}
}
+TEST_F(HttpServerPropertiesManagerTest, SameOrderAfterReload) {
+ const SchemefulSite kSite1(GURL("https://foo.test/"));
+ const SchemefulSite kSite2(GURL("https://bar.test/"));
+ const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
+ const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
+
+ base::test::ScopedFeatureList feature_list;
+ feature_list.InitAndEnableFeature(
+ features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
+
+ // Create and initialize an HttpServerProperties with no state.
+ std::unique_ptr<MockPrefDelegate> pref_delegate =
+ std::make_unique<MockPrefDelegate>();
+ MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
+ std::unique_ptr<HttpServerProperties> properties =
+ std::make_unique<HttpServerProperties>(std::move(pref_delegate),
+ /*net_log=*/nullptr,
+ GetMockTickClock());
+ unowned_pref_delegate->InitializePrefs(
+ base::Value(base::Value::Type::DICTIONARY));
+
+ // Set alternative_service info.
+ base::Time expiration = base::Time::Now() + base::Days(1);
+ AlternativeServiceInfo alt_service1 =
+ AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
+ AlternativeService(kProtoQUIC, "1.example", 1234), expiration,
+ DefaultSupportedQuicVersions());
+ AlternativeServiceInfo alt_service2 =
+ AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
+ AlternativeService(kProtoHTTP2, "2.example", 443), expiration);
+ AlternativeServiceInfo alt_service3 =
+ AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
+ AlternativeService(kProtoHTTP2, "3.example", 443), expiration);
+ const url::SchemeHostPort kServer1("https", "1.example", 443);
+ const url::SchemeHostPort kServer2("https", "2.example", 443);
+ const url::SchemeHostPort kServer3("https", "3.example", 443);
+ properties->SetAlternativeServices(kServer1, kNetworkIsolationKey1,
+ {alt_service1});
+ properties->SetAlternativeServices(kServer2, kNetworkIsolationKey1,
+ {alt_service2});
+ properties->SetAlternativeServices(kServer3, kNetworkIsolationKey2,
+ {alt_service3});
+
+ // Set quic_server_info.
+ quic::QuicServerId quic_server_id1("quic1.example", 80, false);
+ quic::QuicServerId quic_server_id2("quic2.example", 80, false);
+ quic::QuicServerId quic_server_id3("quic3.example", 80, false);
+ properties->SetQuicServerInfo(quic_server_id1, kNetworkIsolationKey1,
+ "quic_server_info1");
+ properties->SetQuicServerInfo(quic_server_id2, kNetworkIsolationKey1,
+ "quic_server_info2");
+ properties->SetQuicServerInfo(quic_server_id3, kNetworkIsolationKey2,
+ "quic_server_info3");
+
+ // Set broken_alternative_service info.
+ AlternativeService broken_service1(kProtoQUIC, "broken1.example", 443);
+ AlternativeService broken_service2(kProtoQUIC, "broken2.example", 443);
+ AlternativeService broken_service3(kProtoQUIC, "broken3.example", 443);
+ properties->MarkAlternativeServiceBroken(broken_service1,
+ kNetworkIsolationKey1);
+ FastForwardBy(base::Milliseconds(1));
+ properties->MarkAlternativeServiceBroken(broken_service2,
+ kNetworkIsolationKey1);
+ FastForwardBy(base::Milliseconds(1));
+ properties->MarkAlternativeServiceBroken(broken_service3,
+ kNetworkIsolationKey2);
+
+ // The first item of `server_info_map` must be the latest item.
+ EXPECT_EQ(3u, properties->server_info_map_for_testing().size());
+ EXPECT_EQ(
+ properties->server_info_map_for_testing().begin()->first.server.host(),
+ "3.example");
+
+ // The first item of `recently_broken_alternative_services` must be the latest
+ // item.
+ EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
+ .recently_broken_alternative_services()
+ .size());
+ EXPECT_EQ("broken3.example",
+ properties->broken_alternative_services_for_testing()
+ .recently_broken_alternative_services()
+ .begin()
+ ->first.alternative_service.host);
+
+ // The first item of `quic_server_info_map` must be the latest item.
+ EXPECT_EQ(3u, properties->quic_server_info_map_for_testing().size());
+ EXPECT_EQ("quic3.example", properties->quic_server_info_map_for_testing()
+ .begin()
+ ->first.server_id.host());
+
+ // The first item of `broken_alternative_service_list` must be the oldest
+ // item.
+ EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
+ .broken_alternative_service_list()
+ .size());
+ EXPECT_EQ("broken1.example",
+ properties->broken_alternative_services_for_testing()
+ .broken_alternative_service_list()
+ .begin()
+ ->first.alternative_service.host);
+
+ // Wait until the data's been written to prefs, and then tear down the
+ // HttpServerProperties.
+ FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
+ base::Value saved_value =
+ unowned_pref_delegate->GetServerProperties()->Clone();
+
+ // Create a new HttpServerProperties using the value saved to prefs above.
+ pref_delegate = std::make_unique<MockPrefDelegate>();
+ unowned_pref_delegate = pref_delegate.get();
+ properties = std::make_unique<HttpServerProperties>(
+ std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
+ unowned_pref_delegate->InitializePrefs(saved_value);
+
+ // The first item of `server_info_map` must be the latest item.
+ EXPECT_EQ(3u, properties->server_info_map_for_testing().size());
+ EXPECT_EQ(
+ properties->server_info_map_for_testing().begin()->first.server.host(),
+ "3.example");
+
+ // The first item of `recently_broken_alternative_services` must be the latest
+ // item.
+ EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
+ .recently_broken_alternative_services()
+ .size());
+ EXPECT_EQ("broken3.example",
+ properties->broken_alternative_services_for_testing()
+ .recently_broken_alternative_services()
+ .begin()
+ ->first.alternative_service.host);
+
+ // The first item of `quic_server_info_map` must be the latest item.
+ EXPECT_EQ(3u, properties->quic_server_info_map_for_testing().size());
+ EXPECT_EQ("quic3.example", properties->quic_server_info_map_for_testing()
+ .begin()
+ ->first.server_id.host());
+
+ // The first item of `broken_alternative_service_list` must be the oldest
+ // item.
+ EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
+ .broken_alternative_service_list()
+ .size());
+ EXPECT_EQ("broken1.example",
+ properties->broken_alternative_services_for_testing()
+ .broken_alternative_service_list()
+ .begin()
+ ->first.alternative_service.host);
+}
+
} // namespace net
diff --git a/chromium/net/http/http_status_code.cc b/chromium/net/http/http_status_code.cc
index 84d8c23e36d..7ad16c916f5 100644
--- a/chromium/net/http/http_status_code.cc
+++ b/chromium/net/http/http_status_code.cc
@@ -12,10 +12,11 @@ namespace net {
const char* GetHttpReasonPhrase(HttpStatusCode code) {
switch (code) {
-
-#define HTTP_STATUS(label, code, reason) case HTTP_ ## label: return reason;
+#define HTTP_STATUS_ENUM_VALUE(label, code, reason) \
+ case HTTP_##label: \
+ return reason;
#include "net/http/http_status_code_list.h"
-#undef HTTP_STATUS
+#undef HTTP_STATUS_ENUM_VALUE
default:
NOTREACHED() << "unknown HTTP status code " << code;
diff --git a/chromium/net/http/http_status_code.h b/chromium/net/http/http_status_code.h
index a4b398b5038..37407e14c20 100644
--- a/chromium/net/http/http_status_code.h
+++ b/chromium/net/http/http_status_code.h
@@ -12,9 +12,9 @@ namespace net {
// HTTP status codes.
enum HttpStatusCode {
-#define HTTP_STATUS(label, code, reason) HTTP_ ## label = code,
+#define HTTP_STATUS_ENUM_VALUE(label, code, reason) HTTP_##label = code,
#include "net/http/http_status_code_list.h"
-#undef HTTP_STATUS
+#undef HTTP_STATUS_ENUM_VALUE
};
diff --git a/chromium/net/http/http_status_code_list.h b/chromium/net/http/http_status_code_list.h
index 669b3724340..b690287b348 100644
--- a/chromium/net/http/http_status_code_list.h
+++ b/chromium/net/http/http_status_code_list.h
@@ -12,64 +12,71 @@
// Code Registry.
// http://www.iana.org/assignments/http-status-codes/http-status-codes.xml
-#ifndef HTTP_STATUS
+#ifndef HTTP_STATUS_ENUM_VALUE
#error "Do #include net/http/http_status_code.h instead of this file directly."
#endif
// Informational 1xx
-HTTP_STATUS(CONTINUE, 100, "Continue")
-HTTP_STATUS(SWITCHING_PROTOCOLS, 101, "Switching Protocols")
-HTTP_STATUS(EARLY_HINTS, 103, "Early Hints")
+HTTP_STATUS_ENUM_VALUE(CONTINUE, 100, "Continue")
+HTTP_STATUS_ENUM_VALUE(SWITCHING_PROTOCOLS, 101, "Switching Protocols")
+HTTP_STATUS_ENUM_VALUE(EARLY_HINTS, 103, "Early Hints")
// Successful 2xx
-HTTP_STATUS(OK, 200, "OK")
-HTTP_STATUS(CREATED, 201, "Created")
-HTTP_STATUS(ACCEPTED, 202, "Accepted")
-HTTP_STATUS(NON_AUTHORITATIVE_INFORMATION, 203, "Non-Authoritative Information")
-HTTP_STATUS(NO_CONTENT, 204, "No Content")
-HTTP_STATUS(RESET_CONTENT, 205, "Reset Content")
-HTTP_STATUS(PARTIAL_CONTENT, 206, "Partial Content")
+HTTP_STATUS_ENUM_VALUE(OK, 200, "OK")
+HTTP_STATUS_ENUM_VALUE(CREATED, 201, "Created")
+HTTP_STATUS_ENUM_VALUE(ACCEPTED, 202, "Accepted")
+HTTP_STATUS_ENUM_VALUE(NON_AUTHORITATIVE_INFORMATION,
+ 203,
+ "Non-Authoritative Information")
+HTTP_STATUS_ENUM_VALUE(NO_CONTENT, 204, "No Content")
+HTTP_STATUS_ENUM_VALUE(RESET_CONTENT, 205, "Reset Content")
+HTTP_STATUS_ENUM_VALUE(PARTIAL_CONTENT, 206, "Partial Content")
// Redirection 3xx
-HTTP_STATUS(MULTIPLE_CHOICES, 300, "Multiple Choices")
-HTTP_STATUS(MOVED_PERMANENTLY, 301, "Moved Permanently")
-HTTP_STATUS(FOUND, 302, "Found")
-HTTP_STATUS(SEE_OTHER, 303, "See Other")
-HTTP_STATUS(NOT_MODIFIED, 304, "Not Modified")
-HTTP_STATUS(USE_PROXY, 305, "Use Proxy")
+HTTP_STATUS_ENUM_VALUE(MULTIPLE_CHOICES, 300, "Multiple Choices")
+HTTP_STATUS_ENUM_VALUE(MOVED_PERMANENTLY, 301, "Moved Permanently")
+HTTP_STATUS_ENUM_VALUE(FOUND, 302, "Found")
+HTTP_STATUS_ENUM_VALUE(SEE_OTHER, 303, "See Other")
+HTTP_STATUS_ENUM_VALUE(NOT_MODIFIED, 304, "Not Modified")
+HTTP_STATUS_ENUM_VALUE(USE_PROXY, 305, "Use Proxy")
// 306 is no longer used.
-HTTP_STATUS(TEMPORARY_REDIRECT, 307, "Temporary Redirect")
-HTTP_STATUS(PERMANENT_REDIRECT, 308, "Permanent Redirect")
+HTTP_STATUS_ENUM_VALUE(TEMPORARY_REDIRECT, 307, "Temporary Redirect")
+HTTP_STATUS_ENUM_VALUE(PERMANENT_REDIRECT, 308, "Permanent Redirect")
// Client error 4xx
-HTTP_STATUS(BAD_REQUEST, 400, "Bad Request")
-HTTP_STATUS(UNAUTHORIZED, 401, "Unauthorized")
-HTTP_STATUS(PAYMENT_REQUIRED, 402, "Payment Required")
-HTTP_STATUS(FORBIDDEN, 403, "Forbidden")
-HTTP_STATUS(NOT_FOUND, 404, "Not Found")
-HTTP_STATUS(METHOD_NOT_ALLOWED, 405, "Method Not Allowed")
-HTTP_STATUS(NOT_ACCEPTABLE, 406, "Not Acceptable")
-HTTP_STATUS(PROXY_AUTHENTICATION_REQUIRED, 407, "Proxy Authentication Required")
-HTTP_STATUS(REQUEST_TIMEOUT, 408, "Request Timeout")
-HTTP_STATUS(CONFLICT, 409, "Conflict")
-HTTP_STATUS(GONE, 410, "Gone")
-HTTP_STATUS(LENGTH_REQUIRED, 411, "Length Required")
-HTTP_STATUS(PRECONDITION_FAILED, 412, "Precondition Failed")
-HTTP_STATUS(REQUEST_ENTITY_TOO_LARGE, 413, "Request Entity Too Large")
-HTTP_STATUS(REQUEST_URI_TOO_LONG, 414, "Request-URI Too Long")
-HTTP_STATUS(UNSUPPORTED_MEDIA_TYPE, 415, "Unsupported Media Type")
-HTTP_STATUS(REQUESTED_RANGE_NOT_SATISFIABLE, 416,
- "Requested Range Not Satisfiable")
-HTTP_STATUS(EXPECTATION_FAILED, 417, "Expectation Failed")
+HTTP_STATUS_ENUM_VALUE(BAD_REQUEST, 400, "Bad Request")
+HTTP_STATUS_ENUM_VALUE(UNAUTHORIZED, 401, "Unauthorized")
+HTTP_STATUS_ENUM_VALUE(PAYMENT_REQUIRED, 402, "Payment Required")
+HTTP_STATUS_ENUM_VALUE(FORBIDDEN, 403, "Forbidden")
+HTTP_STATUS_ENUM_VALUE(NOT_FOUND, 404, "Not Found")
+HTTP_STATUS_ENUM_VALUE(METHOD_NOT_ALLOWED, 405, "Method Not Allowed")
+HTTP_STATUS_ENUM_VALUE(NOT_ACCEPTABLE, 406, "Not Acceptable")
+HTTP_STATUS_ENUM_VALUE(PROXY_AUTHENTICATION_REQUIRED,
+ 407,
+ "Proxy Authentication Required")
+HTTP_STATUS_ENUM_VALUE(REQUEST_TIMEOUT, 408, "Request Timeout")
+HTTP_STATUS_ENUM_VALUE(CONFLICT, 409, "Conflict")
+HTTP_STATUS_ENUM_VALUE(GONE, 410, "Gone")
+HTTP_STATUS_ENUM_VALUE(LENGTH_REQUIRED, 411, "Length Required")
+HTTP_STATUS_ENUM_VALUE(PRECONDITION_FAILED, 412, "Precondition Failed")
+HTTP_STATUS_ENUM_VALUE(REQUEST_ENTITY_TOO_LARGE,
+ 413,
+ "Request Entity Too Large")
+HTTP_STATUS_ENUM_VALUE(REQUEST_URI_TOO_LONG, 414, "Request-URI Too Long")
+HTTP_STATUS_ENUM_VALUE(UNSUPPORTED_MEDIA_TYPE, 415, "Unsupported Media Type")
+HTTP_STATUS_ENUM_VALUE(REQUESTED_RANGE_NOT_SATISFIABLE,
+ 416,
+ "Requested Range Not Satisfiable")
+HTTP_STATUS_ENUM_VALUE(EXPECTATION_FAILED, 417, "Expectation Failed")
// 418 returned by Cloud Print.
-HTTP_STATUS(INVALID_XPRIVET_TOKEN, 418, "Invalid XPrivet Token")
-HTTP_STATUS(TOO_EARLY, 425, "Too Early")
-HTTP_STATUS(TOO_MANY_REQUESTS, 429, "Too Many Requests")
+HTTP_STATUS_ENUM_VALUE(INVALID_XPRIVET_TOKEN, 418, "Invalid XPrivet Token")
+HTTP_STATUS_ENUM_VALUE(TOO_EARLY, 425, "Too Early")
+HTTP_STATUS_ENUM_VALUE(TOO_MANY_REQUESTS, 429, "Too Many Requests")
// Server error 5xx
-HTTP_STATUS(INTERNAL_SERVER_ERROR, 500, "Internal Server Error")
-HTTP_STATUS(NOT_IMPLEMENTED, 501, "Not Implemented")
-HTTP_STATUS(BAD_GATEWAY, 502, "Bad Gateway")
-HTTP_STATUS(SERVICE_UNAVAILABLE, 503, "Service Unavailable")
-HTTP_STATUS(GATEWAY_TIMEOUT, 504, "Gateway Timeout")
-HTTP_STATUS(VERSION_NOT_SUPPORTED, 505, "HTTP Version Not Supported")
+HTTP_STATUS_ENUM_VALUE(INTERNAL_SERVER_ERROR, 500, "Internal Server Error")
+HTTP_STATUS_ENUM_VALUE(NOT_IMPLEMENTED, 501, "Not Implemented")
+HTTP_STATUS_ENUM_VALUE(BAD_GATEWAY, 502, "Bad Gateway")
+HTTP_STATUS_ENUM_VALUE(SERVICE_UNAVAILABLE, 503, "Service Unavailable")
+HTTP_STATUS_ENUM_VALUE(GATEWAY_TIMEOUT, 504, "Gateway Timeout")
+HTTP_STATUS_ENUM_VALUE(VERSION_NOT_SUPPORTED, 505, "HTTP Version Not Supported")
diff --git a/chromium/net/http/http_stream.h b/chromium/net/http/http_stream.h
index 80712a613ff..2b35bca0f8f 100644
--- a/chromium/net/http/http_stream.h
+++ b/chromium/net/http/http_stream.h
@@ -41,12 +41,12 @@ class SSLInfo;
class NET_EXPORT_PRIVATE HttpStream {
public:
- HttpStream() {}
+ HttpStream() = default;
HttpStream(const HttpStream&) = delete;
HttpStream& operator=(const HttpStream&) = delete;
- virtual ~HttpStream() {}
+ virtual ~HttpStream() = default;
// Registers the HTTP request for the stream. Must be called before calling
// InitializeStream(). Separating the registration of the request from the
@@ -194,7 +194,7 @@ class NET_EXPORT_PRIVATE HttpStream {
// called on the old stream. The caller should ensure that the response body
// from the previous request is drained before calling this method. If the
// subclass does not support renewing the stream, NULL is returned.
- virtual HttpStream* RenewStreamForAuth() = 0;
+ virtual std::unique_ptr<HttpStream> RenewStreamForAuth() = 0;
virtual void SetRequestHeadersCallback(RequestHeadersCallback callback) = 0;
diff --git a/chromium/net/http/http_stream_factory.cc b/chromium/net/http/http_stream_factory.cc
index 4b3a3463c5a..010bbe37441 100644
--- a/chromium/net/http/http_stream_factory.cc
+++ b/chromium/net/http/http_stream_factory.cc
@@ -46,7 +46,7 @@ const char kAlternativeServiceHeader[] = "Alt-Svc";
HttpStreamFactory::HttpStreamFactory(HttpNetworkSession* session)
: session_(session), job_factory_(std::make_unique<JobFactory>()) {}
-HttpStreamFactory::~HttpStreamFactory() {}
+HttpStreamFactory::~HttpStreamFactory() = default;
void HttpStreamFactory::ProcessAlternativeServices(
HttpNetworkSession* session,
diff --git a/chromium/net/http/http_stream_factory.h b/chromium/net/http/http_stream_factory.h
index 694d071b9b1..e22f5481c66 100644
--- a/chromium/net/http/http_stream_factory.h
+++ b/chromium/net/http/http_stream_factory.h
@@ -46,9 +46,21 @@ class NET_EXPORT HttpStreamFactory {
class NET_EXPORT_PRIVATE JobFactory;
enum JobType {
+ // Job that will connect via HTTP/1 or HTTP/2. This may be paused for a
+ // while when ALTERNATIVE or DNS_ALPN_H3 job was created.
MAIN,
+ // Job that will connect via HTTP/3 iff Chrome has received an Alt-Svc
+ // header from the origin.
ALTERNATIVE,
+ // Job that will connect via HTTP/3 iff an "h3" value was found in the ALPN
+ // list of an HTTPS DNS record.
+ DNS_ALPN_H3,
+ // Job that will preconnect. This uses HTTP/3 iff Chrome has received an
+ // Alt-Svc header from the origin. Otherwise, it use HTTP/1 or HTTP/2.
PRECONNECT,
+ // Job that will preconnect via HTTP/3 iff an "h3" value was found in the
+ // ALPN list of an HTTPS DNS record.
+ PRECONNECT_DNS_ALPN_H3,
};
explicit HttpStreamFactory(HttpNetworkSession* session);
diff --git a/chromium/net/http/http_stream_factory_job.cc b/chromium/net/http/http_stream_factory_job.cc
index f0a2edc34f1..aed8dbf53a9 100644
--- a/chromium/net/http/http_stream_factory_job.cc
+++ b/chromium/net/http/http_stream_factory_job.cc
@@ -71,31 +71,48 @@ const base::Feature kLimitEarlyPreconnectsExperiment{
} // namespace
+const char* NetLogHttpStreamJobType(HttpStreamFactory::JobType job_type) {
+ switch (job_type) {
+ case HttpStreamFactory::MAIN:
+ return "main";
+ case HttpStreamFactory::ALTERNATIVE:
+ return "alternative";
+ case HttpStreamFactory::DNS_ALPN_H3:
+ return "dns_alpn_h3";
+ case HttpStreamFactory::PRECONNECT:
+ return "preconnect";
+ case HttpStreamFactory::PRECONNECT_DNS_ALPN_H3:
+ return "preconnect_dns_alpn_h3";
+ }
+ return "";
+}
+
// Returns parameters associated with the start of a HTTP stream job.
base::Value NetLogHttpStreamJobParams(const NetLogSource& source,
const GURL& original_url,
const GURL& url,
bool expect_spdy,
bool using_quic,
+ HttpStreamFactory::JobType job_type,
RequestPriority priority) {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
if (source.IsValid())
- source.AddToEventParameters(&dict);
- dict.SetStringKey("original_url",
- original_url.DeprecatedGetOriginAsURL().spec());
- dict.SetStringKey("url", url.DeprecatedGetOriginAsURL().spec());
- dict.SetBoolKey("expect_spdy", expect_spdy);
- dict.SetBoolKey("using_quic", using_quic);
- dict.SetStringKey("priority", RequestPriorityToString(priority));
- return dict;
+ source.AddToEventParameters(dict);
+ dict.Set("original_url", original_url.DeprecatedGetOriginAsURL().spec());
+ dict.Set("url", url.DeprecatedGetOriginAsURL().spec());
+ dict.Set("expect_spdy", expect_spdy);
+ dict.Set("using_quic", using_quic);
+ dict.Set("priority", RequestPriorityToString(priority));
+ dict.Set("type", NetLogHttpStreamJobType(job_type));
+ return base::Value(std::move(dict));
}
// Returns parameters associated with the ALPN protocol of a HTTP stream.
base::Value NetLogHttpStreamProtoParams(NextProto negotiated_protocol) {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
- dict.SetStringKey("proto", NextProtoToString(negotiated_protocol));
- return dict;
+ dict.Set("proto", NextProtoToString(negotiated_protocol));
+ return base::Value(std::move(dict));
}
HttpStreamFactory::Job::Job(Delegate* delegate,
@@ -122,7 +139,7 @@ HttpStreamFactory::Job::Job(Delegate* delegate,
NetLogWithSource::Make(net_log, NetLogSourceType::HTTP_STREAM_JOB)),
io_callback_(
base::BindRepeating(&Job::OnIOComplete, base::Unretained(this))),
- connection_(new ClientSocketHandle),
+ connection_(std::make_unique<ClientSocketHandle>()),
session_(session),
destination_(std::move(destination)),
origin_url_(origin_url),
@@ -143,7 +160,8 @@ HttpStreamFactory::Job::Job(Delegate* delegate,
origin_url_.SchemeIs(url::kWssScheme)),
using_quic_(
alternative_protocol == kProtoQUIC ||
- (ShouldForceQuic(session, destination_, proxy_info, using_ssl_))),
+ (ShouldForceQuic(session, destination_, proxy_info, using_ssl_)) ||
+ job_type == DNS_ALPN_H3 || job_type == PRECONNECT_DNS_ALPN_H3),
quic_version_(quic_version),
expect_spdy_(alternative_protocol == kProtoHTTP2 && !using_quic_),
quic_request_(session_->quic_stream_factory()),
@@ -180,8 +198,10 @@ HttpStreamFactory::Job::Job(Delegate* delegate,
session->context().quic_context->params()->supported_versions[0];
}
- if (using_quic_)
- DCHECK_NE(quic_version_, quic::ParsedQuicVersion::Unsupported());
+ if (using_quic_) {
+ DCHECK((quic_version_ != quic::ParsedQuicVersion::Unsupported()) ||
+ (job_type_ == DNS_ALPN_H3) || (job_type_ == PRECONNECT_DNS_ALPN_H3));
+ }
DCHECK(session);
if (alternative_protocol != kProtoUnknown) {
@@ -275,7 +295,7 @@ void HttpStreamFactory::Job::Resume() {
}
void HttpStreamFactory::Job::Orphan() {
- DCHECK_EQ(job_type_, ALTERNATIVE);
+ DCHECK(job_type_ == ALTERNATIVE || job_type_ == DNS_ALPN_H3);
net_log_.AddEvent(NetLogEventType::HTTP_STREAM_JOB_ORPHANED);
// Watching for SPDY sessions isn't supported on orphaned jobs.
@@ -305,6 +325,28 @@ bool HttpStreamFactory::Job::HasAvailableSpdySession() const {
is_websocket_);
}
+bool HttpStreamFactory::Job::HasAvailableQuicSession() const {
+ if (!using_quic_)
+ return false;
+ bool require_dns_https_alpn = (job_type_ == DNS_ALPN_H3);
+ return quic_request_.CanUseExistingSession(
+ origin_url_, request_info_.privacy_mode, request_info_.socket_tag,
+ request_info_.network_isolation_key, request_info_.secure_dns_policy,
+ require_dns_https_alpn, destination_);
+}
+
+bool HttpStreamFactory::Job::TargettedSocketGroupHasActiveSocket() const {
+ DCHECK(!using_quic_);
+ DCHECK(!is_websocket_);
+ ClientSocketPool* pool = session_->GetSocketPool(
+ HttpNetworkSession::NORMAL_SOCKET_POOL, proxy_info_.proxy_server());
+ DCHECK(pool);
+ ClientSocketPool::GroupId connection_group(
+ destination_, request_info_.privacy_mode,
+ request_info_.network_isolation_key, request_info_.secure_dns_policy);
+ return pool->HasActiveSocket(connection_group);
+}
+
bool HttpStreamFactory::Job::was_alpn_negotiated() const {
return was_alpn_negotiated_;
}
@@ -405,6 +447,7 @@ bool HttpStreamFactory::Job::CanUseExistingSpdySession() const {
void HttpStreamFactory::Job::OnStreamReadyCallback() {
DCHECK(stream_.get());
DCHECK_NE(job_type_, PRECONNECT);
+ DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3);
DCHECK(!is_websocket_ || try_websocket_over_http2_);
MaybeCopyConnectionAttemptsFromHandle();
@@ -416,6 +459,7 @@ void HttpStreamFactory::Job::OnStreamReadyCallback() {
void HttpStreamFactory::Job::OnWebSocketHandshakeStreamReadyCallback() {
DCHECK(websocket_stream_);
DCHECK_NE(job_type_, PRECONNECT);
+ DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3);
DCHECK(is_websocket_);
MaybeCopyConnectionAttemptsFromHandle();
@@ -437,6 +481,7 @@ void HttpStreamFactory::Job::OnBidirectionalStreamImplReadyCallback() {
void HttpStreamFactory::Job::OnStreamFailedCallback(int result) {
DCHECK_NE(job_type_, PRECONNECT);
+ DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3);
MaybeCopyConnectionAttemptsFromHandle();
@@ -448,6 +493,7 @@ void HttpStreamFactory::Job::OnCertificateErrorCallback(
int result,
const SSLInfo& ssl_info) {
DCHECK_NE(job_type_, PRECONNECT);
+ DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3);
DCHECK(!spdy_session_request_);
MaybeCopyConnectionAttemptsFromHandle();
@@ -461,6 +507,7 @@ void HttpStreamFactory::Job::OnNeedsProxyAuthCallback(
HttpAuthController* auth_controller,
base::OnceClosure restart_with_auth_callback) {
DCHECK_NE(job_type_, PRECONNECT);
+ DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3);
DCHECK(establishing_tunnel_);
DCHECK(!restart_with_auth_callback_);
@@ -478,14 +525,15 @@ void HttpStreamFactory::Job::OnNeedsProxyAuthCallback(
void HttpStreamFactory::Job::OnNeedsClientAuthCallback(
SSLCertRequestInfo* cert_info) {
DCHECK_NE(job_type_, PRECONNECT);
+ DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3);
DCHECK(!spdy_session_request_);
delegate_->OnNeedsClientAuth(this, server_ssl_config_, cert_info);
// |this| may be deleted after this call.
}
-void HttpStreamFactory::Job::OnPreconnectsComplete() {
- delegate_->OnPreconnectsComplete(this);
+void HttpStreamFactory::Job::OnPreconnectsComplete(int result) {
+ delegate_->OnPreconnectsComplete(this, result);
// |this| may be deleted after this call.
}
@@ -505,11 +553,11 @@ void HttpStreamFactory::Job::RunLoop(int result) {
// while doing anything other than waiting to establish a connection.
spdy_session_request_.reset();
- if (job_type_ == PRECONNECT) {
+ if ((job_type_ == PRECONNECT) || (job_type_ == PRECONNECT_DNS_ALPN_H3)) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(&HttpStreamFactory::Job::OnPreconnectsComplete,
- ptr_factory_.GetWeakPtr()));
+ ptr_factory_.GetWeakPtr(), result));
return;
}
@@ -628,7 +676,7 @@ int HttpStreamFactory::Job::DoStart() {
net_log_.BeginEvent(NetLogEventType::HTTP_STREAM_JOB, [&] {
return NetLogHttpStreamJobParams(net_log->source(), request_info_.url,
origin_url_, expect_spdy_, using_quic_,
- priority_);
+ job_type_, priority_);
});
net_log->AddEventReferencingSource(
NetLogEventType::HTTP_STREAM_REQUEST_STARTED_JOB, net_log_.source());
@@ -880,13 +928,15 @@ int HttpStreamFactory::Job::DoInitConnectionImplQuic() {
ssl_config = &server_ssl_config_;
}
DCHECK(url.SchemeIs(url::kHttpsScheme));
+ bool require_dns_https_alpn =
+ (job_type_ == DNS_ALPN_H3) || (job_type_ == PRECONNECT_DNS_ALPN_H3);
int rv = quic_request_.Request(
std::move(destination), quic_version_, request_info_.privacy_mode,
priority_, request_info_.socket_tag, request_info_.network_isolation_key,
request_info_.secure_dns_policy, proxy_info_.is_direct(),
- /*require_dns_https_alpn=*/false, ssl_config->GetCertVerifyFlags(), url,
- net_log_, &net_error_details_,
+ require_dns_https_alpn, ssl_config->GetCertVerifyFlags(), url, net_log_,
+ &net_error_details_,
base::BindOnce(&Job::OnFailedOnDefaultNetwork, ptr_factory_.GetWeakPtr()),
io_callback_);
if (rv == OK) {
@@ -909,7 +959,7 @@ void HttpStreamFactory::Job::OnQuicHostResolution(int result) {
}
void HttpStreamFactory::Job::OnFailedOnDefaultNetwork(int result) {
- DCHECK_EQ(job_type_, ALTERNATIVE);
+ DCHECK(job_type_ == ALTERNATIVE || job_type_ == DNS_ALPN_H3);
DCHECK(using_quic_);
delegate_->OnFailedOnDefaultNetwork(this);
}
@@ -921,7 +971,7 @@ int HttpStreamFactory::Job::DoInitConnectionComplete(int result) {
// established.
spdy_session_request_.reset();
- if (job_type_ == PRECONNECT) {
+ if ((job_type_ == PRECONNECT) || (job_type_ == PRECONNECT_DNS_ALPN_H3)) {
if (using_quic_)
return result;
DCHECK_EQ(OK, result);
@@ -1071,6 +1121,7 @@ int HttpStreamFactory::Job::SetSpdyHttpStreamOrBidirectionalStreamImpl(
if (is_websocket_) {
DCHECK_NE(job_type_, PRECONNECT);
+ DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3);
DCHECK(delegate_->websocket_handshake_stream_create_helper());
if (!try_websocket_over_http2_) {
@@ -1111,6 +1162,7 @@ int HttpStreamFactory::Job::DoCreateStream() {
request_info_.url.SchemeIs(url::kHttpScheme);
if (is_websocket_) {
DCHECK_NE(job_type_, PRECONNECT);
+ DCHECK_NE(job_type_, PRECONNECT_DNS_ALPN_H3);
DCHECK(delegate_->websocket_handshake_stream_create_helper());
websocket_stream_ =
delegate_->websocket_handshake_stream_create_helper()
@@ -1223,7 +1275,7 @@ void HttpStreamFactory::Job::OnSpdySessionAvailable(
// If this is a preconnect, nothing left do to.
if (job_type_ == PRECONNECT) {
- OnPreconnectsComplete();
+ OnPreconnectsComplete(OK);
return;
}
@@ -1258,7 +1310,7 @@ HttpStreamFactory::JobFactory::JobFactory() = default;
HttpStreamFactory::JobFactory::~JobFactory() = default;
std::unique_ptr<HttpStreamFactory::Job>
-HttpStreamFactory::JobFactory::CreateMainJob(
+HttpStreamFactory::JobFactory::CreateJob(
HttpStreamFactory::Job::Delegate* delegate,
HttpStreamFactory::JobType job_type,
HttpNetworkSession* session,
@@ -1271,31 +1323,9 @@ HttpStreamFactory::JobFactory::CreateMainJob(
GURL origin_url,
bool is_websocket,
bool enable_ip_based_pooling,
- NetLog* net_log) {
- return std::make_unique<HttpStreamFactory::Job>(
- delegate, job_type, session, request_info, priority, proxy_info,
- server_ssl_config, proxy_ssl_config, std::move(destination), origin_url,
- kProtoUnknown, quic::ParsedQuicVersion::Unsupported(), is_websocket,
- enable_ip_based_pooling, net_log);
-}
-
-std::unique_ptr<HttpStreamFactory::Job>
-HttpStreamFactory::JobFactory::CreateAltSvcJob(
- HttpStreamFactory::Job::Delegate* delegate,
- HttpStreamFactory::JobType job_type,
- HttpNetworkSession* session,
- const HttpRequestInfo& request_info,
- RequestPriority priority,
- const ProxyInfo& proxy_info,
- const SSLConfig& server_ssl_config,
- const SSLConfig& proxy_ssl_config,
- url::SchemeHostPort destination,
- GURL origin_url,
+ NetLog* net_log,
NextProto alternative_protocol,
- quic::ParsedQuicVersion quic_version,
- bool is_websocket,
- bool enable_ip_based_pooling,
- NetLog* net_log) {
+ quic::ParsedQuicVersion quic_version) {
return std::make_unique<HttpStreamFactory::Job>(
delegate, job_type, session, request_info, priority, proxy_info,
server_ssl_config, proxy_ssl_config, std::move(destination), origin_url,
diff --git a/chromium/net/http/http_stream_factory_job.h b/chromium/net/http/http_stream_factory_job.h
index 1a176b71a8f..c5a47f914bf 100644
--- a/chromium/net/http/http_stream_factory_job.h
+++ b/chromium/net/http/http_stream_factory_job.h
@@ -65,7 +65,7 @@ class HttpStreamFactory::Job
// Delegate to report Job's status to HttpStreamRequest and HttpStreamFactory.
class NET_EXPORT_PRIVATE Delegate {
public:
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
// Invoked when |job| has an HttpStream ready.
virtual void OnStreamReady(Job* job, const SSLConfig& used_ssl_config) = 0;
@@ -110,7 +110,7 @@ class HttpStreamFactory::Job
HttpAuthController* auth_controller) = 0;
// Invoked when the |job| finishes pre-connecting sockets.
- virtual void OnPreconnectsComplete(Job* job) = 0;
+ virtual void OnPreconnectsComplete(Job* job, int result) = 0;
// Invoked to record connection attempts made by the socket layer to
// HttpStreamRequest if |job| is associated with HttpStreamRequest.
@@ -186,7 +186,7 @@ class HttpStreamFactory::Job
virtual void Resume();
// Called when |this| is orphaned by Delegate. This is valid for
- // ALTERNATIVE job only.
+ // ALTERNATIVE job and DNS_ALPN_H3 job.
void Orphan();
void SetPriority(RequestPriority priority);
@@ -195,6 +195,14 @@ class HttpStreamFactory::Job
// spdy session.
bool HasAvailableSpdySession() const;
+ // Returns true if the current request can be immediately sent on a existing
+ // QUIC session.
+ bool HasAvailableQuicSession() const;
+
+ // Returns true if a connected (idle or handed out) or connecting socket
+ // exists for the job. This method is not supported for WebSocket and QUIC.
+ bool TargettedSocketGroupHasActiveSocket() const;
+
const GURL& origin_url() const { return origin_url_; }
RequestPriority priority() const { return priority_; }
bool was_alpn_negotiated() const;
@@ -265,7 +273,7 @@ class HttpStreamFactory::Job
HttpAuthController* auth_controller,
base::OnceClosure restart_with_auth_callback);
void OnNeedsClientAuthCallback(SSLCertRequestInfo* cert_info);
- void OnPreconnectsComplete();
+ void OnPreconnectsComplete(int result);
void OnIOComplete(int result);
// RunLoop() finishes asynchronously and invokes one of the On* methods (see
@@ -475,22 +483,7 @@ class HttpStreamFactory::JobFactory {
virtual ~JobFactory();
- virtual std::unique_ptr<HttpStreamFactory::Job> CreateMainJob(
- HttpStreamFactory::Job::Delegate* delegate,
- HttpStreamFactory::JobType job_type,
- HttpNetworkSession* session,
- const HttpRequestInfo& request_info,
- RequestPriority priority,
- const ProxyInfo& proxy_info,
- const SSLConfig& server_ssl_config,
- const SSLConfig& proxy_ssl_config,
- url::SchemeHostPort destination,
- GURL origin_url,
- bool is_websocket,
- bool enable_ip_based_pooling,
- NetLog* net_log);
-
- virtual std::unique_ptr<HttpStreamFactory::Job> CreateAltSvcJob(
+ virtual std::unique_ptr<HttpStreamFactory::Job> CreateJob(
HttpStreamFactory::Job::Delegate* delegate,
HttpStreamFactory::JobType job_type,
HttpNetworkSession* session,
@@ -501,11 +494,12 @@ class HttpStreamFactory::JobFactory {
const SSLConfig& proxy_ssl_config,
url::SchemeHostPort destination,
GURL origin_url,
- NextProto alternative_protocol,
- quic::ParsedQuicVersion quic_version,
bool is_websocket,
bool enable_ip_based_pooling,
- NetLog* net_log);
+ NetLog* net_log,
+ NextProto alternative_protocol = kProtoUnknown,
+ quic::ParsedQuicVersion quic_version =
+ quic::ParsedQuicVersion::Unsupported());
};
} // namespace net
diff --git a/chromium/net/http/http_stream_factory_job_controller.cc b/chromium/net/http/http_stream_factory_job_controller.cc
index 19dd80b8150..46435687f15 100644
--- a/chromium/net/http/http_stream_factory_job_controller.cc
+++ b/chromium/net/http/http_stream_factory_job_controller.cc
@@ -16,8 +16,10 @@
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/memory_usage_estimator.h"
#include "base/values.h"
+#include "net/base/features.h"
#include "net/base/host_mapping_rules.h"
#include "net/base/load_flags.h"
+#include "net/base/net_errors.h"
#include "net/base/privacy_mode.h"
#include "net/base/proxy_server.h"
#include "net/base/proxy_string_util.h"
@@ -44,13 +46,12 @@ namespace {
// Returns parameters associated with the proxy resolution.
base::Value NetLogHttpStreamJobProxyServerResolved(
const ProxyServer& proxy_server) {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
- dict.SetStringKey("proxy_server",
- proxy_server.is_valid()
- ? ProxyServerToPacResultElement(proxy_server)
- : std::string());
- return dict;
+ dict.Set("proxy_server", proxy_server.is_valid()
+ ? ProxyServerToPacResultElement(proxy_server)
+ : std::string());
+ return base::Value(std::move(dict));
}
GURL CreateAltSvcUrl(const GURL& origin_url,
@@ -95,6 +96,12 @@ void HistogramProxyUsed(const ProxyInfo& proxy_info, bool success) {
}
}
+// Generate a AlternativeService for DNS alt job. Note: Chrome does not yet
+// support different port DNS alpn.
+AlternativeService GetAlternativeServiceForDnsJob(const GURL& url) {
+ return AlternativeService(kProtoQUIC, HostPortPair::FromURL(url));
+}
+
} // namespace
// The maximum time to wait for the alternate job to complete before resuming
@@ -103,21 +110,20 @@ const int kMaxDelayTimeForMainJobSecs = 3;
base::Value NetLogJobControllerParams(const HttpRequestInfo& request_info,
bool is_preconnect) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("url", request_info.url.possibly_invalid_spec());
- dict.SetBoolKey("is_preconnect", is_preconnect);
- dict.SetStringKey("privacy_mode",
- PrivacyModeToDebugString(request_info.privacy_mode));
+ base::Value::Dict dict;
+ dict.Set("url", request_info.url.possibly_invalid_spec());
+ dict.Set("is_preconnect", is_preconnect);
+ dict.Set("privacy_mode", PrivacyModeToDebugString(request_info.privacy_mode));
- return dict;
+ return base::Value(std::move(dict));
}
base::Value NetLogAltSvcParams(const AlternativeServiceInfo* alt_svc_info,
bool is_broken) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("alt_svc", alt_svc_info->ToString());
- dict.SetBoolKey("is_broken", is_broken);
- return dict;
+ base::Value::Dict dict;
+ dict.Set("alt_svc", alt_svc_info->ToString());
+ dict.Set("is_broken", is_broken);
+ return base::Value(std::move(dict));
}
HttpStreamFactory::JobController::JobController(
@@ -167,6 +173,7 @@ HttpStreamFactory::JobController::JobController(
HttpStreamFactory::JobController::~JobController() {
main_job_.reset();
alternative_job_.reset();
+ dns_alpn_h3_job_.reset();
bound_job_ = nullptr;
if (proxy_resolve_request_) {
DCHECK_EQ(STATE_RESOLVE_PROXY_COMPLETE, next_state_);
@@ -226,6 +233,9 @@ LoadState HttpStreamFactory::JobController::GetLoadState() const {
return main_job_->GetLoadState();
if (alternative_job_)
return alternative_job_->GetLoadState();
+ if (dns_alpn_h3_job_)
+ return dns_alpn_h3_job_->GetLoadState();
+
// When proxy resolution fails, there is no job created and
// NotifyRequestFailed() is executed one message loop iteration later.
return LOAD_STATE_IDLE;
@@ -233,17 +243,24 @@ LoadState HttpStreamFactory::JobController::GetLoadState() const {
void HttpStreamFactory::JobController::OnRequestComplete() {
DCHECK(request_);
-
- CancelJobs();
request_ = nullptr;
- if (bound_job_) {
+
+ if (!job_bound_) {
+ alternative_job_.reset();
+ main_job_.reset();
+ dns_alpn_h3_job_.reset();
+ } else {
if (bound_job_->job_type() == MAIN) {
+ bound_job_ = nullptr;
main_job_.reset();
- } else {
- DCHECK(bound_job_->job_type() == ALTERNATIVE);
+ } else if (bound_job_->job_type() == ALTERNATIVE) {
+ bound_job_ = nullptr;
alternative_job_.reset();
+ } else {
+ DCHECK(bound_job_->job_type() == DNS_ALPN_H3);
+ bound_job_ = nullptr;
+ dns_alpn_h3_job_.reset();
}
- bound_job_ = nullptr;
}
MaybeNotifyFactoryOfCompletion();
}
@@ -260,6 +277,12 @@ void HttpStreamFactory::JobController::SetPriority(RequestPriority priority) {
if (alternative_job_) {
alternative_job_->SetPriority(priority);
}
+ if (dns_alpn_h3_job_) {
+ dns_alpn_h3_job_->SetPriority(priority);
+ }
+ if (preconnect_backup_job_) {
+ preconnect_backup_job_->SetPriority(priority);
+ }
}
void HttpStreamFactory::JobController::OnStreamReady(
@@ -350,12 +373,18 @@ void HttpStreamFactory::JobController::OnStreamFailed(
Job* job,
int status,
const SSLConfig& used_ssl_config) {
- if (job->job_type() == ALTERNATIVE) {
- DCHECK_EQ(alternative_job_.get(), job);
- OnAlternativeServiceJobFailed(status);
- } else {
+ DCHECK_NE(OK, status);
+ if (job->job_type() == MAIN) {
DCHECK_EQ(main_job_.get(), job);
main_job_net_error_ = status;
+ } else if (job->job_type() == ALTERNATIVE) {
+ DCHECK_EQ(alternative_job_.get(), job);
+ DCHECK_NE(kProtoUnknown, alternative_service_info_.protocol());
+ alternative_job_net_error_ = status;
+ } else {
+ DCHECK_EQ(job->job_type(), DNS_ALPN_H3);
+ DCHECK_EQ(dns_alpn_h3_job_.get(), job);
+ dns_alpn_h3_job_net_error_ = status;
}
MaybeResumeMainJob(job, base::TimeDelta());
@@ -373,14 +402,19 @@ void HttpStreamFactory::JobController::OnStreamFailed(
DCHECK(job);
if (!bound_job_) {
- if (main_job_ && alternative_job_) {
+ if (GetJobCount() >= 2) {
// Hey, we've got other jobs! Maybe one of them will succeed, let's just
// ignore this failure.
if (job->job_type() == MAIN) {
+ DCHECK_EQ(main_job_.get(), job);
main_job_.reset();
- } else {
- DCHECK(job->job_type() == ALTERNATIVE);
+ } else if (job->job_type() == ALTERNATIVE) {
+ DCHECK_EQ(alternative_job_.get(), job);
alternative_job_.reset();
+ } else {
+ DCHECK_EQ(job->job_type(), DNS_ALPN_H3);
+ DCHECK_EQ(dns_alpn_h3_job_.get(), job);
+ dns_alpn_h3_job_.reset();
}
return;
} else {
@@ -403,8 +437,14 @@ void HttpStreamFactory::JobController::OnStreamFailed(
}
void HttpStreamFactory::JobController::OnFailedOnDefaultNetwork(Job* job) {
- DCHECK_EQ(job->job_type(), ALTERNATIVE);
- alternative_job_failed_on_default_network_ = true;
+ if (job->job_type() == ALTERNATIVE) {
+ DCHECK_EQ(alternative_job_.get(), job);
+ alternative_job_failed_on_default_network_ = true;
+ } else {
+ DCHECK_EQ(job->job_type(), DNS_ALPN_H3);
+ DCHECK_EQ(dns_alpn_h3_job_.get(), job);
+ dns_alpn_h3_job_failed_on_default_network_ = true;
+ }
}
void HttpStreamFactory::JobController::OnCertificateError(
@@ -473,9 +513,23 @@ void HttpStreamFactory::JobController::OnNeedsProxyAuth(
auth_controller);
}
-void HttpStreamFactory::JobController::OnPreconnectsComplete(Job* job) {
+void HttpStreamFactory::JobController::OnPreconnectsComplete(Job* job,
+ int result) {
DCHECK_EQ(main_job_.get(), job);
+ if (result == ERR_DNS_NO_MACHING_SUPPORTED_ALPN) {
+ DCHECK_EQ(job->job_type(), PRECONNECT_DNS_ALPN_H3);
+ DCHECK(preconnect_backup_job_);
+ GURL origin_url = request_info_.url;
+ RewriteUrlWithHostMappingRules(origin_url);
+ url::SchemeHostPort destination(origin_url);
+ DCHECK(destination.IsValid());
+ ConvertWsToHttp(destination);
+ main_job_ = std::move(preconnect_backup_job_);
+ main_job_->Preconnect(num_streams_);
+ return;
+ }
main_job_.reset();
+ preconnect_backup_job_.reset();
ResetErrorStatusForJobs();
factory_->OnPreconnectsCompleteInternal();
MaybeNotifyFactoryOfCompletion();
@@ -485,9 +539,13 @@ void HttpStreamFactory::JobController::OnOrphanedJobComplete(const Job* job) {
if (job->job_type() == MAIN) {
DCHECK_EQ(main_job_.get(), job);
main_job_.reset();
- } else {
+ } else if (job->job_type() == ALTERNATIVE) {
DCHECK_EQ(alternative_job_.get(), job);
alternative_job_.reset();
+ } else {
+ DCHECK_EQ(job->job_type(), DNS_ALPN_H3);
+ DCHECK_EQ(dns_alpn_h3_job_.get(), job);
+ dns_alpn_h3_job_.reset();
}
MaybeNotifyFactoryOfCompletion();
@@ -532,15 +590,23 @@ void HttpStreamFactory::JobController::ResetErrorStatusForJobs() {
main_job_net_error_ = OK;
alternative_job_net_error_ = OK;
alternative_job_failed_on_default_network_ = false;
+ dns_alpn_h3_job_net_error_ = OK;
+ dns_alpn_h3_job_failed_on_default_network_ = false;
}
void HttpStreamFactory::JobController::MaybeResumeMainJob(
Job* job,
const base::TimeDelta& delay) {
DCHECK(delay == base::TimeDelta() || delay == main_job_wait_time_);
- DCHECK(job == main_job_.get() || job == alternative_job_.get());
+ DCHECK(job == main_job_.get() || job == alternative_job_.get() ||
+ job == dns_alpn_h3_job_.get());
- if (job != alternative_job_.get() || !main_job_)
+ if (job == main_job_.get())
+ return;
+ if (job == dns_alpn_h3_job_.get() && alternative_job_) {
+ return;
+ }
+ if (!main_job_)
return;
main_job_is_blocked_ = false;
@@ -570,9 +636,9 @@ void HttpStreamFactory::JobController::OnConnectionInitialized(Job* job,
bool HttpStreamFactory::JobController::ShouldWait(Job* job) {
// The alternative job never waits.
- if (job == alternative_job_.get())
+ if (job == alternative_job_.get() || job == dns_alpn_h3_job_.get())
return false;
-
+ DCHECK_EQ(main_job_.get(), job);
if (main_job_is_blocked_)
return true;
@@ -638,6 +704,7 @@ void HttpStreamFactory::JobController::RunLoop(int result) {
// iteration later to avoid re-entrancy.
DCHECK(!main_job_);
DCHECK(!alternative_job_);
+ DCHECK(!dns_alpn_h3_job_);
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(&HttpStreamFactory::JobController::NotifyRequestFailed,
@@ -749,6 +816,14 @@ int HttpStreamFactory::JobController::DoCreateJobs() {
SelectQuicVersion(alternative_service_info_.advertised_versions());
DCHECK_NE(quic_version, quic::ParsedQuicVersion::Unsupported());
}
+ const bool dns_alpn_h3_job_enabled =
+ session_->params().use_dns_https_svcb_alpn &&
+ base::EqualsCaseInsensitiveASCII(origin_url.scheme(),
+ url::kHttpsScheme) &&
+ session_->IsQuicEnabled() && proxy_info_.is_direct() &&
+ !session_->http_server_properties()->IsAlternativeServiceBroken(
+ GetAlternativeServiceForDnsJob(origin_url),
+ request_info_.network_isolation_key);
if (is_preconnect_) {
// Due to how the socket pools handle priorities and idle sockets, only IDLE
@@ -764,30 +839,44 @@ int HttpStreamFactory::JobController::DoCreateJobs() {
url::SchemeHostPort(alternative_url);
ConvertWsToHttp(alternative_destination);
- main_job_ = job_factory_->CreateAltSvcJob(
+ main_job_ = job_factory_->CreateJob(
this, PRECONNECT, session_, request_info_, IDLE, proxy_info_,
server_ssl_config_, proxy_ssl_config_,
- std::move(alternative_destination), origin_url,
- alternative_service_info_.protocol(), quic_version, is_websocket_,
- enable_ip_based_pooling_, session_->net_log());
+ std::move(alternative_destination), origin_url, is_websocket_,
+ enable_ip_based_pooling_, session_->net_log(),
+ alternative_service_info_.protocol(), quic_version);
} else {
- main_job_ = job_factory_->CreateMainJob(
- this, PRECONNECT, session_, request_info_, IDLE, proxy_info_,
- server_ssl_config_, proxy_ssl_config_, std::move(destination),
- origin_url, is_websocket_, enable_ip_based_pooling_,
- session_->net_log());
+ // Note: When `dns_alpn_h3_job_enabled` is true, we create a
+ // PRECONNECT_DNS_ALPN_H3 job. If no matching HTTPS DNS ALPN records are
+ // received, the PRECONNECT_DNS_ALPN_H3 job will fail with
+ // ERR_DNS_NO_MACHING_SUPPORTED_ALPN, and |preconnect_backup_job_| will be
+ // started in OnPreconnectsComplete().
+ main_job_ = job_factory_->CreateJob(
+ this, dns_alpn_h3_job_enabled ? PRECONNECT_DNS_ALPN_H3 : PRECONNECT,
+ session_, request_info_, priority_, proxy_info_, server_ssl_config_,
+ proxy_ssl_config_, destination, origin_url, is_websocket_,
+ enable_ip_based_pooling_, net_log_.net_log());
+ if (dns_alpn_h3_job_enabled) {
+ preconnect_backup_job_ = job_factory_->CreateJob(
+ this, PRECONNECT, session_, request_info_, priority_, proxy_info_,
+ server_ssl_config_, proxy_ssl_config_, std::move(destination),
+ origin_url, is_websocket_, enable_ip_based_pooling_,
+ net_log_.net_log());
+ }
}
main_job_->Preconnect(num_streams_);
return OK;
}
- main_job_ = job_factory_->CreateMainJob(
+ main_job_ = job_factory_->CreateJob(
this, MAIN, session_, request_info_, priority_, proxy_info_,
server_ssl_config_, proxy_ssl_config_, std::move(destination), origin_url,
is_websocket_, enable_ip_based_pooling_, net_log_.net_log());
+
// Alternative Service can only be set for HTTPS requests while Alternative
// Proxy is set for HTTP requests.
if (alternative_service_info_.protocol() != kProtoUnknown) {
DCHECK(request_info_.url.SchemeIs(url::kHttpsScheme));
+ DCHECK(!is_websocket_);
DVLOG(1) << "Selected alternative service (host: "
<< alternative_service_info_.host_port_pair().host()
<< " port: " << alternative_service_info_.host_port_pair().port()
@@ -801,28 +890,75 @@ int HttpStreamFactory::JobController::DoCreateJobs() {
url::SchemeHostPort(alternative_url);
ConvertWsToHttp(alternative_destination);
- alternative_job_ = job_factory_->CreateAltSvcJob(
+ alternative_job_ = job_factory_->CreateJob(
this, ALTERNATIVE, session_, request_info_, priority_, proxy_info_,
server_ssl_config_, proxy_ssl_config_,
- std::move(alternative_destination), origin_url,
- alternative_service_info_.protocol(), quic_version, is_websocket_,
+ std::move(alternative_destination), origin_url, is_websocket_,
+ enable_ip_based_pooling_, net_log_.net_log(),
+ alternative_service_info_.protocol(), quic_version);
+ }
+
+ if (dns_alpn_h3_job_enabled) {
+ DCHECK(!is_websocket_);
+ url::SchemeHostPort dns_alpn_h3_destination =
+ url::SchemeHostPort(origin_url);
+ dns_alpn_h3_job_ = job_factory_->CreateJob(
+ this, DNS_ALPN_H3, session_, request_info_, priority_, proxy_info_,
+ server_ssl_config_, proxy_ssl_config_,
+ std::move(dns_alpn_h3_destination), origin_url, is_websocket_,
enable_ip_based_pooling_, net_log_.net_log());
+ }
+ ClearInappropriateJobs();
+
+ if (main_job_ && (alternative_job_ ||
+ (dns_alpn_h3_job_ &&
+ (!main_job_->TargettedSocketGroupHasActiveSocket() &&
+ !main_job_->HasAvailableSpdySession())))) {
+ // We don't block |main_job_| when |alternative_job_| doesn't exists and
+ // |dns_alpn_h3_job_| exists and an active socket is available for
+ // |main_job_|. This is intended to make the fallback logic faster.
main_job_is_blocked_ = true;
+ }
+
+ if (alternative_job_) {
alternative_job_->Start(request_->stream_type());
}
- // Even if |alternative_job| has already finished, it will not have notified
- // the request yet, since we defer that to the next iteration of the
- // MessageLoop, so starting |main_job_| is always safe.
- main_job_->Start(request_->stream_type());
+ if (dns_alpn_h3_job_) {
+ dns_alpn_h3_job_->Start(request_->stream_type());
+ }
+
+ if (main_job_) {
+ main_job_->Start(request_->stream_type());
+ }
return OK;
}
+void HttpStreamFactory::JobController::ClearInappropriateJobs() {
+ if (dns_alpn_h3_job_ && dns_alpn_h3_job_->HasAvailableQuicSession()) {
+ // Clear |main_job_| and |alternative_job_| here not to start them when
+ // there is an active session available for |dns_alpn_h3_job_|.
+ main_job_.reset();
+ alternative_job_.reset();
+ }
+
+ if (alternative_job_ && dns_alpn_h3_job_ &&
+ (alternative_job_->HasAvailableQuicSession() ||
+ (alternative_service_info_.alternative_service() ==
+ GetAlternativeServiceForDnsJob(request_info_.url)))) {
+ // Clear |dns_alpn_h3_job_|, when there is an active session available for
+ // |alternative_job_| or |alternative_job_| was created for the same
+ // destination.
+ dns_alpn_h3_job_.reset();
+ }
+}
+
void HttpStreamFactory::JobController::BindJob(Job* job) {
DCHECK(request_);
DCHECK(job);
- DCHECK(job == alternative_job_.get() || job == main_job_.get());
+ DCHECK(job == alternative_job_.get() || job == main_job_.get() ||
+ job == dns_alpn_h3_job_.get());
DCHECK(!job_bound_);
DCHECK(!bound_job_);
@@ -839,54 +975,73 @@ void HttpStreamFactory::JobController::BindJob(Job* job) {
OrphanUnboundJob();
}
-void HttpStreamFactory::JobController::CancelJobs() {
- DCHECK(request_);
- if (job_bound_)
- return;
- if (alternative_job_)
- alternative_job_.reset();
- if (main_job_)
- main_job_.reset();
-}
-
void HttpStreamFactory::JobController::OrphanUnboundJob() {
DCHECK(request_);
DCHECK(bound_job_);
- if (bound_job_->job_type() == MAIN && alternative_job_) {
- DCHECK(!is_websocket_);
- // Allow |alternative_job_| to run to completion, rather than resetting it
- // to check if there is any broken alternative service to report.
- // OnOrphanedJobComplete() will clean up |this| when the job completes.
- alternative_job_->Orphan();
+ if (bound_job_->job_type() == MAIN) {
+ // Allow |alternative_job_| and |dns_alpn_h3_job_| to run to completion,
+ // rather than resetting them to check if there is any broken alternative
+ // service to report. OnOrphanedJobComplete() will clean up |this| when the
+ // jobs complete.
+ if (alternative_job_) {
+ DCHECK(!is_websocket_);
+ alternative_job_->Orphan();
+ }
+ if (dns_alpn_h3_job_) {
+ DCHECK(!is_websocket_);
+ dns_alpn_h3_job_->Orphan();
+ }
return;
}
- if (bound_job_->job_type() == ALTERNATIVE && main_job_ &&
- !alternative_job_failed_on_default_network_) {
- // |request_| is bound to the alternative job and the alternative job
- // succeeds on the default network. This means that the main job
- // is no longer needed, so cancel it now. Pending ConnectJobs will return
- // established sockets to socket pools if applicable.
- // https://crbug.com/757548.
- // The main job still needs to run if the alternative job succeeds on the
- // alternate network in order to figure out whether QUIC should be marked as
- // broken until the default network changes.
- DCHECK_EQ(OK, alternative_job_net_error_);
- main_job_.reset();
+ if (bound_job_->job_type() == ALTERNATIVE) {
+ if (!alternative_job_failed_on_default_network_ && !dns_alpn_h3_job_) {
+ // |request_| is bound to the alternative job and the alternative job
+ // succeeds on the default network, and there is no DNS alt job. This
+ // means that the main job is no longer needed, so cancel it now. Pending
+ // ConnectJobs will return established sockets to socket pools if
+ // applicable.
+ // https://crbug.com/757548.
+ // The main job still needs to run if the alternative job succeeds on the
+ // alternate network in order to figure out whether QUIC should be marked
+ // as broken until the default network changes. And also the main job
+ // still needs to run if the DNS alt job exists to figure out whether
+ // the DNS alpn service is broken.
+ DCHECK(!main_job_ || (alternative_job_net_error_ == OK));
+ main_job_.reset();
+ }
+ // Allow |dns_alpn_h3_job_| to run to completion, rather than resetting
+ // it to check if there is any broken alternative service to report.
+ // OnOrphanedJobComplete() will clean up |this| when the job completes.
+ if (dns_alpn_h3_job_) {
+ DCHECK(!is_websocket_);
+ dns_alpn_h3_job_->Orphan();
+ }
+ }
+ if (bound_job_->job_type() == DNS_ALPN_H3) {
+ if (!dns_alpn_h3_job_failed_on_default_network_ && !alternative_job_) {
+ DCHECK(!main_job_ || (dns_alpn_h3_job_net_error_ == OK));
+ main_job_.reset();
+ }
+ // Allow |alternative_job_| to run to completion, rather than resetting
+ // it to check if there is any broken alternative service to report.
+ // OnOrphanedJobComplete() will clean up |this| when the job completes.
+ if (alternative_job_) {
+ DCHECK(!is_websocket_);
+ alternative_job_->Orphan();
+ }
}
}
void HttpStreamFactory::JobController::OnJobSucceeded(Job* job) {
DCHECK(job);
-
if (!bound_job_) {
- if (main_job_ && alternative_job_)
+ if ((main_job_ && alternative_job_) || dns_alpn_h3_job_)
ReportAlternateProtocolUsage(job);
BindJob(job);
return;
}
- DCHECK(bound_job_);
}
void HttpStreamFactory::JobController::MarkRequestComplete(
@@ -897,77 +1052,75 @@ void HttpStreamFactory::JobController::MarkRequestComplete(
request_->Complete(was_alpn_negotiated, negotiated_protocol, using_spdy);
}
-void HttpStreamFactory::JobController::OnAlternativeServiceJobFailed(
- int net_error) {
- DCHECK_EQ(alternative_job_->job_type(), ALTERNATIVE);
- DCHECK_NE(OK, net_error);
- DCHECK_NE(kProtoUnknown, alternative_service_info_.protocol());
-
- alternative_job_net_error_ = net_error;
-}
-
-void HttpStreamFactory::JobController::MaybeReportBrokenAlternativeService() {
+void HttpStreamFactory::JobController::MaybeReportBrokenAlternativeService(
+ const AlternativeService& alt_service,
+ int alt_job_net_error,
+ bool alt_job_failed_on_default_network,
+ const std::string& histogram_name_for_failure) {
// If alternative job succeeds on the default network, no brokenness to
// report.
- if (alternative_job_net_error_ == OK &&
- !alternative_job_failed_on_default_network_)
+ if (alt_job_net_error == OK && !alt_job_failed_on_default_network)
return;
// No brokenness to report if the main job fails.
if (main_job_net_error_ != OK)
return;
- DCHECK(alternative_service_info_.protocol() != kProtoUnknown);
+ // No need to record DNS_NO_MACHING_SUPPORTED_ALPN error.
+ if (alt_job_net_error == ERR_DNS_NO_MACHING_SUPPORTED_ALPN)
+ return;
- if (alternative_job_failed_on_default_network_ &&
- alternative_job_net_error_ == OK) {
+ if (alt_job_failed_on_default_network && alt_job_net_error == OK) {
// Alternative job failed on the default network but succeeds on the
// non-default network, mark alternative service broken until the default
// network changes.
session_->http_server_properties()
->MarkAlternativeServiceBrokenUntilDefaultNetworkChanges(
- alternative_service_info_.alternative_service(),
- request_info_.network_isolation_key);
- // Reset error status for Jobs after reporting brokenness.
- ResetErrorStatusForJobs();
+ alt_service, request_info_.network_isolation_key);
return;
}
- if (alternative_job_net_error_ == ERR_NETWORK_CHANGED ||
- alternative_job_net_error_ == ERR_INTERNET_DISCONNECTED ||
- (alternative_job_net_error_ == ERR_NAME_NOT_RESOLVED &&
- request_info_.url.host() ==
- alternative_service_info_.alternative_service().host)) {
+ if (alt_job_net_error == ERR_NETWORK_CHANGED ||
+ alt_job_net_error == ERR_INTERNET_DISCONNECTED ||
+ (alt_job_net_error == ERR_NAME_NOT_RESOLVED &&
+ request_info_.url.host() == alt_service.host)) {
// No need to mark alternative service as broken.
- // Reset error status for Jobs.
- ResetErrorStatusForJobs();
return;
}
// Report brokenness if alternative job failed.
- base::UmaHistogramSparse("Net.AlternateServiceFailed",
- -alternative_job_net_error_);
+ base::UmaHistogramSparse(histogram_name_for_failure, -alt_job_net_error);
HistogramBrokenAlternateProtocolLocation(
BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_JOB_ALT);
session_->http_server_properties()->MarkAlternativeServiceBroken(
- alternative_service_info_.alternative_service(),
- request_info_.network_isolation_key);
- // Reset error status for Jobs after reporting brokenness.
- ResetErrorStatusForJobs();
+ alt_service, request_info_.network_isolation_key);
}
void HttpStreamFactory::JobController::MaybeNotifyFactoryOfCompletion() {
- if (!main_job_ && !alternative_job_) {
- // Both jobs are gone, report brokenness if apply. Error status for Jobs
- // will be reset after reporting to avoid redundant reporting.
- MaybeReportBrokenAlternativeService();
- }
+ if (main_job_ || alternative_job_ || dns_alpn_h3_job_)
+ return;
- if (!request_ && !main_job_ && !alternative_job_) {
- DCHECK(!bound_job_);
- factory_->OnJobControllerComplete(this);
- }
+ // All jobs are gone.
+ // Report brokenness for the alternate jobs if apply.
+ MaybeReportBrokenAlternativeService(
+ alternative_service_info_.alternative_service(),
+ alternative_job_net_error_, alternative_job_failed_on_default_network_,
+ "Net.AlternateServiceFailed");
+ // Report for the DNS alt job if apply.
+ MaybeReportBrokenAlternativeService(
+ GetAlternativeServiceForDnsJob(request_info_.url),
+ dns_alpn_h3_job_net_error_, dns_alpn_h3_job_failed_on_default_network_,
+ "Net.AlternateServiceForDnsAlpnH3Failed");
+
+ // Reset error status for Jobs after reporting brokenness to avoid redundant
+ // reporting.
+ ResetErrorStatusForJobs();
+
+ if (request_)
+ return;
+ DCHECK(!bound_job_);
+ factory_->OnJobControllerComplete(this);
}
void HttpStreamFactory::JobController::NotifyRequestFailed(int rv) {
@@ -1163,25 +1316,35 @@ quic::ParsedQuicVersion HttpStreamFactory::JobController::SelectQuicVersion(
void HttpStreamFactory::JobController::ReportAlternateProtocolUsage(
Job* job) const {
- DCHECK(main_job_ && alternative_job_);
+ DCHECK((main_job_ && alternative_job_) || dns_alpn_h3_job_);
bool is_google_host = HasGoogleHost(job->origin_url());
if (job == main_job_.get()) {
- HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_LOST_RACE,
+ HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_MAIN_JOB_WON_RACE,
is_google_host);
return;
}
+ if (job == alternative_job_.get()) {
+ if (job->using_existing_quic_session()) {
+ HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_NO_RACE,
+ is_google_host);
+ return;
+ }
- DCHECK_EQ(alternative_job_.get(), job);
- if (job->using_existing_quic_session()) {
- HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_NO_RACE,
+ HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_WON_RACE,
is_google_host);
- return;
}
-
- HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_WON_RACE,
- is_google_host);
+ if (job == dns_alpn_h3_job_.get()) {
+ if (job->using_existing_quic_session()) {
+ HistogramAlternateProtocolUsage(
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_WITOUT_RACE,
+ is_google_host);
+ return;
+ }
+ HistogramAlternateProtocolUsage(
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_RACE, is_google_host);
+ }
}
bool HttpStreamFactory::JobController::IsJobOrphaned(Job* job) const {
@@ -1191,7 +1354,7 @@ bool HttpStreamFactory::JobController::IsJobOrphaned(Job* job) const {
int HttpStreamFactory::JobController::ReconsiderProxyAfterError(Job* job,
int error) {
// ReconsiderProxyAfterError() should only be called when the last job fails.
- DCHECK(!(alternative_job_ && main_job_));
+ DCHECK_EQ(1, GetJobCount());
DCHECK(!proxy_resolve_request_);
DCHECK(session_);
@@ -1215,6 +1378,7 @@ int HttpStreamFactory::JobController::ReconsiderProxyAfterError(Job* job,
// Abandon all Jobs and start over.
job_bound_ = false;
bound_job_ = nullptr;
+ dns_alpn_h3_job_.reset();
alternative_job_.reset();
main_job_.reset();
ResetErrorStatusForJobs();
diff --git a/chromium/net/http/http_stream_factory_job_controller.h b/chromium/net/http/http_stream_factory_job_controller.h
index e6149e3f076..2356e9bdce3 100644
--- a/chromium/net/http/http_stream_factory_job_controller.h
+++ b/chromium/net/http/http_stream_factory_job_controller.h
@@ -52,6 +52,7 @@ class HttpStreamFactory::JobController
// Used in tests only for verification purpose.
const Job* main_job() const { return main_job_.get(); }
const Job* alternative_job() const { return alternative_job_.get(); }
+ const Job* dns_alpn_h3_job() const { return dns_alpn_h3_job_.get(); }
void RewriteUrlWithHostMappingRules(GURL& url);
@@ -128,7 +129,7 @@ class HttpStreamFactory::JobController
HttpAuthController* auth_controller) override;
// Invoked when the |job| finishes pre-connecting sockets.
- void OnPreconnectsComplete(Job* job) override;
+ void OnPreconnectsComplete(Job* job, int result) override;
// Invoked to record connection attempts made by the socket layer to
// Request if |job| is associated with Request.
@@ -185,10 +186,6 @@ class HttpStreamFactory::JobController
// still associated with |request_|.
void BindJob(Job* job);
- // Called when |request_| is destructed.
- // Job(s) associated with but not bound to |request_| will be deleted.
- void CancelJobs();
-
// Called after BindJob() to notify the unbound job that its result should be
// ignored by JobController. The unbound job can be canceled or continue until
// completion.
@@ -200,15 +197,14 @@ class HttpStreamFactory::JobController
// Called when a Job succeeds.
void OnJobSucceeded(Job* job);
+ // Clears inappropriate jobs before starting them.
+ void ClearInappropriateJobs();
+
// Marks completion of the |request_|.
void MarkRequestComplete(bool was_alpn_negotiated,
NextProto negotiated_protocol,
bool using_spdy);
- // Must be called when the alternative service job fails. |net_error| is the
- // net error of the failed alternative service job.
- void OnAlternativeServiceJobFailed(int net_error);
-
// Called when all Jobs complete. Reports alternative service brokenness to
// HttpServerProperties if apply and resets net errors afterwards:
// - report broken if the main job has no error and the alternative job has an
@@ -216,7 +212,11 @@ class HttpStreamFactory::JobController
// - report broken until default network change if the main job has no error,
// the alternative job has no error, but the alternative job failed on the
// default network.
- void MaybeReportBrokenAlternativeService();
+ void MaybeReportBrokenAlternativeService(
+ const AlternativeService& alt_service,
+ int alt_job_net_error,
+ bool alt_job_failed_on_default_network,
+ const std::string& histogram_name_for_failure);
void MaybeNotifyFactoryOfCompletion();
@@ -233,8 +233,10 @@ class HttpStreamFactory::JobController
void ResumeMainJob();
// Reset error status to default value for Jobs:
- // - reset |main_job_net_error_| and |alternative_job_net_error_| to OK;
- // - reset |alternative_job_failed_on_default_network_| to false.
+ // - reset |main_job_net_error_| and |alternative_job_net_error_| and
+ // |dns_alpn_h3_job_net_error_| to OK;
+ // - reset |alternative_job_failed_on_default_network_| and
+ // |dns_alpn_h3_job_failed_on_default_network_| to false.
void ResetErrorStatusForJobs();
AlternativeServiceInfo GetAlternativeServiceInfoFor(
@@ -272,6 +274,11 @@ class HttpStreamFactory::JobController
// Returns true if QUIC is allowed for |host|.
bool IsQuicAllowedForHost(const std::string& host);
+ int GetJobCount() const {
+ return (main_job_ ? 1 : 0) + (alternative_job_ ? 1 : 0) +
+ (dns_alpn_h3_job_ ? 1 : 0);
+ }
+
raw_ptr<HttpStreamFactory> factory_;
raw_ptr<HttpNetworkSession> session_;
raw_ptr<JobFactory> job_factory_;
@@ -280,7 +287,7 @@ class HttpStreamFactory::JobController
// reference and is safe as |request_| will notify |this| JobController
// when it's destructed by calling OnRequestComplete(), which nulls
// |request_|.
- raw_ptr<HttpStreamRequest> request_ = nullptr;
+ raw_ptr<HttpStreamRequest, DanglingUntriaged> request_ = nullptr;
const raw_ptr<HttpStreamRequest::Delegate> delegate_;
@@ -297,11 +304,19 @@ class HttpStreamFactory::JobController
// Enable using alternative services for the request.
const bool enable_alternative_services_;
- // |main_job_| is a job waiting to see if |alternative_job_| can reuse a
- // connection. If |alternative_job_| is unable to do so, |this| will notify
- // |main_job_| to proceed and then race the two jobs.
+ // For normal (non-preconnect) job, |main_job_| is a job waiting to see if
+ // |alternative_job_| or |dns_alpn_h3_job_| can reuse a connection. If both
+ // |alternative_job_| and |dns_alpn_h3_job_| are unable to do so, |this| will
+ // notify |main_job_| to proceed and then race the two jobs.
+ // For preconnect job, |main_job_| is started first, and if it fails with
+ // ERR_DNS_NO_MACHING_SUPPORTED_ALPN, |preconnect_backup_job_| will be
+ // started.
std::unique_ptr<Job> main_job_;
std::unique_ptr<Job> alternative_job_;
+ std::unique_ptr<Job> dns_alpn_h3_job_;
+
+ std::unique_ptr<Job> preconnect_backup_job_;
+
// The alternative service used by |alternative_job_|
// (or by |main_job_| if |is_preconnect_|.)
AlternativeServiceInfo alternative_service_info_;
@@ -313,6 +328,10 @@ class HttpStreamFactory::JobController
int alternative_job_net_error_ = OK;
// Set to true if the alternative job failed on the default network.
bool alternative_job_failed_on_default_network_ = false;
+ // Net error code of the DNS HTTPS ALPN job. Set to OK by default.
+ int dns_alpn_h3_job_net_error_ = OK;
+ // Set to true if the DNS HTTPS ALPN job failed on the default network.
+ bool dns_alpn_h3_job_failed_on_default_network_ = false;
// True if a Job has ever been bound to the |request_|.
bool job_bound_ = false;
diff --git a/chromium/net/http/http_stream_factory_job_controller_unittest.cc b/chromium/net/http/http_stream_factory_job_controller_unittest.cc
index c401c7b4167..63097239951 100644
--- a/chromium/net/http/http_stream_factory_job_controller_unittest.cc
+++ b/chromium/net/http/http_stream_factory_job_controller_unittest.cc
@@ -16,6 +16,7 @@
#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
+#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
@@ -30,6 +31,7 @@
#include "net/base/test_proxy_delegate.h"
#include "net/dns/mock_host_resolver.h"
#include "net/dns/public/secure_dns_policy.h"
+#include "net/http/alternative_service.h"
#include "net/http/http_basic_stream.h"
#include "net/http/http_network_session_peer.h"
#include "net/http/http_response_headers.h"
@@ -46,9 +48,11 @@
#include "net/proxy_resolution/mock_proxy_resolver.h"
#include "net/proxy_resolution/proxy_config_service_fixed.h"
#include "net/proxy_resolution/proxy_info.h"
+#include "net/quic/crypto/proof_verifier_chromium.h"
#include "net/quic/mock_crypto_client_stream_factory.h"
#include "net/quic/mock_quic_context.h"
#include "net/quic/mock_quic_data.h"
+#include "net/quic/quic_http_stream.h"
#include "net/quic/quic_stream_factory.h"
#include "net/quic/quic_stream_factory_peer.h"
#include "net/quic/quic_test_packet_maker.h"
@@ -73,14 +77,16 @@ using ::testing::IsEmpty;
using ::testing::Key;
using ::testing::SizeIs;
-namespace net {
-
-namespace test {
+namespace net::test {
namespace {
const char kServerHostname[] = "www.example.com";
+// The default delay for main job defined in QuicStreamFactory::
+// GetTimeDelayForWaitingJob().
+const int kDefaultDelayMilliSecsForWaitingJob = 300;
+
class FailingProxyResolverFactory : public ProxyResolverFactory {
public:
FailingProxyResolverFactory() : ProxyResolverFactory(false) {}
@@ -175,13 +181,23 @@ class JobControllerPeer {
HttpStreamFactoryJobPeer::SetQuicConnectionFailedOnDefaultNetwork(
job_controller->alternative_job_.get());
}
+ static void SetDnsAlpnH3JobFailedOnDefaultNetwork(
+ HttpStreamFactory::JobController* job_controller) {
+ DCHECK(job_controller->dns_alpn_h3_job() != nullptr);
+ HttpStreamFactoryJobPeer::SetQuicConnectionFailedOnDefaultNetwork(
+ job_controller->dns_alpn_h3_job_.get());
+ }
};
-class HttpStreamFactoryJobControllerTest : public TestWithTaskEnvironment {
+class HttpStreamFactoryJobControllerTestBase : public TestWithTaskEnvironment {
public:
- HttpStreamFactoryJobControllerTest()
+ explicit HttpStreamFactoryJobControllerTestBase(bool dns_https_alpn_enabled)
: TestWithTaskEnvironment(
- base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
+ base::test::TaskEnvironment::TimeSource::MOCK_TIME),
+ dns_https_alpn_enabled_(dns_https_alpn_enabled) {
+ if (dns_https_alpn_enabled_) {
+ feature_list_.InitWithFeatures({features::kUseDnsHttpsSvcbAlpn}, {});
+ }
FLAGS_quic_enable_http3_grease_randomness = false;
CreateSessionDeps();
}
@@ -230,8 +246,12 @@ class HttpStreamFactoryJobControllerTest : public TestWithTaskEnvironment {
if (quic_data_)
quic_data_->AddSocketDataToFactory(session_deps_.socket_factory.get());
+ if (quic_data2_)
+ quic_data2_->AddSocketDataToFactory(session_deps_.socket_factory.get());
if (tcp_data_)
session_deps_.socket_factory->AddSocketDataProvider(tcp_data_.get());
+ if (tcp_data2_)
+ session_deps_.socket_factory->AddSocketDataProvider(tcp_data2_.get());
session_deps_.proxy_resolution_service->SetProxyDelegate(
test_proxy_delegate_.get());
@@ -248,13 +268,15 @@ class HttpStreamFactoryJobControllerTest : public TestWithTaskEnvironment {
session_ = std::make_unique<HttpNetworkSession>(params, session_context);
factory_ = static_cast<HttpStreamFactory*>(session_->http_stream_factory());
if (create_job_controller_) {
- job_controller_ = new HttpStreamFactory::JobController(
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
factory_, &request_delegate_, session_.get(), &job_factory_,
request_info, is_preconnect_, false /* is_websocket */,
enable_ip_based_pooling_, enable_alternative_services_,
delay_main_job_with_available_spdy_session_, SSLConfig(),
SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller_);
+ job_controller_ = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
}
}
@@ -262,20 +284,28 @@ class HttpStreamFactoryJobControllerTest : public TestWithTaskEnvironment {
return test_proxy_delegate_.get();
}
- HttpStreamFactoryJobControllerTest(
- const HttpStreamFactoryJobControllerTest&) = delete;
- HttpStreamFactoryJobControllerTest& operator=(
- const HttpStreamFactoryJobControllerTest&) = delete;
+ HttpStreamFactoryJobControllerTestBase(
+ const HttpStreamFactoryJobControllerTestBase&) = delete;
+ HttpStreamFactoryJobControllerTestBase& operator=(
+ const HttpStreamFactoryJobControllerTestBase&) = delete;
- ~HttpStreamFactoryJobControllerTest() override {
+ ~HttpStreamFactoryJobControllerTestBase() override {
if (quic_data_) {
EXPECT_TRUE(quic_data_->AllReadDataConsumed());
EXPECT_TRUE(quic_data_->AllWriteDataConsumed());
}
+ if (quic_data2_) {
+ EXPECT_TRUE(quic_data2_->AllReadDataConsumed());
+ EXPECT_TRUE(quic_data2_->AllWriteDataConsumed());
+ }
if (tcp_data_) {
EXPECT_TRUE(tcp_data_->AllReadDataConsumed());
EXPECT_TRUE(tcp_data_->AllWriteDataConsumed());
}
+ if (tcp_data2_) {
+ EXPECT_TRUE(tcp_data2_->AllReadDataConsumed());
+ EXPECT_TRUE(tcp_data2_->AllWriteDataConsumed());
+ }
}
void SetAlternativeService(const HttpRequestInfo& request_info,
@@ -327,6 +357,8 @@ class HttpStreamFactoryJobControllerTest : public TestWithTaskEnvironment {
const quic::ParsedQuicVersion& expected_version,
const quic::ParsedQuicVersionVector& supported_versions);
+ bool dns_https_alpn_enabled() const { return dns_https_alpn_enabled_; }
+
quic::ParsedQuicVersion version_ = DefaultSupportedQuicVersions().front();
RecordingNetLogObserver net_log_observer_;
NetLogWithSource net_log_with_source_{
@@ -340,7 +372,9 @@ class HttpStreamFactoryJobControllerTest : public TestWithTaskEnvironment {
raw_ptr<HttpStreamFactory::JobController> job_controller_ = nullptr;
std::unique_ptr<HttpStreamRequest> request_;
std::unique_ptr<SequencedSocketData> tcp_data_;
+ std::unique_ptr<SequencedSocketData> tcp_data2_;
std::unique_ptr<MockQuicData> quic_data_;
+ std::unique_ptr<MockQuicData> quic_data2_;
MockCryptoClientStreamFactory crypto_client_stream_factory_;
QuicTestPacketMaker client_maker_{version_,
quic::QuicUtils::CreateRandomConnectionId(
@@ -357,11 +391,26 @@ class HttpStreamFactoryJobControllerTest : public TestWithTaskEnvironment {
bool delay_main_job_with_available_spdy_session_ = true;
private:
+ bool dns_https_alpn_enabled_;
std::unique_ptr<TestProxyDelegate> test_proxy_delegate_;
bool create_job_controller_ = true;
+
+ base::test::ScopedFeatureList feature_list_;
+};
+
+class HttpStreamFactoryJobControllerTest
+ : public HttpStreamFactoryJobControllerTestBase,
+ public ::testing::WithParamInterface<bool> {
+ protected:
+ HttpStreamFactoryJobControllerTest()
+ : HttpStreamFactoryJobControllerTestBase(GetParam()) {}
};
-TEST_F(HttpStreamFactoryJobControllerTest, ProxyResolutionFailsSync) {
+INSTANTIATE_TEST_SUITE_P(All,
+ HttpStreamFactoryJobControllerTest,
+ testing::Bool());
+
+TEST_P(HttpStreamFactoryJobControllerTest, ProxyResolutionFailsSync) {
ProxyConfig proxy_config;
proxy_config.set_pac_url(GURL("http://fooproxyurl"));
proxy_config.set_pac_mandatory(true);
@@ -398,19 +447,20 @@ TEST_F(HttpStreamFactoryJobControllerTest, ProxyResolutionFailsSync) {
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
-TEST_F(HttpStreamFactoryJobControllerTest, ProxyResolutionFailsAsync) {
+TEST_P(HttpStreamFactoryJobControllerTest, ProxyResolutionFailsAsync) {
ProxyConfig proxy_config;
proxy_config.set_pac_url(GURL("http://fooproxyurl"));
proxy_config.set_pac_mandatory(true);
- MockAsyncProxyResolverFactory* proxy_resolver_factory =
- new MockAsyncProxyResolverFactory(false);
+ auto proxy_resolver_factory =
+ std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* proxy_resolver_factory_ptr = proxy_resolver_factory.get();
MockAsyncProxyResolver resolver;
session_deps_.proxy_resolution_service =
std::make_unique<ConfiguredProxyResolutionService>(
std::make_unique<ProxyConfigServiceFixed>(ProxyConfigWithAnnotation(
proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS)),
- base::WrapUnique(proxy_resolver_factory), nullptr,
+ std::move(proxy_resolver_factory), nullptr,
/*quick_check_enabled=*/true);
HttpRequestInfo request_info;
request_info.method = "GET";
@@ -432,16 +482,16 @@ TEST_F(HttpStreamFactoryJobControllerTest, ProxyResolutionFailsAsync) {
request_delegate_,
OnStreamFailed(ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, _, _, _, _))
.Times(1);
- proxy_resolver_factory->pending_requests()[0]->CompleteNowWithForwarder(
+ proxy_resolver_factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(
ERR_FAILED, &resolver);
base::RunLoop().RunUntilIdle();
request_.reset();
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
-TEST_F(HttpStreamFactoryJobControllerTest, NoSupportedProxies) {
+TEST_P(HttpStreamFactoryJobControllerTest, NoSupportedProxies) {
session_deps_.proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
session_deps_.enable_quic = false;
HttpRequestInfo request_info;
@@ -466,8 +516,10 @@ TEST_F(HttpStreamFactoryJobControllerTest, NoSupportedProxies) {
}
class JobControllerReconsiderProxyAfterErrorTest
- : public HttpStreamFactoryJobControllerTest {
+ : public HttpStreamFactoryJobControllerTestBase {
public:
+ JobControllerReconsiderProxyAfterErrorTest()
+ : HttpStreamFactoryJobControllerTestBase(false) {}
void Initialize(
std::unique_ptr<ProxyResolutionService> proxy_resolution_service) {
session_deps_.proxy_resolution_service =
@@ -480,15 +532,15 @@ class JobControllerReconsiderProxyAfterErrorTest
std::unique_ptr<HttpStreamRequest> CreateJobController(
const HttpRequestInfo& request_info) {
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, &request_delegate_, session_.get(), &default_job_factory_,
- request_info, is_preconnect_, false /* is_websocket */,
- enable_ip_based_pooling_, enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- return job_controller->Start(
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, &request_delegate_, session_.get(), &default_job_factory_,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
+ return job_controller_ptr->Start(
&request_delegate_, nullptr, net_log_with_source_,
HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
}
@@ -546,7 +598,7 @@ TEST_F(JobControllerReconsiderProxyAfterErrorTest,
std::unique_ptr<ConfiguredProxyResolutionService>
proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY badproxy:99; PROXY badfallbackproxy:98; DIRECT",
TRAFFIC_ANNOTATION_FOR_TESTS);
auto test_proxy_delegate = std::make_unique<TestProxyDelegate>();
@@ -732,12 +784,12 @@ TEST_F(JobControllerReconsiderProxyAfterErrorTest,
std::unique_ptr<ConfiguredProxyResolutionService>
proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS badproxy:99; HTTPS badfallbackproxy:98; DIRECT",
TRAFFIC_ANNOTATION_FOR_TESTS);
if (mock_error.triggers_ssl_connect_job_retry_logic) {
proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS badproxy:99; DIRECT", TRAFFIC_ANNOTATION_FOR_TESTS);
}
auto test_proxy_delegate = std::make_unique<TestProxyDelegate>();
@@ -931,7 +983,7 @@ TEST_F(JobControllerReconsiderProxyAfterErrorTest,
CreateSessionDeps();
std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"SOCKS5 badproxy:99; SOCKS5 badfallbackproxy:98; DIRECT",
TRAFFIC_ANNOTATION_FOR_TESTS);
auto test_proxy_delegate = std::make_unique<TestProxyDelegate>();
@@ -1044,7 +1096,7 @@ TEST_F(JobControllerReconsiderProxyAfterErrorTest,
// Tests that ERR_MSG_TOO_BIG is retryable for QUIC proxy.
TEST_F(JobControllerReconsiderProxyAfterErrorTest, ReconsiderErrMsgTooBig) {
std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC badproxy:99; DIRECT", TRAFFIC_ANNOTATION_FOR_TESTS);
// Before starting the test, verify that there are no proxies marked as bad.
@@ -1091,7 +1143,7 @@ TEST_F(JobControllerReconsiderProxyAfterErrorTest, ReconsiderErrMsgTooBig) {
TEST_F(JobControllerReconsiderProxyAfterErrorTest,
DoNotReconsiderErrMsgTooBig) {
std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS badproxy:99; DIRECT", TRAFFIC_ANNOTATION_FOR_TESTS);
// Before starting the test, verify that there are no proxies marked as bad.
@@ -1133,7 +1185,7 @@ TEST_F(JobControllerReconsiderProxyAfterErrorTest,
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
-TEST_F(HttpStreamFactoryJobControllerTest, OnStreamFailedWithNoAlternativeJob) {
+TEST_P(HttpStreamFactoryJobControllerTest, OnStreamFailedWithNoAlternativeJob) {
tcp_data_ = std::make_unique<SequencedSocketData>();
tcp_data_->set_connect_data(MockConnect(ASYNC, ERR_FAILED));
@@ -1157,7 +1209,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, OnStreamFailedWithNoAlternativeJob) {
base::RunLoop().RunUntilIdle();
}
-TEST_F(HttpStreamFactoryJobControllerTest, OnStreamReadyWithNoAlternativeJob) {
+TEST_P(HttpStreamFactoryJobControllerTest, OnStreamReadyWithNoAlternativeJob) {
tcp_data_ = std::make_unique<SequencedSocketData>();
tcp_data_->set_connect_data(MockConnect(ASYNC, OK));
@@ -1181,7 +1233,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, OnStreamReadyWithNoAlternativeJob) {
// Test we cancel Jobs correctly when the Request is explicitly canceled
// before any Job is bound to Request.
-TEST_F(HttpStreamFactoryJobControllerTest, CancelJobsBeforeBinding) {
+TEST_P(HttpStreamFactoryJobControllerTest, CancelJobsBeforeBinding) {
// Use COLD_START to make the alt job pending.
crypto_client_stream_factory_.set_handshake_mode(
MockCryptoClientStream::COLD_START);
@@ -1216,7 +1268,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, CancelJobsBeforeBinding) {
// Test that the controller does not create alternative job when the advertised
// versions in AlternativeServiceInfo do not contain any version that is
// supported.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
DoNotCreateAltJobIfQuicVersionsUnsupported) {
tcp_data_ = std::make_unique<SequencedSocketData>();
tcp_data_->set_connect_data(MockConnect(ASYNC, OK));
@@ -1243,7 +1295,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
DoNotDelayMainJobIfQuicWasRecentlyBroken) {
crypto_client_stream_factory_.set_handshake_mode(
MockCryptoClientStream::COLD_START);
@@ -1301,7 +1353,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
DelayMainJobAfterRecentlyBrokenQuicWasConfirmed) {
crypto_client_stream_factory_.set_handshake_mode(
MockCryptoClientStream::COLD_START);
@@ -1365,7 +1417,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
-void HttpStreamFactoryJobControllerTest::TestOnStreamFailedForBothJobs(
+void HttpStreamFactoryJobControllerTestBase::TestOnStreamFailedForBothJobs(
bool alt_job_retried_on_non_default_network) {
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddConnect(ASYNC, ERR_FAILED);
@@ -1404,20 +1456,21 @@ void HttpStreamFactoryJobControllerTest::TestOnStreamFailedForBothJobs(
// This test verifies that the alternative service is not marked broken if both
// jobs fail, and the alternative job is not retried on the alternate network.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
OnStreamFailedForBothJobsWithoutQuicRetry) {
TestOnStreamFailedForBothJobs(false);
}
// This test verifies that the alternative service is not marked broken if both
// jobs fail, and the alternative job is retried on the alternate network.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
OnStreamFailedForBothJobsWithQuicRetriedOnAlternateNetwork) {
TestOnStreamFailedForBothJobs(true);
}
-void HttpStreamFactoryJobControllerTest::TestAltJobFailsAfterMainJobSucceeded(
- bool alt_job_retried_on_non_default_network) {
+void HttpStreamFactoryJobControllerTestBase::
+ TestAltJobFailsAfterMainJobSucceeded(
+ bool alt_job_retried_on_non_default_network) {
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddRead(ASYNC, ERR_FAILED);
crypto_client_stream_factory_.set_handshake_mode(
@@ -1472,7 +1525,7 @@ void HttpStreamFactoryJobControllerTest::TestAltJobFailsAfterMainJobSucceeded(
// This test verifies that the alternatvie service is marked broken when the
// alternative job fails on default after the main job succeeded. The
// brokenness should not be cleared when the default network changes.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltJobFailsOnDefaultNetworkAfterMainJobSucceeded) {
TestAltJobFailsAfterMainJobSucceeded(false);
}
@@ -1480,13 +1533,13 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// This test verifies that the alternatvie service is marked broken when the
// alternative job fails on both networks after the main job succeeded. The
// brokenness should not be cleared when the default network changes.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltJobFailsOnBothNetworksAfterMainJobSucceeded) {
TestAltJobFailsAfterMainJobSucceeded(true);
}
// Tests that when alt job succeeds, main job is destroyed.
-TEST_F(HttpStreamFactoryJobControllerTest, AltJobSucceedsMainJobDestroyed) {
+TEST_P(HttpStreamFactoryJobControllerTest, AltJobSucceedsMainJobDestroyed) {
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddRead(SYNCHRONOUS, ERR_IO_PENDING);
// Use cold start and complete alt job manually.
@@ -1533,7 +1586,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, AltJobSucceedsMainJobDestroyed) {
// Tests that if alt job succeeds and main job is blocked, main job should be
// cancelled immediately. |request_| completion will clean up the JobController.
// Regression test for crbug.com/678768.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsMainJobBlockedControllerDestroyed) {
quic_data_ = std::make_unique<MockQuicData>(version_);
if (version_.UsesHttp3()) {
@@ -1574,7 +1627,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
SpdySessionKeyHasOriginHostPortPair) {
session_deps_.enable_http2_alternative_service = true;
@@ -1614,7 +1667,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// Tests that if an orphaned job completes after |request_| is gone,
// JobController will be cleaned up.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
OrphanedJobCompletesControllerDestroyed) {
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -1668,8 +1721,9 @@ TEST_F(HttpStreamFactoryJobControllerTest,
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
-void HttpStreamFactoryJobControllerTest::TestAltJobSucceedsAfterMainJobFailed(
- bool alt_job_retried_on_non_default_network) {
+void HttpStreamFactoryJobControllerTestBase::
+ TestAltJobSucceedsAfterMainJobFailed(
+ bool alt_job_retried_on_non_default_network) {
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddRead(SYNCHRONOUS, ERR_IO_PENDING);
// Use cold start and complete alt job manually.
@@ -1723,19 +1777,19 @@ void HttpStreamFactoryJobControllerTest::TestAltJobSucceedsAfterMainJobFailed(
// This test verifies that the alternative service is not mark broken if the
// alternative job succeeds on the default network after the main job failed.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnDefaultNetworkAfterMainJobFailed) {
TestAltJobSucceedsAfterMainJobFailed(false);
}
// This test verifies that the alternative service is not mark broken if the
// alternative job succeeds on the alternate network after the main job failed.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnAlternateNetwrokAfterMainJobFailed) {
TestAltJobSucceedsAfterMainJobFailed(true);
}
-void HttpStreamFactoryJobControllerTest::
+void HttpStreamFactoryJobControllerTestBase::
TestAltJobSucceedsAfterMainJobSucceeded(
bool alt_job_retried_on_non_default_network) {
quic_data_ = std::make_unique<MockQuicData>(version_);
@@ -1803,7 +1857,7 @@ void HttpStreamFactoryJobControllerTest::
// This test verifies that the alternative service is not marked broken if the
// alternative job succeeds on the default network after the main job succeeded.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnDefaultNetworkAfterMainJobSucceeded) {
TestAltJobSucceedsAfterMainJobSucceeded(false);
}
@@ -1813,12 +1867,12 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// network, which failed on the default network previously, after the main job
// succeeded. The brokenness should be cleared when the default network
// changes.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltJobSucceedsOnAlternateNetworkAfterMainJobSucceeded) {
TestAltJobSucceedsAfterMainJobSucceeded(true);
}
-void HttpStreamFactoryJobControllerTest::
+void HttpStreamFactoryJobControllerTestBase::
TestMainJobSucceedsAfterAltJobSucceeded(
bool alt_job_retried_on_non_default_network) {
quic_data_ = std::make_unique<MockQuicData>(version_);
@@ -1880,7 +1934,7 @@ void HttpStreamFactoryJobControllerTest::
// This test verifies that the alternative service is not marked broken if the
// main job succeeds after the alternative job succeeded on the default network.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobSucceededOnDefaultNetwork) {
TestMainJobSucceedsAfterAltJobSucceeded(false);
}
@@ -1890,13 +1944,14 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// succeeded on the non-default network, i.e., failed on the default network
// previously. The brokenness should be cleared when the default network
// changes.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobSucceededOnAlternateNetwork) {
TestMainJobSucceedsAfterAltJobSucceeded(true);
}
-void HttpStreamFactoryJobControllerTest::TestMainJobFailsAfterAltJobSucceeded(
- bool alt_job_retried_on_non_default_network) {
+void HttpStreamFactoryJobControllerTestBase::
+ TestMainJobFailsAfterAltJobSucceeded(
+ bool alt_job_retried_on_non_default_network) {
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddRead(SYNCHRONOUS, ERR_IO_PENDING);
// Use cold start and complete alt job manually.
@@ -1945,7 +2000,7 @@ void HttpStreamFactoryJobControllerTest::TestMainJobFailsAfterAltJobSucceeded(
// This test verifies that the alternative service is not marked broken if the
// main job fails after the alternative job succeeded on the default network.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
MainJobFailsAfterAltJobSucceededOnDefaultNetwork) {
TestMainJobFailsAfterAltJobSucceeded(false);
}
@@ -1953,13 +2008,14 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// This test verifies that the alternative service is not marked broken if the
// main job fails after the alternative job succeeded on the non-default
// network, i.e., failed on the default network previously.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
MainJobFailsAfterAltJobSucceededOnAlternateNetwork) {
TestMainJobFailsAfterAltJobSucceeded(true);
}
-void HttpStreamFactoryJobControllerTest::TestMainJobSucceedsAfterAltJobFailed(
- bool alt_job_retried_on_non_default_network) {
+void HttpStreamFactoryJobControllerTestBase::
+ TestMainJobSucceedsAfterAltJobFailed(
+ bool alt_job_retried_on_non_default_network) {
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddConnect(SYNCHRONOUS, ERR_FAILED);
@@ -2011,7 +2067,7 @@ void HttpStreamFactoryJobControllerTest::TestMainJobSucceedsAfterAltJobFailed(
// This test verifies that the alternative service will be marked broken when
// the alternative job fails on the default network and main job succeeds later.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobFailedOnDefaultNetwork) {
TestMainJobSucceedsAfterAltJobFailed(false);
}
@@ -2019,15 +2075,15 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// This test verifies that the alternative service will be marked broken when
// the alternative job fails on both default and alternate networks and main job
// succeeds later.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterAltJobFailedOnBothNetworks) {
TestMainJobSucceedsAfterAltJobFailed(true);
}
-void HttpStreamFactoryJobControllerTest::TestMainJobSucceedsAfterIgnoredError(
- int net_error,
- bool expect_broken,
- std::string alternate_host) {
+void HttpStreamFactoryJobControllerTestBase::
+ TestMainJobSucceedsAfterIgnoredError(int net_error,
+ bool expect_broken,
+ std::string alternate_host) {
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddConnect(SYNCHRONOUS, net_error);
tcp_data_ = std::make_unique<SequencedSocketData>();
@@ -2073,27 +2129,27 @@ void HttpStreamFactoryJobControllerTest::TestMainJobSucceedsAfterIgnoredError(
// Verifies that if the alternative job fails due to a connection change event,
// then the alternative service is not marked as broken.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterConnectionChanged) {
TestMainJobSucceedsAfterIgnoredError(ERR_NETWORK_CHANGED);
}
// Verifies that if the alternative job fails due to a disconnected network,
// then the alternative service is not marked as broken.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterInternetDisconnected) {
TestMainJobSucceedsAfterIgnoredError(ERR_INTERNET_DISCONNECTED);
}
// Verifies that if the alternative job fails due to a DNS failure,
// then the alternative service is not marked as broken.
-TEST_F(HttpStreamFactoryJobControllerTest, MainJobSucceedsAfterDnsFailure) {
+TEST_P(HttpStreamFactoryJobControllerTest, MainJobSucceedsAfterDnsFailure) {
TestMainJobSucceedsAfterIgnoredError(ERR_NAME_NOT_RESOLVED);
}
// Verifies that if the alternative job fails due to a DNS failure on a
// different name, then the alternative service is marked as broken.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
MainJobSucceedsAfterDnsFailureWithAlternateName) {
TestMainJobSucceedsAfterIgnoredError(ERR_NAME_NOT_RESOLVED, true,
"alternate.google.com");
@@ -2101,7 +2157,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// Regression test for crbug/621069.
// Get load state after main job fails and before alternative job succeeds.
-TEST_F(HttpStreamFactoryJobControllerTest, GetLoadStateAfterMainJobFailed) {
+TEST_P(HttpStreamFactoryJobControllerTest, GetLoadStateAfterMainJobFailed) {
// Use COLD_START to complete alt job manually.
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -2148,7 +2204,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, GetLoadStateAfterMainJobFailed) {
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
-TEST_F(HttpStreamFactoryJobControllerTest, ResumeMainJobWhenAltJobStalls) {
+TEST_P(HttpStreamFactoryJobControllerTest, ResumeMainJobWhenAltJobStalls) {
// Use COLD_START to stall alt job.
quic_data_ = std::make_unique<MockQuicData>(version_);
quic_data_->AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -2181,7 +2237,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, ResumeMainJobWhenAltJobStalls) {
base::RunLoop().RunUntilIdle();
}
-TEST_F(HttpStreamFactoryJobControllerTest, InvalidPortForQuic) {
+TEST_P(HttpStreamFactoryJobControllerTest, InvalidPortForQuic) {
HttpRequestInfo request_info;
request_info.method = "GET";
request_info.url = GURL("https://www.google.com");
@@ -2207,7 +2263,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, InvalidPortForQuic) {
// Verifies that the main job is not resumed until after the alt job completes
// host resolution.
-TEST_F(HttpStreamFactoryJobControllerTest, HostResolutionHang) {
+TEST_P(HttpStreamFactoryJobControllerTest, HostResolutionHang) {
auto hanging_resolver = std::make_unique<MockHostResolver>();
hanging_resolver->set_ondemand_mode(true);
hanging_resolver->rules()->AddRule("www.google.com", "1.2.3.4");
@@ -2279,13 +2335,13 @@ TEST_F(HttpStreamFactoryJobControllerTest, HostResolutionHang) {
// OnStreamFailed will post a task to resume the main job immediately but
// won't call Resume() on the main job since it's been resumed already.
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
- quic_data.GetSequencedSocketData()->Resume();
+ quic_data.Resume();
FastForwardUntilNoTasksRemain();
// Alt job should be cleaned up
EXPECT_FALSE(job_controller_->alternative_job());
}
-TEST_F(HttpStreamFactoryJobControllerTest, DelayedTCP) {
+TEST_P(HttpStreamFactoryJobControllerTest, DelayedTCP) {
HttpRequestInfo request_info;
request_info.method = "GET";
request_info.url = GURL("https://www.google.com");
@@ -2340,13 +2396,13 @@ TEST_F(HttpStreamFactoryJobControllerTest, DelayedTCP) {
// Unpause mock quic data and run all remaining tasks. Alt-job should fail
// and be cleaned up.
- quic_data.GetSequencedSocketData()->Resume();
+ quic_data.Resume();
FastForwardUntilNoTasksRemain();
EXPECT_FALSE(job_controller_->alternative_job());
}
// Regression test for crbug.com/789560.
-TEST_F(HttpStreamFactoryJobControllerTest, ResumeMainJobLaterCanceled) {
+TEST_P(HttpStreamFactoryJobControllerTest, ResumeMainJobLaterCanceled) {
std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
ConfiguredProxyResolutionService::CreateDirect();
ConfiguredProxyResolutionService* proxy_resolution_service_raw =
@@ -2424,7 +2480,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, ResumeMainJobLaterCanceled) {
// http_server_properties cached an inappropriate large srtt for the server,
// which would potentially delay the main job for a extremely long time in
// delayed tcp case.
-TEST_F(HttpStreamFactoryJobControllerTest, DelayedTCPWithLargeSrtt) {
+TEST_P(HttpStreamFactoryJobControllerTest, DelayedTCPWithLargeSrtt) {
// The max delay time should be in sync with .cc file.
base::TimeDelta kMaxDelayTimeForMainJob = base::Seconds(3);
@@ -2481,14 +2537,14 @@ TEST_F(HttpStreamFactoryJobControllerTest, DelayedTCPWithLargeSrtt) {
// Unpause mock quic data and run all remaining tasks. Alt-job should fail
// and be cleaned up.
- quic_data.GetSequencedSocketData()->Resume();
+ quic_data.Resume();
FastForwardUntilNoTasksRemain();
EXPECT_FALSE(job_controller_->alternative_job());
}
// TODO(https://crbug.com/1007502): Disabled because the pending task count does
// not match expectations.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
DISABLED_ResumeMainJobImmediatelyOnStreamFailed) {
HttpRequestInfo request_info;
request_info.method = "GET";
@@ -2540,7 +2596,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// Now unpause the mock quic data to fail the alt job. This should immediately
// resume the main job.
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1);
- quic_data.GetSequencedSocketData()->Resume();
+ quic_data.Resume();
FastForwardBy(base::TimeDelta());
EXPECT_TRUE(job_controller_->main_job());
@@ -2556,7 +2612,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
FastForwardUntilNoTasksRemain();
}
-TEST_F(HttpStreamFactoryJobControllerTest, PreconnectToHostWithValidAltSvc) {
+TEST_P(HttpStreamFactoryJobControllerTest, PreconnectToHostWithValidAltSvc) {
quic_data_ = std::make_unique<MockQuicData>(version_);
if (version_.UsesHttp3()) {
quic_data_->AddWrite(SYNCHRONOUS,
@@ -2586,7 +2642,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, PreconnectToHostWithValidAltSvc) {
}
// When preconnect to a H2 supported server, only 1 connection is opened.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
PreconnectMultipleStreamsToH2Server) {
tcp_data_ = std::make_unique<SequencedSocketData>();
tcp_data_->set_connect_data(MockConnect(ASYNC, OK));
@@ -2618,7 +2674,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// Check that the logic to only preconnect a single socket to servers with H2
// support respects NetworkIsolationKeys.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
PreconnectMultipleStreamsToH2ServerWithNetworkIsolationKey) {
base::test::ScopedFeatureList feature_list;
// It's not strictly necessary to enable
@@ -2684,29 +2740,29 @@ TEST_F(HttpStreamFactoryJobControllerTest,
request_info.network_isolation_key = other_network_isolation_key;
MockHttpStreamRequestDelegate request_delegate;
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, &request_delegate, session_.get(), &job_factory_,
- request_info, is_preconnect_, false /* is_websocket */,
- enable_ip_based_pooling_, enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- job_controller->Preconnect(/*num_streams=*/5);
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, &request_delegate, session_.get(), &job_factory_,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
+ job_controller_ptr->Preconnect(/*num_streams=*/5);
// Five jobs should be started.
- EXPECT_TRUE(job_controller->main_job());
- EXPECT_FALSE(job_controller->alternative_job());
+ EXPECT_TRUE(job_controller_ptr->main_job());
+ EXPECT_FALSE(job_controller_ptr->alternative_job());
EXPECT_EQ(HttpStreamFactory::PRECONNECT,
- job_controller->main_job()->job_type());
- EXPECT_EQ(
- 5, HttpStreamFactoryJobPeer::GetNumStreams(job_controller->main_job()));
+ job_controller_ptr->main_job()->job_type());
+ EXPECT_EQ(5, HttpStreamFactoryJobPeer::GetNumStreams(
+ job_controller_ptr->main_job()));
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
}
}
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
DonotDelayMainJobIfHasAvailableSpdySession) {
SetNotDelayMainJobWithAvailableSpdySession();
HttpRequestInfo request_info;
@@ -2760,7 +2816,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// Check the case that while a preconnect is waiting in the H2 request queue,
// and a SPDY session appears, the job completes successfully.
-TEST_F(HttpStreamFactoryJobControllerTest, SpdySessionInterruptsPreconnect) {
+TEST_P(HttpStreamFactoryJobControllerTest, SpdySessionInterruptsPreconnect) {
// Make sure there is only one socket connect.
MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 0)};
MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1)};
@@ -2789,17 +2845,16 @@ TEST_F(HttpStreamFactoryJobControllerTest, SpdySessionInterruptsPreconnect) {
// Create and start a preconnect request, which should start watching the
// SpdySessionPool.
MockHttpStreamRequestDelegate preconnect_request_delegate;
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, &preconnect_request_delegate, session_.get(), &job_factory_,
- request_info, true /* is_preconnect */, false /* is_websocket */,
- enable_ip_based_pooling_, enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- job_controller->Preconnect(1);
- EXPECT_TRUE(job_controller->main_job());
- EXPECT_FALSE(job_controller->alternative_job());
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, &preconnect_request_delegate, session_.get(), &job_factory_,
+ request_info, true /* is_preconnect */, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_, std::move(job_controller));
+ job_controller_ptr->Preconnect(1);
+ EXPECT_TRUE(job_controller_ptr->main_job());
+ EXPECT_FALSE(job_controller_ptr->alternative_job());
// The non-preconnect request should create an H2 session, which the
// preconnect then sees, and the preconnect request should complete and be
@@ -2834,16 +2889,14 @@ TEST_F(HttpStreamFactoryJobControllerTest, SpdySessionInterruptsPreconnect) {
// OnConnectComplete() is called in the end of the test.
// [3] Normal non-preconnect request to other.example.org. This request must
// succeed even while the preconnect request [2] is paused.
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
PreconnectJobDoesntBlockIpBasedPooling) {
// Make sure that both "www.example.org" and "other.example.org" are pointing
// to the same IP address.
- std::vector<HostResolverEndpointResult> endpoints;
- HostResolverEndpointResult endpoint_result;
- endpoint_result.ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
- endpoints.push_back(endpoint_result);
- session_deps_.host_resolver->rules()->AddRule("www.example.org", endpoints);
- session_deps_.host_resolver->rules()->AddRule("other.example.org", endpoints);
+ session_deps_.host_resolver->rules()->AddRule(
+ "www.example.org", IPAddress::IPv4Localhost().ToString());
+ session_deps_.host_resolver->rules()->AddRule(
+ "other.example.org", IPAddress::IPv4Localhost().ToString());
// Make |host_resolver| asynchronous to simulate the issue of
// crbug.com/1320608.
session_deps_.host_resolver->set_synchronous_mode(false);
@@ -2881,6 +2934,11 @@ TEST_F(HttpStreamFactoryJobControllerTest,
&request_delegate_,
/*websocket_handshake_stream_create_helper=*/nullptr,
NetLogWithSource(), HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
+ if (dns_https_alpn_enabled()) {
+ EXPECT_CALL(*job_factory_.main_job(), Resume())
+ .Times(1)
+ .WillOnce([this]() { job_factory_.main_job()->DoResume(); });
+ }
base::RunLoop run_loop;
EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _))
.WillOnce([&run_loop]() { run_loop.Quit(); });
@@ -2908,16 +2966,18 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// Create and start a preconnect request [2].
MockHttpStreamRequestDelegate preconnect_request_delegate;
- HttpStreamFactory::JobController* preconnect_job_controller =
- new HttpStreamFactory::JobController(
+ auto preconnect_job_controller =
+ std::make_unique<HttpStreamFactory::JobController>(
factory_, &preconnect_request_delegate, session_.get(), &job_factory_,
other_request_info, /*is_preconnect=*/true,
/*is_websocket=*/false, /*enable_ip_based_pooling=*/true,
enable_alternative_services_,
delay_main_job_with_available_spdy_session_, SSLConfig(),
SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, preconnect_job_controller);
- preconnect_job_controller->Preconnect(1);
+ auto* preconnect_job_controller_ptr = preconnect_job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(preconnect_job_controller));
+ preconnect_job_controller_ptr->Preconnect(1);
base::RunLoop().RunUntilIdle();
// The SpdySession is available for IP based pooling when the host resolution
@@ -2939,17 +2999,17 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// Create and start a second non-preconnect request [3].
{
MockHttpStreamRequestDelegate request_delegate;
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, &request_delegate, session_.get(), &job_factory_,
- other_request_info, /*is_preconnect=*/false,
- /*is_websocket=*/false, /*enable_ip_based_pooling=*/true,
- enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, &request_delegate, session_.get(), &job_factory_,
+ other_request_info, /*is_preconnect=*/false,
+ /*is_websocket=*/false, /*enable_ip_based_pooling=*/true,
+ enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
std::unique_ptr<HttpStreamRequest> second_stream_request =
- job_controller->Start(
+ job_controller_ptr->Start(
&request_delegate,
/*websocket_handshake_stream_create_helper=*/nullptr,
NetLogWithSource(), HttpStreamRequest::HTTP_STREAM,
@@ -2972,8 +3032,10 @@ TEST_F(HttpStreamFactoryJobControllerTest,
}
class JobControllerLimitMultipleH2Requests
- : public HttpStreamFactoryJobControllerTest {
+ : public HttpStreamFactoryJobControllerTestBase {
protected:
+ JobControllerLimitMultipleH2Requests()
+ : HttpStreamFactoryJobControllerTestBase(false) {}
const int kNumRequests = 5;
void SetUp() override { SkipCreatingJobController(); }
};
@@ -3004,19 +3066,19 @@ TEST_F(JobControllerLimitMultipleH2Requests, MultipleRequests) {
for (int i = 0; i < kNumRequests; ++i) {
request_delegates.emplace_back(
std::make_unique<MockHttpStreamRequestDelegate>());
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, false /* is_websocket */,
- enable_ip_based_pooling_, enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- auto request = job_controller->Start(
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, request_delegates[i].get(), session_.get(), &job_factory_,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
+ auto request = job_controller_ptr->Start(
request_delegates[i].get(), nullptr, net_log_with_source_,
HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
- EXPECT_TRUE(job_controller->main_job());
- EXPECT_FALSE(job_controller->alternative_job());
+ EXPECT_TRUE(job_controller_ptr->main_job());
+ EXPECT_FALSE(job_controller_ptr->alternative_job());
requests.push_back(std::move(request));
}
@@ -3091,20 +3153,20 @@ TEST_F(JobControllerLimitMultipleH2Requests,
}
request_delegates.emplace_back(
std::make_unique<MockHttpStreamRequestDelegate>());
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, request_delegates[i].get(), session_.get(),
- &job_factory_, request_info, is_preconnect_,
- false /* is_websocket */, enable_ip_based_pooling_,
- enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- auto request = job_controller->Start(
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, request_delegates[i].get(), session_.get(), &job_factory_,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(),
+ SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
+ auto request = job_controller_ptr->Start(
request_delegates[i].get(), nullptr, net_log_with_source_,
HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
- EXPECT_TRUE(job_controller->main_job());
- EXPECT_FALSE(job_controller->alternative_job());
+ EXPECT_TRUE(job_controller_ptr->main_job());
+ EXPECT_FALSE(job_controller_ptr->alternative_job());
requests.push_back(std::move(request));
}
}
@@ -3169,19 +3231,19 @@ TEST_F(JobControllerLimitMultipleH2Requests, MultipleRequestsFirstRequestHang) {
for (int i = 0; i < kNumRequests; ++i) {
request_delegates.push_back(
std::make_unique<MockHttpStreamRequestDelegate>());
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, false /* is_websocket */,
- enable_ip_based_pooling_, enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- auto request = job_controller->Start(
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, request_delegates[i].get(), session_.get(), &job_factory_,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
+ auto request = job_controller_ptr->Start(
request_delegates[i].get(), nullptr, net_log_with_source_,
HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
- EXPECT_TRUE(job_controller->main_job());
- EXPECT_FALSE(job_controller->alternative_job());
+ EXPECT_TRUE(job_controller_ptr->main_job());
+ EXPECT_FALSE(job_controller_ptr->alternative_job());
requests.push_back(std::move(request));
}
@@ -3243,19 +3305,19 @@ TEST_F(JobControllerLimitMultipleH2Requests,
for (int i = 0; i < kNumRequests; ++i) {
request_delegates.emplace_back(
std::make_unique<MockHttpStreamRequestDelegate>());
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, false /* is_websocket */,
- enable_ip_based_pooling_, enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- auto request = job_controller->Start(
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, request_delegates[i].get(), session_.get(), &job_factory_,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
+ auto request = job_controller_ptr->Start(
request_delegates[i].get(), nullptr, net_log_with_source_,
HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
- EXPECT_TRUE(job_controller->main_job());
- EXPECT_FALSE(job_controller->alternative_job());
+ EXPECT_TRUE(job_controller_ptr->main_job());
+ EXPECT_FALSE(job_controller_ptr->alternative_job());
requests.push_back(std::move(request));
}
// Cancel the first one.
@@ -3299,17 +3361,17 @@ TEST_F(JobControllerLimitMultipleH2Requests, MultiplePreconnects) {
for (int i = 0; i < kNumRequests; ++i) {
request_delegates.emplace_back(
std::make_unique<MockHttpStreamRequestDelegate>());
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, false /* is_websocket */,
- enable_ip_based_pooling_, enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- job_controller->Preconnect(1);
- EXPECT_TRUE(job_controller->main_job());
- EXPECT_FALSE(job_controller->alternative_job());
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, request_delegates[i].get(), session_.get(), &job_factory_,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
+ job_controller_ptr->Preconnect(1);
+ EXPECT_TRUE(job_controller_ptr->main_job());
+ EXPECT_FALSE(job_controller_ptr->alternative_job());
}
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
@@ -3348,19 +3410,19 @@ TEST_F(JobControllerLimitMultipleH2Requests, H1NegotiatedForFirstRequest) {
for (int i = 0; i < 2; ++i) {
request_delegates.emplace_back(
std::make_unique<MockHttpStreamRequestDelegate>());
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, false /* is_websocket */,
- enable_ip_based_pooling_, enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- auto request = job_controller->Start(
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, request_delegates[i].get(), session_.get(), &job_factory_,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
+ auto request = job_controller_ptr->Start(
request_delegates[i].get(), nullptr, net_log_with_source_,
HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
- EXPECT_TRUE(job_controller->main_job());
- EXPECT_FALSE(job_controller->alternative_job());
+ EXPECT_TRUE(job_controller_ptr->main_job());
+ EXPECT_FALSE(job_controller_ptr->alternative_job());
requests.push_back(std::move(request));
}
@@ -3411,20 +3473,19 @@ TEST_F(JobControllerLimitMultipleH2Requests, QuicJobNotThrottled) {
// Use default job factory so that Resume() is not mocked out.
HttpStreamFactory::JobFactory default_job_factory;
- HttpStreamFactory::JobController* job_controller =
- new HttpStreamFactory::JobController(
- factory_, &request_delegate_, session_.get(), &default_job_factory,
- request_info, is_preconnect_, false /* is_websocket */,
- enable_ip_based_pooling_, enable_alternative_services_,
- delay_main_job_with_available_spdy_session_, SSLConfig(),
- SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller);
- request_ =
- job_controller->Start(&request_delegate_, nullptr, net_log_with_source_,
- HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
-
- EXPECT_TRUE(job_controller->main_job());
- EXPECT_TRUE(job_controller->alternative_job());
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, &request_delegate_, session_.get(), &default_job_factory,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ auto* job_controller_ptr = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_, std::move(job_controller));
+ request_ = job_controller_ptr->Start(
+ &request_delegate_, nullptr, net_log_with_source_,
+ HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
+
+ EXPECT_TRUE(job_controller_ptr->main_job());
+ EXPECT_TRUE(job_controller_ptr->alternative_job());
EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _));
base::RunLoop().RunUntilIdle();
auto entries = net_log_observer_.GetEntries();
@@ -3434,8 +3495,12 @@ TEST_F(JobControllerLimitMultipleH2Requests, QuicJobNotThrottled) {
}
class HttpStreamFactoryJobControllerMisdirectedRequestRetry
- : public HttpStreamFactoryJobControllerTest,
- public ::testing::WithParamInterface<::testing::tuple<bool, bool>> {};
+ : public HttpStreamFactoryJobControllerTestBase,
+ public ::testing::WithParamInterface<::testing::tuple<bool, bool>> {
+ public:
+ HttpStreamFactoryJobControllerMisdirectedRequestRetry()
+ : HttpStreamFactoryJobControllerTestBase(false) {}
+};
INSTANTIATE_TEST_SUITE_P(
All,
@@ -3491,9 +3556,12 @@ TEST_P(HttpStreamFactoryJobControllerMisdirectedRequestRetry,
}
class HttpStreamFactoryJobControllerPreconnectTest
- : public HttpStreamFactoryJobControllerTest,
+ : public HttpStreamFactoryJobControllerTestBase,
public ::testing::WithParamInterface<bool> {
protected:
+ HttpStreamFactoryJobControllerPreconnectTest()
+ : HttpStreamFactoryJobControllerTestBase(false) {}
+
void SetUp() override {
if (!GetParam()) {
scoped_feature_list_.InitFromCommandLine(std::string(),
@@ -3509,7 +3577,7 @@ class HttpStreamFactoryJobControllerPreconnectTest
factory_ = session_->http_stream_factory();
request_info_.method = "GET";
request_info_.url = GURL("https://www.example.com");
- job_controller_ = new HttpStreamFactory::JobController(
+ auto job_controller = std::make_unique<HttpStreamFactory::JobController>(
factory_, &request_delegate_, session_.get(), &job_factory_,
request_info_, /* is_preconnect = */ true,
/* is_websocket = */ false,
@@ -3517,7 +3585,9 @@ class HttpStreamFactoryJobControllerPreconnectTest
/* enable_alternative_services = */ true,
/* delay_main_job_with_available_spdy_session = */ true, SSLConfig(),
SSLConfig());
- HttpStreamFactoryPeer::AddJobController(factory_, job_controller_);
+ job_controller_ = job_controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_,
+ std::move(job_controller));
}
protected:
@@ -3564,7 +3634,7 @@ TEST_P(HttpStreamFactoryJobControllerPreconnectTest, LimitEarlyPreconnects) {
// Test that GetAlternativeServiceInfoFor will include a list of advertised
// versions, which contains a version that is supported. Returns an empty list
// if advertised versions are missing in HttpServerProperties.
-TEST_F(HttpStreamFactoryJobControllerTest, GetAlternativeServiceInfoFor) {
+TEST_P(HttpStreamFactoryJobControllerTest, GetAlternativeServiceInfoFor) {
HttpRequestInfo request_info;
request_info.method = "GET";
request_info.url = GURL("https://www.google.com");
@@ -3658,7 +3728,7 @@ TEST_F(HttpStreamFactoryJobControllerTest, GetAlternativeServiceInfoFor) {
EXPECT_EQ(0u, alt_svc_info.advertised_versions().size());
}
-void HttpStreamFactoryJobControllerTest::TestAltSvcVersionSelection(
+void HttpStreamFactoryJobControllerTestBase::TestAltSvcVersionSelection(
const std::string& alt_svc_header,
const quic::ParsedQuicVersion& expected_version,
const quic::ParsedQuicVersionVector& supported_versions) {
@@ -3672,8 +3742,7 @@ void HttpStreamFactoryJobControllerTest::TestAltSvcVersionSelection(
request_info.network_isolation_key = network_isolation_key;
Initialize(request_info);
url::SchemeHostPort origin(request_info.url);
- scoped_refptr<HttpResponseHeaders> headers(
- base::MakeRefCounted<HttpResponseHeaders>(""));
+ auto headers = base::MakeRefCounted<HttpResponseHeaders>("");
headers->AddHeader("alt-svc", alt_svc_header);
session_->http_stream_factory()->ProcessAlternativeServices(
session_.get(), network_isolation_key, headers.get(), origin);
@@ -3691,7 +3760,7 @@ void HttpStreamFactoryJobControllerTest::TestAltSvcVersionSelection(
<< quic::ParsedQuicVersionVectorToString(advertised_versions);
}
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltSvcVersionSelectionFindsFirstMatch) {
TestAltSvcVersionSelection(
"h3-Q050=\":443\"; ma=2592000,"
@@ -3702,7 +3771,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
quic::ParsedQuicVersion::Q050(), quic::AllSupportedVersions());
}
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltSvcVersionSelectionFindsFirstMatchInverse) {
TestAltSvcVersionSelection(
"h3-Q043=\":443\"; ma=2592000,"
@@ -3712,7 +3781,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
quic::ParsedQuicVersion::Q043(), quic::AllSupportedVersions());
}
-TEST_F(HttpStreamFactoryJobControllerTest,
+TEST_P(HttpStreamFactoryJobControllerTest,
AltSvcVersionSelectionWithInverseOrderingNewFormat) {
// Server prefers Q043 but client prefers Q046.
TestAltSvcVersionSelection(
@@ -3726,7 +3795,7 @@ TEST_F(HttpStreamFactoryJobControllerTest,
// Tests that if HttpNetworkSession has a non-empty QUIC host allowlist,
// then GetAlternativeServiceFor() will not return any QUIC alternative service
// that's not on the allowlist.
-TEST_F(HttpStreamFactoryJobControllerTest, QuicHostAllowlist) {
+TEST_P(HttpStreamFactoryJobControllerTest, QuicHostAllowlist) {
HttpRequestInfo request_info;
request_info.method = "GET";
request_info.url = GURL("https://www.google.com");
@@ -3781,6 +3850,1261 @@ TEST_F(HttpStreamFactoryJobControllerTest, QuicHostAllowlist) {
EXPECT_EQ(0u, alt_svc_info.advertised_versions().size());
}
-} // namespace test
+// Tests specific to UseDnsHttpsAlpn feature.
+class HttpStreamFactoryJobControllerDnsHttpsAlpnTest
+ : public HttpStreamFactoryJobControllerTestBase {
+ protected:
+ HttpStreamFactoryJobControllerDnsHttpsAlpnTest()
+ : HttpStreamFactoryJobControllerTestBase(true) {}
+
+ void SetUp() override { SkipCreatingJobController(); }
+
+ void EnableOndemandHostResolver() {
+ session_deps_.host_resolver->set_synchronous_mode(false);
+ session_deps_.host_resolver->set_ondemand_mode(true);
+ }
+
+ HttpRequestInfo CreateTestHttpRequestInfo() {
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("https://www.example.org");
+ return request_info;
+ }
+
+ void RegisterMockHttpsRecord() {
+ HostResolverEndpointResult endpoint_result1;
+ endpoint_result1.ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
+ endpoint_result1.metadata.supported_protocol_alpns = {
+ quic::QuicVersionLabelToString(quic::CreateQuicVersionLabel(version_))};
+
+ HostResolverEndpointResult endpoint_result2;
+ endpoint_result2.ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
+
+ std::vector<HostResolverEndpointResult> endpoints;
+ endpoints.push_back(endpoint_result1);
+ endpoints.push_back(endpoint_result2);
+ session_deps_.host_resolver->rules()->AddRule(
+ "www.example.org",
+ MockHostResolverBase::RuleResolver::RuleResult(
+ std::move(endpoints),
+ /*aliases=*/std::set<std::string>{"www.example.org"}));
+ }
+
+ void CreateJobController(const HttpRequestInfo& request_info) {
+ CreateJobControllerImpl(&job_controller_, &request_delegate_, request_info);
+ }
+
+ std::unique_ptr<HttpStreamRequest> CreateJobControllerAndStart(
+ const HttpRequestInfo& request_info) {
+ return CreateJobControllerAndStartImpl(&job_controller_, &request_delegate_,
+ request_info);
+ }
+
+ std::unique_ptr<HttpStreamRequest> CreateSecondJobControllerAndStart(
+ const HttpRequestInfo& request_info) {
+ return CreateJobControllerAndStartImpl(&job_controller2_,
+ &request_delegate2_, request_info);
+ }
+
+ void PrepareForMainJob() { PrepareForMainJobImpl(&tcp_data_, &ssl_data_); }
+ void PrepareForSecondMainJob() {
+ PrepareForMainJobImpl(&tcp_data2_, &ssl_data2_);
+ }
+
+ void PrepareForFirstQuicJob() { PrepareForQuicJobImpl(&quic_data_); }
+ void PrepareForSecondQuicJob() { PrepareForQuicJobImpl(&quic_data2_); }
+
+ void PrepareForFirstQuicJobFailure() {
+ PrepareForQuicJobFailureImpl(&quic_data_);
+ }
+ void PrepareForSecondQuicJobFailure() {
+ PrepareForQuicJobFailureImpl(&quic_data2_);
+ }
+
+ void MakeMainJobSucceed(bool expect_stream_ready) {
+ MakeMainJobSucceedImpl(request_delegate_, tcp_data_.get(),
+ expect_stream_ready);
+ }
+
+ void MakeSecondMainJobSucceed(bool expect_stream_ready) {
+ MakeMainJobSucceedImpl(request_delegate2_, tcp_data2_.get(),
+ expect_stream_ready);
+ }
+
+ void MakeQuicJobScceed(size_t index, bool expect_stream_ready) {
+ ASSERT_GT(crypto_client_stream_factory_.streams().size(), index);
+ MockCryptoClientStream* stream =
+ crypto_client_stream_factory_.streams()[index].get();
+ ASSERT_TRUE(stream);
+
+ if (expect_stream_ready) {
+ base::RunLoop run_loop;
+ EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _))
+ .Times(1)
+ .WillOnce(Invoke([&run_loop]() { run_loop.Quit(); }));
+ stream->NotifySessionOneRttKeyAvailable();
+ run_loop.Run();
+ } else {
+ EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _)).Times(0);
+ stream->NotifySessionOneRttKeyAvailable();
+ base::RunLoop().RunUntilIdle();
+ }
+ }
+
+ void CheckJobsStatus(bool main_job_exists,
+ bool alternative_job_exists,
+ bool dns_alpn_h3_job_exists,
+ const std::string& scoped_trace_message = "") {
+ CheckJobsStatusImpl(job_controller_.get(), main_job_exists,
+ alternative_job_exists, dns_alpn_h3_job_exists,
+ scoped_trace_message);
+ }
+
+ void CheckSecondJobsStatus(bool main_job_exists,
+ bool alternative_job_exists,
+ bool dns_alpn_h3_job_exists,
+ const std::string& scoped_trace_message = "") {
+ CheckJobsStatusImpl(job_controller2_.get(), main_job_exists,
+ alternative_job_exists, dns_alpn_h3_job_exists,
+ scoped_trace_message);
+ }
+
+ std::unique_ptr<QuicHttpStream> ConnectQuicHttpStream(
+ bool alt_destination,
+ bool require_dns_https_alpn) {
+ NetErrorDetails net_error_details;
+ QuicStreamRequest quic_request(session_->quic_stream_factory());
+ url::SchemeHostPort scheme_host_port(
+ url::kHttpsScheme,
+ alt_destination ? "alt.example.org" : "www.example.org", 443);
+ absl::optional<int> quic_request_result;
+
+ CHECK_EQ(ERR_IO_PENDING,
+ quic_request.Request(
+ scheme_host_port,
+ require_dns_https_alpn ? quic::ParsedQuicVersion::Unsupported()
+ : version_,
+ PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY, SocketTag(),
+ NetworkIsolationKey(), SecureDnsPolicy::kAllow,
+ /*use_dns_aliases=*/true, require_dns_https_alpn,
+ /*cert_verify_flags=*/0, GURL("https://www.example.org/"),
+ net_log_with_source_, &net_error_details,
+ base::BindLambdaForTesting([&](int result) {}),
+ base::BindLambdaForTesting([&quic_request_result](int result) {
+ quic_request_result = result;
+ })));
+ CHECK_EQ(1u, crypto_client_stream_factory_.streams().size());
+ CHECK(crypto_client_stream_factory_.streams()[0]);
+ crypto_client_stream_factory_.streams()[0]
+ ->NotifySessionOneRttKeyAvailable();
+ base::RunLoop().RunUntilIdle();
+ CHECK(quic_request_result);
+ CHECK_EQ(OK, *quic_request_result);
+
+ std::unique_ptr<QuicChromiumClientSession::Handle> session =
+ quic_request.ReleaseSessionHandle();
+ std::set<std::string> dns_aliases =
+ session->GetDnsAliasesForSessionKey(quic_request.session_key());
+ auto stream = std::make_unique<QuicHttpStream>(std::move(session),
+ std::move(dns_aliases));
+ return stream;
+ }
+
+ bool IsAlternativeServiceBroken(GURL& url) {
+ return session_->http_server_properties()->IsAlternativeServiceBroken(
+ AlternativeService(kProtoQUIC, HostPortPair::FromURL(url)),
+ NetworkIsolationKey());
+ }
+
+ raw_ptr<HttpStreamFactory::JobController> job_controller2_ = nullptr;
+
+ MockHttpStreamRequestDelegate request_delegate2_;
+
+ private:
+ QuicTestPacketMaker CreateQuicTestPacketMakerForClient() {
+ return QuicTestPacketMaker(version_,
+ quic::QuicUtils::CreateRandomConnectionId(
+ quic_context_.random_generator()),
+ quic_context_.clock(), "www.example.org",
+ quic::Perspective::IS_CLIENT, false);
+ }
+
+ void CreateJobControllerImpl(
+ raw_ptr<HttpStreamFactory::JobController>* job_controller,
+ MockHttpStreamRequestDelegate* request_delegate,
+ const HttpRequestInfo& request_info) {
+ auto controller = std::make_unique<HttpStreamFactory::JobController>(
+ factory_, request_delegate, session_.get(), &default_job_factory_,
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_,
+ delay_main_job_with_available_spdy_session_, SSLConfig(), SSLConfig());
+ *job_controller = controller.get();
+ HttpStreamFactoryPeer::AddJobController(factory_, std::move(controller));
+ }
+
+ std::unique_ptr<HttpStreamRequest> CreateJobControllerAndStartImpl(
+ raw_ptr<HttpStreamFactory::JobController>* job_controller,
+ MockHttpStreamRequestDelegate* request_delegate,
+ const HttpRequestInfo& request_info) {
+ CreateJobControllerImpl(job_controller, request_delegate, request_info);
+ return (*job_controller)
+ ->Start(request_delegate, nullptr, net_log_with_source_,
+ HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
+ }
+
+ void PrepareForMainJobImpl(std::unique_ptr<SequencedSocketData>* tcp_data,
+ std::unique_ptr<SSLSocketDataProvider>* ssl_data) {
+ *tcp_data = std::make_unique<SequencedSocketData>();
+ (*tcp_data)->set_connect_data(
+ MockConnect(ASYNC, ERR_IO_PENDING)); /* pause */
+ (*ssl_data) = std::make_unique<SSLSocketDataProvider>(ASYNC, OK);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data->get());
+ }
+
+ void PrepareForQuicJobImpl(std::unique_ptr<MockQuicData>* quic_data) {
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::COLD_START);
+ *quic_data = std::make_unique<MockQuicData>(version_);
+ (*quic_data)->AddRead(SYNCHRONOUS, ERR_IO_PENDING);
+ if (version_.UsesHttp3()) {
+ (*quic_data)
+ ->AddWrite(SYNCHRONOUS, CreateQuicTestPacketMakerForClient()
+ .MakeInitialSettingsPacket(1));
+ }
+ }
+
+ void PrepareForQuicJobFailureImpl(std::unique_ptr<MockQuicData>* quic_data) {
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::COLD_START);
+ *quic_data = std::make_unique<MockQuicData>(version_);
+ (*quic_data)->AddRead(ASYNC, ERR_IO_PENDING); // Pause
+ (*quic_data)->AddRead(ASYNC, ERR_FAILED);
+ }
+
+ void MakeMainJobSucceedImpl(MockHttpStreamRequestDelegate& request_delegate,
+ SequencedSocketData* tcp_data,
+ bool expect_stream_ready) {
+ if (expect_stream_ready) {
+ base::RunLoop run_loop;
+ EXPECT_CALL(request_delegate, OnStreamReadyImpl(_, _, _))
+ .Times(1)
+ .WillOnce(Invoke([&run_loop]() { run_loop.Quit(); }));
+ tcp_data->socket()->OnConnectComplete(MockConnect());
+ run_loop.Run();
+ } else {
+ EXPECT_CALL(request_delegate, OnStreamReadyImpl(_, _, _)).Times(0);
+ tcp_data->socket()->OnConnectComplete(MockConnect());
+ base::RunLoop().RunUntilIdle();
+ }
+ }
+
+ static void CheckJobsStatusImpl(
+ HttpStreamFactory::JobController* job_controller,
+ bool main_job_exists,
+ bool alternative_job_exists,
+ bool dns_alpn_h3_job_exists,
+ const std::string& scoped_trace_message) {
+ SCOPED_TRACE(scoped_trace_message);
+ EXPECT_EQ(main_job_exists, !!job_controller->main_job());
+ EXPECT_EQ(alternative_job_exists, !!job_controller->alternative_job());
+ EXPECT_EQ(dns_alpn_h3_job_exists, !!job_controller->dns_alpn_h3_job());
+ }
+
+ // Use real Jobs so that Job::Resume() is not mocked out. When main job is
+ // resumed it will use mock socket data.
+ HttpStreamFactory::JobFactory default_job_factory_;
+
+ // Used for man job connection.
+ std::unique_ptr<SSLSocketDataProvider> ssl_data_;
+ std::unique_ptr<SSLSocketDataProvider> ssl_data2_;
+};
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ NoHttpsRecordSyncHostResolve) {
+ PrepareForMainJob();
+ Initialize(HttpRequestInfo());
+ request_ = CreateJobControllerAndStart(CreateTestHttpRequestInfo());
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+
+ // The main job should be synchronously resumed, as host is resolved
+ // synchronously.
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+
+ base::RunLoop().RunUntilIdle();
+
+ // |dns_alpn_h3_job| must fail when there is no valid supported alpn. And
+ // must be deleted.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/false,
+ "DNS ALPN job must be deleted.");
+
+ base::HistogramTester histogram_tester;
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ // Net.AlternateProtocolUsage must not record anything, when HTTPS record with
+ // alpn is not available.
+ histogram_tester.ExpectTotalCount("Net.AlternateProtocolUsage", 0);
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ NoHttpsRecordAsyncHostResolveResumeMainWithoutDelay) {
+ EnableOndemandHostResolver();
+ PrepareForMainJob();
+ Initialize(HttpRequestInfo());
+
+ request_ = CreateJobControllerAndStart(CreateTestHttpRequestInfo());
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+
+ // The main job should be resumed quickly after resolving the host.
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+
+ // Resolve the host resolve request from |dns_alpn_h3_job|.
+ session_deps_.host_resolver->ResolveAllPending();
+ base::RunLoop().RunUntilIdle();
+
+ // |dns_alpn_h3_job| must fail when there is no valid supported alpn. And
+ // must be deleted.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/false,
+ "DNS ALPN job must be deleted.");
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+
+ // The host resolve request from the main job must be resolved using the
+ // cached result.
+ EXPECT_TRUE(tcp_data_->socket());
+
+ base::HistogramTester histogram_tester;
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ // Net.AlternateProtocolUsage must not record anything, when HTTPS record with
+ // alpn is not available.
+ histogram_tester.ExpectTotalCount("Net.AlternateProtocolUsage", 0);
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ NoHttpsRecordAsyncHostResolveResumeMainWithoutDelayQuicWorkedNetwork) {
+ EnableOndemandHostResolver();
+ PrepareForMainJob();
+ Initialize(HttpRequestInfo());
+
+ QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory();
+ quic_stream_factory->set_is_quic_known_to_work_on_current_network(true);
+
+ request_ = CreateJobControllerAndStart(CreateTestHttpRequestInfo());
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+ // Main job must be waiting.
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+
+ // Resolve the host resolve request from |dns_alpn_h3_job|.
+ session_deps_.host_resolver->ResolveAllPending();
+ base::RunLoop().RunUntilIdle();
+
+ // |dns_alpn_h3_job| must fail when there is no valid supported alpn. And
+ // must be deleted.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/false,
+ "DNS ALPN job must be deleted.");
+ // The main job should be resumed quickly after resolving the host.
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+
+ // The host resolve request from the main job must be resolved using the
+ // cached result.
+ EXPECT_TRUE(tcp_data_->socket());
+
+ base::HistogramTester histogram_tester;
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ // Net.AlternateProtocolUsage must not record anything, when HTTPS record with
+ // alpn is not available.
+ histogram_tester.ExpectTotalCount("Net.AlternateProtocolUsage", 0);
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ MainJobNoDelayOnQuicNotWorkedNetworkSyncHostResolve) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ request_ = CreateJobControllerAndStart(CreateTestHttpRequestInfo());
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+ // |main_job| is not blocked, because the hostname is resolved synchronously
+ // and |is_quic_known_to_work_on_current_network| is false for this test.
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+
+ base::HistogramTester histogram_tester;
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_RACE, 1);
+
+ // The success of |dns_alpn_h3_job| deletes |main_job|.
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true, "Main job must be deleted.");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ MainJobNoDelayOnQuicNotWorkedNetworkAsyncHostResolve) {
+ EnableOndemandHostResolver();
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ request_ = CreateJobControllerAndStart(CreateTestHttpRequestInfo());
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+
+ // |main_job| is blocked until host resolves.
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+ base::RunLoop().RunUntilIdle();
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+
+ // Resolve the host resolve request from |dns_alpn_h3_job|.
+ session_deps_.host_resolver->ResolveAllPending();
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+ base::RunLoop().RunUntilIdle();
+
+ // |main_job| should have been resumed quickly because
+ // |is_quic_known_to_work_on_current_network| is false for this test.
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+ // |dns_alpn_h3_job| must not fail when there is a valid supported alpn.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Both main job and DNS ALPN job must be alive");
+
+ base::HistogramTester histogram_tester;
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_RACE, 1);
+
+ // The success of |dns_alpn_h3_job| deletes |main_job|.
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true, "Main job must be deleted.");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ MainJobDelayOnQuicWorkedNetwork) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+ QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory();
+ quic_stream_factory->set_is_quic_known_to_work_on_current_network(true);
+
+ request_ = CreateJobControllerAndStart(CreateTestHttpRequestInfo());
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+ base::RunLoop().RunUntilIdle();
+ // |dns_alpn_h3_job| must not fail when there is a valid supported alpn.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Both main job and DNS ALPN job must be alive");
+
+ // The main job should be waiting until kDefaultDelayMilliSecsForWaitingJob
+ // amount of time has passed.
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+ FastForwardBy(base::Milliseconds(kDefaultDelayMilliSecsForWaitingJob - 1));
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+ FastForwardBy(base::Milliseconds(1));
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+
+ base::HistogramTester histogram_tester;
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_RACE, 1);
+
+ // The success of |dns_alpn_h3_job| deletes |main_job|.
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true, "Main job must be deleted.");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ MainJobSucceedsDnsAlpnH3JobSucceeds) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+ request_ = CreateJobControllerAndStart(CreateTestHttpRequestInfo());
+ base::RunLoop().RunUntilIdle();
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+ // |main_job| is not blocked, because the hostname is resolved synchronously
+ // and |is_quic_known_to_work_on_current_network| is false for this test.
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+
+ base::HistogramTester histogram_tester;
+ // Make |main_job| succeed.
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage", ALTERNATE_PROTOCOL_USAGE_MAIN_JOB_WON_RACE,
+ 1);
+
+ // The success of |main_job| doesn't delete |dns_alpn_h3_job|.
+ EXPECT_TRUE(job_controller_->dns_alpn_h3_job());
+
+ // Make |dns_alpn_h3_job| complete.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/false);
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ ActiveSessionAvailableForMainJob) {
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+ PrepareForFirstQuicJob();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ // Set |is_quic_known_to_work_on_current_network| flag so that
+ // the delaying logic of main job would work when the main job is blocked.
+ // Note: In this test, we don't need this because the main job is not blocked.
+ // But we set here because we want to check that the main job is not blocked.
+ QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory();
+ quic_stream_factory->set_is_quic_known_to_work_on_current_network(true);
+
+ // Put a SpdySession in the pool.
+ SpdySessionKey key(HostPortPair::FromURL(request_info.url),
+ ProxyServer::Direct(), PRIVACY_MODE_DISABLED,
+ SpdySessionKey::IsProxySession::kFalse, SocketTag(),
+ NetworkIsolationKey(), SecureDnsPolicy::kAllow);
+ std::ignore = CreateFakeSpdySession(session_->spdy_session_pool(), key);
+
+ request_ = CreateJobControllerAndStart(request_info);
+ // |dns_alpn_h3_job| must be created even when an active session is
+ // available for |main_job|.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+
+ // Main job must not be waiting because an active session is available.
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+
+ base::HistogramTester histogram_tester;
+ // Run the message loop to make |main_job| succeed and status will be
+ // reported to Request.
+ {
+ base::RunLoop run_loop;
+ EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _))
+ .Times(1)
+ .WillOnce(Invoke([&run_loop]() { run_loop.Quit(); }));
+ run_loop.Run();
+ }
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage", ALTERNATE_PROTOCOL_USAGE_MAIN_JOB_WON_RACE,
+ 1);
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "DNS ALPN job must be alive");
+
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/false);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/false,
+ "DNS ALPN job must be deleted");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest, MainJobHasActiveSocket) {
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ PrepareForMainJob();
+ PrepareForSecondMainJob();
+
+ PrepareForFirstQuicJobFailure();
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ // Set |is_quic_known_to_work_on_current_network| flag so that
+ // the delaying logic of main job would work when the main job is blocked.
+ QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory();
+ quic_stream_factory->set_is_quic_known_to_work_on_current_network(true);
+
+ request_ = CreateJobControllerAndStart(request_info);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+ FastForwardBy(base::Milliseconds(kDefaultDelayMilliSecsForWaitingJob - 1));
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+ FastForwardBy(base::Milliseconds(1));
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+
+ auto request2 = CreateSecondJobControllerAndStart(request_info);
+ CheckSecondJobsStatus(
+ /*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created for the second request.");
+
+ // When an active socket is available for the main job, the main job should
+ // not be blocked.
+ EXPECT_FALSE(job_controller2_->main_job()->is_waiting());
+
+ quic_data_->Resume();
+ base::RunLoop().RunUntilIdle();
+
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ MakeSecondMainJobSucceed(/*expect_stream_ready=*/true);
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ MainJobHasActiveSocketAltSvcRegistered) {
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ PrepareForMainJob();
+ PrepareForSecondMainJob();
+
+ PrepareForFirstQuicJobFailure();
+ PrepareForSecondQuicJobFailure();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ // Set |is_quic_known_to_work_on_current_network| flag so that
+ // the delaying logic of main job would work when the main job is blocked.
+ QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory();
+ quic_stream_factory->set_is_quic_known_to_work_on_current_network(true);
+
+ url::SchemeHostPort server(request_info.url);
+ AlternativeService alternative_service(kProtoQUIC, "alt.example.org", 443);
+ SetAlternativeService(request_info, alternative_service);
+
+ request_ = CreateJobControllerAndStart(request_info);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/true,
+ "All types of jobs are created");
+
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+ FastForwardBy(base::Milliseconds(kDefaultDelayMilliSecsForWaitingJob - 1));
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+ FastForwardBy(base::Milliseconds(1));
+ EXPECT_FALSE(job_controller_->main_job()->is_waiting());
+
+ auto request2 = CreateSecondJobControllerAndStart(request_info);
+ CheckSecondJobsStatus(
+ /*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/true,
+ "All types of jobs must be created for the second request.");
+
+ // The main job should be waiting until kDefaultDelayMilliSecsForWaitingJob
+ // amount of time has passed, when an alternative service was registered,
+ // even when an active socket is available for the main job.
+ // This is intended to switch to QUIC from TCP for the first connection
+ // when the server supports Alt-Svc but doesn't support HTTP DNS records with
+ // alpn.
+ // Note: When QuicParams.delay_main_job_with_available_spdy_session is false,
+ // main job is not blocked.
+ EXPECT_TRUE(job_controller2_->main_job()->is_waiting());
+ FastForwardBy(base::Milliseconds(kDefaultDelayMilliSecsForWaitingJob - 1));
+ EXPECT_TRUE(job_controller2_->main_job()->is_waiting());
+ FastForwardBy(base::Milliseconds(1));
+ EXPECT_FALSE(job_controller2_->main_job()->is_waiting());
+
+ quic_data_->Resume();
+ quic_data2_->Resume();
+ base::RunLoop().RunUntilIdle();
+
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ MakeSecondMainJobSucceed(/*expect_stream_ready=*/true);
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ ActiveSessionAvailableForAltSvcJob) {
+ PrepareForMainJob();
+ RegisterMockHttpsRecord();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ PrepareForFirstQuicJob();
+
+ Initialize(HttpRequestInfo());
+
+ auto stream = ConnectQuicHttpStream(/*alt_destination=*/true,
+ /*require_dns_https_alpn=*/false);
+
+ url::SchemeHostPort server(request_info.url);
+ AlternativeService alternative_service(kProtoQUIC, "alt.example.org", 443);
+ SetAlternativeService(request_info, alternative_service);
+
+ request_ = CreateJobControllerAndStart(request_info);
+
+ // |dns_alpn_h3_job| must not be created when an active session is
+ // available for |alternative_job|.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/false,
+ "Main job and alternative job must be created.");
+
+ base::HistogramTester histogram_tester;
+ // Run the message loop to make |alternative_job| succeed and status will be
+ // reported to Request.
+ {
+ base::RunLoop run_loop;
+ EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _))
+ .Times(1)
+ .WillOnce(Invoke([&run_loop]() { run_loop.Quit(); }));
+ run_loop.Run();
+ }
+ histogram_tester.ExpectUniqueSample("Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_NO_RACE, 1);
+
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/false,
+ "Main job must be deleted.");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ ActiveSessionAvailableForDnsAlpnH3Job) {
+ PrepareForFirstQuicJob();
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ auto stream = ConnectQuicHttpStream(/*alt_destination=*/false,
+ /*require_dns_https_alpn=*/true);
+ request_ = CreateJobControllerAndStart(CreateTestHttpRequestInfo());
+
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and alternative job must not be available.");
+
+ base::HistogramTester histogram_tester;
+ // Run the message loop to make |dns_alpn_h3_job| succeed and status will be
+ // reported to Request.
+ {
+ base::RunLoop run_loop;
+ EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _))
+ .Times(1)
+ .WillOnce(Invoke([&run_loop]() { run_loop.Quit(); }));
+ run_loop.Run();
+ }
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_WITOUT_RACE, 1);
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "DNS alpn H3 job must exist.");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ ActiveSessionAvailableForMainJobAndDnsAlpnH3Job) {
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+ PrepareForFirstQuicJob();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ // Put a SpdySession in the pool.
+ SpdySessionKey key(HostPortPair::FromURL(request_info.url),
+ ProxyServer::Direct(), PRIVACY_MODE_DISABLED,
+ SpdySessionKey::IsProxySession::kFalse, SocketTag(),
+ NetworkIsolationKey(), SecureDnsPolicy::kAllow);
+ std::ignore = CreateFakeSpdySession(session_->spdy_session_pool(), key);
+
+ auto stream = ConnectQuicHttpStream(/*alt_destination=*/false,
+ /*require_dns_https_alpn=*/true);
+ request_ = CreateJobControllerAndStart(CreateTestHttpRequestInfo());
+
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job must not be available.");
+
+ base::HistogramTester histogram_tester;
+ // Run the message loop to make |dns_alpn_h3_job| succeed and status will be
+ // reported to Request.
+ {
+ base::RunLoop run_loop;
+ EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _))
+ .Times(1)
+ .WillOnce(Invoke([&run_loop]() { run_loop.Quit(); }));
+ run_loop.Run();
+ }
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_WITOUT_RACE, 1);
+
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "DNS alpn H3 job must exist.");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ DonotStartDnsAlpnH3JobWhenSameHostDefaultPortAltJobCreated) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ url::SchemeHostPort server(request_info.url);
+ AlternativeService alternative_service(kProtoQUIC, "www.example.org", 443);
+ SetAlternativeService(request_info, alternative_service);
+
+ request_ = CreateJobControllerAndStart(request_info);
+ // |dns_alpn_h3_job| must be deleted when a same origin alt service
+ // was registered.
+ CheckJobsStatus(
+ true, true, false,
+ "All types of jobs are created, but DNS alpn job must be deleted");
+
+ base::HistogramTester histogram_tester;
+ // Make |main_job| succeed.
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage", ALTERNATE_PROTOCOL_USAGE_MAIN_JOB_WON_RACE,
+ 1);
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/false,
+ "Alternate job must not be deleted");
+
+ // Make |alternative_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/false);
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ AllJobsCreatedMainJobSucceedAltJobSucceedDnsJobSucceed) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+ PrepareForSecondQuicJob();
+
+ // Use cold start and complete `alternative_job` and `dns_alpn_h3_job`
+ // manually.
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::COLD_START);
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ url::SchemeHostPort server(request_info.url);
+ AlternativeService alternative_service(kProtoQUIC, "alt.example.org", 443);
+ SetAlternativeService(request_info, alternative_service);
+
+ request_ = CreateJobControllerAndStart(request_info);
+ // |dns_alpn_h3_job| must be created when a different origin alt service
+ // was registered.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/true,
+ "All types of jobs are created");
+
+ base::HistogramTester histogram_tester;
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage", ALTERNATE_PROTOCOL_USAGE_MAIN_JOB_WON_RACE,
+ 1);
+
+ // The success of |main_job| doesn't delete |alternative_job| and
+ // |dns_alpn_h3_job|.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/true, "Jobs must not be deleted.");
+
+ // Make |alternative_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/false);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Alternate job must be deleted.");
+
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(1, /*expect_stream_ready=*/false);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/false,
+ "DNS alpn job must be deleted.");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ AllJobsCreatedAltJobSucceedDnsJobSucceedMainJobSucceed) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+ PrepareForSecondQuicJob();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ url::SchemeHostPort server(request_info.url);
+ AlternativeService alternative_service(kProtoQUIC, "alt.example.org", 443);
+ SetAlternativeService(request_info, alternative_service);
+
+ request_ = CreateJobControllerAndStart(request_info);
+ // |dns_alpn_h3_job| must be created when a different origin alt service
+ // was registered.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/true,
+ "All types of jobs are created");
+
+ base::HistogramTester histogram_tester;
+ // Make |alternative_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample("Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_WON_RACE, 1);
+
+ // The success of |alternative_job| doesn't delete |main_job| and
+ // |dns_alpn_h3_job|.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/true, "Jobs must not be deleted.");
+
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(1, /*expect_stream_ready=*/false);
+
+ // The success of |dns_alpn_h3_job| doesn't delete |main_job| and
+ // |alternative_job|.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/false,
+ "DNS alpn job must be deleted.");
+
+ // Make |main_job| succeed.
+ MakeMainJobSucceed(/*expect_stream_ready=*/false);
+
+ // |main_job| should be cleared.
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/false,
+ "Alternate job must be deleted.");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ AllJobsCreatedDnsJobSucceedAltJobSucceedMainJobSucceed) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+ PrepareForSecondQuicJob();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+
+ url::SchemeHostPort server(request_info.url);
+ AlternativeService alternative_service(kProtoQUIC, "alt.example.org", 443);
+ SetAlternativeService(request_info, alternative_service);
+
+ request_ = CreateJobControllerAndStart(request_info);
+ // |dns_alpn_h3_job| must be created when a different origin alt service
+ // was registered.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/true,
+ "All types of jobs are created");
+
+ base::HistogramTester histogram_tester;
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(1, /*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_RACE, 1);
+
+ // The success of |dns_alpn_h3_job| doesn't delete |main_job| and
+ // |alternative_job|.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/true,
+ /*dns_alpn_h3_job_exists=*/true, "Jobs must not be deleted.");
+
+ // Make |alternative_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/false);
+
+ // The success of |alternative_job| doesn't delete |main_job| and
+ // |dns_alpn_h3_job|.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Alternate job must be deleted.");
+
+ // Make |main_job| succeed.
+ MakeMainJobSucceed(/*expect_stream_ready=*/false);
+
+ // |main_job| should be cleared.
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true, "Main job must be deleted.");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ DnsJobFailOnDefaultNetworkDnsJobFailMainJobSucceed) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJobFailure();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+ request_ = CreateJobControllerAndStart(request_info);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+
+ JobControllerPeer::SetDnsAlpnH3JobFailedOnDefaultNetwork(job_controller_);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true, "Jobs must not be deleted.");
+
+ base::HistogramTester histogram_tester;
+ // Make |dns_alpn_h3_job| fail.
+ quic_data_->Resume();
+ base::RunLoop().RunUntilIdle();
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/false, "DNS alpn job be deleted.");
+
+ // Make |main_job| succeed.
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ // Net.AlternateProtocolUsage must not record anything, when DNS alpn job
+ // failed.
+ histogram_tester.ExpectTotalCount("Net.AlternateProtocolUsage", 0);
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/false,
+ "DNS alpn job must be deleted.");
+
+ request_.reset();
+ EXPECT_TRUE(IsAlternativeServiceBroken(request_info.url));
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+ histogram_tester.ExpectUniqueSample("Net.AlternateServiceForDnsAlpnH3Failed",
+ -ERR_QUIC_PROTOCOL_ERROR, 1);
+
+ // Verify the brokenness is not cleared when the default network changes.
+ session_->http_server_properties()->OnDefaultNetworkChanged();
+ EXPECT_TRUE(IsAlternativeServiceBroken(request_info.url));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ DnsJobFailOnDefaultNetworkMainJobSucceedDnsJobSucceed) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+ base::HistogramTester histogram_tester;
+ request_ = CreateJobControllerAndStart(request_info);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+
+ JobControllerPeer::SetDnsAlpnH3JobFailedOnDefaultNetwork(job_controller_);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true, "Jobs must not be deleted.");
+
+ // Make |main_job| succeed.
+ MakeMainJobSucceed(/*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage", ALTERNATE_PROTOCOL_USAGE_MAIN_JOB_WON_RACE,
+ 1);
+
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "DNS alpn job must not be deleted.");
+
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/false);
+
+ request_.reset();
+ histogram_tester.ExpectTotalCount("Net.AlternateServiceForDnsAlpnH3Failed",
+ 0);
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+ EXPECT_TRUE(IsAlternativeServiceBroken(request_info.url));
+
+ // Verify the brokenness is cleared when the default network changes.
+ session_->http_server_properties()->OnDefaultNetworkChanged();
+ EXPECT_FALSE(IsAlternativeServiceBroken(request_info.url));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ DnsJobSucceedMainJobCanceled) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+ request_ = CreateJobControllerAndStart(request_info);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+
+ base::HistogramTester histogram_tester;
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_RACE, 1);
+
+ // Main job is canceled.
+ CheckJobsStatus(/*main_job_exists=*/false, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true, "Main job must be deleted");
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest,
+ DnsJobFailOnDefaultNetworkDnsJobSucceedMainJobSucceed) {
+ PrepareForMainJob();
+ PrepareForFirstQuicJob();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+ request_ = CreateJobControllerAndStart(request_info);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job and DNS ALPN job must be created.");
+
+ JobControllerPeer::SetDnsAlpnH3JobFailedOnDefaultNetwork(job_controller_);
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true, "Jobs must not be deleted.");
+
+ base::HistogramTester histogram_tester;
+ // Make |dns_alpn_h3_job| succeed.
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/true);
+ histogram_tester.ExpectUniqueSample(
+ "Net.AlternateProtocolUsage",
+ ALTERNATE_PROTOCOL_USAGE_DNS_ALPN_H3_JOB_WON_RACE, 1);
+
+ // Main job is not canceled, because |dns_alpn_h3_job| has failed on the
+ // default network.
+ CheckJobsStatus(/*main_job_exists=*/true, /*alternative_job_exists=*/false,
+ /*dns_alpn_h3_job_exists=*/true,
+ "Main job must not be deleted.");
+
+ // Make |main_job| succeed.
+ MakeMainJobSucceed(/*expect_stream_ready=*/false);
+
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest, PreconnectDnsAlpnH3) {
+ SetPreconnect();
+ PrepareForFirstQuicJob();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ RegisterMockHttpsRecord();
+
+ Initialize(HttpRequestInfo());
+ CreateJobController(request_info);
+ job_controller_->Preconnect(/*num_streams=*/5);
+ // Only one job is started.
+ EXPECT_TRUE(job_controller_->main_job());
+ EXPECT_FALSE(job_controller_->alternative_job());
+ EXPECT_EQ(HttpStreamFactory::PRECONNECT_DNS_ALPN_H3,
+ job_controller_->main_job()->job_type());
+
+ MakeQuicJobScceed(0, /*expect_stream_ready=*/false);
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
+
+TEST_F(HttpStreamFactoryJobControllerDnsHttpsAlpnTest, PreconnectNoDnsAlpnH3) {
+ EnableOndemandHostResolver();
+ PrepareForMainJob();
+ SetPreconnect();
+
+ HttpRequestInfo request_info = CreateTestHttpRequestInfo();
+
+ Initialize(HttpRequestInfo());
+ CreateJobController(request_info);
+ job_controller_->Preconnect(/*num_streams=*/1);
+ // Only one job is started.
+ EXPECT_TRUE(job_controller_->main_job());
+ EXPECT_FALSE(job_controller_->alternative_job());
+ EXPECT_EQ(HttpStreamFactory::PRECONNECT_DNS_ALPN_H3,
+ job_controller_->main_job()->job_type());
+
+ // Resolve the host resolve request from |dns_alpn_h3_job|.
+ session_deps_.host_resolver->ResolveAllPending();
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(HttpStreamFactory::PRECONNECT,
+ job_controller_->main_job()->job_type());
+
+ base::RunLoop().RunUntilIdle();
+
+ // Make |main_job| succeed.
+ MakeMainJobSucceed(/*expect_stream_ready=*/false);
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_));
+}
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/http/http_stream_factory_test_util.cc b/chromium/net/http/http_stream_factory_test_util.cc
index 5b7a376b708..e3932b382a9 100644
--- a/chromium/net/http/http_stream_factory_test_util.cc
+++ b/chromium/net/http/http_stream_factory_test_util.cc
@@ -52,11 +52,15 @@ MockHttpStreamFactoryJob::MockHttpStreamFactoryJob(
MockHttpStreamFactoryJob::~MockHttpStreamFactoryJob() = default;
+void MockHttpStreamFactoryJob::DoResume() {
+ HttpStreamFactory::Job::Resume();
+}
+
TestJobFactory::TestJobFactory() = default;
TestJobFactory::~TestJobFactory() = default;
-std::unique_ptr<HttpStreamFactory::Job> TestJobFactory::CreateMainJob(
+std::unique_ptr<HttpStreamFactory::Job> TestJobFactory::CreateJob(
HttpStreamFactory::Job::Delegate* delegate,
HttpStreamFactory::JobType job_type,
HttpNetworkSession* session,
@@ -69,48 +73,35 @@ std::unique_ptr<HttpStreamFactory::Job> TestJobFactory::CreateMainJob(
GURL origin_url,
bool is_websocket,
bool enable_ip_based_pooling,
- NetLog* net_log) {
- if (override_main_job_url_)
- origin_url = main_job_alternative_url_;
-
- auto main_job = std::make_unique<MockHttpStreamFactoryJob>(
- delegate, job_type, session, request_info, priority, proxy_info,
- SSLConfig(), SSLConfig(), std::move(destination), origin_url,
- kProtoUnknown, quic::ParsedQuicVersion::Unsupported(), is_websocket,
- enable_ip_based_pooling, net_log);
-
- // Keep raw pointer to Job but pass ownership.
- main_job_ = main_job.get();
-
- return std::move(main_job);
-}
-
-std::unique_ptr<HttpStreamFactory::Job> TestJobFactory::CreateAltSvcJob(
- HttpStreamFactory::Job::Delegate* delegate,
- HttpStreamFactory::JobType job_type,
- HttpNetworkSession* session,
- const HttpRequestInfo& request_info,
- RequestPriority priority,
- const ProxyInfo& proxy_info,
- const SSLConfig& server_ssl_config,
- const SSLConfig& proxy_ssl_config,
- url::SchemeHostPort destination,
- GURL origin_url,
- NextProto alternative_protocol,
- quic::ParsedQuicVersion quic_version,
- bool is_websocket,
- bool enable_ip_based_pooling,
- NetLog* net_log) {
- auto alternative_job = std::make_unique<MockHttpStreamFactoryJob>(
+ NetLog* net_log,
+ NextProto alternative_protocol = kProtoUnknown,
+ quic::ParsedQuicVersion quic_version =
+ quic::ParsedQuicVersion::Unsupported()) {
+ auto job = std::make_unique<MockHttpStreamFactoryJob>(
delegate, job_type, session, request_info, priority, proxy_info,
SSLConfig(), SSLConfig(), std::move(destination), origin_url,
alternative_protocol, quic_version, is_websocket, enable_ip_based_pooling,
net_log);
// Keep raw pointer to Job but pass ownership.
- alternative_job_ = alternative_job.get();
-
- return std::move(alternative_job);
+ switch (job_type) {
+ case HttpStreamFactory::MAIN:
+ main_job_ = job.get();
+ break;
+ case HttpStreamFactory::ALTERNATIVE:
+ alternative_job_ = job.get();
+ break;
+ case HttpStreamFactory::DNS_ALPN_H3:
+ dns_alpn_h3_job_ = job.get();
+ break;
+ case HttpStreamFactory::PRECONNECT:
+ main_job_ = job.get();
+ break;
+ case HttpStreamFactory::PRECONNECT_DNS_ALPN_H3:
+ main_job_ = job.get();
+ break;
+ }
+ return job;
}
} // namespace net
diff --git a/chromium/net/http/http_stream_factory_test_util.h b/chromium/net/http/http_stream_factory_test_util.h
index ac89b431dba..72f75007348 100644
--- a/chromium/net/http/http_stream_factory_test_util.h
+++ b/chromium/net/http/http_stream_factory_test_util.h
@@ -28,8 +28,8 @@ class HttpStreamFactoryPeer {
public:
static void AddJobController(
HttpStreamFactory* factory,
- HttpStreamFactory::JobController* job_controller) {
- factory->job_controller_set_.insert(base::WrapUnique(job_controller));
+ std::unique_ptr<HttpStreamFactory::JobController> job_controller) {
+ factory->job_controller_set_.insert(std::move(job_controller));
}
static bool IsJobControllerDeleted(HttpStreamFactory* factory) {
@@ -125,6 +125,8 @@ class MockHttpStreamFactoryJob : public HttpStreamFactory::Job {
MOCK_METHOD0(Resume, void());
MOCK_METHOD0(Orphan, void());
+
+ void DoResume();
};
// JobFactory for creating MockHttpStreamFactoryJobs.
@@ -133,7 +135,7 @@ class TestJobFactory : public HttpStreamFactory::JobFactory {
TestJobFactory();
~TestJobFactory() override;
- std::unique_ptr<HttpStreamFactory::Job> CreateMainJob(
+ std::unique_ptr<HttpStreamFactory::Job> CreateJob(
HttpStreamFactory::Job::Delegate* delegate,
HttpStreamFactory::JobType job_type,
HttpNetworkSession* session,
@@ -146,38 +148,18 @@ class TestJobFactory : public HttpStreamFactory::JobFactory {
GURL origin_url,
bool is_websocket,
bool enable_ip_based_pooling,
- NetLog* net_log) override;
-
- std::unique_ptr<HttpStreamFactory::Job> CreateAltSvcJob(
- HttpStreamFactory::Job::Delegate* delegate,
- HttpStreamFactory::JobType job_type,
- HttpNetworkSession* session,
- const HttpRequestInfo& request_info,
- RequestPriority priority,
- const ProxyInfo& proxy_info,
- const SSLConfig& server_ssl_config,
- const SSLConfig& proxy_ssl_config,
- url::SchemeHostPort destination,
- GURL origin_url,
+ NetLog* net_log,
NextProto alternative_protocol,
- quic::ParsedQuicVersion quic_version,
- bool is_websocket,
- bool enable_ip_based_pooling,
- NetLog* net_log) override;
+ quic::ParsedQuicVersion quic_version) override;
MockHttpStreamFactoryJob* main_job() const { return main_job_; }
MockHttpStreamFactoryJob* alternative_job() const { return alternative_job_; }
-
- void UseDifferentURLForMainJob(GURL url) {
- override_main_job_url_ = true;
- main_job_alternative_url_ = url;
- }
+ MockHttpStreamFactoryJob* dns_alpn_h3_job() const { return dns_alpn_h3_job_; }
private:
raw_ptr<MockHttpStreamFactoryJob> main_job_ = nullptr;
raw_ptr<MockHttpStreamFactoryJob> alternative_job_ = nullptr;
- bool override_main_job_url_ = false;
- GURL main_job_alternative_url_;
+ raw_ptr<MockHttpStreamFactoryJob> dns_alpn_h3_job_ = nullptr;
};
} // namespace net
diff --git a/chromium/net/http/http_stream_factory_unittest.cc b/chromium/net/http/http_stream_factory_unittest.cc
index e11997a6ae8..27b43aa80a5 100644
--- a/chromium/net/http/http_stream_factory_unittest.cc
+++ b/chromium/net/http/http_stream_factory_unittest.cc
@@ -170,7 +170,7 @@ class MockWebSocketHandshakeStream : public WebSocketHandshakeStreamBase {
void Drain(HttpNetworkSession* session) override {}
void PopulateNetErrorDetails(NetErrorDetails* details) override { return; }
void SetPriority(RequestPriority priority) override {}
- HttpStream* RenewStreamForAuth() override { return nullptr; }
+ std::unique_ptr<HttpStream> RenewStreamForAuth() override { return nullptr; }
const std::set<std::string>& GetDnsAliases() const override {
static const base::NoDestructor<std::set<std::string>> nullset_result;
return *nullset_result;
@@ -377,9 +377,10 @@ void PreconnectHelperForURL(int num_streams,
SecureDnsPolicy secure_dns_policy,
HttpNetworkSession* session) {
HttpNetworkSessionPeer peer(session);
- MockHttpStreamFactoryForPreconnect* mock_factory =
- new MockHttpStreamFactoryForPreconnect(session);
- peer.SetHttpStreamFactory(std::unique_ptr<HttpStreamFactory>(mock_factory));
+ auto mock_factory =
+ std::make_unique<MockHttpStreamFactoryForPreconnect>(session);
+ auto* mock_factory_ptr = mock_factory.get();
+ peer.SetHttpStreamFactory(std::move(mock_factory));
HttpRequestInfo request;
request.method = "GET";
@@ -391,7 +392,7 @@ void PreconnectHelperForURL(int num_streams,
MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
session->http_stream_factory()->PreconnectStreams(num_streams, request);
- mock_factory->WaitForPreconnects();
+ mock_factory_ptr->WaitForPreconnects();
}
void PreconnectHelper(const TestCase& test, HttpNetworkSession* session) {
@@ -504,7 +505,7 @@ class CapturePreconnectsTransportSocketPool : public TransportClientSocketPool {
using HttpStreamFactoryTest = TestWithTaskEnvironment;
TEST_F(HttpStreamFactoryTest, PreconnectDirect) {
- for (size_t i = 0; i < std::size(kTests); ++i) {
+ for (const auto& test : kTests) {
SpdySessionDependencies session_deps(
ConfiguredProxyResolutionService::CreateDirect());
std::unique_ptr<HttpNetworkSession> session(
@@ -522,16 +523,16 @@ TEST_F(HttpStreamFactoryTest, PreconnectDirect) {
mock_pool_manager->SetSocketPool(ProxyServer::Direct(),
std::move(owned_transport_conn_pool));
peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
- PreconnectHelper(kTests[i], session.get());
- EXPECT_EQ(kTests[i].num_streams, transport_conn_pool->last_num_streams());
- EXPECT_EQ(GetGroupId(kTests[i]), transport_conn_pool->last_group_id());
+ PreconnectHelper(test, session.get());
+ EXPECT_EQ(test.num_streams, transport_conn_pool->last_num_streams());
+ EXPECT_EQ(GetGroupId(test), transport_conn_pool->last_group_id());
}
}
TEST_F(HttpStreamFactoryTest, PreconnectHttpProxy) {
- for (size_t i = 0; i < std::size(kTests); ++i) {
+ for (const auto& test : kTests) {
SpdySessionDependencies session_deps(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"http_proxy", TRAFFIC_ANNOTATION_FOR_TESTS));
std::unique_ptr<HttpNetworkSession> session(
SpdySessionDependencies::SpdyCreateSession(&session_deps));
@@ -540,22 +541,24 @@ TEST_F(HttpStreamFactoryTest, PreconnectHttpProxy) {
HostPortPair("http_proxy", 80));
CommonConnectJobParams common_connect_job_params =
session->CreateCommonConnectJobParams();
- CapturePreconnectsTransportSocketPool* http_proxy_pool =
- new CapturePreconnectsTransportSocketPool(&common_connect_job_params);
+
+ auto http_proxy_pool =
+ std::make_unique<CapturePreconnectsTransportSocketPool>(
+ &common_connect_job_params);
+ auto* http_proxy_pool_ptr = http_proxy_pool.get();
auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
- mock_pool_manager->SetSocketPool(proxy_server,
- base::WrapUnique(http_proxy_pool));
+ mock_pool_manager->SetSocketPool(proxy_server, std::move(http_proxy_pool));
peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
- PreconnectHelper(kTests[i], session.get());
- EXPECT_EQ(kTests[i].num_streams, http_proxy_pool->last_num_streams());
- EXPECT_EQ(GetGroupId(kTests[i]), http_proxy_pool->last_group_id());
+ PreconnectHelper(test, session.get());
+ EXPECT_EQ(test.num_streams, http_proxy_pool_ptr->last_num_streams());
+ EXPECT_EQ(GetGroupId(test), http_proxy_pool_ptr->last_group_id());
}
}
TEST_F(HttpStreamFactoryTest, PreconnectSocksProxy) {
- for (size_t i = 0; i < std::size(kTests); ++i) {
+ for (const auto& test : kTests) {
SpdySessionDependencies session_deps(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"socks4://socks_proxy:1080", TRAFFIC_ANNOTATION_FOR_TESTS));
std::unique_ptr<HttpNetworkSession> session(
SpdySessionDependencies::SpdyCreateSession(&session_deps));
@@ -564,20 +567,21 @@ TEST_F(HttpStreamFactoryTest, PreconnectSocksProxy) {
HostPortPair("socks_proxy", 1080));
CommonConnectJobParams common_connect_job_params =
session->CreateCommonConnectJobParams();
- CapturePreconnectsTransportSocketPool* socks_proxy_pool =
- new CapturePreconnectsTransportSocketPool(&common_connect_job_params);
+ auto socks_proxy_pool =
+ std::make_unique<CapturePreconnectsTransportSocketPool>(
+ &common_connect_job_params);
+ auto* socks_proxy_pool_ptr = socks_proxy_pool.get();
auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
- mock_pool_manager->SetSocketPool(proxy_server,
- base::WrapUnique(socks_proxy_pool));
+ mock_pool_manager->SetSocketPool(proxy_server, std::move(socks_proxy_pool));
peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
- PreconnectHelper(kTests[i], session.get());
- EXPECT_EQ(kTests[i].num_streams, socks_proxy_pool->last_num_streams());
- EXPECT_EQ(GetGroupId(kTests[i]), socks_proxy_pool->last_group_id());
+ PreconnectHelper(test, session.get());
+ EXPECT_EQ(test.num_streams, socks_proxy_pool_ptr->last_num_streams());
+ EXPECT_EQ(GetGroupId(test), socks_proxy_pool_ptr->last_group_id());
}
}
TEST_F(HttpStreamFactoryTest, PreconnectDirectWithExistingSpdySession) {
- for (size_t i = 0; i < std::size(kTests); ++i) {
+ for (const auto& test : kTests) {
SpdySessionDependencies session_deps(
ConfiguredProxyResolutionService::CreateDirect());
std::unique_ptr<HttpNetworkSession> session(
@@ -604,13 +608,13 @@ TEST_F(HttpStreamFactoryTest, PreconnectDirectWithExistingSpdySession) {
mock_pool_manager->SetSocketPool(ProxyServer::Direct(),
std::move(owned_transport_conn_pool));
peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
- PreconnectHelper(kTests[i], session.get());
+ PreconnectHelper(test, session.get());
// We shouldn't be preconnecting if we have an existing session, which is
// the case for https://www.google.com.
- if (kTests[i].ssl)
+ if (test.ssl)
EXPECT_EQ(-1, transport_conn_pool->last_num_streams());
else
- EXPECT_EQ(kTests[i].num_streams, transport_conn_pool->last_num_streams());
+ EXPECT_EQ(test.num_streams, transport_conn_pool->last_num_streams());
}
}
@@ -724,7 +728,7 @@ TEST_F(HttpStreamFactoryTest, PreconnectDisableSecureDns) {
TEST_F(HttpStreamFactoryTest, JobNotifiesProxy) {
const char* kProxyString = "PROXY bad:99; PROXY maybe:80; DIRECT";
SpdySessionDependencies session_deps(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
kProxyString, TRAFFIC_ANNOTATION_FOR_TESTS));
// First connection attempt fails
@@ -776,7 +780,7 @@ TEST_F(HttpStreamFactoryTest, JobNotifiesProxy) {
TEST_F(HttpStreamFactoryTest, NoProxyFallbackOnTunnelFail) {
const char* kProxyString = "PROXY bad:99; DIRECT";
SpdySessionDependencies session_deps(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
kProxyString, TRAFFIC_ANNOTATION_FOR_TESTS));
// A 404 in response to a CONNECT will trigger
@@ -844,7 +848,7 @@ const int quic_proxy_test_mock_errors[] = {
TEST_F(HttpStreamFactoryTest, QuicProxyMarkedAsBad) {
for (int quic_proxy_test_mock_error : quic_proxy_test_mock_errors) {
std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC bad:99; DIRECT", TRAFFIC_ANNOTATION_FOR_TESTS);
HttpNetworkSessionParams session_params;
@@ -952,18 +956,18 @@ class MockQuicData {
~MockQuicData() = default;
void AddRead(std::unique_ptr<quic::QuicEncryptedPacket> packet) {
- reads_.push_back(
- MockRead(ASYNC, packet->data(), packet->length(), packet_number_++));
+ reads_.emplace_back(ASYNC, packet->data(), packet->length(),
+ packet_number_++);
packets_.push_back(std::move(packet));
}
void AddRead(IoMode mode, int rv) {
- reads_.push_back(MockRead(mode, rv, packet_number_++));
+ reads_.emplace_back(mode, rv, packet_number_++);
}
void AddWrite(std::unique_ptr<quic::QuicEncryptedPacket> packet) {
- writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(),
- packet_number_++));
+ writes_.emplace_back(SYNCHRONOUS, packet->data(), packet->length(),
+ packet_number_++);
packets_.push_back(std::move(packet));
}
@@ -989,7 +993,7 @@ TEST_F(HttpStreamFactoryTest, UsePreConnectIfNoZeroRTT) {
GURL url = GURL("https://www.google.com");
SpdySessionDependencies session_deps(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"http_proxy", TRAFFIC_ANNOTATION_FOR_TESTS));
// Setup params to disable preconnect, but QUIC doesn't 0RTT.
@@ -1020,15 +1024,16 @@ TEST_F(HttpStreamFactoryTest, UsePreConnectIfNoZeroRTT) {
HostPortPair("http_proxy", 80));
CommonConnectJobParams common_connect_job_params =
session->CreateCommonConnectJobParams();
- CapturePreconnectsTransportSocketPool* http_proxy_pool =
- new CapturePreconnectsTransportSocketPool(&common_connect_job_params);
+ auto http_proxy_pool =
+ std::make_unique<CapturePreconnectsTransportSocketPool>(
+ &common_connect_job_params);
+ auto* http_proxy_pool_ptr = http_proxy_pool.get();
auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
- mock_pool_manager->SetSocketPool(proxy_server,
- base::WrapUnique(http_proxy_pool));
+ mock_pool_manager->SetSocketPool(proxy_server, std::move(http_proxy_pool));
peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
PreconnectHelperForURL(num_streams, url, NetworkIsolationKey(),
SecureDnsPolicy::kAllow, session.get());
- EXPECT_EQ(num_streams, http_proxy_pool->last_num_streams());
+ EXPECT_EQ(num_streams, http_proxy_pool_ptr->last_num_streams());
}
}
@@ -1039,9 +1044,9 @@ int GetSocketPoolGroupCount(ClientSocketPool* pool) {
int count = 0;
base::Value dict = pool->GetInfoAsValue("", "");
EXPECT_TRUE(dict.is_dict());
- const base::Value* groups = dict.FindDictKey("groups");
+ const base::Value::Dict* groups = dict.GetDict().FindDict("groups");
if (groups) {
- count = groups->DictSize();
+ count = groups->size();
}
return count;
}
@@ -1052,14 +1057,14 @@ int GetSpdySessionCount(HttpNetworkSession* session) {
session->spdy_session_pool()->SpdySessionPoolInfoToValue());
if (!value || !value->is_list())
return -1;
- return value->GetListDeprecated().size();
+ return value->GetList().size();
}
// Return count of sockets handed out by a given socket pool.
int GetHandedOutSocketCount(ClientSocketPool* pool) {
base::Value dict = pool->GetInfoAsValue("", "");
EXPECT_TRUE(dict.is_dict());
- return dict.FindIntKey("handed_out_socket_count").value_or(-1);
+ return dict.GetDict().FindInt("handed_out_socket_count").value_or(-1);
}
// Return count of distinct QUIC sessions.
@@ -1382,7 +1387,7 @@ TEST_F(HttpStreamFactoryTest, RequestHttpStreamOverSSL) {
TEST_F(HttpStreamFactoryTest, RequestHttpStreamOverProxy) {
SpdySessionDependencies session_deps(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:8888", TRAFFIC_ANNOTATION_FOR_TESTS));
StaticSocketDataProvider socket_data;
@@ -1519,7 +1524,7 @@ TEST_F(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStreamOverSSL) {
TEST_F(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStreamOverProxy) {
SpdySessionDependencies session_deps(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"myproxy:8888", TRAFFIC_ANNOTATION_FOR_TESTS));
MockRead reads[] = {
@@ -1616,10 +1621,10 @@ TEST_F(HttpStreamFactoryTest, RequestSpdyHttpStreamHttpsURL) {
TEST_F(HttpStreamFactoryTest, RequestSpdyHttpStreamHttpURL) {
url::SchemeHostPort scheme_host_port("http", "myproxy.org", 443);
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS));
std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
MockRead mock_read(SYNCHRONOUS, ERR_IO_PENDING);
@@ -1686,10 +1691,10 @@ TEST_F(HttpStreamFactoryTest,
url::SchemeHostPort scheme_host_port("http", "myproxy.org", 443);
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS));
std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
MockRead mock_read(SYNCHRONOUS, ERR_IO_PENDING);
@@ -2000,7 +2005,7 @@ class HttpStreamFactoryBidirectionalQuicTest
false),
proxy_resolution_service_(
ConfiguredProxyResolutionService::CreateDirect()),
- ssl_config_service_(new SSLConfigServiceDefaults) {
+ ssl_config_service_(std::make_unique<SSLConfigServiceDefaults>()) {
FLAGS_quic_enable_http3_grease_randomness = false;
quic_context_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(20));
quic::QuicEnableVersion(version_);
@@ -2390,9 +2395,9 @@ TEST_F(HttpStreamFactoryTest, RequestBidirectionalStreamImplFailure) {
// amongst streams with different socket tags).
TEST_F(HttpStreamFactoryTest, Tag) {
SpdySessionDependencies session_deps;
- MockTaggingClientSocketFactory* socket_factory =
- new MockTaggingClientSocketFactory();
- session_deps.socket_factory.reset(socket_factory);
+ auto socket_factory = std::make_unique<MockTaggingClientSocketFactory>();
+ auto* socket_factory_ptr = socket_factory.get();
+ session_deps.socket_factory = std::move(socket_factory);
// Prepare for two HTTPS connects.
MockRead mock_read(SYNCHRONOUS, ERR_IO_PENDING);
@@ -2456,9 +2461,9 @@ TEST_F(HttpStreamFactoryTest, Tag) {
1, GetHandedOutSocketCount(session->GetSocketPool(
HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyServer::Direct())));
// Verify socket tagged appropriately.
- EXPECT_TRUE(tag1 == socket_factory->GetLastProducedTCPSocket()->tag());
- EXPECT_TRUE(
- socket_factory->GetLastProducedTCPSocket()->tagged_before_connected());
+ EXPECT_TRUE(tag1 == socket_factory_ptr->GetLastProducedTCPSocket()->tag());
+ EXPECT_TRUE(socket_factory_ptr->GetLastProducedTCPSocket()
+ ->tagged_before_connected());
// Verify one more stream with a different tag results in one more session and
// socket.
@@ -2481,9 +2486,9 @@ TEST_F(HttpStreamFactoryTest, Tag) {
2, GetHandedOutSocketCount(session->GetSocketPool(
HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyServer::Direct())));
// Verify socket tagged appropriately.
- EXPECT_TRUE(tag2 == socket_factory->GetLastProducedTCPSocket()->tag());
- EXPECT_TRUE(
- socket_factory->GetLastProducedTCPSocket()->tagged_before_connected());
+ EXPECT_TRUE(tag2 == socket_factory_ptr->GetLastProducedTCPSocket()->tag());
+ EXPECT_TRUE(socket_factory_ptr->GetLastProducedTCPSocket()
+ ->tagged_before_connected());
// Verify one more stream reusing a tag does not create new sessions, groups
// or sockets.
@@ -2644,9 +2649,9 @@ TEST_P(HttpStreamFactoryBidirectionalQuicTest, Tag) {
TEST_F(HttpStreamFactoryTest, ChangeSocketTag) {
SpdySessionDependencies session_deps;
- MockTaggingClientSocketFactory* socket_factory =
- new MockTaggingClientSocketFactory();
- session_deps.socket_factory.reset(socket_factory);
+ auto socket_factory = std::make_unique<MockTaggingClientSocketFactory>();
+ auto* socket_factory_ptr = socket_factory.get();
+ session_deps.socket_factory = std::move(socket_factory);
// Prepare for two HTTPS connects.
MockRead mock_read(SYNCHRONOUS, ERR_IO_PENDING);
@@ -2719,7 +2724,8 @@ TEST_F(HttpStreamFactoryTest, ChangeSocketTag) {
1, GetHandedOutSocketCount(session->GetSocketPool(
HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyServer::Direct())));
// Verify socket tagged appropriately.
- MockTaggingStreamSocket* socket = socket_factory->GetLastProducedTCPSocket();
+ MockTaggingStreamSocket* socket =
+ socket_factory_ptr->GetLastProducedTCPSocket();
EXPECT_TRUE(tag1 == socket->tag());
EXPECT_TRUE(socket->tagged_before_connected());
@@ -2743,7 +2749,7 @@ TEST_F(HttpStreamFactoryTest, ChangeSocketTag) {
1, GetHandedOutSocketCount(session->GetSocketPool(
HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyServer::Direct())));
// Verify no new sockets created.
- EXPECT_EQ(socket, socket_factory->GetLastProducedTCPSocket());
+ EXPECT_EQ(socket, socket_factory_ptr->GetLastProducedTCPSocket());
// Verify socket tag changed.
EXPECT_TRUE(tag2 == socket->tag());
EXPECT_FALSE(socket->tagged_before_connected());
@@ -2777,7 +2783,7 @@ TEST_F(HttpStreamFactoryTest, ChangeSocketTag) {
1, GetHandedOutSocketCount(session->GetSocketPool(
HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyServer::Direct())));
// Verify no new sockets created.
- EXPECT_EQ(socket, socket_factory->GetLastProducedTCPSocket());
+ EXPECT_EQ(socket, socket_factory_ptr->GetLastProducedTCPSocket());
// Verify socket tag changed.
EXPECT_TRUE(tag1 == socket->tag());
EXPECT_FALSE(socket->tagged_before_connected());
@@ -2811,7 +2817,8 @@ TEST_F(HttpStreamFactoryTest, ChangeSocketTag) {
2, GetHandedOutSocketCount(session->GetSocketPool(
HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyServer::Direct())));
// Verify a new socket was created.
- MockTaggingStreamSocket* socket2 = socket_factory->GetLastProducedTCPSocket();
+ MockTaggingStreamSocket* socket2 =
+ socket_factory_ptr->GetLastProducedTCPSocket();
EXPECT_NE(socket, socket2);
// Verify tag set appropriately.
EXPECT_TRUE(tag2 == socket2->tag());
@@ -2825,9 +2832,9 @@ TEST_F(HttpStreamFactoryTest, ChangeSocketTag) {
// Regression test for https://crbug.com/954503.
TEST_F(HttpStreamFactoryTest, ChangeSocketTagAvoidOverwrite) {
SpdySessionDependencies session_deps;
- MockTaggingClientSocketFactory* socket_factory =
- new MockTaggingClientSocketFactory();
- session_deps.socket_factory.reset(socket_factory);
+ auto socket_factory = std::make_unique<MockTaggingClientSocketFactory>();
+ auto* socket_factory_ptr = socket_factory.get();
+ session_deps.socket_factory = std::move(socket_factory);
// Prepare for two HTTPS connects.
MockRead mock_read(SYNCHRONOUS, ERR_IO_PENDING);
@@ -2901,7 +2908,8 @@ TEST_F(HttpStreamFactoryTest, ChangeSocketTagAvoidOverwrite) {
1, GetHandedOutSocketCount(session->GetSocketPool(
HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyServer::Direct())));
// Verify socket tagged appropriately.
- MockTaggingStreamSocket* socket = socket_factory->GetLastProducedTCPSocket();
+ MockTaggingStreamSocket* socket =
+ socket_factory_ptr->GetLastProducedTCPSocket();
EXPECT_TRUE(tag1 == socket->tag());
EXPECT_TRUE(socket->tagged_before_connected());
@@ -2933,7 +2941,8 @@ TEST_F(HttpStreamFactoryTest, ChangeSocketTagAvoidOverwrite) {
2, GetHandedOutSocketCount(session->GetSocketPool(
HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyServer::Direct())));
// Verify a new socket was created.
- MockTaggingStreamSocket* socket2 = socket_factory->GetLastProducedTCPSocket();
+ MockTaggingStreamSocket* socket2 =
+ socket_factory_ptr->GetLastProducedTCPSocket();
EXPECT_NE(socket, socket2);
// Verify tag set appropriately.
EXPECT_TRUE(tag2 == socket2->tag());
@@ -2972,7 +2981,7 @@ TEST_F(HttpStreamFactoryTest, ChangeSocketTagAvoidOverwrite) {
2, GetHandedOutSocketCount(session->GetSocketPool(
HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyServer::Direct())));
// Verify no new sockets created.
- EXPECT_EQ(socket2, socket_factory->GetLastProducedTCPSocket());
+ EXPECT_EQ(socket2, socket_factory_ptr->GetLastProducedTCPSocket());
// Verify socket tag changed.
EXPECT_TRUE(tag3 == socket->tag());
EXPECT_FALSE(socket->tagged_before_connected());
@@ -2993,7 +3002,7 @@ TEST_F(HttpStreamFactoryTest, ChangeSocketTagAvoidOverwrite) {
EXPECT_FALSE(waiter4.websocket_stream());
ASSERT_TRUE(waiter4.stream());
// Verify no new sockets created.
- EXPECT_EQ(socket2, socket_factory->GetLastProducedTCPSocket());
+ EXPECT_EQ(socket2, socket_factory_ptr->GetLastProducedTCPSocket());
}
#endif
@@ -3552,8 +3561,8 @@ TEST_F(ProcessAlternativeServicesTest, ProcessEmptyAltSvc) {
url::SchemeHostPort origin;
NetworkIsolationKey network_isolation_key;
- scoped_refptr<HttpResponseHeaders> headers(
- base::MakeRefCounted<HttpResponseHeaders>(""));
+ auto headers = base::MakeRefCounted<HttpResponseHeaders>("");
+
session_->http_stream_factory()->ProcessAlternativeServices(
session_.get(), network_isolation_key, headers.get(), origin);
@@ -3582,8 +3591,7 @@ TEST_F(ProcessAlternativeServicesTest, ProcessAltSvcClear) {
.GetAlternativeServiceInfos(origin, network_isolation_key)
.empty());
- scoped_refptr<HttpResponseHeaders> headers(
- base::MakeRefCounted<HttpResponseHeaders>(""));
+ auto headers = base::MakeRefCounted<HttpResponseHeaders>("");
headers->AddHeader("alt-svc", "clear");
session_->http_stream_factory()->ProcessAlternativeServices(
@@ -3605,8 +3613,7 @@ TEST_F(ProcessAlternativeServicesTest, ProcessAltSvcQuicIetf) {
SchemefulSite(GURL("https://example.com")),
SchemefulSite(GURL("https://example.com")));
- scoped_refptr<HttpResponseHeaders> headers(
- base::MakeRefCounted<HttpResponseHeaders>(""));
+ auto headers = base::MakeRefCounted<HttpResponseHeaders>("");
headers->AddHeader("alt-svc",
"h3-29=\":443\","
"h3-Q050=\":443\","
@@ -3643,8 +3650,7 @@ TEST_F(ProcessAlternativeServicesTest, ProcessAltSvcHttp2) {
SchemefulSite(GURL("https://example.com")),
SchemefulSite(GURL("https://example.com")));
- scoped_refptr<HttpResponseHeaders> headers(
- base::MakeRefCounted<HttpResponseHeaders>(""));
+ auto headers = base::MakeRefCounted<HttpResponseHeaders>("");
headers->AddHeader("alt-svc", "h2=\"other.example.com:443\"");
session_->http_stream_factory()->ProcessAlternativeServices(
diff --git a/chromium/net/http/http_stream_parser.cc b/chromium/net/http/http_stream_parser.cc
index 7a0e8f0e4ca..8609f3d3a47 100644
--- a/chromium/net/http/http_stream_parser.cc
+++ b/chromium/net/http/http_stream_parser.cc
@@ -57,11 +57,11 @@ std::string GetResponseHeaderLines(const HttpResponseHeaders& headers) {
base::Value NetLogSendRequestBodyParams(uint64_t length,
bool is_chunked,
bool did_merge) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetIntKey("length", static_cast<int>(length));
- dict.SetBoolKey("is_chunked", is_chunked);
- dict.SetBoolKey("did_merge", did_merge);
- return dict;
+ base::Value::Dict dict;
+ dict.Set("length", static_cast<int>(length));
+ dict.Set("is_chunked", is_chunked);
+ dict.Set("did_merge", did_merge);
+ return base::Value(std::move(dict));
}
void NetLogSendRequestBody(const NetLogWithSource& net_log,
@@ -1007,7 +1007,8 @@ int HttpStreamParser::ParseResponseHeaders(int end_offset) {
}
}
- headers = new HttpResponseHeaders(std::string("HTTP/0.9 200 OK"));
+ headers = base::MakeRefCounted<HttpResponseHeaders>(
+ std::string("HTTP/0.9 200 OK"));
}
// Check for multiple Content-Length headers when the response is not
@@ -1035,7 +1036,6 @@ int HttpStreamParser::ParseResponseHeaders(int end_offset) {
} else if (headers->GetHttpVersion() == HttpVersion(1, 1)) {
response_->connection_info = HttpResponseInfo::CONNECTION_INFO_HTTP1_1;
}
- response_->vary_data.Init(*request_, *response_->headers);
DVLOG(1) << __func__ << "() content_length = \""
<< response_->headers->GetContentLength() << "\n\""
<< " headers = \"" << GetResponseHeaderLines(*response_->headers)
@@ -1129,6 +1129,12 @@ bool HttpStreamParser::CanReuseConnection() const {
return stream_socket_->IsConnected();
}
+void HttpStreamParser::OnConnectionClose() {
+ // This is to ensure `stream_socket_` doesn't get dangling on connection
+ // close.
+ stream_socket_ = nullptr;
+}
+
void HttpStreamParser::GetSSLInfo(SSLInfo* ssl_info) {
if (!request_->url.SchemeIsCryptographic() ||
!stream_socket_->GetSSLInfo(ssl_info)) {
diff --git a/chromium/net/http/http_stream_parser.h b/chromium/net/http/http_stream_parser.h
index 73a4bc560ea..b9287d07343 100644
--- a/chromium/net/http/http_stream_parser.h
+++ b/chromium/net/http/http_stream_parser.h
@@ -95,6 +95,9 @@ class NET_EXPORT_PRIVATE HttpStreamParser {
// false.
bool CanReuseConnection() const;
+ // Called when stream is closed.
+ void OnConnectionClose();
+
int64_t received_bytes() const { return received_bytes_; }
int64_t sent_bytes() const { return sent_bytes_; }
@@ -301,7 +304,7 @@ class NET_EXPORT_PRIVATE HttpStreamParser {
// The underlying socket, owned by the caller. The HttpStreamParser must be
// destroyed before the caller destroys the socket, or relinquishes ownership
// of it.
- const raw_ptr<StreamSocket> stream_socket_;
+ raw_ptr<StreamSocket> stream_socket_;
// Whether the socket has already been used. Only used in HTTP/0.9 detection
// logic.
diff --git a/chromium/net/http/http_stream_parser_unittest.cc b/chromium/net/http/http_stream_parser_unittest.cc
index d870cd1c398..981df1366ac 100644
--- a/chromium/net/http/http_stream_parser_unittest.cc
+++ b/chromium/net/http/http_stream_parser_unittest.cc
@@ -58,8 +58,8 @@ const size_t kMaxPayloadSize =
std::unique_ptr<StreamSocket> CreateConnectedSocket(SequencedSocketData* data) {
data->set_connect_data(MockConnect(SYNCHRONOUS, OK));
- std::unique_ptr<MockTCPClientSocket> socket(
- new MockTCPClientSocket(net::AddressList(), nullptr, data));
+ auto socket =
+ std::make_unique<MockTCPClientSocket>(net::AddressList(), nullptr, data);
TestCompletionCallback callback;
EXPECT_THAT(socket->Connect(callback.callback()), IsOk());
@@ -363,7 +363,7 @@ TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_EmptyBody) {
TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_ChunkedBody) {
const std::string payload = "123";
- std::unique_ptr<ChunkedUploadDataStream> body(new ChunkedUploadDataStream(0));
+ auto body = std::make_unique<ChunkedUploadDataStream>(0);
body->AppendData(payload.data(), payload.size(), true);
ASSERT_THAT(
body->Init(TestCompletionCallback().callback(), NetLogWithSource()),
@@ -392,7 +392,8 @@ TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_FileBody) {
base::Time()));
std::unique_ptr<UploadDataStream> body(
- new ElementsUploadDataStream(std::move(element_readers), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers),
+ 0));
TestCompletionCallback callback;
ASSERT_THAT(body->Init(callback.callback(), NetLogWithSource()),
IsError(ERR_IO_PENDING));
@@ -413,7 +414,8 @@ TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_SmallBodyInMemory) {
payload.data(), payload.size()));
std::unique_ptr<UploadDataStream> body(
- new ElementsUploadDataStream(std::move(element_readers), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers),
+ 0));
ASSERT_THAT(body->Init(CompletionOnceCallback(), NetLogWithSource()), IsOk());
// Yes, should be merged if the in-memory body is small here.
ASSERT_TRUE(HttpStreamParser::ShouldMergeRequestHeadersAndBody(
@@ -427,7 +429,8 @@ TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_LargeBodyInMemory) {
payload.data(), payload.size()));
std::unique_ptr<UploadDataStream> body(
- new ElementsUploadDataStream(std::move(element_readers), 0));
+ std::make_unique<ElementsUploadDataStream>(std::move(element_readers),
+ 0));
ASSERT_THAT(body->Init(CompletionOnceCallback(), NetLogWithSource()), IsOk());
// Shouldn't be merged if the in-memory body is large here.
ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody(
@@ -1249,12 +1252,12 @@ class SimpleGetRunner {
// The data used to back |string_piece| must stay alive until all mock data
// has been read.
void AddRead(base::StringPiece string_piece) {
- reads_.push_back(MockRead(SYNCHRONOUS, string_piece.data(),
- string_piece.length(), sequence_number_++));
+ reads_.emplace_back(SYNCHRONOUS, string_piece.data(), string_piece.length(),
+ sequence_number_++);
}
void SetupParserAndSendRequest() {
- reads_.push_back(MockRead(SYNCHRONOUS, 0, sequence_number_++)); // EOF
+ reads_.emplace_back(SYNCHRONOUS, 0, sequence_number_++); // EOF
data_ = std::make_unique<SequencedSocketData>(reads_, writes_);
stream_socket_ = CreateConnectedSocket(data_.get());
@@ -1663,8 +1666,8 @@ TEST(HttpStreamParser, ReceivedBytesMultipleReads) {
}
SimpleGetRunner get_runner;
- for (std::vector<std::string>::size_type i = 0; i < blocks.size(); ++i)
- get_runner.AddRead(blocks[i]);
+ for (const auto& block : blocks)
+ get_runner.AddRead(block);
get_runner.SetupParserAndSendRequest();
get_runner.ReadHeaders();
int64_t headers_size = headers.size();
@@ -2158,7 +2161,7 @@ TEST(HttpStreamParser, ReadAfterUnownedObjectsDestroyed) {
SequencedSocketData data(reads, writes);
std::unique_ptr<StreamSocket> stream_socket = CreateConnectedSocket(&data);
- std::unique_ptr<HttpRequestInfo> request_info(new HttpRequestInfo());
+ auto request_info = std::make_unique<HttpRequestInfo>();
request_info->method = "GET";
request_info->url = GURL("http://somewhere/foo.html");
@@ -2168,8 +2171,8 @@ TEST(HttpStreamParser, ReadAfterUnownedObjectsDestroyed) {
request_info.get(), read_buffer.get(),
NetLogWithSource());
- std::unique_ptr<HttpRequestHeaders> request_headers(new HttpRequestHeaders());
- std::unique_ptr<HttpResponseInfo> response_info(new HttpResponseInfo());
+ auto request_headers = std::make_unique<HttpRequestHeaders>();
+ auto response_info = std::make_unique<HttpResponseInfo>();
TestCompletionCallback callback;
ASSERT_EQ(
OK, parser.SendRequest("GET /foo.html HTTP/1.1\r\n", *request_headers,
diff --git a/chromium/net/http/http_stream_request.cc b/chromium/net/http/http_stream_request.cc
index c2446311e23..a938d5dcc53 100644
--- a/chromium/net/http/http_stream_request.cc
+++ b/chromium/net/http/http_stream_request.cc
@@ -35,7 +35,7 @@ HttpStreamRequest::HttpStreamRequest(
HttpStreamRequest::~HttpStreamRequest() {
net_log_.EndEvent(NetLogEventType::HTTP_STREAM_REQUEST);
- helper_->OnRequestComplete();
+ helper_.ExtractAsDangling()->OnRequestComplete(); // May delete `*helper_`;
}
void HttpStreamRequest::Complete(bool was_alpn_negotiated,
diff --git a/chromium/net/http/http_stream_request.h b/chromium/net/http/http_stream_request.h
index 8b8eb41dfdf..9f4b3ada44b 100644
--- a/chromium/net/http/http_stream_request.h
+++ b/chromium/net/http/http_stream_request.h
@@ -50,7 +50,7 @@ class NET_EXPORT_PRIVATE HttpStreamRequest {
// called as a result of a stream request.
class NET_EXPORT_PRIVATE Delegate {
public:
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
// This is the success case for RequestStream.
// |stream| is now owned by the delegate.
@@ -137,7 +137,7 @@ class NET_EXPORT_PRIVATE HttpStreamRequest {
class NET_EXPORT_PRIVATE Helper {
public:
- virtual ~Helper() {}
+ virtual ~Helper() = default;
// Returns the LoadState for Request.
virtual LoadState GetLoadState() const = 0;
@@ -219,7 +219,7 @@ class NET_EXPORT_PRIVATE HttpStreamRequest {
private:
const GURL url_;
- // Unowned. The helper must outlive this request.
+ // Unowned. The helper must not be destroyed before this object is.
raw_ptr<Helper> helper_;
const raw_ptr<WebSocketHandshakeStreamBase::CreateHelper>
diff --git a/chromium/net/http/http_transaction.h b/chromium/net/http/http_transaction.h
index 58e46c5123e..0d28e304e82 100644
--- a/chromium/net/http/http_transaction.h
+++ b/chromium/net/http/http_transaction.h
@@ -61,7 +61,7 @@ class NET_EXPORT_PRIVATE HttpTransaction {
CompletionOnceCallback callback)>;
// Stops any pending IO and destroys the transaction object.
- virtual ~HttpTransaction() {}
+ virtual ~HttpTransaction() = default;
// Starts the HTTP transaction (i.e., sends the HTTP request).
//
diff --git a/chromium/net/http/http_transaction_factory.h b/chromium/net/http/http_transaction_factory.h
index d787c69b8f0..b04d1d32421 100644
--- a/chromium/net/http/http_transaction_factory.h
+++ b/chromium/net/http/http_transaction_factory.h
@@ -19,7 +19,7 @@ class HttpTransaction;
// An interface to a class that can create HttpTransaction objects.
class NET_EXPORT HttpTransactionFactory {
public:
- virtual ~HttpTransactionFactory() {}
+ virtual ~HttpTransactionFactory() = default;
// Creates a HttpTransaction object. On success, saves the new
// transaction to |*trans| and returns OK.
diff --git a/chromium/net/http/http_transaction_test_util.cc b/chromium/net/http/http_transaction_test_util.cc
index 254263aba71..865099933cd 100644
--- a/chromium/net/http/http_transaction_test_util.cc
+++ b/chromium/net/http/http_transaction_test_util.cc
@@ -179,9 +179,9 @@ const MockTransaction* FindMockTransaction(const GURL& url) {
return it->second;
// look for builtins:
- for (size_t i = 0; i < std::size(kBuiltinMockTransactions); ++i) {
- if (url == GURL(kBuiltinMockTransactions[i]->url))
- return kBuiltinMockTransactions[i];
+ for (const auto* transaction : kBuiltinMockTransactions) {
+ if (url == GURL(transaction->url))
+ return transaction;
}
return nullptr;
}
@@ -204,7 +204,7 @@ MockHttpRequest::MockHttpRequest(const MockTransaction& t) {
}
std::string MockHttpRequest::CacheKey() {
- return HttpCache::GenerateCacheKeyForTest(this);
+ return *HttpCache::GenerateCacheKeyForRequest(this);
}
//-----------------------------------------------------------------------------
@@ -506,8 +506,7 @@ int MockNetworkTransaction::StartInternal(const HttpRequestInfo* request,
if (!t->response_time.is_null())
response_.response_time = t->response_time;
- response_.headers = new HttpResponseHeaders(header_data);
- response_.vary_data.Init(*request, *response_.headers.get());
+ response_.headers = base::MakeRefCounted<HttpResponseHeaders>(header_data);
response_.ssl_info.cert = t->cert;
response_.ssl_info.cert_status = t->cert_status;
response_.ssl_info.connection_status = t->ssl_connection_status;
@@ -608,8 +607,8 @@ int MockNetworkLayer::CreateTransaction(
std::unique_ptr<HttpTransaction>* trans) {
transaction_count_++;
last_create_transaction_priority_ = priority;
- std::unique_ptr<MockNetworkTransaction> mock_transaction(
- new MockNetworkTransaction(priority, this));
+ auto mock_transaction =
+ std::make_unique<MockNetworkTransaction>(priority, this);
last_transaction_ = mock_transaction->AsWeakPtr();
*trans = std::move(mock_transaction);
return OK;
diff --git a/chromium/net/http/http_util.cc b/chromium/net/http/http_util.cc
index 96a6e2943e8..7aa436ea73c 100644
--- a/chromium/net/http/http_util.cc
+++ b/chromium/net/http/http_util.cc
@@ -335,6 +335,12 @@ bool HttpUtil::IsSafeHeader(base::StringPiece name) {
if (base::EqualsCaseInsensitiveASCII(name, field))
return false;
}
+
+ if (base::FeatureList::IsEnabled(features::kBlockSetCookieHeader) &&
+ base::EqualsCaseInsensitiveASCII(name, "set-cookie")) {
+ return false;
+ }
+
return true;
}
diff --git a/chromium/net/http/http_util_unittest.cc b/chromium/net/http/http_util_unittest.cc
index b2eb2332b54..c5c278f9890 100644
--- a/chromium/net/http/http_util_unittest.cc
+++ b/chromium/net/http/http_util_unittest.cc
@@ -38,6 +38,7 @@ TEST(HttpUtilTest, IsSafeHeader) {
"keep-alive",
"origin",
"referer",
+ "set-cookie",
"te",
"trailer",
"transfer-encoding",
@@ -45,11 +46,10 @@ TEST(HttpUtilTest, IsSafeHeader) {
"user-agent",
"via",
};
- for (size_t i = 0; i < std::size(unsafe_headers); ++i) {
- EXPECT_FALSE(HttpUtil::IsSafeHeader(unsafe_headers[i]))
- << unsafe_headers[i];
- EXPECT_FALSE(HttpUtil::IsSafeHeader(base::ToUpperASCII(unsafe_headers[i])))
- << unsafe_headers[i];
+ for (const auto* unsafe_header : unsafe_headers) {
+ EXPECT_FALSE(HttpUtil::IsSafeHeader(unsafe_header)) << unsafe_header;
+ EXPECT_FALSE(HttpUtil::IsSafeHeader(base::ToUpperASCII(unsafe_header)))
+ << unsafe_header;
}
static const char* const safe_headers[] = {
"foo",
@@ -92,10 +92,10 @@ TEST(HttpUtilTest, IsSafeHeader) {
"user_agent",
"viaa",
};
- for (size_t i = 0; i < std::size(safe_headers); ++i) {
- EXPECT_TRUE(HttpUtil::IsSafeHeader(safe_headers[i])) << safe_headers[i];
- EXPECT_TRUE(HttpUtil::IsSafeHeader(base::ToUpperASCII(safe_headers[i])))
- << safe_headers[i];
+ for (const auto* safe_header : safe_headers) {
+ EXPECT_TRUE(HttpUtil::IsSafeHeader(safe_header)) << safe_header;
+ EXPECT_TRUE(HttpUtil::IsSafeHeader(base::ToUpperASCII(safe_header)))
+ << safe_header;
}
}
@@ -339,10 +339,10 @@ TEST(HttpUtilTest, LocateEndOfHeaders) {
{"foo\nbar\n\r\njunk", 10},
{"foo\nbar\r\n\njunk", 10},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
- size_t input_len = strlen(tests[i].input);
- size_t eoh = HttpUtil::LocateEndOfHeaders(tests[i].input, input_len);
- EXPECT_EQ(tests[i].expected_result, eoh);
+ for (const auto& test : tests) {
+ size_t input_len = strlen(test.input);
+ size_t eoh = HttpUtil::LocateEndOfHeaders(test.input, input_len);
+ EXPECT_EQ(test.expected_result, eoh);
}
}
@@ -363,11 +363,10 @@ TEST(HttpUtilTest, LocateEndOfAdditionalHeaders) {
{"foo\nbar\n\r\njunk", 10},
{"foo\nbar\r\n\njunk", 10},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
- size_t input_len = strlen(tests[i].input);
- size_t eoh =
- HttpUtil::LocateEndOfAdditionalHeaders(tests[i].input, input_len);
- EXPECT_EQ(tests[i].expected_result, eoh);
+ for (const auto& test : tests) {
+ size_t input_len = strlen(test.input);
+ size_t eoh = HttpUtil::LocateEndOfAdditionalHeaders(test.input, input_len);
+ EXPECT_EQ(test.expected_result, eoh);
}
}
TEST(HttpUtilTest, AssembleRawHeaders) {
@@ -686,12 +685,12 @@ TEST(HttpUtilTest, AssembleRawHeaders) {
},
};
// clang-format on
- for (size_t i = 0; i < std::size(tests); ++i) {
- std::string input = tests[i].input;
+ for (const auto& test : tests) {
+ std::string input = test.input;
std::replace(input.begin(), input.end(), '|', '\0');
std::string raw = HttpUtil::AssembleRawHeaders(input);
std::replace(raw.begin(), raw.end(), '\0', '|');
- EXPECT_EQ(tests[i].expected_result, raw);
+ EXPECT_EQ(test.expected_result, raw);
}
}
@@ -992,21 +991,21 @@ TEST(HttpUtilTest, ParseContentType) {
// TODO(abarth): Add more interesting test cases.
};
// clang-format on
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
std::string mime_type;
std::string charset;
bool had_charset = false;
std::string boundary;
- HttpUtil::ParseContentType(tests[i].content_type, &mime_type, &charset,
+ HttpUtil::ParseContentType(test.content_type, &mime_type, &charset,
&had_charset, &boundary);
- EXPECT_EQ(tests[i].expected_mime_type, mime_type)
- << "content_type=" << tests[i].content_type;
- EXPECT_EQ(tests[i].expected_charset, charset)
- << "content_type=" << tests[i].content_type;
- EXPECT_EQ(tests[i].expected_had_charset, had_charset)
- << "content_type=" << tests[i].content_type;
- EXPECT_EQ(tests[i].expected_boundary, boundary)
- << "content_type=" << tests[i].content_type;
+ EXPECT_EQ(test.expected_mime_type, mime_type)
+ << "content_type=" << test.content_type;
+ EXPECT_EQ(test.expected_charset, charset)
+ << "content_type=" << test.content_type;
+ EXPECT_EQ(test.expected_had_charset, had_charset)
+ << "content_type=" << test.content_type;
+ EXPECT_EQ(test.expected_boundary, boundary)
+ << "content_type=" << test.content_type;
}
}
@@ -1632,8 +1631,8 @@ TEST(HttpUtilTest, ParseAcceptEncoding) {
{"foo,\"bar\"", "INVALID"},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
- std::string value(tests[i].value);
+ for (const auto& test : tests) {
+ std::string value(test.value);
std::string reformatted;
std::set<std::string> allowed_encodings;
if (!HttpUtil::ParseAcceptEncoding(value, &allowed_encodings)) {
@@ -1644,7 +1643,7 @@ TEST(HttpUtilTest, ParseAcceptEncoding) {
encodings_list.push_back(encoding);
reformatted = base::JoinString(encodings_list, "|");
}
- EXPECT_STREQ(tests[i].expected, reformatted.c_str())
+ EXPECT_STREQ(test.expected, reformatted.c_str())
<< "value=\"" << value << "\"";
}
}
@@ -1662,8 +1661,8 @@ TEST(HttpUtilTest, ParseContentEncoding) {
{"foo,\"bar\"", "INVALID"},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
- std::string value(tests[i].value);
+ for (const auto& test : tests) {
+ std::string value(test.value);
std::string reformatted;
std::set<std::string> used_encodings;
if (!HttpUtil::ParseContentEncoding(value, &used_encodings)) {
@@ -1674,7 +1673,7 @@ TEST(HttpUtilTest, ParseContentEncoding) {
encodings_list.push_back(encoding);
reformatted = base::JoinString(encodings_list, "|");
}
- EXPECT_STREQ(tests[i].expected, reformatted.c_str())
+ EXPECT_STREQ(test.expected, reformatted.c_str())
<< "value=\"" << value << "\"";
}
}
diff --git a/chromium/net/http/http_vary_data_unittest.cc b/chromium/net/http/http_vary_data_unittest.cc
index 0b11adf91f6..b4b3d4c5dfb 100644
--- a/chromium/net/http/http_vary_data_unittest.cc
+++ b/chromium/net/http/http_vary_data_unittest.cc
@@ -25,7 +25,7 @@ struct TestTransaction {
const std::string& response_headers) {
std::string temp(response_headers);
std::replace(temp.begin(), temp.end(), '\n', '\0');
- response = new HttpResponseHeaders(temp);
+ response = base::MakeRefCounted<HttpResponseHeaders>(temp);
request.extra_headers.Clear();
for (const auto& [key, value] : request_headers)
diff --git a/chromium/net/http/http_version.h b/chromium/net/http/http_version.h
index 13864a65c60..29cbf81b254 100644
--- a/chromium/net/http/http_version.h
+++ b/chromium/net/http/http_version.h
@@ -16,7 +16,8 @@ class HttpVersion {
HttpVersion() : value_(0) { }
// Build from unsigned major/minor pair.
- HttpVersion(uint16_t major, uint16_t minor) : value_(major << 16 | minor) {}
+ HttpVersion(uint16_t major, uint16_t minor)
+ : value_(static_cast<uint32_t>(major << 16) | minor) {}
// Major version number.
uint16_t major_value() const { return value_ >> 16; }
diff --git a/chromium/net/http/mock_http_cache.cc b/chromium/net/http/mock_http_cache.cc
index 790d31af772..a96faaaf05a 100644
--- a/chromium/net/http/mock_http_cache.cc
+++ b/chromium/net/http/mock_http_cache.cc
@@ -368,9 +368,8 @@ void MockDiskEntry::StoreAndDeliverCallbacks(bool store,
CallbackInfo c = {entry, std::move(callback)};
callback_list.push_back(std::move(c));
} else {
- for (size_t i = 0; i < callback_list.size(); i++) {
- CallbackInfo& c = callback_list[i];
- c.entry->CallbackLater(std::move(c.callback));
+ for (auto& callback_info : callback_list) {
+ callback_info.entry->CallbackLater(std::move(callback_info.callback));
}
callback_list.clear();
}
@@ -582,7 +581,7 @@ class MockDiskCache::NotImplementedIterator : public Iterator {
};
std::unique_ptr<disk_cache::Backend::Iterator> MockDiskCache::CreateIterator() {
- return std::unique_ptr<Iterator>(new NotImplementedIterator());
+ return std::make_unique<NotImplementedIterator>();
}
void MockDiskCache::GetStats(base::StringPairs* stats) {
@@ -649,12 +648,10 @@ const std::vector<std::string>& MockDiskCache::GetExternalCacheHits() const {
//-----------------------------------------------------------------------------
-int MockBackendFactory::CreateBackend(
+disk_cache::BackendResult MockBackendFactory::CreateBackend(
NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
- CompletionOnceCallback callback) {
- *backend = std::make_unique<MockDiskCache>();
- return OK;
+ disk_cache::BackendResultCallback callback) {
+ return disk_cache::BackendResult::Make(std::make_unique<MockDiskCache>());
}
//-----------------------------------------------------------------------------
@@ -811,43 +808,41 @@ disk_cache::EntryResult MockDiskCacheNoCB::CreateEntry(
//-----------------------------------------------------------------------------
-int MockBackendNoCbFactory::CreateBackend(
+disk_cache::BackendResult MockBackendNoCbFactory::CreateBackend(
NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
- CompletionOnceCallback callback) {
- *backend = std::make_unique<MockDiskCacheNoCB>();
- return OK;
+ disk_cache::BackendResultCallback callback) {
+ return disk_cache::BackendResult::Make(std::make_unique<MockDiskCacheNoCB>());
}
//-----------------------------------------------------------------------------
MockBlockingBackendFactory::MockBlockingBackendFactory() = default;
-
MockBlockingBackendFactory::~MockBlockingBackendFactory() = default;
-int MockBlockingBackendFactory::CreateBackend(
+disk_cache::BackendResult MockBlockingBackendFactory::CreateBackend(
NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
- CompletionOnceCallback callback) {
+ disk_cache::BackendResultCallback callback) {
if (!block_) {
- if (!fail_)
- *backend = std::make_unique<MockDiskCache>();
- return Result();
+ return MakeResult();
}
- backend_ = backend;
callback_ = std::move(callback);
- return ERR_IO_PENDING;
+ return disk_cache::BackendResult::MakeError(ERR_IO_PENDING);
}
void MockBlockingBackendFactory::FinishCreation() {
block_ = false;
if (!callback_.is_null()) {
- if (!fail_)
- *backend_ = std::make_unique<MockDiskCache>();
// Running the callback might delete |this|.
- std::move(callback_).Run(Result());
+ std::move(callback_).Run(MakeResult());
}
}
+disk_cache::BackendResult MockBlockingBackendFactory::MakeResult() {
+ if (fail_)
+ return disk_cache::BackendResult::MakeError(ERR_FAILED);
+ else
+ return disk_cache::BackendResult::Make(std::make_unique<MockDiskCache>());
+}
+
} // namespace net
diff --git a/chromium/net/http/mock_http_cache.h b/chromium/net/http/mock_http_cache.h
index 9068a3d8456..2c95830c666 100644
--- a/chromium/net/http/mock_http_cache.h
+++ b/chromium/net/http/mock_http_cache.h
@@ -280,9 +280,9 @@ class MockDiskCache : public disk_cache::Backend {
class MockBackendFactory : public HttpCache::BackendFactory {
public:
- int CreateBackend(NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
- CompletionOnceCallback callback) override;
+ disk_cache::BackendResult CreateBackend(
+ NetLog* net_log,
+ disk_cache::BackendResultCallback callback) override;
};
class MockHttpCache {
@@ -358,9 +358,9 @@ class MockDiskCacheNoCB : public MockDiskCache {
class MockBackendNoCbFactory : public HttpCache::BackendFactory {
public:
- int CreateBackend(NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
- CompletionOnceCallback callback) override;
+ disk_cache::BackendResult CreateBackend(
+ NetLog* net_log,
+ disk_cache::BackendResultCallback callback) override;
};
// This backend factory allows us to control the backend instantiation.
@@ -369,24 +369,24 @@ class MockBlockingBackendFactory : public HttpCache::BackendFactory {
MockBlockingBackendFactory();
~MockBlockingBackendFactory() override;
- int CreateBackend(NetLog* net_log,
- std::unique_ptr<disk_cache::Backend>* backend,
- CompletionOnceCallback callback) override;
+ disk_cache::BackendResult CreateBackend(
+ NetLog* net_log,
+ disk_cache::BackendResultCallback callback) override;
// Completes the backend creation. Any blocked call will be notified via the
// provided callback.
void FinishCreation();
- std::unique_ptr<disk_cache::Backend>* backend() { return backend_; }
void set_fail(bool fail) { fail_ = fail; }
- CompletionOnceCallback ReleaseCallback() { return std::move(callback_); }
+ disk_cache::BackendResultCallback ReleaseCallback() {
+ return std::move(callback_);
+ }
private:
- int Result() { return fail_ ? ERR_FAILED : OK; }
+ disk_cache::BackendResult MakeResult();
- raw_ptr<std::unique_ptr<disk_cache::Backend>> backend_ = nullptr;
- CompletionOnceCallback callback_;
+ disk_cache::BackendResultCallback callback_;
bool block_ = true;
bool fail_ = false;
};
diff --git a/chromium/net/http/proxy_client_socket.h b/chromium/net/http/proxy_client_socket.h
index db9900ffdea..09319659f2a 100644
--- a/chromium/net/http/proxy_client_socket.h
+++ b/chromium/net/http/proxy_client_socket.h
@@ -26,12 +26,12 @@ class NetLogWithSource;
// A common base class for a stream socket tunneled through a proxy.
class NET_EXPORT_PRIVATE ProxyClientSocket : public StreamSocket {
public:
- ProxyClientSocket() {}
+ ProxyClientSocket() = default;
ProxyClientSocket(const ProxyClientSocket&) = delete;
ProxyClientSocket& operator=(const ProxyClientSocket&) = delete;
- ~ProxyClientSocket() override {}
+ ~ProxyClientSocket() override = default;
// Returns the HttpResponseInfo (including HTTP Headers) from
// the response to the CONNECT request.
diff --git a/chromium/net/http/structured_headers.h b/chromium/net/http/structured_headers.h
index 97a1da5cf01..73b7e616eec 100644
--- a/chromium/net/http/structured_headers.h
+++ b/chromium/net/http/structured_headers.h
@@ -12,8 +12,7 @@
#include "net/third_party/quiche/src/quiche/common/structured_headers.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
-namespace net {
-namespace structured_headers {
+namespace net::structured_headers {
using Item = quiche::structured_headers::Item;
using ParameterisedIdentifier =
@@ -69,7 +68,6 @@ inline absl::optional<std::string> SerializeDictionary(
return quiche::structured_headers::SerializeDictionary(value);
}
-} // namespace structured_headers
-} // namespace net
+} // namespace net::structured_headers
#endif // NET_HTTP_STRUCTURED_HEADERS_H_
diff --git a/chromium/net/http/transport_security_persister.cc b/chromium/net/http/transport_security_persister.cc
index 2b3d0dc57d5..95053920611 100644
--- a/chromium/net/http/transport_security_persister.cc
+++ b/chromium/net/http/transport_security_persister.cc
@@ -102,27 +102,27 @@ bool IsDynamicExpectCTEnabled() {
}
// Serializes STS data from |state| to a Value.
-base::Value SerializeSTSData(const TransportSecurityState* state) {
- base::Value sts_list(base::Value::Type::LIST);
+base::Value::List SerializeSTSData(const TransportSecurityState* state) {
+ base::Value::List sts_list;
TransportSecurityState::STSStateIterator sts_iterator(*state);
for (; sts_iterator.HasNext(); sts_iterator.Advance()) {
const TransportSecurityState::STSState& sts_state =
sts_iterator.domain_state();
- base::Value serialized(base::Value::Type::DICTIONARY);
- serialized.SetStringKey(
- kHostname, HashedDomainToExternalString(sts_iterator.hostname()));
- serialized.SetBoolKey(kStsIncludeSubdomains, sts_state.include_subdomains);
- serialized.SetDoubleKey(kStsObserved, sts_state.last_observed.ToDoubleT());
- serialized.SetDoubleKey(kExpiry, sts_state.expiry.ToDoubleT());
+ base::Value::Dict serialized;
+ serialized.Set(kHostname,
+ HashedDomainToExternalString(sts_iterator.hostname()));
+ serialized.Set(kStsIncludeSubdomains, sts_state.include_subdomains);
+ serialized.Set(kStsObserved, sts_state.last_observed.ToDoubleT());
+ serialized.Set(kExpiry, sts_state.expiry.ToDoubleT());
switch (sts_state.upgrade_mode) {
case TransportSecurityState::STSState::MODE_FORCE_HTTPS:
- serialized.SetStringKey(kMode, kForceHTTPS);
+ serialized.Set(kMode, kForceHTTPS);
break;
case TransportSecurityState::STSState::MODE_DEFAULT:
- serialized.SetStringKey(kMode, kDefault);
+ serialized.Set(kMode, kDefault);
break;
}
@@ -139,16 +139,17 @@ void DeserializeSTSData(const base::Value& sts_list,
base::Time current_time(base::Time::Now());
- for (const base::Value& sts_entry : sts_list.GetListDeprecated()) {
- if (!sts_entry.is_dict())
+ for (const base::Value& sts_entry : sts_list.GetList()) {
+ const base::Value::Dict* sts_dict = sts_entry.GetIfDict();
+ if (!sts_dict)
continue;
- const std::string* hostname = sts_entry.FindStringKey(kHostname);
+ const std::string* hostname = sts_dict->FindString(kHostname);
absl::optional<bool> sts_include_subdomains =
- sts_entry.FindBoolKey(kStsIncludeSubdomains);
- absl::optional<double> sts_observed = sts_entry.FindDoubleKey(kStsObserved);
- absl::optional<double> expiry = sts_entry.FindDoubleKey(kExpiry);
- const std::string* mode = sts_entry.FindStringKey(kMode);
+ sts_dict->FindBool(kStsIncludeSubdomains);
+ absl::optional<double> sts_observed = sts_dict->FindDouble(kStsObserved);
+ absl::optional<double> expiry = sts_dict->FindDouble(kExpiry);
+ const std::string* mode = sts_dict->FindString(kMode);
if (!hostname || !sts_include_subdomains.has_value() ||
!sts_observed.has_value() || !expiry.has_value() || !mode) {
@@ -181,8 +182,8 @@ void DeserializeSTSData(const base::Value& sts_list,
}
// Serializes Expect-CT data from |state| to a Value.
-base::Value SerializeExpectCTData(TransportSecurityState* state) {
- base::Value ct_list(base::Value::Type::LIST);
+base::Value::List SerializeExpectCTData(TransportSecurityState* state) {
+ base::Value::List ct_list;
if (!IsDynamicExpectCTEnabled())
return ct_list;
@@ -192,7 +193,7 @@ base::Value SerializeExpectCTData(TransportSecurityState* state) {
const TransportSecurityState::ExpectCTState& expect_ct_state =
expect_ct_iterator.domain_state();
- base::Value ct_entry(base::Value::Type::DICTIONARY);
+ base::Value::Dict ct_entry;
base::Value network_isolation_key_value;
// Don't serialize entries with transient NetworkIsolationKeys.
@@ -200,17 +201,14 @@ base::Value SerializeExpectCTData(TransportSecurityState* state) {
&network_isolation_key_value)) {
continue;
}
- ct_entry.SetKey(kNetworkIsolationKey,
- std::move(network_isolation_key_value));
-
- ct_entry.SetStringKey(
- kHostname, HashedDomainToExternalString(expect_ct_iterator.hostname()));
- ct_entry.SetDoubleKey(kExpectCTObserved,
- expect_ct_state.last_observed.ToDoubleT());
- ct_entry.SetDoubleKey(kExpectCTExpiry, expect_ct_state.expiry.ToDoubleT());
- ct_entry.SetBoolKey(kExpectCTEnforce, expect_ct_state.enforce);
- ct_entry.SetStringKey(kExpectCTReportUri,
- expect_ct_state.report_uri.spec());
+ ct_entry.Set(kNetworkIsolationKey, std::move(network_isolation_key_value));
+
+ ct_entry.Set(kHostname,
+ HashedDomainToExternalString(expect_ct_iterator.hostname()));
+ ct_entry.Set(kExpectCTObserved, expect_ct_state.last_observed.ToDoubleT());
+ ct_entry.Set(kExpectCTExpiry, expect_ct_state.expiry.ToDoubleT());
+ ct_entry.Set(kExpectCTEnforce, expect_ct_state.enforce);
+ ct_entry.Set(kExpectCTReportUri, expect_ct_state.report_uri.spec());
ct_list.Append(std::move(ct_entry));
}
@@ -228,21 +226,22 @@ void DeserializeExpectCTData(const base::Value& ct_list,
const base::Time current_time(base::Time::Now());
- for (const base::Value& ct_entry : ct_list.GetListDeprecated()) {
- if (!ct_entry.is_dict())
+ for (const base::Value& ct_entry : ct_list.GetList()) {
+ const base::Value::Dict* ct_dict = ct_entry.GetIfDict();
+ if (!ct_dict)
continue;
- const std::string* hostname = ct_entry.FindStringKey(kHostname);
+ const std::string* hostname = ct_dict->FindString(kHostname);
const base::Value* network_isolation_key_value =
- ct_entry.FindKey(kNetworkIsolationKey);
+ ct_dict->Find(kNetworkIsolationKey);
absl::optional<double> expect_ct_last_observed =
- ct_entry.FindDoubleKey(kExpectCTObserved);
+ ct_dict->FindDouble(kExpectCTObserved);
absl::optional<double> expect_ct_expiry =
- ct_entry.FindDoubleKey(kExpectCTExpiry);
+ ct_dict->FindDouble(kExpectCTExpiry);
absl::optional<bool> expect_ct_enforce =
- ct_entry.FindBoolKey(kExpectCTEnforce);
+ ct_dict->FindBool(kExpectCTEnforce);
const std::string* expect_ct_report_uri =
- ct_entry.FindStringKey(kExpectCTReportUri);
+ ct_dict->FindString(kExpectCTReportUri);
if (!hostname || !network_isolation_key_value ||
!expect_ct_last_observed.has_value() || !expect_ct_expiry.has_value() ||
@@ -351,11 +350,10 @@ void TransportSecurityPersister::OnWriteFinished(base::OnceClosure callback) {
bool TransportSecurityPersister::SerializeData(std::string* output) {
DCHECK(foreground_runner_->RunsTasksInCurrentSequence());
- base::Value toplevel(base::Value::Type::DICTIONARY);
- toplevel.SetIntKey(kVersionKey, kCurrentVersionValue);
- toplevel.SetKey(kSTSKey, SerializeSTSData(transport_security_state_));
- toplevel.SetKey(kExpectCTKey,
- SerializeExpectCTData(transport_security_state_));
+ base::Value::Dict toplevel;
+ toplevel.Set(kVersionKey, kCurrentVersionValue);
+ toplevel.Set(kSTSKey, SerializeSTSData(transport_security_state_));
+ toplevel.Set(kExpectCTKey, SerializeExpectCTData(transport_security_state_));
base::JSONWriter::Write(toplevel, output);
return true;
@@ -374,18 +372,19 @@ void TransportSecurityPersister::Deserialize(const std::string& serialized,
if (!value || !value->is_dict())
return;
- absl::optional<int> version = value->FindIntKey(kVersionKey);
+ base::Value::Dict& dict = value->GetDict();
+ absl::optional<int> version = dict.FindInt(kVersionKey);
// Stop if the data is out of date (or in the previous format that didn't have
// a version number).
if (!version || *version != kCurrentVersionValue)
return;
- base::Value* sts_value = value->FindKey(kSTSKey);
+ base::Value* sts_value = dict.Find(kSTSKey);
if (sts_value)
DeserializeSTSData(*sts_value, state);
- base::Value* expect_ct_value = value->FindKey(kExpectCTKey);
+ base::Value* expect_ct_value = dict.Find(kExpectCTKey);
if (expect_ct_value)
DeserializeExpectCTData(*expect_ct_value, state);
}
diff --git a/chromium/net/http/transport_security_persister_unittest.cc b/chromium/net/http/transport_security_persister_unittest.cc
index 0789ae4e8ab..a45a44f407e 100644
--- a/chromium/net/http/transport_security_persister_unittest.cc
+++ b/chromium/net/http/transport_security_persister_unittest.cc
@@ -41,6 +41,14 @@ class TransportSecurityPersisterTest : public ::testing::TestWithParam<bool>,
TransportSecurityPersisterTest()
: WithTaskEnvironment(
base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
+ // This feature is used in initializing |state_|.
+ if (partition_expect_ct_state()) {
+ feature_list_.InitAndEnableFeature(
+ features::kPartitionExpectCTStateByNetworkIsolationKey);
+ } else {
+ feature_list_.InitAndDisableFeature(
+ features::kPartitionExpectCTStateByNetworkIsolationKey);
+ }
// Mock out time so that entries with hard-coded json data can be
// successfully loaded. Use a large enough value that dynamically created
// entries have at least somewhat interesting expiration times.
@@ -61,14 +69,6 @@ class TransportSecurityPersisterTest : public ::testing::TestWithParam<bool>,
base::ThreadPool::CreateSequencedTaskRunner(
{base::MayBlock(), base::TaskPriority::BEST_EFFORT,
base::TaskShutdownBehavior::BLOCK_SHUTDOWN}));
- // This feature is used in initializing |state_|.
- if (partition_expect_ct_state()) {
- feature_list_.InitAndEnableFeature(
- features::kPartitionExpectCTStateByNetworkIsolationKey);
- } else {
- feature_list_.InitAndDisableFeature(
- features::kPartitionExpectCTStateByNetworkIsolationKey);
- }
state_ = std::make_unique<TransportSecurityState>();
persister_ = std::make_unique<TransportSecurityPersister>(
state_.get(), std::move(background_runner),
diff --git a/chromium/net/http/transport_security_state.cc b/chromium/net/http/transport_security_state.cc
index 25c3764df23..cbe5d84732f 100644
--- a/chromium/net/http/transport_security_state.cc
+++ b/chromium/net/http/transport_security_state.cc
@@ -79,16 +79,16 @@ base::Value GetPEMEncodedChainAsList(const net::X509Certificate* cert_chain) {
if (!cert_chain)
return base::Value(base::Value::Type::LIST);
- base::Value result(base::Value::Type::LIST);
+ base::Value::List result;
std::vector<std::string> pem_encoded_chain;
cert_chain->GetPEMEncodedChain(&pem_encoded_chain);
for (const std::string& cert : pem_encoded_chain)
result.Append(cert);
- return result;
+ return base::Value(std::move(result));
}
-bool HashReportForCache(const base::Value& report,
+bool HashReportForCache(const base::Value::Dict& report,
const GURL& report_uri,
std::string* cache_key) {
char hashed[crypto::kSHA256Length];
@@ -112,23 +112,23 @@ bool GetHPKPReport(const HostPortPair& host_port_pair,
if (pkp_state.report_uri.is_empty())
return false;
- base::Value report(base::Value::Type::DICTIONARY);
+ base::Value::Dict report;
base::Time now = base::Time::Now();
- report.SetStringKey("hostname", host_port_pair.host());
- report.SetIntKey("port", host_port_pair.port());
- report.SetBoolKey("include-subdomains", pkp_state.include_subdomains);
- report.SetStringKey("noted-hostname", pkp_state.domain);
+ report.Set("hostname", host_port_pair.host());
+ report.Set("port", host_port_pair.port());
+ report.Set("include-subdomains", pkp_state.include_subdomains);
+ report.Set("noted-hostname", pkp_state.domain);
auto served_certificate_chain_list =
GetPEMEncodedChainAsList(served_certificate_chain);
auto validated_certificate_chain_list =
GetPEMEncodedChainAsList(validated_certificate_chain);
- report.SetKey("served-certificate-chain",
- std::move(served_certificate_chain_list));
- report.SetKey("validated-certificate-chain",
- std::move(validated_certificate_chain_list));
+ report.Set("served-certificate-chain",
+ std::move(served_certificate_chain_list));
+ report.Set("validated-certificate-chain",
+ std::move(validated_certificate_chain_list));
- base::Value known_pin_list(base::Value::Type::LIST);
+ base::Value::List known_pin_list;
for (const auto& hash_value : pkp_state.spki_hashes) {
std::string known_pin;
@@ -152,7 +152,7 @@ bool GetHPKPReport(const HostPortPair& host_port_pair,
known_pin_list.Append(known_pin);
}
- report.SetKey("known-pins", std::move(known_pin_list));
+ report.Set("known-pins", std::move(known_pin_list));
// For the sent reports cache, do not include the effective expiration
// date. The expiration date will likely change every time the user
@@ -163,9 +163,9 @@ bool GetHPKPReport(const HostPortPair& host_port_pair,
return false;
}
- report.SetStringKey("date-time", base::TimeToISO8601(now));
- report.SetStringKey("effective-expiration-date",
- base::TimeToISO8601(pkp_state.expiry));
+ report.Set("date-time", base::TimeToISO8601(now));
+ report.Set("effective-expiration-date",
+ base::TimeToISO8601(pkp_state.expiry));
if (!base::JSONWriter::Write(report, serialized_report)) {
LOG(ERROR) << "Failed to serialize HPKP violation report.";
return false;
@@ -433,14 +433,13 @@ bool TransportSecurityState::ShouldSSLErrorsBeFatal(const std::string& host) {
base::Value TransportSecurityState::NetLogUpgradeToSSLParam(
const std::string& host) {
STSState sts_state;
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("host", host);
- dict.SetBoolKey("get_sts_state_result", GetSTSState(host, &sts_state));
- dict.SetBoolKey("should_upgrade_to_ssl", sts_state.ShouldUpgradeToSSL());
- dict.SetBoolKey(
- "host_found_in_hsts_bypass_list",
- hsts_host_bypass_list_.find(host) != hsts_host_bypass_list_.end());
- return dict;
+ base::Value::Dict dict;
+ dict.Set("host", host);
+ dict.Set("get_sts_state_result", GetSTSState(host, &sts_state));
+ dict.Set("should_upgrade_to_ssl", sts_state.ShouldUpgradeToSSL());
+ dict.Set("host_found_in_hsts_bypass_list",
+ hsts_host_bypass_list_.find(host) != hsts_host_bypass_list_.end());
+ return base::Value(std::move(dict));
}
bool TransportSecurityState::ShouldUpgradeToSSL(
diff --git a/chromium/net/http/transport_security_state.h b/chromium/net/http/transport_security_state.h
index f8b68821c48..99899b7c5c2 100644
--- a/chromium/net/http/transport_security_state.h
+++ b/chromium/net/http/transport_security_state.h
@@ -63,7 +63,7 @@ class NET_EXPORT TransportSecurityState {
base::OnceClosure callback) = 0;
protected:
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
};
class NET_EXPORT RequireCTDelegate {
@@ -310,7 +310,7 @@ class NET_EXPORT TransportSecurityState {
error_callback) = 0;
protected:
- virtual ~ReportSenderInterface() {}
+ virtual ~ReportSenderInterface() = default;
};
// An interface for building and asynchronously sending reports when a
@@ -332,7 +332,7 @@ class NET_EXPORT TransportSecurityState {
const NetworkIsolationKey& network_isolation_key) = 0;
protected:
- virtual ~ExpectCTReporter() {}
+ virtual ~ExpectCTReporter() = default;
};
class NET_EXPORT PinSet {
@@ -660,10 +660,7 @@ class NET_EXPORT TransportSecurityState {
typedef std::map<std::string, STSState> STSStateMap;
typedef std::map<std::string, PKPState> PKPStateMap;
typedef std::map<ExpectCTStateIndex, ExpectCTState> ExpectCTStateMap;
- typedef ExpiringCache<std::string,
- bool,
- base::TimeTicks,
- std::less<base::TimeTicks>>
+ typedef ExpiringCache<std::string, bool, base::TimeTicks, std::less<>>
ReportCache;
base::Value NetLogUpgradeToSSLParam(const std::string& host);
diff --git a/chromium/net/http/transport_security_state_static.json.gz b/chromium/net/http/transport_security_state_static.json.gz
index 67961946223..92182cb59b8 100644
--- a/chromium/net/http/transport_security_state_static.json.gz
+++ b/chromium/net/http/transport_security_state_static.json.gz
Binary files differ
diff --git a/chromium/net/http/transport_security_state_static.pins b/chromium/net/http/transport_security_state_static.pins
index 42af336fbf1..5dda8457382 100644
--- a/chromium/net/http/transport_security_state_static.pins
+++ b/chromium/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
# hash function for preloaded entries again (we have already done so once).
#
-# Last updated: 2022-08-31 12:54 UTC
+# Last updated: 2022-09-19 12:54 UTC
PinsListTimestamp
-1661950496
+1663592078
TestSPKI
sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/chromium/net/http/transport_security_state_unittest.cc b/chromium/net/http/transport_security_state_unittest.cc
index 72ea47ef65b..e6a28e588b3 100644
--- a/chromium/net/http/transport_security_state_unittest.cc
+++ b/chromium/net/http/transport_security_state_unittest.cc
@@ -107,8 +107,7 @@ void MakeTestSCTAndStatus(ct::SignedCertificateTimestamp::Origin origin,
const base::Time& timestamp,
ct::SCTVerifyStatus status,
SignedCertificateTimestampAndStatusList* sct_list) {
- scoped_refptr<net::ct::SignedCertificateTimestamp> sct(
- new net::ct::SignedCertificateTimestamp());
+ auto sct = base::MakeRefCounted<net::ct::SignedCertificateTimestamp>();
sct->version = net::ct::SignedCertificateTimestamp::V1;
sct->log_id = log_id;
sct->extensions = extensions;
@@ -255,11 +254,10 @@ void CompareCertificateChainWithList(
ASSERT_TRUE(cert_list->is_list());
std::vector<std::string> pem_encoded_chain;
cert_chain->GetPEMEncodedChain(&pem_encoded_chain);
- ASSERT_EQ(pem_encoded_chain.size(), cert_list->GetListDeprecated().size());
+ ASSERT_EQ(pem_encoded_chain.size(), cert_list->GetList().size());
for (size_t i = 0; i < pem_encoded_chain.size(); i++) {
- const std::string& list_cert =
- cert_list->GetListDeprecated()[i].GetString();
+ const std::string& list_cert = cert_list->GetList()[i].GetString();
EXPECT_EQ(pem_encoded_chain[i], list_cert);
}
}
@@ -274,46 +272,46 @@ void CheckHPKPReport(
const HashValueVector& known_pins) {
absl::optional<base::Value> value = base::JSONReader::Read(report);
ASSERT_TRUE(value.has_value());
- const base::Value& report_dict = value.value();
- ASSERT_TRUE(report_dict.is_dict());
+ const base::Value::Dict* report_dict = value.value().GetIfDict();
+ ASSERT_TRUE(report_dict);
- const std::string* report_hostname = report_dict.FindStringKey("hostname");
+ const std::string* report_hostname = report_dict->FindString("hostname");
ASSERT_TRUE(report_hostname);
EXPECT_EQ(host_port_pair.host(), *report_hostname);
- absl::optional<int> report_port = report_dict.FindIntKey("port");
+ absl::optional<int> report_port = report_dict->FindInt("port");
ASSERT_TRUE(report_port.has_value());
EXPECT_EQ(host_port_pair.port(), report_port.value());
absl::optional<bool> report_include_subdomains =
- report_dict.FindBoolKey("include-subdomains");
+ report_dict->FindBool("include-subdomains");
ASSERT_TRUE(report_include_subdomains.has_value());
EXPECT_EQ(include_subdomains, report_include_subdomains.value());
const std::string* report_noted_hostname =
- report_dict.FindStringKey("noted-hostname");
+ report_dict->FindString("noted-hostname");
ASSERT_TRUE(report_noted_hostname);
EXPECT_EQ(noted_hostname, *report_noted_hostname);
// TODO(estark): check times in RFC3339 format.
const std::string* report_expiration =
- report_dict.FindStringKey("effective-expiration-date");
+ report_dict->FindString("effective-expiration-date");
ASSERT_TRUE(report_expiration);
EXPECT_FALSE(report_expiration->empty());
- const std::string* report_date = report_dict.FindStringKey("date-time");
+ const std::string* report_date = report_dict->FindString("date-time");
ASSERT_TRUE(report_date);
EXPECT_FALSE(report_date->empty());
const base::Value* report_served_certificate_chain =
- report_dict.FindKey("served-certificate-chain");
+ report_dict->Find("served-certificate-chain");
ASSERT_TRUE(report_served_certificate_chain);
ASSERT_NO_FATAL_FAILURE(CompareCertificateChainWithList(
served_certificate_chain, report_served_certificate_chain));
const base::Value* report_validated_certificate_chain =
- report_dict.FindKey("validated-certificate-chain");
+ report_dict->Find("validated-certificate-chain");
ASSERT_TRUE(report_validated_certificate_chain);
ASSERT_NO_FATAL_FAILURE(CompareCertificateChainWithList(
validated_certificate_chain, report_validated_certificate_chain));
@@ -1776,17 +1774,23 @@ class CTEmergencyDisableTest
: public TransportSecurityStateTest,
public testing::WithParamInterface<CTEmergencyDisableSwitchKind> {
public:
- void SetUp() override {
+ CTEmergencyDisableTest() {
if (GetParam() ==
CTEmergencyDisableSwitchKind::kComponentUpdaterDrivenSwitch) {
- state_.SetCTEmergencyDisabled(true);
scoped_feature_list_.Init();
} else {
- ASSERT_EQ(GetParam(), CTEmergencyDisableSwitchKind::kFinchDrivenFeature);
scoped_feature_list_.InitAndDisableFeature(
TransportSecurityState::kCertificateTransparencyEnforcement);
}
}
+ void SetUp() override {
+ if (GetParam() ==
+ CTEmergencyDisableSwitchKind::kComponentUpdaterDrivenSwitch) {
+ state_.SetCTEmergencyDisabled(true);
+ } else {
+ ASSERT_EQ(GetParam(), CTEmergencyDisableSwitchKind::kFinchDrivenFeature);
+ }
+ }
protected:
base::test::ScopedFeatureList scoped_feature_list_;
@@ -4175,10 +4179,9 @@ TEST_F(TransportSecurityStateTest, UpdateKeyPinsListTimestamp) {
class TransportSecurityStatePinningKillswitchTest
: public TransportSecurityStateTest {
public:
- void SetUp() override {
+ TransportSecurityStatePinningKillswitchTest() {
scoped_feature_list_.InitAndDisableFeature(
features::kStaticKeyPinningEnforcement);
- TransportSecurityStateTest::SetUp();
}
protected:
diff --git a/chromium/net/http/url_security_manager.h b/chromium/net/http/url_security_manager.h
index 85dfba3559d..764aceb7c47 100644
--- a/chromium/net/http/url_security_manager.h
+++ b/chromium/net/http/url_security_manager.h
@@ -21,12 +21,12 @@ class HttpAuthFilter;
// regarding URL actions (e.g., sending the default credentials to a server).
class NET_EXPORT_PRIVATE URLSecurityManager {
public:
- URLSecurityManager() {}
+ URLSecurityManager() = default;
URLSecurityManager(const URLSecurityManager&) = delete;
URLSecurityManager& operator=(const URLSecurityManager&) = delete;
- virtual ~URLSecurityManager() {}
+ virtual ~URLSecurityManager() = default;
// Creates a platform-dependent instance of URLSecurityManager.
//
diff --git a/chromium/net/http/url_security_manager_unittest.cc b/chromium/net/http/url_security_manager_unittest.cc
index 672425027c3..0d59ffbd548 100644
--- a/chromium/net/http/url_security_manager_unittest.cc
+++ b/chromium/net/http/url_security_manager_unittest.cc
@@ -46,8 +46,8 @@ const TestData kTestDataList[] = {
} // namespace
TEST(URLSecurityManager, UseDefaultCredentials) {
- std::unique_ptr<HttpAuthFilter> auth_filter(
- new HttpAuthFilterAllowlist(kTestAuthAllowlist));
+ auto auth_filter =
+ std::make_unique<HttpAuthFilterAllowlist>(kTestAuthAllowlist);
ASSERT_TRUE(auth_filter);
// The URL security manager takes ownership of |auth_filter|.
std::unique_ptr<URLSecurityManager> url_security_manager(
@@ -68,8 +68,8 @@ TEST(URLSecurityManager, UseDefaultCredentials) {
}
TEST(URLSecurityManager, CanDelegate) {
- std::unique_ptr<HttpAuthFilter> auth_filter(
- new HttpAuthFilterAllowlist(kTestAuthAllowlist));
+ auto auth_filter =
+ std::make_unique<HttpAuthFilterAllowlist>(kTestAuthAllowlist);
ASSERT_TRUE(auth_filter);
// The URL security manager takes ownership of |auth_filter|.
std::unique_ptr<URLSecurityManager> url_security_manager(
@@ -93,9 +93,8 @@ TEST(URLSecurityManager, CanDelegate_NoAllowlist) {
URLSecurityManager::Create());
ASSERT_TRUE(url_security_manager.get());
- for (size_t i = 0; i < std::size(kTestDataList); ++i) {
- url::SchemeHostPort scheme_host_port(
- GURL(kTestDataList[i].scheme_host_port));
+ for (const auto& test : kTestDataList) {
+ url::SchemeHostPort scheme_host_port(GURL(test.scheme_host_port));
bool can_delegate = url_security_manager->CanDelegate(scheme_host_port);
EXPECT_FALSE(can_delegate);
}
diff --git a/chromium/net/http/url_security_manager_win.cc b/chromium/net/http/url_security_manager_win.cc
index d79327cb841..aa07b494910 100644
--- a/chromium/net/http/url_security_manager_win.cc
+++ b/chromium/net/http/url_security_manager_win.cc
@@ -46,8 +46,8 @@ class URLSecurityManagerWin : public URLSecurityManagerAllowlist {
Microsoft::WRL::ComPtr<IInternetSecurityManager> security_manager_;
};
-URLSecurityManagerWin::URLSecurityManagerWin() {}
-URLSecurityManagerWin::~URLSecurityManagerWin() {}
+URLSecurityManagerWin::URLSecurityManagerWin() = default;
+URLSecurityManagerWin::~URLSecurityManagerWin() = default;
bool URLSecurityManagerWin::CanUseDefaultCredentials(
const url::SchemeHostPort& auth_scheme_host_port) const {
diff --git a/chromium/net/http/webfonts_histogram.cc b/chromium/net/http/webfonts_histogram.cc
index 2f27c82344c..f353536be5e 100644
--- a/chromium/net/http/webfonts_histogram.cc
+++ b/chromium/net/http/webfonts_histogram.cc
@@ -37,8 +37,7 @@ void RecordCacheEvent(net::HttpResponseInfo::CacheEntryStatus cache_status,
} // namespace
-namespace net {
-namespace web_fonts_histogram {
+namespace net::web_fonts_histogram {
// Check if |key| is a URL for a font resource of Google Fonts.
// If so, record the WebFont.HttpCacheStatus histogram suffixed by "roboto",
@@ -61,5 +60,4 @@ void MaybeRecordCacheStatus(HttpResponseInfo::CacheEntryStatus cache_status,
}
}
-} // namespace web_fonts_histogram
-} // namespace net
+} // namespace net::web_fonts_histogram
diff --git a/chromium/net/http/webfonts_histogram.h b/chromium/net/http/webfonts_histogram.h
index 9da1fd3bac6..6583650fe60 100644
--- a/chromium/net/http/webfonts_histogram.h
+++ b/chromium/net/http/webfonts_histogram.h
@@ -9,17 +9,13 @@
#include "net/http/http_response_info.h"
-namespace net {
-
// A collection of functions for histogram reporting about web fonts.
-namespace web_fonts_histogram {
+namespace net::web_fonts_histogram {
NET_EXPORT void MaybeRecordCacheStatus(
HttpResponseInfo::CacheEntryStatus cache_status,
const std::string& key);
-} // namespace web_fonts_histogram
-
-} // namespace net
+} // namespace net::web_fonts_histogram
#endif // NET_HTTP_WEBFONTS_HISTOGRAM_H_
diff --git a/chromium/net/http/webfonts_histogram_unittest.cc b/chromium/net/http/webfonts_histogram_unittest.cc
index d14481c30ad..7c112510bee 100644
--- a/chromium/net/http/webfonts_histogram_unittest.cc
+++ b/chromium/net/http/webfonts_histogram_unittest.cc
@@ -8,8 +8,7 @@
#include "base/test/metrics/histogram_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace web_fonts_histogram {
+namespace net::web_fonts_histogram {
namespace {
@@ -134,5 +133,4 @@ TEST(WebfontsHistogramTest, TwoRobotoSameBucket_TwoOpenSansDifferentBucket) {
histograms.ExpectTotalCount(kOthersHistogramName, 0);
}
-} // namespace web_fonts_histogram
-} // namespace net
+} // namespace net::web_fonts_histogram
diff --git a/chromium/net/log/file_net_log_observer.cc b/chromium/net/log/file_net_log_observer.cc
index f92b834e475..b1a1a91b4e1 100644
--- a/chromium/net/log/file_net_log_observer.cc
+++ b/chromium/net/log/file_net_log_observer.cc
@@ -409,7 +409,7 @@ void FileNetLogObserver::StopObserving(std::unique_ptr<base::Value> polled_data,
}
void FileNetLogObserver::OnAddEntry(const NetLogEntry& entry) {
- std::unique_ptr<std::string> json(new std::string);
+ auto json = std::make_unique<std::string>();
*json = SerializeNetLogValueToJson(entry.ToValue());
@@ -467,17 +467,17 @@ std::unique_ptr<FileNetLogObserver> FileNetLogObserver::CreateInternal(
// TODO(dconnol): Handle the case when the WriteQueue still doesn't
// contain enough events to fill all files, because of very large events
// relative to file size.
- std::unique_ptr<FileWriter> file_writer(new FileWriter(
+ auto file_writer = std::make_unique<FileWriter>(
log_path, inprogress_dir_path, std::move(pre_existing_log_file),
- max_event_file_size, total_num_event_files, file_task_runner));
+ max_event_file_size, total_num_event_files, file_task_runner);
uint64_t write_queue_memory_max =
base::MakeClampedNum<uint64_t>(max_total_size) * 2;
return base::WrapUnique(new FileNetLogObserver(
file_task_runner, std::move(file_writer),
- base::WrapRefCounted(new WriteQueue(write_queue_memory_max)),
- capture_mode, std::move(constants)));
+ base::MakeRefCounted<WriteQueue>(write_queue_memory_max), capture_mode,
+ std::move(constants)));
}
FileNetLogObserver::FileNetLogObserver(
@@ -752,7 +752,7 @@ void FileNetLogObserver::FileWriter::StitchFinalLogFile() {
// Allocate a 64K buffer used for reading the files. At most kReadBufferSize
// bytes will be in memory at a time.
const size_t kReadBufferSize = 1 << 16; // 64KiB
- std::unique_ptr<char[]> read_buffer(new char[kReadBufferSize]);
+ auto read_buffer = std::make_unique<char[]>(kReadBufferSize);
if (final_log_file_.IsValid()) {
// Truncate the final log file.
diff --git a/chromium/net/log/file_net_log_observer_unittest.cc b/chromium/net/log/file_net_log_observer_unittest.cc
index 58ab5279354..acc6c5a0090 100644
--- a/chromium/net/log/file_net_log_observer_unittest.cc
+++ b/chromium/net/log/file_net_log_observer_unittest.cc
@@ -122,12 +122,11 @@ struct ParsedNetLog {
return ::testing::AssertionFailure() << "input is empty";
}
- base::JSONReader::ValueWithError parsed_json =
- base::JSONReader::ReadAndReturnValueWithError(input);
- if (!parsed_json.value) {
- return ::testing::AssertionFailure() << parsed_json.error_message;
+ auto parsed_json = base::JSONReader::ReadAndReturnValueWithError(input);
+ if (!parsed_json.has_value()) {
+ return ::testing::AssertionFailure() << parsed_json.error().message;
}
- root = std::move(*parsed_json.value);
+ root = std::move(*parsed_json);
const base::Value::Dict* dict = root.GetIfDict();
if (!dict) {
diff --git a/chromium/net/log/net_log_event_type_list.h b/chromium/net/log/net_log_event_type_list.h
index dc199c74eef..352db1172b7 100644
--- a/chromium/net/log/net_log_event_type_list.h
+++ b/chromium/net/log/net_log_event_type_list.h
@@ -1118,8 +1118,11 @@ EVENT_TYPE(HTTP_STREAM_REQUEST)
// "original_url": <The URL to create a stream for>,
// "url": <The URL actually being used, possibly different from
// original_url if using an alternate service>,
-// "alternate_service": <The alternate service being used>,
+// "expect_spdy": <Boolean indicating whether the Job will use SPDY>,
+// "using_quic": <Boolean indicating whether the Job will use QUIC>,
// "priority": <The priority of the Job>,
+// "type": <The type of this Job ("main", "alternative", "dns_alpn_h3",
+// "preconnect")>,
// }
EVENT_TYPE(HTTP_STREAM_JOB)
@@ -2869,7 +2872,7 @@ EVENT_TYPE(DNS_CONFIG_CHANGED)
// This event is emitted whenever NetworkChangeNotifier determines that a
// network has connected and network-specific information is available
-// (i.e. the NetworkChangeNotifier::NetworkHandle of the network is known).
+// (i.e. the handles::NetworkHandle of the network is known).
// {
// "changed_network_handle": <Network handle>
// "changed_network_type": <Type of network>
@@ -2882,7 +2885,7 @@ EVENT_TYPE(SPECIFIC_NETWORK_CONNECTED)
// This event is emitted whenever NetworkChangeNotifier determines that a
// network has disconnected and network-specific information is available
-// (i.e. the NetworkChangeNotifier::NetworkHandle of the network is known).
+// (i.e. the handles::NetworkHandle of the network is known).
// {
// "changed_network_handle": <Network handle>
// "changed_network_type": <Type of network>
@@ -2895,7 +2898,7 @@ EVENT_TYPE(SPECIFIC_NETWORK_DISCONNECTED)
// This event is emitted whenever NetworkChangeNotifier determines that a
// network is soon to disconnect and network-specific information is available
-// (i.e. the NetworkChangeNotifier::NetworkHandle of the network is known).
+// (i.e. the handles::NetworkHandle of the network is known).
// {
// "changed_network_handle": <Network handle>
// "changed_network_type": <Type of network>
@@ -2908,7 +2911,7 @@ EVENT_TYPE(SPECIFIC_NETWORK_SOON_TO_DISCONNECT)
// This event is emitted whenever NetworkChangeNotifier determines that a
// network has become the default and network-specific information is available
-// (i.e. the NetworkChangeNotifier::NetworkHandle of the network is known).
+// (i.e. the handles::NetworkHandle of the network is known).
// {
// "changed_network_handle": <Network handle>
// "changed_network_type": <Type of network>
@@ -3520,6 +3523,28 @@ EVENT_TYPE(UPLOAD_DATA_STREAM_READ)
EVENT_TYPE(RESOURCE_SCHEDULER_REQUEST_STARTED)
// -----------------------------------------------------------------------------
+// Auxiliary network service in-memory HTTP cache related events
+// -----------------------------------------------------------------------------
+
+// These event are emitted when HTTP response headers are served from the
+// in-memory cache.
+// The following parameters are attached:
+// {
+// "headers": <The list of header:value pairs>,
+// }
+EVENT_TYPE(IN_MEMORY_CACHE_READ_REQUEST_HEADERS)
+EVENT_TYPE(IN_MEMORY_CACHE_READ_RESPONSE_HEADERS)
+
+// This event is emitted when response content are read from the in-memory
+// cache.
+// The following parameters are attached:
+// {
+// "byte_count": <Number of bytes that were just sent>,
+// "bytes": <The exact bytes sent, Base64 encoded>,
+// }
+EVENT_TYPE(IN_MEMORY_CACHE_BYTES_READ)
+
+// -----------------------------------------------------------------------------
// Network Quality Estimator related events
// -----------------------------------------------------------------------------
diff --git a/chromium/net/log/net_log_source.cc b/chromium/net/log/net_log_source.cc
index 381e6572599..d19b586bd24 100644
--- a/chromium/net/log/net_log_source.cc
+++ b/chromium/net/log/net_log_source.cc
@@ -56,11 +56,6 @@ void NetLogSource::AddToEventParameters(base::Value::Dict& event_params) const {
event_params.Set("source_dependency", std::move(dict));
}
-void NetLogSource::AddToEventParameters(base::Value* event_params) const {
- DCHECK(event_params->is_dict());
- AddToEventParameters(event_params->GetDict());
-}
-
base::Value NetLogSource::ToEventParameters() const {
return SourceEventParametersCallback(*this);
}
diff --git a/chromium/net/log/net_log_source.h b/chromium/net/log/net_log_source.h
index 91797098fad..9ce41b3ec4a 100644
--- a/chromium/net/log/net_log_source.h
+++ b/chromium/net/log/net_log_source.h
@@ -31,8 +31,6 @@ struct NET_EXPORT NetLogSource {
// Adds the source to a dictionary containing event parameters,
// using the name "source_dependency".
void AddToEventParameters(base::Value::Dict& event_params) const;
- // Legacy version of above method. Should be removed once no longer used.
- void AddToEventParameters(base::Value* event_params) const;
// Returns a dictionary with a single entry named "source_dependency" that
// describes |this|.
diff --git a/chromium/net/log/net_log_unittest.cc b/chromium/net/log/net_log_unittest.cc
index 5083cf69e41..da4c60ba04a 100644
--- a/chromium/net/log/net_log_unittest.cc
+++ b/chromium/net/log/net_log_unittest.cc
@@ -334,8 +334,8 @@ void RunTestThreads(NetLog* net_log) {
TEST(NetLogTest, NetLogEventThreads) {
// Attach some observers. They'll safely detach themselves on destruction.
CountingObserver observers[3];
- for (size_t i = 0; i < std::size(observers); ++i) {
- NetLog::Get()->AddObserver(&observers[i], NetLogCaptureMode::kEverything);
+ for (auto& observer : observers) {
+ NetLog::Get()->AddObserver(&observer, NetLogCaptureMode::kEverything);
}
// Run a bunch of threads to completion, each of which will emit events to
@@ -344,8 +344,8 @@ TEST(NetLogTest, NetLogEventThreads) {
// Check that each observer saw the emitted events.
const int kTotalEvents = kThreads * kEvents;
- for (size_t i = 0; i < std::size(observers); ++i)
- EXPECT_EQ(kTotalEvents, observers[i].count());
+ for (const auto& observer : observers)
+ EXPECT_EQ(kTotalEvents, observer.count());
}
// Test adding and removing a single observer.
@@ -354,7 +354,7 @@ TEST(NetLogTest, NetLogAddRemoveObserver) {
AddEvent(NetLog::Get());
EXPECT_EQ(0, observer.count());
- EXPECT_EQ(NULL, observer.net_log());
+ EXPECT_EQ(nullptr, observer.net_log());
EXPECT_FALSE(NetLog::Get()->IsCapturing());
// Add the observer and add an event.
@@ -372,7 +372,7 @@ TEST(NetLogTest, NetLogAddRemoveObserver) {
// Remove observer and add an event.
NetLog::Get()->RemoveObserver(&observer);
- EXPECT_EQ(NULL, observer.net_log());
+ EXPECT_EQ(nullptr, observer.net_log());
EXPECT_FALSE(NetLog::Get()->IsCapturing());
AddEvent(NetLog::Get());
@@ -397,7 +397,7 @@ TEST(NetLogTest, NetLogTwoObservers) {
NetLog::Get()->AddObserver(&observer[0],
NetLogCaptureMode::kIncludeSensitive);
EXPECT_EQ(NetLog::Get(), observer[0].net_log());
- EXPECT_EQ(NULL, observer[1].net_log());
+ EXPECT_EQ(nullptr, observer[1].net_log());
EXPECT_EQ(NetLogCaptureMode::kIncludeSensitive, observer[0].capture_mode());
EXPECT_TRUE(NetLog::Get()->IsCapturing());
@@ -425,7 +425,7 @@ TEST(NetLogTest, NetLogTwoObservers) {
// Remove second observer.
NetLog::Get()->RemoveObserver(&observer[1]);
EXPECT_EQ(NetLog::Get(), observer[0].net_log());
- EXPECT_EQ(NULL, observer[1].net_log());
+ EXPECT_EQ(nullptr, observer[1].net_log());
EXPECT_EQ(NetLogCaptureMode::kIncludeSensitive, observer[0].capture_mode());
EXPECT_TRUE(NetLog::Get()->IsCapturing());
@@ -436,8 +436,8 @@ TEST(NetLogTest, NetLogTwoObservers) {
// Remove first observer.
NetLog::Get()->RemoveObserver(&observer[0]);
- EXPECT_EQ(NULL, observer[0].net_log());
- EXPECT_EQ(NULL, observer[1].net_log());
+ EXPECT_EQ(nullptr, observer[0].net_log());
+ EXPECT_EQ(nullptr, observer[1].net_log());
EXPECT_FALSE(NetLog::Get()->IsCapturing());
// Add event and make sure neither observer gets it.
diff --git a/chromium/net/log/net_log_util.cc b/chromium/net/log/net_log_util.cc
index a24a3ba4fdb..216771e804b 100644
--- a/chromium/net/log/net_log_util.cc
+++ b/chromium/net/log/net_log_util.cc
@@ -23,8 +23,8 @@
#include "net/base/net_errors.h"
#include "net/base/net_info_source_list.h"
#include "net/cert/cert_verifier.h"
-#include "net/cert/internal/simple_path_builder_delegate.h"
-#include "net/cert/internal/trust_store.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
+#include "net/cert/pki/trust_store.h"
#include "net/disk_cache/disk_cache.h"
#include "net/dns/host_cache.h"
#include "net/dns/host_resolver.h"
diff --git a/chromium/net/log/net_log_with_source.cc b/chromium/net/log/net_log_with_source.cc
index fc38c276ed7..edf4865aa6f 100644
--- a/chromium/net/log/net_log_with_source.cc
+++ b/chromium/net/log/net_log_with_source.cc
@@ -48,7 +48,7 @@ NetLogWithSource::NetLogWithSource() {
non_null_net_log_ = dummy.get();
}
-NetLogWithSource::~NetLogWithSource() {}
+NetLogWithSource::~NetLogWithSource() = default;
void NetLogWithSource::AddEntry(NetLogEventType type,
NetLogEventPhase phase) const {
diff --git a/chromium/net/log/trace_net_log_observer.cc b/chromium/net/log/trace_net_log_observer.cc
index 77c3d25f539..1ffddd05542 100644
--- a/chromium/net/log/trace_net_log_observer.cc
+++ b/chromium/net/log/trace_net_log_observer.cc
@@ -27,10 +27,9 @@ constexpr const char kNetLogTracingCategory[] = "netlog";
class TracedValue : public base::trace_event::ConvertableToTraceFormat {
public:
explicit TracedValue(base::Value value) : value_(std::move(value)) {}
-
- private:
~TracedValue() override = default;
+ private:
void AppendAsTraceFormat(std::string* out) const override {
if (!value_.is_none()) {
std::string tmp;
@@ -62,24 +61,21 @@ void TraceNetLogObserver::OnAddEntry(const NetLogEntry& entry) {
kNetLogTracingCategory, NetLogEventTypeToString(entry.type),
entry.source.id, "source_type",
NetLog::SourceTypeToString(entry.source.type), "params",
- std::unique_ptr<base::trace_event::ConvertableToTraceFormat>(
- new TracedValue(std::move(params))));
+ std::make_unique<TracedValue>(std::move(params)));
break;
case NetLogEventPhase::END:
TRACE_EVENT_NESTABLE_ASYNC_END2(
kNetLogTracingCategory, NetLogEventTypeToString(entry.type),
entry.source.id, "source_type",
NetLog::SourceTypeToString(entry.source.type), "params",
- std::unique_ptr<base::trace_event::ConvertableToTraceFormat>(
- new TracedValue(std::move(params))));
+ std::make_unique<TracedValue>(std::move(params)));
break;
case NetLogEventPhase::NONE:
TRACE_EVENT_NESTABLE_ASYNC_INSTANT2(
kNetLogTracingCategory, NetLogEventTypeToString(entry.type),
entry.source.id, "source_type",
NetLog::SourceTypeToString(entry.source.type), "params",
- std::unique_ptr<base::trace_event::ConvertableToTraceFormat>(
- new TracedValue(std::move(params))));
+ std::make_unique<TracedValue>(std::move(params)));
break;
}
}
diff --git a/chromium/net/log/trace_net_log_observer_unittest.cc b/chromium/net/log/trace_net_log_observer_unittest.cc
index 5a26920bce5..2f73e4dd916 100644
--- a/chromium/net/log/trace_net_log_observer_unittest.cc
+++ b/chromium/net/log/trace_net_log_observer_unittest.cc
@@ -149,8 +149,9 @@ class TraceNetLogObserverTest : public TestWithTaskEnvironment {
run_loop.Run();
}
- void set_trace_net_log_observer(TraceNetLogObserver* trace_net_log_observer) {
- trace_net_log_observer_.reset(trace_net_log_observer);
+ void set_trace_net_log_observer(
+ std::unique_ptr<TraceNetLogObserver> trace_net_log_observer) {
+ trace_net_log_observer_ = std::move(trace_net_log_observer);
}
static base::Value::List FilterNetLogTraceEvents(
@@ -367,7 +368,7 @@ TEST_F(TraceNetLogObserverTest, DestroyObserverWhileNotTracing) {
TEST_F(TraceNetLogObserverTest, CreateObserverAfterTracingStarts) {
set_trace_net_log_observer(nullptr);
EnableTraceLogWithNetLog();
- set_trace_net_log_observer(new TraceNetLogObserver());
+ set_trace_net_log_observer(std::make_unique<TraceNetLogObserver>());
trace_net_log_observer()->WatchForTraceStart(NetLog::Get());
NetLog::Get()->AddGlobalEntry(NetLogEventType::CANCELLED);
trace_net_log_observer()->StopWatchForTraceStart();
@@ -387,7 +388,7 @@ TEST_F(TraceNetLogObserverTest,
EnableTraceLogWithoutNetLog();
- set_trace_net_log_observer(new TraceNetLogObserver());
+ set_trace_net_log_observer(std::make_unique<TraceNetLogObserver>());
trace_net_log_observer()->WatchForTraceStart(NetLog::Get());
NetLog::Get()->AddGlobalEntry(NetLogEventType::CANCELLED);
trace_net_log_observer()->StopWatchForTraceStart();
diff --git a/chromium/net/network_error_logging/mock_persistent_nel_store.h b/chromium/net/network_error_logging/mock_persistent_nel_store.h
index 7dc98358186..b896d901cba 100644
--- a/chromium/net/network_error_logging/mock_persistent_nel_store.h
+++ b/chromium/net/network_error_logging/mock_persistent_nel_store.h
@@ -36,7 +36,7 @@ class MockPersistentNelStore
// commands.
Command(Type type, const NetworkErrorLoggingService::NelPolicy& policy);
// Constructor for FLUSH commands.
- Command(Type type);
+ explicit Command(Type type);
Command(const Command& other);
Command(Command&& other);
diff --git a/chromium/net/network_error_logging/network_error_logging_service.cc b/chromium/net/network_error_logging/network_error_logging_service.cc
index bedaca3e016..47dafaa3621 100644
--- a/chromium/net/network_error_logging/network_error_logging_service.cc
+++ b/chromium/net/network_error_logging/network_error_logging_service.cc
@@ -128,12 +128,12 @@ const struct {
void GetPhaseAndTypeFromNetError(Error error,
std::string* phase_out,
std::string* type_out) {
- for (size_t i = 0; i < std::size(kErrorTypes); ++i) {
- DCHECK(kErrorTypes[i].phase != nullptr);
- DCHECK(kErrorTypes[i].type != nullptr);
- if (kErrorTypes[i].error == error) {
- *phase_out = kErrorTypes[i].phase;
- *type_out = kErrorTypes[i].type;
+ for (const auto& error_type : kErrorTypes) {
+ DCHECK(error_type.phase != nullptr);
+ DCHECK(error_type.type != nullptr);
+ if (error_type.error == error) {
+ *phase_out = error_type.phase;
+ *type_out = error_type.type;
return;
}
}
diff --git a/chromium/net/network_error_logging/network_error_logging_service_unittest.cc b/chromium/net/network_error_logging/network_error_logging_service_unittest.cc
index 675f851334f..00eeb788d89 100644
--- a/chromium/net/network_error_logging/network_error_logging_service_unittest.cc
+++ b/chromium/net/network_error_logging/network_error_logging_service_unittest.cc
@@ -429,27 +429,28 @@ TEST_P(NetworkErrorLoggingServiceTest, SuccessReportQueued) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
// TODO(juliatuttle): Extract these constants.
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("", *body,
+ base::ExpectDictStringValue("", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("GET", *body,
+ base::ExpectDictStringValue("GET", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictIntegerValue(0, *body,
+ base::ExpectDictIntegerValue(0, body_dict,
NetworkErrorLoggingService::kStatusCodeKey);
- base::ExpectDictIntegerValue(1000, *body,
+ base::ExpectDictIntegerValue(1000, body_dict,
NetworkErrorLoggingService::kElapsedTimeKey);
- base::ExpectDictStringValue("application", *body,
+ base::ExpectDictStringValue("application", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("ok", *body,
+ base::ExpectDictStringValue("ok", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -473,27 +474,28 @@ TEST_P(NetworkErrorLoggingServiceTest, FailureReportQueued) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
// TODO(juliatuttle): Extract these constants.
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("", *body,
+ base::ExpectDictStringValue("", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("GET", *body,
+ base::ExpectDictStringValue("GET", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictIntegerValue(0, *body,
+ base::ExpectDictIntegerValue(0, body_dict,
NetworkErrorLoggingService::kStatusCodeKey);
- base::ExpectDictIntegerValue(1000, *body,
+ base::ExpectDictIntegerValue(1000, body_dict,
NetworkErrorLoggingService::kElapsedTimeKey);
- base::ExpectDictStringValue("connection", *body,
+ base::ExpectDictStringValue("connection", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("tcp.refused", *body,
+ base::ExpectDictStringValue("tcp.refused", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -511,10 +513,12 @@ TEST_P(NetworkErrorLoggingServiceTest, UnknownFailureReportQueued) {
ASSERT_EQ(1u, reports().size());
const base::Value* body = reports()[0].body.get();
+ ASSERT_TRUE(body);
ASSERT_TRUE(body->is_dict());
- base::ExpectDictStringValue("application", *body,
+ const base::Value::Dict& body_dict = body->GetDict();
+ base::ExpectDictStringValue("application", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("unknown", *body,
+ base::ExpectDictStringValue("unknown", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -534,10 +538,12 @@ TEST_P(NetworkErrorLoggingServiceTest, UnknownCertFailureReportQueued) {
ASSERT_EQ(1u, reports().size());
const base::Value* body = reports()[0].body.get();
+ ASSERT_TRUE(body);
ASSERT_TRUE(body->is_dict());
- base::ExpectDictStringValue("connection", *body,
+ const base::Value::Dict& body_dict = body->GetDict();
+ base::ExpectDictStringValue("connection", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("unknown", *body,
+ base::ExpectDictStringValue("unknown", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -560,27 +566,28 @@ TEST_P(NetworkErrorLoggingServiceTest, HttpErrorReportQueued) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
// TODO(juliatuttle): Extract these constants.
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("", *body,
+ base::ExpectDictStringValue("", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("GET", *body,
+ base::ExpectDictStringValue("GET", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictIntegerValue(504, *body,
+ base::ExpectDictIntegerValue(504, body_dict,
NetworkErrorLoggingService::kStatusCodeKey);
- base::ExpectDictIntegerValue(1000, *body,
+ base::ExpectDictIntegerValue(1000, body_dict,
NetworkErrorLoggingService::kElapsedTimeKey);
- base::ExpectDictStringValue("application", *body,
+ base::ExpectDictStringValue("application", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("http.error", *body,
+ base::ExpectDictStringValue("http.error", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -601,26 +608,27 @@ TEST_P(NetworkErrorLoggingServiceTest, SuccessReportDowngraded) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kOtherServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kOtherServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("", *body,
+ base::ExpectDictStringValue("", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("GET", *body,
+ base::ExpectDictStringValue("GET", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictIntegerValue(0, *body,
+ base::ExpectDictIntegerValue(0, body_dict,
NetworkErrorLoggingService::kStatusCodeKey);
- base::ExpectDictIntegerValue(0, *body,
+ base::ExpectDictIntegerValue(0, body_dict,
NetworkErrorLoggingService::kElapsedTimeKey);
- base::ExpectDictStringValue("dns", *body,
+ base::ExpectDictStringValue("dns", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("dns.address_changed", *body,
+ base::ExpectDictStringValue("dns.address_changed", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -641,26 +649,27 @@ TEST_P(NetworkErrorLoggingServiceTest, FailureReportDowngraded) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kOtherServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kOtherServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("", *body,
+ base::ExpectDictStringValue("", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("GET", *body,
+ base::ExpectDictStringValue("GET", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictIntegerValue(0, *body,
+ base::ExpectDictIntegerValue(0, body_dict,
NetworkErrorLoggingService::kStatusCodeKey);
- base::ExpectDictIntegerValue(0, *body,
+ base::ExpectDictIntegerValue(0, body_dict,
NetworkErrorLoggingService::kElapsedTimeKey);
- base::ExpectDictStringValue("dns", *body,
+ base::ExpectDictStringValue("dns", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("dns.address_changed", *body,
+ base::ExpectDictStringValue("dns.address_changed", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -681,26 +690,27 @@ TEST_P(NetworkErrorLoggingServiceTest, HttpErrorReportDowngraded) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kOtherServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kOtherServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("", *body,
+ base::ExpectDictStringValue("", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("GET", *body,
+ base::ExpectDictStringValue("GET", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictIntegerValue(0, *body,
+ base::ExpectDictIntegerValue(0, body_dict,
NetworkErrorLoggingService::kStatusCodeKey);
- base::ExpectDictIntegerValue(0, *body,
+ base::ExpectDictIntegerValue(0, body_dict,
NetworkErrorLoggingService::kElapsedTimeKey);
- base::ExpectDictStringValue("dns", *body,
+ base::ExpectDictStringValue("dns", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("dns.address_changed", *body,
+ base::ExpectDictStringValue("dns.address_changed", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -721,26 +731,27 @@ TEST_P(NetworkErrorLoggingServiceTest, DNSFailureReportNotDowngraded) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kOtherServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kOtherServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("", *body,
+ base::ExpectDictStringValue("", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("GET", *body,
+ base::ExpectDictStringValue("GET", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictIntegerValue(0, *body,
+ base::ExpectDictIntegerValue(0, body_dict,
NetworkErrorLoggingService::kStatusCodeKey);
- base::ExpectDictIntegerValue(1000, *body,
+ base::ExpectDictIntegerValue(1000, body_dict,
NetworkErrorLoggingService::kElapsedTimeKey);
- base::ExpectDictStringValue("dns", *body,
+ base::ExpectDictStringValue("dns", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("dns.name_not_resolved", *body,
+ base::ExpectDictStringValue("dns.name_not_resolved", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -760,22 +771,23 @@ TEST_P(NetworkErrorLoggingServiceTest, SuccessPOSTReportQueued) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("", *body,
+ base::ExpectDictStringValue("", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("POST", *body,
+ base::ExpectDictStringValue("POST", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictStringValue("application", *body,
+ base::ExpectDictStringValue("application", body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("ok", *body,
+ base::ExpectDictStringValue("ok", body_dict,
NetworkErrorLoggingService::kTypeKey);
}
@@ -1237,41 +1249,41 @@ TEST_P(NetworkErrorLoggingServiceTest, SuccessReportQueued_SignedExchange) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("http/1.1", *body,
+ base::ExpectDictStringValue("http/1.1", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("GET", *body,
+ base::ExpectDictStringValue("GET", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictIntegerValue(200, *body,
+ base::ExpectDictIntegerValue(200, body_dict,
NetworkErrorLoggingService::kStatusCodeKey);
- base::ExpectDictIntegerValue(1234, *body,
+ base::ExpectDictIntegerValue(1234, body_dict,
NetworkErrorLoggingService::kElapsedTimeKey);
base::ExpectDictStringValue(
- NetworkErrorLoggingService::kSignedExchangePhaseValue, *body,
+ NetworkErrorLoggingService::kSignedExchangePhaseValue, body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("ok", *body,
+ base::ExpectDictStringValue("ok", body_dict,
NetworkErrorLoggingService::kTypeKey);
- const base::Value* sxg_body =
- body_dict->Find(NetworkErrorLoggingService::kSignedExchangeBodyKey);
- ASSERT_TRUE(sxg_body && sxg_body->is_dict());
+ const base::Value::Dict* sxg_body =
+ body_dict.FindDict(NetworkErrorLoggingService::kSignedExchangeBodyKey);
+ ASSERT_TRUE(sxg_body);
base::ExpectDictStringValue(kUrl_.spec(), *sxg_body,
NetworkErrorLoggingService::kOuterUrlKey);
base::ExpectDictStringValue(kInnerUrl_.spec(), *sxg_body,
NetworkErrorLoggingService::kInnerUrlKey);
- base::ExpectStringValue(kCertUrl_.spec(),
- sxg_body->GetDict()
- .Find(NetworkErrorLoggingService::kCertUrlKey)
- ->GetList()[0]);
+ base::ExpectStringValue(
+ kCertUrl_.spec(),
+ sxg_body->Find(NetworkErrorLoggingService::kCertUrlKey)->GetList()[0]);
}
TEST_P(NetworkErrorLoggingServiceTest, FailureReportQueued_SignedExchange) {
@@ -1291,41 +1303,41 @@ TEST_P(NetworkErrorLoggingServiceTest, FailureReportQueued_SignedExchange) {
EXPECT_EQ(0, reports()[0].depth);
const base::Value* body = reports()[0].body.get();
- const base::Value::Dict* body_dict = body->GetIfDict();
- ASSERT_TRUE(body_dict);
+ ASSERT_TRUE(body);
+ ASSERT_TRUE(body->is_dict());
+ const base::Value::Dict& body_dict = body->GetDict();
- base::ExpectDictStringValue(kReferrer_.spec(), *body,
+ base::ExpectDictStringValue(kReferrer_.spec(), body_dict,
NetworkErrorLoggingService::kReferrerKey);
- ExpectDictDoubleValue(1.0, *body_dict,
+ ExpectDictDoubleValue(1.0, body_dict,
NetworkErrorLoggingService::kSamplingFractionKey);
- base::ExpectDictStringValue(kServerIP_.ToString(), *body,
+ base::ExpectDictStringValue(kServerIP_.ToString(), body_dict,
NetworkErrorLoggingService::kServerIpKey);
- base::ExpectDictStringValue("http/1.1", *body,
+ base::ExpectDictStringValue("http/1.1", body_dict,
NetworkErrorLoggingService::kProtocolKey);
- base::ExpectDictStringValue("GET", *body,
+ base::ExpectDictStringValue("GET", body_dict,
NetworkErrorLoggingService::kMethodKey);
- base::ExpectDictIntegerValue(200, *body,
+ base::ExpectDictIntegerValue(200, body_dict,
NetworkErrorLoggingService::kStatusCodeKey);
- base::ExpectDictIntegerValue(1234, *body,
+ base::ExpectDictIntegerValue(1234, body_dict,
NetworkErrorLoggingService::kElapsedTimeKey);
base::ExpectDictStringValue(
- NetworkErrorLoggingService::kSignedExchangePhaseValue, *body,
+ NetworkErrorLoggingService::kSignedExchangePhaseValue, body_dict,
NetworkErrorLoggingService::kPhaseKey);
- base::ExpectDictStringValue("sxg.failed", *body,
+ base::ExpectDictStringValue("sxg.failed", body_dict,
NetworkErrorLoggingService::kTypeKey);
- const base::Value* sxg_body =
- body_dict->Find(NetworkErrorLoggingService::kSignedExchangeBodyKey);
- ASSERT_TRUE(sxg_body && sxg_body->is_dict());
+ const base::Value::Dict* sxg_body =
+ body_dict.FindDict(NetworkErrorLoggingService::kSignedExchangeBodyKey);
+ ASSERT_TRUE(sxg_body);
base::ExpectDictStringValue(kUrl_.spec(), *sxg_body,
NetworkErrorLoggingService::kOuterUrlKey);
base::ExpectDictStringValue(kInnerUrl_.spec(), *sxg_body,
NetworkErrorLoggingService::kInnerUrlKey);
- base::ExpectStringValue(kCertUrl_.spec(),
- sxg_body->GetDict()
- .Find(NetworkErrorLoggingService::kCertUrlKey)
- ->GetList()[0]);
+ base::ExpectStringValue(
+ kCertUrl_.spec(),
+ sxg_body->Find(NetworkErrorLoggingService::kCertUrlKey)->GetList()[0]);
}
TEST_P(NetworkErrorLoggingServiceTest, MismatchingSubdomain_SignedExchange) {
@@ -1545,8 +1557,8 @@ TEST_P(NetworkErrorLoggingServiceTest, DuplicateEntriesInStore) {
// The first call to any of the public methods triggers a load.
service()->OnHeader(kNik_, kOrigin_, kServerIP_, kHeader_);
- EXPECT_TRUE(store()->VerifyCommands(
- {MockPersistentNelStore::Command::Type::LOAD_NEL_POLICIES}));
+ EXPECT_TRUE(store()->VerifyCommands({MockPersistentNelStore::Command(
+ MockPersistentNelStore::Command::Type::LOAD_NEL_POLICIES)}));
FinishLoading(/*load_success=*/true);
EXPECT_EQ(service()->GetPolicyKeysForTesting().size(), 1u);
diff --git a/chromium/net/nqe/cached_network_quality.cc b/chromium/net/nqe/cached_network_quality.cc
index 2343a1b6dbe..0001ff75188 100644
--- a/chromium/net/nqe/cached_network_quality.cc
+++ b/chromium/net/nqe/cached_network_quality.cc
@@ -4,11 +4,7 @@
#include "net/nqe/cached_network_quality.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
CachedNetworkQuality::CachedNetworkQuality()
: effective_connection_type_(EFFECTIVE_CONNECTION_TYPE_UNKNOWN) {}
@@ -40,8 +36,4 @@ bool CachedNetworkQuality::OlderThan(
return last_update_time_ < cached_network_quality.last_update_time_;
}
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/cached_network_quality.h b/chromium/net/nqe/cached_network_quality.h
index 22f60299516..364b1649eb7 100644
--- a/chromium/net/nqe/cached_network_quality.h
+++ b/chromium/net/nqe/cached_network_quality.h
@@ -10,11 +10,7 @@
#include "net/nqe/effective_connection_type.h"
#include "net/nqe/network_quality.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
// CachedNetworkQuality stores the quality of a previously seen network.
class NET_EXPORT_PRIVATE CachedNetworkQuality {
@@ -56,10 +52,6 @@ class NET_EXPORT_PRIVATE CachedNetworkQuality {
EffectiveConnectionType effective_connection_type_;
};
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
#endif // NET_NQE_CACHED_NETWORK_QUALITY_H_
diff --git a/chromium/net/nqe/effective_connection_type_observer.h b/chromium/net/nqe/effective_connection_type_observer.h
index eed0798895c..a3142b5d3d9 100644
--- a/chromium/net/nqe/effective_connection_type_observer.h
+++ b/chromium/net/nqe/effective_connection_type_observer.h
@@ -33,8 +33,8 @@ class NET_EXPORT_PRIVATE EffectiveConnectionTypeObserver {
EffectiveConnectionType type) = 0;
protected:
- EffectiveConnectionTypeObserver() {}
- virtual ~EffectiveConnectionTypeObserver() {}
+ EffectiveConnectionTypeObserver() = default;
+ virtual ~EffectiveConnectionTypeObserver() = default;
};
} // namespace net
diff --git a/chromium/net/nqe/event_creator.cc b/chromium/net/nqe/event_creator.cc
index f41556716fb..42168e4bd3d 100644
--- a/chromium/net/nqe/event_creator.cc
+++ b/chromium/net/nqe/event_creator.cc
@@ -15,11 +15,7 @@
#include "net/log/net_log_capture_mode.h"
#include "net/log/net_log_with_source.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
namespace {
@@ -28,15 +24,14 @@ base::Value NetworkQualityChangedNetLogParams(
base::TimeDelta transport_rtt,
int32_t downstream_throughput_kbps,
EffectiveConnectionType effective_connection_type) {
- base::Value value(base::Value::Type::DICTIONARY);
- base::Value::Dict& dict = value.GetDict();
- dict.Set("http_rtt_ms", static_cast<int>(http_rtt.InMilliseconds()));
- dict.Set("transport_rtt_ms",
- static_cast<int>(transport_rtt.InMilliseconds()));
- dict.Set("downstream_throughput_kbps", downstream_throughput_kbps);
- dict.Set("effective_connection_type",
- GetNameForEffectiveConnectionType(effective_connection_type));
- return value;
+ base::Value::Dict value;
+ value.Set("http_rtt_ms", static_cast<int>(http_rtt.InMilliseconds()));
+ value.Set("transport_rtt_ms",
+ static_cast<int>(transport_rtt.InMilliseconds()));
+ value.Set("downstream_throughput_kbps", downstream_throughput_kbps);
+ value.Set("effective_connection_type",
+ GetNameForEffectiveConnectionType(effective_connection_type));
+ return base::Value(std::move(value));
}
bool MetricChangedMeaningfully(int32_t past_value, int32_t current_value) {
@@ -114,8 +109,4 @@ void EventCreator::MaybeAddNetworkQualityChangedEventToNetLog(
});
}
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/event_creator.h b/chromium/net/nqe/event_creator.h
index 7a614cb3ec0..4eb856502f5 100644
--- a/chromium/net/nqe/event_creator.h
+++ b/chromium/net/nqe/event_creator.h
@@ -17,9 +17,7 @@ namespace net {
class NetLogWithSource;
-namespace nqe {
-
-namespace internal {
+namespace nqe::internal {
// Class that adds net log events for network quality estimator.
class NET_EXPORT_PRIVATE EventCreator {
@@ -53,9 +51,7 @@ class NET_EXPORT_PRIVATE EventCreator {
SEQUENCE_CHECKER(sequence_checker_);
};
-} // namespace internal
-
-} // namespace nqe
+} // namespace nqe::internal
} // namespace net
diff --git a/chromium/net/nqe/event_creator_unittest.cc b/chromium/net/nqe/event_creator_unittest.cc
index 4d727734f49..df3c71cf49e 100644
--- a/chromium/net/nqe/event_creator_unittest.cc
+++ b/chromium/net/nqe/event_creator_unittest.cc
@@ -11,11 +11,7 @@
#include "net/nqe/network_quality.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
namespace {
@@ -102,8 +98,4 @@ TEST(NetworkQualityEstimatorEventCreatorTest, Notified) {
} // namespace
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/network_id.cc b/chromium/net/nqe/network_id.cc
index be8d350bbdb..aad99b4f211 100644
--- a/chromium/net/nqe/network_id.cc
+++ b/chromium/net/nqe/network_id.cc
@@ -10,9 +10,7 @@
#include "base/strings/string_number_conversions.h"
#include "net/nqe/proto/network_id_proto.pb.h"
-namespace net {
-namespace nqe {
-namespace internal {
+namespace net::nqe::internal {
// static
NetworkID NetworkID::FromString(const std::string& network_id) {
@@ -80,6 +78,4 @@ std::string NetworkID::ToString() const {
return base64_encoded;
}
-} // namespace internal
-} // namespace nqe
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/network_id.h b/chromium/net/nqe/network_id.h
index 618210c87f5..a669548e72e 100644
--- a/chromium/net/nqe/network_id.h
+++ b/chromium/net/nqe/network_id.h
@@ -10,9 +10,7 @@
#include "net/base/net_export.h"
#include "net/base/network_change_notifier.h"
-namespace net {
-namespace nqe {
-namespace internal {
+namespace net::nqe::internal {
// NetworkID is used to uniquely identify a network.
// For the purpose of network quality estimation and caching, a network is
@@ -62,8 +60,6 @@ struct NET_EXPORT_PRIVATE NetworkID {
int32_t signal_strength;
};
-} // namespace internal
-} // namespace nqe
-} // namespace net
+} // namespace net::nqe::internal
#endif // NET_NQE_NETWORK_ID_H_
diff --git a/chromium/net/nqe/network_id_unittest.cc b/chromium/net/nqe/network_id_unittest.cc
index 68e5d01a4ff..bb685307aac 100644
--- a/chromium/net/nqe/network_id_unittest.cc
+++ b/chromium/net/nqe/network_id_unittest.cc
@@ -10,9 +10,7 @@
#include "net/base/network_change_notifier.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace nqe {
-namespace internal {
+namespace net::nqe::internal {
namespace {
@@ -25,6 +23,4 @@ TEST(NetworkIDTest, TestSerialize) {
} // namespace
-} // namespace internal
-} // namespace nqe
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/network_qualities_prefs_manager.h b/chromium/net/nqe/network_qualities_prefs_manager.h
index aceab05dc7a..9691e3186ac 100644
--- a/chromium/net/nqe/network_qualities_prefs_manager.h
+++ b/chromium/net/nqe/network_qualities_prefs_manager.h
@@ -32,7 +32,7 @@ class NET_EXPORT NetworkQualitiesPrefsManager
// Provides an interface that must be implemented by the embedder.
class NET_EXPORT PrefDelegate {
public:
- virtual ~PrefDelegate() {}
+ virtual ~PrefDelegate() = default;
// Sets the persistent pref to the given value.
virtual void SetDictionaryValue(const base::Value::Dict& dict) = 0;
diff --git a/chromium/net/nqe/network_qualities_prefs_manager_unittest.cc b/chromium/net/nqe/network_qualities_prefs_manager_unittest.cc
index d1e484da5da..345d6d3fc9b 100644
--- a/chromium/net/nqe/network_qualities_prefs_manager_unittest.cc
+++ b/chromium/net/nqe/network_qualities_prefs_manager_unittest.cc
@@ -82,7 +82,7 @@ TEST_F(NetworkQualitiesPrefManager, Write) {
variation_params["force_effective_connection_type"] = "Slow-2G";
TestNetworkQualityEstimator estimator(variation_params);
- std::unique_ptr<TestPrefDelegate> prefs_delegate(new TestPrefDelegate());
+ auto prefs_delegate = std::make_unique<TestPrefDelegate>();
TestPrefDelegate* prefs_delegate_ptr = prefs_delegate.get();
NetworkQualitiesPrefsManager manager(std::move(prefs_delegate));
@@ -127,7 +127,7 @@ TEST_F(NetworkQualitiesPrefManager, WriteWhenMatchingExpectedECT) {
variation_params["force_effective_connection_type"] = "Slow-2G";
TestNetworkQualityEstimator estimator(variation_params);
- std::unique_ptr<TestPrefDelegate> prefs_delegate(new TestPrefDelegate());
+ auto prefs_delegate = std::make_unique<TestPrefDelegate>();
TestPrefDelegate* prefs_delegate_ptr = prefs_delegate.get();
NetworkQualitiesPrefsManager manager(std::move(prefs_delegate));
@@ -192,7 +192,7 @@ TEST_F(NetworkQualitiesPrefManager, WriteAndReadWithMultipleNetworkIDs) {
variation_params["force_effective_connection_type"] = "Slow-2G";
TestNetworkQualityEstimator estimator(variation_params);
- std::unique_ptr<TestPrefDelegate> prefs_delegate(new TestPrefDelegate());
+ auto prefs_delegate = std::make_unique<TestPrefDelegate>();
NetworkQualitiesPrefsManager manager(std::move(prefs_delegate));
manager.InitializeOnNetworkThread(&estimator);
@@ -267,7 +267,7 @@ TEST_F(NetworkQualitiesPrefManager, ClearPrefs) {
variation_params["force_effective_connection_type"] = "Slow-2G";
TestNetworkQualityEstimator estimator(variation_params);
- std::unique_ptr<TestPrefDelegate> prefs_delegate(new TestPrefDelegate());
+ auto prefs_delegate = std::make_unique<TestPrefDelegate>();
NetworkQualitiesPrefsManager manager(std::move(prefs_delegate));
manager.InitializeOnNetworkThread(&estimator);
diff --git a/chromium/net/nqe/network_quality.cc b/chromium/net/nqe/network_quality.cc
index 8e0cb68a51a..ee660175268 100644
--- a/chromium/net/nqe/network_quality.cc
+++ b/chromium/net/nqe/network_quality.cc
@@ -4,9 +4,7 @@
#include "net/nqe/network_quality.h"
-namespace net {
-namespace nqe {
-namespace internal {
+namespace net::nqe::internal {
base::TimeDelta InvalidRTT() {
return base::Milliseconds(INVALID_RTT_THROUGHPUT);
@@ -73,6 +71,4 @@ void NetworkQuality::VerifyValueCorrectness() const {
DCHECK_LE(INVALID_RTT_THROUGHPUT, downstream_throughput_kbps_);
}
-} // namespace internal
-} // namespace nqe
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/network_quality.h b/chromium/net/nqe/network_quality.h
index d439e07bff3..5867e278e6b 100644
--- a/chromium/net/nqe/network_quality.h
+++ b/chromium/net/nqe/network_quality.h
@@ -12,9 +12,7 @@
#include "base/time/time.h"
#include "net/base/net_export.h"
-namespace net {
-namespace nqe {
-namespace internal {
+namespace net::nqe::internal {
// RTT and throughput values are set to |INVALID_RTT_THROUGHPUT| if a valid
// value is unavailable.
@@ -105,8 +103,6 @@ class NET_EXPORT_PRIVATE NetworkQuality {
SEQUENCE_CHECKER(sequence_checker_);
};
-} // namespace internal
-} // namespace nqe
-} // namespace net
+} // namespace net::nqe::internal
#endif // NET_NQE_NETWORK_QUALITY_H_
diff --git a/chromium/net/nqe/network_quality_estimator.cc b/chromium/net/nqe/network_quality_estimator.cc
index 2895c5bf2d6..54814bd9720 100644
--- a/chromium/net/nqe/network_quality_estimator.cc
+++ b/chromium/net/nqe/network_quality_estimator.cc
@@ -471,8 +471,8 @@ void NetworkQualityEstimator::OnConnectionTypeChanged(
// Clear the local state.
last_connection_change_ = tick_clock_->NowTicks();
http_downstream_throughput_kbps_observations_.Clear();
- for (int i = 0; i < nqe::internal::OBSERVATION_CATEGORY_COUNT; ++i)
- rtt_ms_observations_[i].Clear();
+ for (auto& rtt_ms_observation : rtt_ms_observations_)
+ rtt_ms_observation.Clear();
current_network_id_.signal_strength = INT32_MIN;
network_quality_ = nqe::internal::NetworkQuality();
@@ -1106,8 +1106,8 @@ void NetworkQualityEstimator::SetTickClockForTesting(
const base::TickClock* tick_clock) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
tick_clock_ = tick_clock;
- for (int i = 0; i < nqe::internal::OBSERVATION_CATEGORY_COUNT; ++i)
- rtt_ms_observations_[i].SetTickClockForTesting(tick_clock_);
+ for (auto& rtt_ms_observation : rtt_ms_observations_)
+ rtt_ms_observation.SetTickClockForTesting(tick_clock_); // IN-TEST
http_downstream_throughput_kbps_observations_.SetTickClockForTesting(
tick_clock_);
throughput_analyzer_->SetTickClockForTesting(tick_clock_);
diff --git a/chromium/net/nqe/network_quality_estimator.h b/chromium/net/nqe/network_quality_estimator.h
index cda6fac5815..23bf4ee7a26 100644
--- a/chromium/net/nqe/network_quality_estimator.h
+++ b/chromium/net/nqe/network_quality_estimator.h
@@ -47,11 +47,9 @@ namespace net {
class NetLog;
-namespace nqe {
-namespace internal {
+namespace nqe::internal {
class ThroughputAnalyzer;
-} // namespace internal
-} // namespace nqe
+} // namespace nqe::internal
class URLRequest;
@@ -80,8 +78,8 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator
NetworkQualityObservationSource source) = 0;
protected:
- RTTObserver() {}
- virtual ~RTTObserver() {}
+ RTTObserver() = default;
+ virtual ~RTTObserver() = default;
};
// Observes measurements of throughput.
@@ -98,8 +96,8 @@ class NET_EXPORT_PRIVATE NetworkQualityEstimator
NetworkQualityObservationSource source) = 0;
protected:
- ThroughputObserver() {}
- virtual ~ThroughputObserver() {}
+ ThroughputObserver() = default;
+ virtual ~ThroughputObserver() = default;
};
// Creates a new NetworkQualityEstimator.
diff --git a/chromium/net/nqe/network_quality_estimator_params_unittest.cc b/chromium/net/nqe/network_quality_estimator_params_unittest.cc
index 59139be1178..5ef76fda094 100644
--- a/chromium/net/nqe/network_quality_estimator_params_unittest.cc
+++ b/chromium/net/nqe/network_quality_estimator_params_unittest.cc
@@ -10,11 +10,7 @@
#include "net/base/network_change_notifier.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
namespace {
@@ -142,8 +138,4 @@ TEST(NetworkQualityEstimatorParamsTest, GetForcedECTCellularOnly) {
} // namespace
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/network_quality_estimator_unittest.cc b/chromium/net/nqe/network_quality_estimator_unittest.cc
index db6acb0a33e..8bca56e3028 100644
--- a/chromium/net/nqe/network_quality_estimator_unittest.cc
+++ b/chromium/net/nqe/network_quality_estimator_unittest.cc
@@ -159,7 +159,7 @@ class TestRTTObserver : public NetworkQualityEstimator::RTTObserver {
void OnRTTObservation(int32_t rtt_ms,
const base::TimeTicks& timestamp,
NetworkQualityObservationSource source) override {
- observations_.push_back(Observation(rtt_ms, timestamp, source));
+ observations_.emplace_back(rtt_ms, timestamp, source);
}
// Returns the last received RTT observation that has source set to |source|.
@@ -195,7 +195,7 @@ class TestThroughputObserver
int32_t throughput_kbps,
const base::TimeTicks& timestamp,
NetworkQualityObservationSource source) override {
- observations_.push_back(Observation(throughput_kbps, timestamp, source));
+ observations_.emplace_back(throughput_kbps, timestamp, source);
}
private:
diff --git a/chromium/net/nqe/network_quality_estimator_util.cc b/chromium/net/nqe/network_quality_estimator_util.cc
index 69dcc72ac66..6dddd842ae0 100644
--- a/chromium/net/nqe/network_quality_estimator_util.cc
+++ b/chromium/net/nqe/network_quality_estimator_util.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/check_op.h"
#include "base/notreached.h"
+#include "net/base/address_list.h"
#include "net/base/host_port_pair.h"
#include "net/base/ip_address.h"
#include "net/base/ip_endpoint.h"
@@ -18,9 +19,7 @@
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_context.h"
-namespace net {
-
-namespace nqe {
+namespace net::nqe {
namespace {
@@ -72,6 +71,4 @@ bool IsPrivateHostForTesting(HostResolver* host_resolver,
} // namespace internal
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe
diff --git a/chromium/net/nqe/network_quality_estimator_util.h b/chromium/net/nqe/network_quality_estimator_util.h
index 67d2099db2b..0233956ecfb 100644
--- a/chromium/net/nqe/network_quality_estimator_util.h
+++ b/chromium/net/nqe/network_quality_estimator_util.h
@@ -17,9 +17,7 @@ class HostResolver;
class NetworkIsolationKey;
class URLRequest;
-namespace nqe {
-
-namespace internal {
+namespace nqe::internal {
// A unified compact representation of an IPv6 or an IPv4 address.
typedef uint64_t IPHash;
@@ -43,9 +41,7 @@ NET_EXPORT_PRIVATE bool IsPrivateHostForTesting(
const HostPortPair& host_port_pair,
const NetworkIsolationKey& network_isolation_key);
-} // namespace internal
-
-} // namespace nqe
+} // namespace nqe::internal
} // namespace net
diff --git a/chromium/net/nqe/network_quality_estimator_util_unittest.cc b/chromium/net/nqe/network_quality_estimator_util_unittest.cc
index c1511a1ef5a..211f071f074 100644
--- a/chromium/net/nqe/network_quality_estimator_util_unittest.cc
+++ b/chromium/net/nqe/network_quality_estimator_util_unittest.cc
@@ -23,11 +23,7 @@
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "url/gurl.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
namespace {
@@ -100,8 +96,7 @@ TEST(NetworkQualityEstimatorUtilTest, MAYBE_ReservedHostUncached) {
MockCachingHostResolver mock_host_resolver;
- scoped_refptr<net::RuleBasedHostResolverProc> rules(
- new net::RuleBasedHostResolverProc(nullptr));
+ auto rules = base::MakeRefCounted<net::RuleBasedHostResolverProc>(nullptr);
// Add example3.com resolution to the DNS cache.
mock_host_resolver.rules()->AddRule("example3.com", "127.0.0.3");
@@ -194,8 +189,7 @@ TEST(NetworkQualityEstimatorUtilTest, MAYBE_Localhost) {
std::unique_ptr<ContextHostResolver> resolver =
HostResolver::CreateStandaloneContextResolver(NetLog::Get());
- scoped_refptr<net::RuleBasedHostResolverProc> rules(
- new net::RuleBasedHostResolverProc(nullptr));
+ auto rules = base::MakeRefCounted<net::RuleBasedHostResolverProc>(nullptr);
EXPECT_TRUE(IsPrivateHostForTesting(
resolver.get(), HostPortPair("localhost", 443), NetworkIsolationKey()));
@@ -218,8 +212,4 @@ TEST(NetworkQualityEstimatorUtilTest, MAYBE_Localhost) {
} // namespace
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/network_quality_observation.cc b/chromium/net/nqe/network_quality_observation.cc
index d7d11e7a4b1..3f41b231159 100644
--- a/chromium/net/nqe/network_quality_observation.cc
+++ b/chromium/net/nqe/network_quality_observation.cc
@@ -7,11 +7,7 @@
#include "base/check.h"
#include "base/notreached.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
Observation::Observation(int32_t value,
base::TimeTicks timestamp,
@@ -71,8 +67,4 @@ std::vector<ObservationCategory> Observation::GetObservationCategories() const {
return observation_categories;
}
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/network_quality_observation.h b/chromium/net/nqe/network_quality_observation.h
index 86007e123cc..2978d04c9f3 100644
--- a/chromium/net/nqe/network_quality_observation.h
+++ b/chromium/net/nqe/network_quality_observation.h
@@ -15,11 +15,7 @@
#include "net/nqe/network_quality_observation_source.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
// Records observations of network quality metrics (such as round trip time
// or throughput), along with the time the observation was made. Observations
@@ -77,10 +73,6 @@ class NET_EXPORT_PRIVATE Observation {
absl::optional<IPHash> host_;
};
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
#endif // NET_NQE_NETWORK_QUALITY_OBSERVATION_H_
diff --git a/chromium/net/nqe/network_quality_observation_source.h b/chromium/net/nqe/network_quality_observation_source.h
index 91465a2c0eb..653da444b9d 100644
--- a/chromium/net/nqe/network_quality_observation_source.h
+++ b/chromium/net/nqe/network_quality_observation_source.h
@@ -54,9 +54,7 @@ enum NetworkQualityObservationSource {
NETWORK_QUALITY_OBSERVATION_SOURCE_MAX,
};
-namespace nqe {
-
-namespace internal {
+namespace nqe::internal {
// Different categories to which an observation source can belong to. Each
// observation source belongs to exactly one category.
@@ -77,9 +75,7 @@ enum ObservationCategory {
OBSERVATION_CATEGORY_COUNT = 3
};
-} // namespace internal
-
-} // namespace nqe
+} // namespace nqe::internal
} // namespace net
diff --git a/chromium/net/nqe/network_quality_store.cc b/chromium/net/nqe/network_quality_store.cc
index 6e9f1207c1a..59a08f8ac5e 100644
--- a/chromium/net/nqe/network_quality_store.cc
+++ b/chromium/net/nqe/network_quality_store.cc
@@ -10,11 +10,7 @@
#include "base/threading/thread_task_runner_handle.h"
#include "net/base/network_change_notifier.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
NetworkQualityStore::NetworkQualityStore() {
static_assert(kMaximumNetworkQualityCacheSize > 0,
@@ -71,9 +67,9 @@ bool NetworkQualityStore::GetById(
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// First check if an exact match can be found.
- for (auto it = cached_network_qualities_.begin();
- it != cached_network_qualities_.end(); ++it) {
- if (network_id.type != it->first.type || network_id.id != it->first.id) {
+ for (const auto& cached_quality : cached_network_qualities_) {
+ if (network_id.type != cached_quality.first.type ||
+ network_id.id != cached_quality.first.id) {
// The |type| and |id| must match.
continue;
}
@@ -82,8 +78,8 @@ bool NetworkQualityStore::GetById(
// It's possible that the current network does not have signal strength
// available. In that case, return the cached network quality when the
// signal strength was unavailable.
- if (network_id.signal_strength == it->first.signal_strength) {
- *cached_network_quality = it->second;
+ if (network_id.signal_strength == cached_quality.first.signal_strength) {
+ *cached_network_quality = cached_quality.second;
return true;
}
}
@@ -197,8 +193,4 @@ void NetworkQualityStore::NotifyCacheObserverIfPresent(
observer->OnChangeInCachedNetworkQuality(it.first, it.second);
}
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/network_quality_store.h b/chromium/net/nqe/network_quality_store.h
index 3db51656aa0..40d4b443fb5 100644
--- a/chromium/net/nqe/network_quality_store.h
+++ b/chromium/net/nqe/network_quality_store.h
@@ -15,11 +15,7 @@
#include "net/nqe/effective_connection_type.h"
#include "net/nqe/network_id.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
// NetworkQualityStore holds the network qualities of different networks in
// memory. Entries are stored in LRU order, and older entries may be evicted.
@@ -42,8 +38,8 @@ class NET_EXPORT_PRIVATE NetworkQualityStore {
const nqe::internal::CachedNetworkQuality& cached_network_quality) = 0;
protected:
- NetworkQualitiesCacheObserver() {}
- virtual ~NetworkQualitiesCacheObserver() {}
+ NetworkQualitiesCacheObserver() = default;
+ virtual ~NetworkQualitiesCacheObserver() = default;
};
NetworkQualityStore();
@@ -107,10 +103,6 @@ class NET_EXPORT_PRIVATE NetworkQualityStore {
base::WeakPtrFactory<NetworkQualityStore> weak_ptr_factory_{this};
};
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
#endif // NET_NQE_NETWORK_QUALITY_STORE_H_
diff --git a/chromium/net/nqe/observation_buffer.cc b/chromium/net/nqe/observation_buffer.cc
index 9e0d1a43e45..e0e81b106b3 100644
--- a/chromium/net/nqe/observation_buffer.cc
+++ b/chromium/net/nqe/observation_buffer.cc
@@ -16,11 +16,7 @@
#include "net/nqe/network_quality_estimator_params.h"
#include "net/nqe/weighted_observation.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
ObservationBuffer::ObservationBuffer(
const NetworkQualityEstimatorParams* params,
@@ -173,8 +169,4 @@ size_t ObservationBuffer::Capacity() const {
return params_->observation_buffer_size();
}
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/observation_buffer.h b/chromium/net/nqe/observation_buffer.h
index d45b6853189..22429484f33 100644
--- a/chromium/net/nqe/observation_buffer.h
+++ b/chromium/net/nqe/observation_buffer.h
@@ -31,9 +31,7 @@ namespace net {
class NetworkQualityEstimatorParams;
-namespace nqe {
-
-namespace internal {
+namespace nqe::internal {
struct WeightedObservation;
@@ -131,9 +129,7 @@ class NET_EXPORT_PRIVATE ObservationBuffer {
raw_ptr<const base::TickClock> tick_clock_;
};
-} // namespace internal
-
-} // namespace nqe
+} // namespace nqe::internal
} // namespace net
diff --git a/chromium/net/nqe/observation_buffer_unittest.cc b/chromium/net/nqe/observation_buffer_unittest.cc
index 578f755c9ea..a153497da61 100644
--- a/chromium/net/nqe/observation_buffer_unittest.cc
+++ b/chromium/net/nqe/observation_buffer_unittest.cc
@@ -18,11 +18,7 @@
#include "net/nqe/network_quality_observation_source.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
namespace {
@@ -366,8 +362,4 @@ TEST(NetworkQualityObservationBufferTest, TestGetMedianRTTSince) {
} // namespace
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/peer_to_peer_connections_count_observer.h b/chromium/net/nqe/peer_to_peer_connections_count_observer.h
index 4076bd22fef..0077fa4b5d7 100644
--- a/chromium/net/nqe/peer_to_peer_connections_count_observer.h
+++ b/chromium/net/nqe/peer_to_peer_connections_count_observer.h
@@ -21,8 +21,8 @@ class NET_EXPORT_PRIVATE PeerToPeerConnectionsCountObserver {
virtual void OnPeerToPeerConnectionsCountChange(uint32_t count) = 0;
protected:
- PeerToPeerConnectionsCountObserver() {}
- virtual ~PeerToPeerConnectionsCountObserver() {}
+ PeerToPeerConnectionsCountObserver() = default;
+ virtual ~PeerToPeerConnectionsCountObserver() = default;
};
} // namespace net
diff --git a/chromium/net/nqe/pref_names.cc b/chromium/net/nqe/pref_names.cc
index 0def50af429..a1e5dcf3778 100644
--- a/chromium/net/nqe/pref_names.cc
+++ b/chromium/net/nqe/pref_names.cc
@@ -4,12 +4,8 @@
#include "net/nqe/pref_names.h"
-namespace net {
-
-namespace nqe {
+namespace net::nqe {
const char kNetworkQualities[] = "net.network_qualities";
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe
diff --git a/chromium/net/nqe/pref_names.h b/chromium/net/nqe/pref_names.h
index 2fe0b0ba9cc..8dd7213c4e6 100644
--- a/chromium/net/nqe/pref_names.h
+++ b/chromium/net/nqe/pref_names.h
@@ -7,15 +7,11 @@
#include "net/base/net_export.h"
-namespace net {
-
-namespace nqe {
+namespace net::nqe {
// Prefs for persisting network qualities.
NET_EXPORT_PRIVATE extern const char kNetworkQualities[];
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe
#endif // NET_NQE_PREF_NAMES_H_
diff --git a/chromium/net/nqe/rtt_throughput_estimates_observer.h b/chromium/net/nqe/rtt_throughput_estimates_observer.h
index 8b434e9003f..1794345c4b6 100644
--- a/chromium/net/nqe/rtt_throughput_estimates_observer.h
+++ b/chromium/net/nqe/rtt_throughput_estimates_observer.h
@@ -38,10 +38,10 @@ class NET_EXPORT_PRIVATE RTTAndThroughputEstimatesObserver {
RTTAndThroughputEstimatesObserver& operator=(
const RTTAndThroughputEstimatesObserver&) = delete;
- virtual ~RTTAndThroughputEstimatesObserver() {}
+ virtual ~RTTAndThroughputEstimatesObserver() = default;
protected:
- RTTAndThroughputEstimatesObserver() {}
+ RTTAndThroughputEstimatesObserver() = default;
};
} // namespace net
diff --git a/chromium/net/nqe/socket_watcher.cc b/chromium/net/nqe/socket_watcher.cc
index 09404b7c7ca..fccea328a9a 100644
--- a/chromium/net/nqe/socket_watcher.cc
+++ b/chromium/net/nqe/socket_watcher.cc
@@ -12,11 +12,7 @@
#include "net/base/address_list.h"
#include "net/base/ip_address.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
namespace {
@@ -129,8 +125,4 @@ void SocketWatcher::OnConnectionChanged() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/socket_watcher.h b/chromium/net/nqe/socket_watcher.h
index 5d3ebda3444..db651b26a09 100644
--- a/chromium/net/nqe/socket_watcher.h
+++ b/chromium/net/nqe/socket_watcher.h
@@ -39,9 +39,7 @@ typedef base::RepeatingCallback<bool(base::TimeTicks)> ShouldNotifyRTTCallback;
} // namespace
-namespace nqe {
-
-namespace internal {
+namespace nqe::internal {
// SocketWatcher implements SocketPerformanceWatcher, and is not thread-safe.
class NET_EXPORT_PRIVATE SocketWatcher : public SocketPerformanceWatcher {
@@ -112,9 +110,7 @@ class NET_EXPORT_PRIVATE SocketWatcher : public SocketPerformanceWatcher {
const absl::optional<IPHash> host_;
};
-} // namespace internal
-
-} // namespace nqe
+} // namespace nqe::internal
} // namespace net
diff --git a/chromium/net/nqe/socket_watcher_factory.cc b/chromium/net/nqe/socket_watcher_factory.cc
index 64b095a075c..f7684b2df8b 100644
--- a/chromium/net/nqe/socket_watcher_factory.cc
+++ b/chromium/net/nqe/socket_watcher_factory.cc
@@ -7,11 +7,7 @@
#include "base/time/time.h"
#include "net/nqe/socket_watcher.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
SocketWatcherFactory::SocketWatcherFactory(
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
@@ -45,8 +41,4 @@ void SocketWatcherFactory::SetTickClockForTesting(
tick_clock_ = tick_clock;
}
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/socket_watcher_factory.h b/chromium/net/nqe/socket_watcher_factory.h
index d3d45989f43..9ff7d447287 100644
--- a/chromium/net/nqe/socket_watcher_factory.h
+++ b/chromium/net/nqe/socket_watcher_factory.h
@@ -38,9 +38,7 @@ typedef base::RepeatingCallback<bool(base::TimeTicks)> ShouldNotifyRTTCallback;
} // namespace
-namespace nqe {
-
-namespace internal {
+namespace nqe::internal {
// SocketWatcherFactory implements SocketPerformanceWatcherFactory.
// SocketWatcherFactory is thread safe.
@@ -99,9 +97,7 @@ class SocketWatcherFactory : public SocketPerformanceWatcherFactory {
raw_ptr<const base::TickClock> tick_clock_;
};
-} // namespace internal
-
-} // namespace nqe
+} // namespace nqe::internal
} // namespace net
diff --git a/chromium/net/nqe/socket_watcher_unittest.cc b/chromium/net/nqe/socket_watcher_unittest.cc
index aadd657c2c9..a6512d88207 100644
--- a/chromium/net/nqe/socket_watcher_unittest.cc
+++ b/chromium/net/nqe/socket_watcher_unittest.cc
@@ -17,11 +17,7 @@
#include "net/test/test_with_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
namespace {
@@ -275,8 +271,4 @@ TEST_F(NetworkQualitySocketWatcherTest, RemoteHostIPHashComputedCorrectly) {
} // namespace
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
diff --git a/chromium/net/nqe/throughput_analyzer.cc b/chromium/net/nqe/throughput_analyzer.cc
index 08657ae4c29..fa0fa625f31 100644
--- a/chromium/net/nqe/throughput_analyzer.cc
+++ b/chromium/net/nqe/throughput_analyzer.cc
@@ -38,9 +38,7 @@ bool ShouldDiscardRequest(const URLRequest& request) {
} // namespace
-namespace nqe {
-
-namespace internal {
+namespace nqe::internal {
// The default content size of a HTML response body. It is set to the median
// HTML response content size, i.e. 1.8kB.
constexpr int64_t kDefaultContentSizeBytes = 1800;
@@ -267,6 +265,9 @@ bool ThroughputAnalyzer::IsHangingWindow(int64_t bits_received,
if (params_->use_small_responses())
return false;
+ if (!duration.is_positive())
+ return false;
+
// Initial congestion window size for TCP connections.
static constexpr size_t kCwndSizeKilobytes = 10 * 1.5;
static constexpr size_t kCwndSizeBits = kCwndSizeKilobytes * 1000 * 8;
@@ -358,8 +359,8 @@ void ThroughputAnalyzer::OnConnectionTypeChanged() {
// computation are now spanning a connection change event. These requests
// would now degrade the throughput computation accuracy. So, move them to
// |accuracy_degrading_requests_|.
- for (auto it = requests_.begin(); it != requests_.end(); ++it) {
- accuracy_degrading_requests_.insert(it->first);
+ for (const auto& request : requests_) {
+ accuracy_degrading_requests_.insert(request.first);
}
requests_.clear();
BoundRequestsSize();
@@ -486,8 +487,6 @@ void ThroughputAnalyzer::EraseHangingRequests(const URLRequest& request) {
}
}
-} // namespace internal
-
-} // namespace nqe
+} // namespace nqe::internal
} // namespace net
diff --git a/chromium/net/nqe/throughput_analyzer.h b/chromium/net/nqe/throughput_analyzer.h
index 51d4cd02312..f0aeb5c344b 100644
--- a/chromium/net/nqe/throughput_analyzer.h
+++ b/chromium/net/nqe/throughput_analyzer.h
@@ -33,9 +33,7 @@ class NetworkQualityEstimatorParams;
class NetworkQualityEstimator;
class URLRequest;
-namespace nqe {
-
-namespace internal {
+namespace nqe::internal {
// Makes throughput observations. Polls NetworkActivityMonitor
// (TrafficStats on Android) to count number of bits received over throughput
@@ -254,9 +252,7 @@ class NET_EXPORT_PRIVATE ThroughputAnalyzer {
NetLogWithSource net_log_;
};
-} // namespace internal
-
-} // namespace nqe
+} // namespace nqe::internal
} // namespace net
diff --git a/chromium/net/nqe/throughput_analyzer_unittest.cc b/chromium/net/nqe/throughput_analyzer_unittest.cc
index a156ce3adf3..38ed6a08ba0 100644
--- a/chromium/net/nqe/throughput_analyzer_unittest.cc
+++ b/chromium/net/nqe/throughput_analyzer_unittest.cc
@@ -45,9 +45,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
-namespace net {
-
-namespace nqe {
+namespace net::nqe {
namespace {
@@ -277,12 +275,12 @@ TEST_F(ThroughputAnalyzerTest, TestMinRequestsForThroughputSample) {
std::vector<std::unique_ptr<URLRequest>> requests_not_local;
std::vector<TestDelegate> not_local_test_delegates(num_requests);
- for (size_t i = 0; i < num_requests; ++i) {
+ for (auto& delegate : not_local_test_delegates) {
// We don't care about completion, except for the first one (see below).
- not_local_test_delegates[i].set_on_complete(base::DoNothing());
+ delegate.set_on_complete(base::DoNothing());
std::unique_ptr<URLRequest> request_not_local(context->CreateRequest(
- GURL("http://example.com/echo.html"), DEFAULT_PRIORITY,
- &not_local_test_delegates[i], TRAFFIC_ANNOTATION_FOR_TESTS));
+ GURL("http://example.com/echo.html"), DEFAULT_PRIORITY, &delegate,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
request_not_local->Start();
requests_not_local.push_back(std::move(request_not_local));
}
@@ -290,16 +288,16 @@ TEST_F(ThroughputAnalyzerTest, TestMinRequestsForThroughputSample) {
EXPECT_EQ(0, throughput_analyzer.throughput_observations_received());
- for (size_t i = 0; i < requests_not_local.size(); ++i) {
- throughput_analyzer.NotifyStartTransaction(*requests_not_local.at(i));
+ for (const auto& request : requests_not_local) {
+ throughput_analyzer.NotifyStartTransaction(*request);
}
// Increment the bytes received count to emulate the bytes received for
// |request_local| and |requests_not_local|.
throughput_analyzer.IncrementBitsReceived(100 * 1000 * 8);
- for (size_t i = 0; i < requests_not_local.size(); ++i) {
- throughput_analyzer.NotifyRequestCompleted(*requests_not_local.at(i));
+ for (const auto& request : requests_not_local) {
+ throughput_analyzer.NotifyRequestCompleted(*request);
}
base::RunLoop().RunUntilIdle();
@@ -697,8 +695,8 @@ TEST_F(ThroughputAnalyzerTest,
if (test.start_local_request)
throughput_analyzer.NotifyStartTransaction(*request_local);
- for (size_t i = 0; i < requests_not_local.size(); ++i) {
- throughput_analyzer.NotifyStartTransaction(*requests_not_local.at(i));
+ for (const auto& request : requests_not_local) {
+ throughput_analyzer.NotifyStartTransaction(*request);
}
if (test.local_request_completes_first) {
@@ -710,8 +708,8 @@ TEST_F(ThroughputAnalyzerTest,
// |request_local| and |requests_not_local|.
throughput_analyzer.IncrementBitsReceived(100 * 1000 * 8);
- for (size_t i = 0; i < requests_not_local.size(); ++i) {
- throughput_analyzer.NotifyRequestCompleted(*requests_not_local.at(i));
+ for (const auto& request : requests_not_local) {
+ throughput_analyzer.NotifyRequestCompleted(*request);
}
if (test.start_local_request && !test.local_request_completes_first)
throughput_analyzer.NotifyRequestCompleted(*request_local);
@@ -956,6 +954,4 @@ TEST_F(ThroughputAnalyzerTest, TestHangingWindow) {
} // namespace
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe
diff --git a/chromium/net/nqe/weighted_observation.h b/chromium/net/nqe/weighted_observation.h
index e3285c26db5..55881a82b6e 100644
--- a/chromium/net/nqe/weighted_observation.h
+++ b/chromium/net/nqe/weighted_observation.h
@@ -7,11 +7,7 @@
#include "net/base/net_export.h"
-namespace net {
-
-namespace nqe {
-
-namespace internal {
+namespace net::nqe::internal {
// Holds an observation and its weight.
struct NET_EXPORT_PRIVATE WeightedObservation {
@@ -21,11 +17,7 @@ struct NET_EXPORT_PRIVATE WeightedObservation {
WeightedObservation(const WeightedObservation& other)
: WeightedObservation(other.value, other.weight) {}
- WeightedObservation& operator=(const WeightedObservation& other) {
- value = other.value;
- weight = other.weight;
- return *this;
- }
+ WeightedObservation& operator=(const WeightedObservation& other) = default;
// Required for sorting the samples in the ascending order of values.
bool operator<(const WeightedObservation& other) const {
@@ -40,10 +32,6 @@ struct NET_EXPORT_PRIVATE WeightedObservation {
double weight;
};
-} // namespace internal
-
-} // namespace nqe
-
-} // namespace net
+} // namespace net::nqe::internal
#endif // NET_NQE_WEIGHTED_OBSERVATION_H_
diff --git a/chromium/net/ntlm/ntlm.cc b/chromium/net/ntlm/ntlm.cc
index b0ce87db781..95c7e37b3c5 100644
--- a/chromium/net/ntlm/ntlm.cc
+++ b/chromium/net/ntlm/ntlm.cc
@@ -18,8 +18,7 @@
#include "third_party/boringssl/src/include/openssl/md4.h"
#include "third_party/boringssl/src/include/openssl/md5.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
namespace {
@@ -338,7 +337,7 @@ void GenerateNtlmProofV2(
base::span<const uint8_t> target_info,
base::span<uint8_t, kNtlmProofLenV2> v2_proof) {
bssl::ScopedHMAC_CTX ctx;
- HMAC_Init_ex(ctx.get(), v2_hash.data(), kNtlmHashLen, EVP_md5(), NULL);
+ HMAC_Init_ex(ctx.get(), v2_hash.data(), kNtlmHashLen, EVP_md5(), nullptr);
DCHECK_EQ(kNtlmProofLenV2, HMAC_size(ctx.get()));
HMAC_Update(ctx.get(), server_challenge.data(), kChallengeLen);
HMAC_Update(ctx.get(), v2_input.data(), kProofInputLenV2);
@@ -384,7 +383,7 @@ void GenerateMicV2(base::span<const uint8_t, kSessionKeyLenV2> session_key,
base::span<uint8_t, kMicLenV2> mic) {
bssl::ScopedHMAC_CTX ctx;
HMAC_Init_ex(ctx.get(), session_key.data(), kSessionKeyLenV2, EVP_md5(),
- NULL);
+ nullptr);
DCHECK_EQ(kMicLenV2, HMAC_size(ctx.get()));
HMAC_Update(ctx.get(), negotiate_msg.data(), negotiate_msg.size());
HMAC_Update(ctx.get(), challenge_msg.data(), challenge_msg.size());
@@ -407,5 +406,4 @@ NET_EXPORT_PRIVATE std::vector<uint8_t> GenerateUpdatedTargetInfo(
return WriteUpdatedTargetInfo(updated_av_pairs, updated_target_info_len);
}
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
diff --git a/chromium/net/ntlm/ntlm.h b/chromium/net/ntlm/ntlm.h
index 25d86646eaa..caa51ae0d05 100644
--- a/chromium/net/ntlm/ntlm.h
+++ b/chromium/net/ntlm/ntlm.h
@@ -23,8 +23,7 @@
#include "net/base/net_export.h"
#include "net/ntlm/ntlm_constants.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
// Maps the bits in the NTLM Hash into 3 DES keys. The DES keys each have 56
// bits stored in the 7 most significant bits of 8 bytes. The least
@@ -225,7 +224,6 @@ NET_EXPORT_PRIVATE std::vector<uint8_t> GenerateUpdatedTargetInfo(
const std::vector<AvPair>& av_pairs,
uint64_t* server_timestamp);
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
#endif // NET_NTLM_NTLM_H_
diff --git a/chromium/net/ntlm/ntlm_buffer_reader.cc b/chromium/net/ntlm/ntlm_buffer_reader.cc
index e2896cb8bce..6368b225016 100644
--- a/chromium/net/ntlm/ntlm_buffer_reader.cc
+++ b/chromium/net/ntlm/ntlm_buffer_reader.cc
@@ -8,10 +8,9 @@
#include "base/check_op.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
-NtlmBufferReader::NtlmBufferReader() {}
+NtlmBufferReader::NtlmBufferReader() = default;
NtlmBufferReader::NtlmBufferReader(base::span<const uint8_t> buffer)
: buffer_(buffer) {}
@@ -298,5 +297,4 @@ void NtlmBufferReader::SetCursor(size_t cursor) {
cursor_ = cursor;
}
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
diff --git a/chromium/net/ntlm/ntlm_buffer_reader.h b/chromium/net/ntlm/ntlm_buffer_reader.h
index 605a3f0a62a..5448f39efd8 100644
--- a/chromium/net/ntlm/ntlm_buffer_reader.h
+++ b/chromium/net/ntlm/ntlm_buffer_reader.h
@@ -15,8 +15,7 @@
#include "net/base/net_export.h"
#include "net/ntlm/ntlm_constants.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
// Supports various bounds-checked low level buffer operations required by an
// NTLM implementation.
@@ -218,7 +217,6 @@ class NET_EXPORT_PRIVATE NtlmBufferReader {
size_t cursor_ = 0;
};
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
#endif // NET_NTLM_NTLM_BUFFER_READER_H_
diff --git a/chromium/net/ntlm/ntlm_buffer_reader_unittest.cc b/chromium/net/ntlm/ntlm_buffer_reader_unittest.cc
index 1cb7622cc0c..ec11a29d76e 100644
--- a/chromium/net/ntlm/ntlm_buffer_reader_unittest.cc
+++ b/chromium/net/ntlm/ntlm_buffer_reader_unittest.cc
@@ -7,8 +7,7 @@
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
TEST(NtlmBufferReaderTest, Initialization) {
const uint8_t buf[1] = {0};
@@ -714,5 +713,4 @@ TEST(NtlmBufferReaderTest, ReadAvPairHeaderPastEob) {
ASSERT_FALSE(reader.ReadAvPairHeader(&avid, &avlen));
}
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
diff --git a/chromium/net/ntlm/ntlm_buffer_writer.cc b/chromium/net/ntlm/ntlm_buffer_writer.cc
index 8f3f72214e9..5a2f6fbfdd1 100644
--- a/chromium/net/ntlm/ntlm_buffer_writer.cc
+++ b/chromium/net/ntlm/ntlm_buffer_writer.cc
@@ -12,8 +12,7 @@
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
NtlmBufferWriter::NtlmBufferWriter(size_t buffer_len)
: buffer_(buffer_len, 0) {}
@@ -179,5 +178,4 @@ void NtlmBufferWriter::SetCursor(size_t cursor) {
cursor_ = cursor;
}
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
diff --git a/chromium/net/ntlm/ntlm_buffer_writer.h b/chromium/net/ntlm/ntlm_buffer_writer.h
index 00745ce97e0..b810541ca80 100644
--- a/chromium/net/ntlm/ntlm_buffer_writer.h
+++ b/chromium/net/ntlm/ntlm_buffer_writer.h
@@ -16,8 +16,7 @@
#include "net/base/net_export.h"
#include "net/ntlm/ntlm_constants.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
// Supports various bounds checked low level buffer operations required by an
// NTLM implementation.
@@ -191,7 +190,6 @@ class NET_EXPORT_PRIVATE NtlmBufferWriter {
size_t cursor_ = 0;
};
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
#endif // NET_NTLM_NTLM_BUFFER_WRITER_H_
diff --git a/chromium/net/ntlm/ntlm_buffer_writer_unittest.cc b/chromium/net/ntlm/ntlm_buffer_writer_unittest.cc
index 3d8c8340b23..a03a1f01272 100644
--- a/chromium/net/ntlm/ntlm_buffer_writer_unittest.cc
+++ b/chromium/net/ntlm/ntlm_buffer_writer_unittest.cc
@@ -7,8 +7,7 @@
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
namespace {
@@ -282,5 +281,4 @@ TEST(NtlmBufferWriterTest, WriteAvPairHeaderPastEob) {
ASSERT_EQ(0u, writer.GetCursor());
}
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
diff --git a/chromium/net/ntlm/ntlm_client.cc b/chromium/net/ntlm/ntlm_client.cc
index 4a160bbaee1..357b66e0ac7 100644
--- a/chromium/net/ntlm/ntlm_client.cc
+++ b/chromium/net/ntlm/ntlm_client.cc
@@ -16,8 +16,7 @@
#include "net/ntlm/ntlm_buffer_writer.h"
#include "net/ntlm/ntlm_constants.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
namespace {
// Parses the challenge message and returns the |challenge_flags| and
@@ -395,5 +394,4 @@ size_t NtlmClient::GetNtlmResponseLength(size_t updated_target_info_len) const {
return kResponseLenV1;
}
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
diff --git a/chromium/net/ntlm/ntlm_client.h b/chromium/net/ntlm/ntlm_client.h
index 68638bd6e7d..5acab8c057d 100644
--- a/chromium/net/ntlm/ntlm_client.h
+++ b/chromium/net/ntlm/ntlm_client.h
@@ -26,8 +26,7 @@
#include "net/base/net_export.h"
#include "net/ntlm/ntlm_constants.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
// Provides an implementation of an NTLMv1 or NTLMv2 Client with support
// for MIC and EPA [1]. This implementation does not support the key exchange,
@@ -156,7 +155,6 @@ class NET_EXPORT_PRIVATE NtlmClient {
std::vector<uint8_t> negotiate_message_;
};
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
#endif // NET_NTLM_NTLM_CLIENT_H_
diff --git a/chromium/net/ntlm/ntlm_client_unittest.cc b/chromium/net/ntlm/ntlm_client_unittest.cc
index 0099320fa12..78a072e440a 100644
--- a/chromium/net/ntlm/ntlm_client_unittest.cc
+++ b/chromium/net/ntlm/ntlm_client_unittest.cc
@@ -15,8 +15,7 @@
#include "net/ntlm/ntlm_test_data.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
namespace {
@@ -469,5 +468,4 @@ TEST(NtlmClientTest, AvPairsOverflow) {
}
}
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
diff --git a/chromium/net/ntlm/ntlm_constants.cc b/chromium/net/ntlm/ntlm_constants.cc
index f8fc6dab5e9..b4436d190ed 100644
--- a/chromium/net/ntlm/ntlm_constants.cc
+++ b/chromium/net/ntlm/ntlm_constants.cc
@@ -4,9 +4,7 @@
#include "net/ntlm/ntlm_constants.h"
-namespace net {
-
-namespace ntlm {
+namespace net::ntlm {
AvPair::AvPair() = default;
@@ -28,5 +26,4 @@ AvPair& AvPair::operator=(const AvPair& other) = default;
AvPair& AvPair::operator=(AvPair&& other) = default;
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
diff --git a/chromium/net/ntlm/ntlm_constants.h b/chromium/net/ntlm/ntlm_constants.h
index 8eed997a71d..015134333d9 100644
--- a/chromium/net/ntlm/ntlm_constants.h
+++ b/chromium/net/ntlm/ntlm_constants.h
@@ -12,8 +12,7 @@
#include "net/base/net_export.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
// A security buffer is a structure within an NTLM message that indicates
// the offset from the beginning of the message and the length of a payload
@@ -181,7 +180,6 @@ static constexpr NegotiateFlags kNegotiateMessageFlags =
NegotiateFlags::kRequestTarget | NegotiateFlags::kNtlm |
NegotiateFlags::kAlwaysSign | NegotiateFlags::kExtendedSessionSecurity;
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
#endif // NET_NTLM_NTLM_CONSTANTS_H_
diff --git a/chromium/net/ntlm/ntlm_test_data.h b/chromium/net/ntlm/ntlm_test_data.h
index cc44939367e..8ad35b323d3 100644
--- a/chromium/net/ntlm/ntlm_test_data.h
+++ b/chromium/net/ntlm/ntlm_test_data.h
@@ -18,9 +18,7 @@
#include "net/ntlm/ntlm_constants.h"
-namespace net {
-namespace ntlm {
-namespace test {
+namespace net::ntlm::test {
// Common input values defined in [MS-NLMP] Section 4.2.1.
constexpr char16_t kPassword[] = {'P', 'a', 's', 's', 'w', 'o', 'r', 'd', '\0'};
@@ -566,8 +564,6 @@ constexpr uint8_t kExpectedAuthenticateMsgEmptyChannelBindingsV2[] = {
'P', 0x00, 'U', 0x00, 'T', 0x00, 'E', 0x00, 'R', 0x00,
};
-} // namespace test
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm::test
#endif // NET_NTLM_NTLM_TEST_DATA_H_
diff --git a/chromium/net/ntlm/ntlm_unittest.cc b/chromium/net/ntlm/ntlm_unittest.cc
index eeaec825592..7088e44646b 100644
--- a/chromium/net/ntlm/ntlm_unittest.cc
+++ b/chromium/net/ntlm/ntlm_unittest.cc
@@ -21,8 +21,7 @@
#include "net/ntlm/ntlm_test_data.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace ntlm {
+namespace net::ntlm {
namespace {
@@ -420,5 +419,4 @@ TEST(NtlmTest, GenerateNtlmProofWithClientTimestampV2) {
proof, kNtlmProofLenV2));
}
-} // namespace ntlm
-} // namespace net
+} // namespace net::ntlm
diff --git a/chromium/net/proxy_resolution/configured_proxy_resolution_service.cc b/chromium/net/proxy_resolution/configured_proxy_resolution_service.cc
index 30072447d14..929ddb38ccc 100644
--- a/chromium/net/proxy_resolution/configured_proxy_resolution_service.cc
+++ b/chromium/net/proxy_resolution/configured_proxy_resolution_service.cc
@@ -45,18 +45,11 @@
#include "net/url_request/url_request_context.h"
#if BUILDFLAG(IS_WIN)
-#include "net/proxy_resolution/win/proxy_config_service_win.h"
#include "net/proxy_resolution/win/proxy_resolver_winhttp.h"
#elif BUILDFLAG(IS_IOS)
-#include "net/proxy_resolution/proxy_config_service_ios.h"
#include "net/proxy_resolution/proxy_resolver_mac.h"
#elif BUILDFLAG(IS_MAC)
-#include "net/proxy_resolution/proxy_config_service_mac.h"
#include "net/proxy_resolution/proxy_resolver_mac.h"
-#elif BUILDFLAG(IS_LINUX)
-#include "net/proxy_resolution/proxy_config_service_linux.h"
-#elif BUILDFLAG(IS_ANDROID)
-#include "net/proxy_resolution/proxy_config_service_android.h"
#endif
using base::TimeTicks;
@@ -65,35 +58,6 @@ namespace net {
namespace {
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX)
-constexpr net::NetworkTrafficAnnotationTag kSystemProxyConfigTrafficAnnotation =
- net::DefineNetworkTrafficAnnotation("proxy_config_system", R"(
- semantics {
- sender: "Proxy Config"
- description:
- "Establishing a connection through a proxy server using system proxy "
- "settings."
- trigger:
- "Whenever a network request is made when the system proxy settings "
- "are used, and they indicate to use a proxy server."
- data:
- "Proxy configuration."
- destination: OTHER
- destination_other:
- "The proxy server specified in the configuration."
- }
- policy {
- cookies_allowed: NO
- setting:
- "User cannot override system proxy settings, but can change them "
- "through 'Advanced/System/Open proxy settings'."
- policy_exception_justification:
- "Using either of 'ProxyMode', 'ProxyServer', or 'ProxyPacUrl' "
- "policies can set Chrome to use a specific proxy settings and avoid "
- "system proxy."
- })");
-#endif
-
const size_t kDefaultNumPacThreads = 4;
// When the IP address changes we don't immediately re-run proxy auto-config.
@@ -328,47 +292,32 @@ class ProxyResolverFactoryForPacResult : public ProxyResolverFactory {
base::Value NetLogProxyConfigChangedParams(
const absl::optional<ProxyConfigWithAnnotation>* old_config,
const ProxyConfigWithAnnotation* new_config) {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
// The "old_config" is optional -- the first notification will not have
// any "previous" configuration.
if (old_config->has_value())
- dict.SetKey("old_config", (*old_config)->value().ToValue());
- dict.SetKey("new_config", new_config->value().ToValue());
- return dict;
+ dict.Set("old_config", (*old_config)->value().ToValue());
+ dict.Set("new_config", new_config->value().ToValue());
+ return base::Value(std::move(dict));
}
base::Value NetLogBadProxyListParams(const ProxyRetryInfoMap* retry_info) {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
base::Value list(base::Value::Type::LIST);
for (const auto& retry_info_pair : *retry_info)
list.Append(retry_info_pair.first);
- dict.SetKey("bad_proxy_list", std::move(list));
- return dict;
+ dict.Set("bad_proxy_list", std::move(list));
+ return base::Value(std::move(dict));
}
// Returns NetLog parameters on a successful proxy resolution.
base::Value NetLogFinishedResolvingProxyParams(const ProxyInfo* result) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("pac_string", result->ToPacString());
- return dict;
+ base::Value::Dict dict;
+ dict.Set("pac_string", result->ToPacString());
+ return base::Value(std::move(dict));
}
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-class UnsetProxyConfigService : public ProxyConfigService {
- public:
- UnsetProxyConfigService() = default;
- ~UnsetProxyConfigService() override = default;
-
- void AddObserver(Observer* observer) override {}
- void RemoveObserver(Observer* observer) override {}
- ConfigAvailability GetLatestProxyConfig(
- ProxyConfigWithAnnotation* config) override {
- return CONFIG_UNSET;
- }
-};
-#endif
-
// Returns a sanitized copy of |url| which is safe to pass on to a PAC script.
//
// PAC scripts are modelled as being controllable by a network-present
@@ -877,7 +826,7 @@ ConfiguredProxyResolutionService::CreateWithoutProxyResolver(
// static
std::unique_ptr<ConfiguredProxyResolutionService>
-ConfiguredProxyResolutionService::CreateFixed(
+ConfiguredProxyResolutionService::CreateFixedForTest(
const ProxyConfigWithAnnotation& pc) {
// TODO(eroman): This isn't quite right, won't work if |pc| specifies
// a PAC script.
@@ -888,13 +837,13 @@ ConfiguredProxyResolutionService::CreateFixed(
// static
std::unique_ptr<ConfiguredProxyResolutionService>
-ConfiguredProxyResolutionService::CreateFixed(
+ConfiguredProxyResolutionService::CreateFixedForTest(
const std::string& proxy,
const NetworkTrafficAnnotationTag& traffic_annotation) {
ProxyConfig proxy_config;
proxy_config.proxy_rules().ParseFromString(proxy);
ProxyConfigWithAnnotation annotated_config(proxy_config, traffic_annotation);
- return ConfiguredProxyResolutionService::CreateFixed(annotated_config);
+ return ConfiguredProxyResolutionService::CreateFixedForTest(annotated_config);
}
// static
@@ -909,16 +858,15 @@ ConfiguredProxyResolutionService::CreateDirect() {
// static
std::unique_ptr<ConfiguredProxyResolutionService>
-ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
const std::string& pac_string,
const NetworkTrafficAnnotationTag& traffic_annotation) {
// We need the settings to contain an "automatic" setting, otherwise the
// ProxyResolver dependency we give it will never be used.
- std::unique_ptr<ProxyConfigService> proxy_config_service(
- new ProxyConfigServiceFixed(ProxyConfigWithAnnotation(
- ProxyConfig::CreateFromCustomPacURL(
- GURL("https://my-pac-script.invalid/wpad.dat")),
- traffic_annotation)));
+ auto proxy_config_service = std::make_unique<ProxyConfigServiceFixed>(
+ ProxyConfigWithAnnotation(ProxyConfig::CreateFromCustomPacURL(GURL(
+ "https://my-pac-script.invalid/wpad.dat")),
+ traffic_annotation));
return std::make_unique<ConfiguredProxyResolutionService>(
std::move(proxy_config_service),
@@ -928,12 +876,12 @@ ConfiguredProxyResolutionService::CreateFixedFromPacResult(
// static
std::unique_ptr<ConfiguredProxyResolutionService>
-ConfiguredProxyResolutionService::CreateFixedFromAutoDetectedPacResult(
+ConfiguredProxyResolutionService::CreateFixedFromAutoDetectedPacResultForTest(
const std::string& pac_string,
const NetworkTrafficAnnotationTag& traffic_annotation) {
- std::unique_ptr<ProxyConfigService> proxy_config_service(
- new ProxyConfigServiceFixed(ProxyConfigWithAnnotation(
- ProxyConfig::CreateAutoDetect(), traffic_annotation)));
+ auto proxy_config_service =
+ std::make_unique<ProxyConfigServiceFixed>(ProxyConfigWithAnnotation(
+ ProxyConfig::CreateAutoDetect(), traffic_annotation));
return std::make_unique<ConfiguredProxyResolutionService>(
std::move(proxy_config_service),
@@ -1379,12 +1327,11 @@ base::Value::Dict ConfiguredProxyResolutionService::GetProxyNetLogValues() {
const std::string& proxy_uri = it.first;
const ProxyRetryInfo& retry_info = it.second;
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("proxy_uri", proxy_uri);
- dict.SetStringKey("bad_until",
- NetLog::TickCountToString(retry_info.bad_until));
+ base::Value::Dict dict;
+ dict.Set("proxy_uri", proxy_uri);
+ dict.Set("bad_until", NetLog::TickCountToString(retry_info.bad_until));
- list.Append(std::move(dict));
+ list.Append(base::Value(std::move(dict)));
}
net_info_dict.Set(kNetInfoBadProxies, std::move(list));
@@ -1400,56 +1347,6 @@ bool ConfiguredProxyResolutionService::CastToConfiguredProxyResolutionService(
}
// static
-std::unique_ptr<ProxyConfigService>
-ConfiguredProxyResolutionService::CreateSystemProxyConfigService(
- const scoped_refptr<base::SequencedTaskRunner>& main_task_runner) {
-#if BUILDFLAG(IS_WIN)
- return std::make_unique<ProxyConfigServiceWin>(
- kSystemProxyConfigTrafficAnnotation);
-#elif BUILDFLAG(IS_IOS)
- return std::make_unique<ProxyConfigServiceIOS>(
- kSystemProxyConfigTrafficAnnotation);
-#elif BUILDFLAG(IS_MAC)
- return std::make_unique<ProxyConfigServiceMac>(
- main_task_runner, kSystemProxyConfigTrafficAnnotation);
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
- LOG(ERROR) << "ProxyConfigService for ChromeOS should be created in "
- << "profile_io_data.cc::CreateProxyConfigService and this should "
- << "be used only for examples.";
- return std::make_unique<UnsetProxyConfigService>();
-#elif BUILDFLAG(IS_LINUX)
- std::unique_ptr<ProxyConfigServiceLinux> linux_config_service(
- new ProxyConfigServiceLinux());
-
- // Assume we got called on the thread that runs the default glib
- // main loop, so the current thread is where we should be running
- // gsettings calls from.
- scoped_refptr<base::SingleThreadTaskRunner> glib_thread_task_runner =
- base::ThreadTaskRunnerHandle::Get();
-
- // Synchronously fetch the current proxy config (since we are running on
- // glib_default_loop). Additionally register for notifications (delivered in
- // either |glib_default_loop| or an internal sequenced task runner) to
- // keep us updated when the proxy config changes.
- linux_config_service->SetupAndFetchInitialConfig(
- glib_thread_task_runner, main_task_runner,
- kSystemProxyConfigTrafficAnnotation);
-
- return std::move(linux_config_service);
-#elif BUILDFLAG(IS_ANDROID)
- return std::make_unique<ProxyConfigServiceAndroid>(
- main_task_runner, base::ThreadTaskRunnerHandle::Get());
-#elif BUILDFLAG(IS_FUCHSIA)
- // TODO(crbug.com/889195): Implement a system proxy service for Fuchsia.
- return std::make_unique<ProxyConfigServiceDirect>();
-#else
- LOG(WARNING) << "Failed to choose a system proxy settings fetcher "
- "for this platform.";
- return std::make_unique<ProxyConfigServiceDirect>();
-#endif
-}
-
-// static
const ConfiguredProxyResolutionService::PacPollPolicy*
ConfiguredProxyResolutionService::set_pac_script_poll_policy(
const PacPollPolicy* policy) {
diff --git a/chromium/net/proxy_resolution/configured_proxy_resolution_service.h b/chromium/net/proxy_resolution/configured_proxy_resolution_service.h
index 83b5ee338d3..b640467a1c9 100644
--- a/chromium/net/proxy_resolution/configured_proxy_resolution_service.h
+++ b/chromium/net/proxy_resolution/configured_proxy_resolution_service.h
@@ -34,7 +34,6 @@
#include "url/gurl.h"
namespace base {
-class SequencedTaskRunner;
class TimeDelta;
} // namespace base
@@ -88,7 +87,7 @@ class NET_EXPORT ConfiguredProxyResolutionService
MODE_START_AFTER_ACTIVITY,
};
- virtual ~PacPollPolicy() {}
+ virtual ~PacPollPolicy() = default;
// Decides the next poll delay. |current_delay| is the delay used
// by the preceding poll, or a negative TimeDelta value if determining
@@ -202,9 +201,9 @@ class NET_EXPORT ConfiguredProxyResolutionService
// Convenience methods that creates a proxy service using the
// specified fixed settings.
- static std::unique_ptr<ConfiguredProxyResolutionService> CreateFixed(
+ static std::unique_ptr<ConfiguredProxyResolutionService> CreateFixedForTest(
const ProxyConfigWithAnnotation& pc);
- static std::unique_ptr<ConfiguredProxyResolutionService> CreateFixed(
+ static std::unique_ptr<ConfiguredProxyResolutionService> CreateFixedForTest(
const std::string& proxy,
const NetworkTrafficAnnotationTag& traffic_annotation);
@@ -217,27 +216,17 @@ class NET_EXPORT ConfiguredProxyResolutionService
// |pac_string| is a list of proxy servers, in the format that a PAC script
// would return it. For example, "PROXY foobar:99; SOCKS fml:2; DIRECT"
static std::unique_ptr<ConfiguredProxyResolutionService>
- CreateFixedFromPacResult(
+ CreateFixedFromPacResultForTest(
const std::string& pac_string,
const NetworkTrafficAnnotationTag& traffic_annotation);
- // Same as CreateFixedFromPacResult(), except the resulting ProxyInfo from
- // resolutions will be tagged as having been auto-detected.
+ // Same as CreateFixedFromPacResultForTest(), except the resulting ProxyInfo
+ // from resolutions will be tagged as having been auto-detected.
static std::unique_ptr<ConfiguredProxyResolutionService>
- CreateFixedFromAutoDetectedPacResult(
+ CreateFixedFromAutoDetectedPacResultForTest(
const std::string& pac_string,
const NetworkTrafficAnnotationTag& traffic_annotation);
- // Creates a config service appropriate for this platform that fetches the
- // system proxy settings. |main_task_runner| is the thread where the consumer
- // of the ProxyConfigService will live.
- //
- // TODO(mmenke): Should this be a member of ProxyConfigService?
- // The ConfiguredProxyResolutionService may not even be in the same process as
- // the system ProxyConfigService.
- static std::unique_ptr<ProxyConfigService> CreateSystemProxyConfigService(
- const scoped_refptr<base::SequencedTaskRunner>& main_task_runner);
-
// This method should only be used by unit tests.
void set_stall_proxy_auto_config_delay(base::TimeDelta delay) {
stall_proxy_auto_config_delay_ = delay;
diff --git a/chromium/net/proxy_resolution/configured_proxy_resolution_service_unittest.cc b/chromium/net/proxy_resolution/configured_proxy_resolution_service_unittest.cc
index cdd6bc8b7b7..37e3a18dd69 100644
--- a/chromium/net/proxy_resolution/configured_proxy_resolution_service_unittest.cc
+++ b/chromium/net/proxy_resolution/configured_proxy_resolution_service_unittest.cc
@@ -362,11 +362,11 @@ JobMap GetCancelledJobsForURLs(const MockAsyncProxyResolver& resolver,
} // namespace
TEST_F(ConfiguredProxyResolutionServiceTest, Direct) {
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
ConfiguredProxyResolutionService service(
std::make_unique<MockProxyConfigService>(ProxyConfig::CreateDirect()),
- base::WrapUnique(factory), nullptr, /*quick_check_enabled=*/true);
+ std::move(factory), nullptr, /*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -378,7 +378,7 @@ TEST_F(ConfiguredProxyResolutionServiceTest, Direct) {
&info, callback.callback(), &request,
NetLogWithSource::Make(NetLogSourceType::NONE));
EXPECT_THAT(rv, IsOk());
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
EXPECT_TRUE(info.is_direct());
EXPECT_TRUE(info.proxy_resolve_start_time().is_null());
@@ -550,16 +550,15 @@ DeletingCallback<T>::~DeletingCallback() = default;
// Test that the ConfiguredProxyResolutionService correctly handles the case
// where a request callback deletes another request.
TEST_F(ConfiguredProxyResolutionServiceTest, CallbackDeletesRequest) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
-
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
std::unique_ptr<ConfiguredProxyResolutionService> service =
std::make_unique<ConfiguredProxyResolutionService>(
- base::WrapUnique(config_service), base::WrapUnique(factory), nullptr,
+ std::move(config_service), std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -582,10 +581,10 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CallbackDeletesRequest) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Run pending requests.
- ASSERT_EQ(1u, factory->pending_requests().size());
+ ASSERT_EQ(1u, factory_ptr->pending_requests().size());
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(2u, resolver.pending_jobs().size());
// Job order is nondeterministic, as requests are stored in an std::set, so
@@ -617,16 +616,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CallbackDeletesRequest) {
// ConfiguredProxyResolutionService's destructor).
TEST_F(ConfiguredProxyResolutionServiceTest,
CallbackDeletesRequestDuringDestructor) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
std::unique_ptr<ConfiguredProxyResolutionService> service =
std::make_unique<ConfiguredProxyResolutionService>(
- base::WrapUnique(config_service), base::WrapUnique(factory), nullptr,
+ std::move(config_service), std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -668,16 +666,16 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
// Test that the ConfiguredProxyResolutionService correctly handles the case
// where a request callback deletes its own handle.
TEST_F(ConfiguredProxyResolutionServiceTest, CallbackDeletesSelf) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
std::unique_ptr<ConfiguredProxyResolutionService> service =
std::make_unique<ConfiguredProxyResolutionService>(
- base::WrapUnique(config_service), base::WrapUnique(factory), nullptr,
+ std::move(config_service), std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -705,10 +703,10 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CallbackDeletesSelf) {
NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
- ASSERT_EQ(1u, factory->pending_requests().size());
+ ASSERT_EQ(1u, factory_ptr->pending_requests().size());
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(3u, resolver.pending_jobs().size());
// Job order is nondeterministic, as requests are stored in an std::set, so
@@ -737,16 +735,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CallbackDeletesSelf) {
// ConfiguredProxyResolutionService's destructor.
TEST_F(ConfiguredProxyResolutionServiceTest,
CallbackDeletesSelfDuringDestructor) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
std::unique_ptr<ConfiguredProxyResolutionService> service =
std::make_unique<ConfiguredProxyResolutionService>(
- base::WrapUnique(config_service), base::WrapUnique(factory), nullptr,
+ std::move(config_service), std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -784,12 +781,12 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
}
TEST_F(ConfiguredProxyResolutionServiceTest, ProxyServiceDeletedBeforeRequest) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
GURL url("http://www.google.com/");
@@ -799,8 +796,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyServiceDeletedBeforeRequest) {
int rv;
{
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
rv = service.ResolveProxy(url, std::string(), NetworkIsolationKey(), &info,
callback.callback(), &request,
@@ -809,10 +806,10 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyServiceDeletedBeforeRequest) {
EXPECT_EQ(LOAD_STATE_RESOLVING_PROXY_FOR_URL, request->GetLoadState());
- ASSERT_EQ(1u, factory->pending_requests().size());
+ ASSERT_EQ(1u, factory_ptr->pending_requests().size());
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
}
@@ -824,16 +821,16 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyServiceDeletedBeforeRequest) {
// Test that the ConfiguredProxyResolutionService correctly handles the case
// where a request callback deletes the service.
TEST_F(ConfiguredProxyResolutionServiceTest, CallbackDeletesService) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
+ auto* config_service_ptr = config_service.get();
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
std::unique_ptr<ConfiguredProxyResolutionService> service =
std::make_unique<ConfiguredProxyResolutionService>(
- base::WrapUnique(config_service), base::WrapUnique(factory), nullptr,
+ std::move(config_service), std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -863,7 +860,7 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CallbackDeletesService) {
NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
- config_service->SetConfig(ProxyConfigWithAnnotation(
+ config_service_ptr->SetConfig(ProxyConfigWithAnnotation(
ProxyConfig::CreateDirect(), TRAFFIC_ANNOTATION_FOR_TESTS));
ASSERT_EQ(0u, resolver.pending_jobs().size());
@@ -873,15 +870,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CallbackDeletesService) {
}
TEST_F(ConfiguredProxyResolutionServiceTest, PAC) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -898,10 +895,10 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC) {
EXPECT_EQ(LOAD_STATE_RESOLVING_PROXY_FOR_URL, request->GetLoadState());
- ASSERT_EQ(1u, factory->pending_requests().size());
+ ASSERT_EQ(1u, factory_ptr->pending_requests().size());
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -937,15 +934,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC) {
// Test that the proxy resolver does not see the URL's username/password
// or its reference section.
TEST_F(ConfiguredProxyResolutionServiceTest, PAC_NoIdentityOrHash) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://username:password@www.google.com/?ref#hash#hash");
@@ -959,8 +956,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC_NoIdentityOrHash) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
// The URL should have been simplified, stripping the username/password/hash.
@@ -972,14 +969,14 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC_NoIdentityOrHash) {
}
TEST_F(ConfiguredProxyResolutionServiceTest, PAC_FailoverWithoutDirect) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -993,8 +990,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC_FailoverWithoutDirect) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1021,14 +1018,14 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC_FailoverWithoutDirect) {
// Test that if the execution of the PAC script fails (i.e. javascript runtime
// error), and the PAC settings are non-mandatory, that we fall-back to direct.
TEST_F(ConfiguredProxyResolutionServiceTest, PAC_RuntimeError) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://this-causes-js-error/");
@@ -1042,8 +1039,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC_RuntimeError) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1080,14 +1077,14 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC_RuntimeError) {
// The important check of this test is to make sure that DIRECT is not somehow
// cached as being a bad proxy.
TEST_F(ConfiguredProxyResolutionServiceTest, PAC_FailoverAfterDirect) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -1101,8 +1098,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC_FailoverAfterDirect) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1140,12 +1137,12 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC_ConfigSourcePropagates) {
ProxyConfig config =
ProxyConfig::CreateFromCustomPacURL(GURL("http://foopy/proxy.pac"));
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
// Resolve something.
@@ -1157,7 +1154,7 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PAC_ConfigSourcePropagates) {
service.ResolveProxy(url, std::string(), NetworkIsolationKey(), &info,
callback.callback(), &request, NetLogWithSource());
ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
// Set the result in proxy resolver.
@@ -1178,15 +1175,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyResolverFails) {
// of the PAC script have already succeeded, so this corresponds with a
// javascript runtime error while calling FindProxyForURL().
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
// Start first resolve request.
@@ -1200,8 +1197,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyResolverFails) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1244,15 +1241,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
// Test what happens when the ProxyResolver fails with a fatal error while
// a GetProxyForURL() call is in progress.
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
// Start first resolve request.
@@ -1265,10 +1262,10 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
callback1.callback(), &request, NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
- ASSERT_EQ(1u, factory->pending_requests().size());
+ ASSERT_EQ(1u, factory_ptr->pending_requests().size());
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1288,17 +1285,17 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
// With no other requests, the ConfiguredProxyResolutionService waits for a
// new request before initializing a new ProxyResolver.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
TestCompletionCallback callback2;
rv = service.ResolveProxy(url, std::string(), NetworkIsolationKey(), &info,
callback2.callback(), &request, NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
- ASSERT_EQ(1u, factory->pending_requests().size());
+ ASSERT_EQ(1u, factory_ptr->pending_requests().size());
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1317,15 +1314,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
// Test what happens when the ProxyResolver fails with a fatal error while
// a GetProxyForURL() call is in progress.
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
// Start two resolve requests.
@@ -1344,10 +1341,10 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
callback2.callback(), &request2, NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
- ASSERT_EQ(1u, factory->pending_requests().size());
+ ASSERT_EQ(1u, factory_ptr->pending_requests().size());
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
JobMap jobs = GetPendingJobsForURLs(resolver, url1, url2);
@@ -1369,10 +1366,10 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
// Since a second request was in progress, the
// ConfiguredProxyResolutionService starts initializating a new ProxyResolver.
- ASSERT_EQ(1u, factory->pending_requests().size());
+ ASSERT_EQ(1u, factory_ptr->pending_requests().size());
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
jobs = GetPendingJobsForURLs(resolver, url2);
@@ -1394,13 +1391,13 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
ProxyConfig::CreateFromCustomPacURL(GURL("http://foopy/proxy.pac")));
config.set_pac_mandatory(true);
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
// Start first resolve request.
@@ -1414,10 +1411,10 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNow(ERR_FAILED, nullptr);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNow(ERR_FAILED, nullptr);
- ASSERT_EQ(0u, factory->pending_requests().size());
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
// As the proxy resolver factory failed the request and is configured for a
// mandatory PAC script, ConfiguredProxyResolutionService must not implicitly
// fall-back to DIRECT.
@@ -1445,17 +1442,18 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
ProxyConfig::CreateFromCustomPacURL(GURL("http://foopy/proxy.pac")));
config.set_pac_mandatory(true);
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start resolve request.
@@ -1469,15 +1467,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Check that nothing has been sent to the proxy resolver factory yet.
- ASSERT_EQ(0u, factory->pending_requests().size());
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
// Downloading the PAC script succeeds.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(OK, "invalid-script-contents");
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(OK, "invalid-script-contents");
- EXPECT_FALSE(fetcher->has_pending_request());
- ASSERT_EQ(0u, factory->pending_requests().size());
+ EXPECT_FALSE(fetcher_ptr->has_pending_request());
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
// Since PacFileDecider failed to identify a valid PAC and PAC was
// mandatory for this configuration, the ConfiguredProxyResolutionService must
@@ -1497,14 +1495,14 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
ProxyConfig::CreateFromCustomPacURL(GURL("http://foopy/proxy.pac")));
config.set_pac_mandatory(true);
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
// Start first resolve request.
@@ -1518,8 +1516,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1558,15 +1556,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallback) {
// Test what happens when we specify multiple proxy servers and some of them
// are bad.
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -1581,8 +1579,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallback) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1697,15 +1695,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallback) {
// This test is similar to ProxyFallback, but this time we have an explicit
// fallback choice to DIRECT.
TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallbackToDirect) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -1720,8 +1718,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallbackToDirect) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1761,15 +1759,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallbackToDirect) {
TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallback_BadConfig) {
// Test proxy failover when the configuration is bad.
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -1786,8 +1784,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallback_BadConfig) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -1869,14 +1867,14 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallback_BadConfigMandatory) {
ProxyConfig::CreateFromCustomPacURL(GURL("http://foopy/proxy.pac")));
config.set_pac_mandatory(true);
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -1891,8 +1889,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ProxyFallback_BadConfigMandatory) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -2232,15 +2230,15 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CancelInProgressRequest) {
const GURL url1("http://request1");
const GURL url2("http://request2");
const GURL url3("http://request3");
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
// Start 3 requests.
@@ -2255,8 +2253,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CancelInProgressRequest) {
// Successfully initialize the PAC script.
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
GetPendingJobsForURLs(resolver, url1);
@@ -2307,19 +2305,20 @@ TEST_F(ConfiguredProxyResolutionServiceTest, InitialPACScriptDownload) {
const GURL url1("http://request1");
const GURL url2("http://request2");
const GURL url3("http://request3");
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 3 requests.
@@ -2333,8 +2332,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, InitialPACScriptDownload) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
ProxyInfo info2;
TestCompletionCallback callback2;
@@ -2353,7 +2352,7 @@ TEST_F(ConfiguredProxyResolutionServiceTest, InitialPACScriptDownload) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
EXPECT_EQ(LOAD_STATE_DOWNLOADING_PAC_FILE, request1->GetLoadState());
EXPECT_EQ(LOAD_STATE_DOWNLOADING_PAC_FILE, request2->GetLoadState());
@@ -2362,13 +2361,13 @@ TEST_F(ConfiguredProxyResolutionServiceTest, InitialPACScriptDownload) {
// At this point the ConfiguredProxyResolutionService should be waiting for
// the PacFileFetcher to invoke its completion callback, notifying it of PAC
// script download completion.
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
// Now that the PAC script is downloaded, it will have been sent to the proxy
// resolver.
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
JobMap jobs = GetPendingJobsForURLs(resolver, url1, url2, url3);
@@ -2415,19 +2414,20 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
ChangeScriptFetcherWhilePACDownloadInProgress) {
const GURL url1("http://request1");
const GURL url2("http://request2");
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 2 jobs.
@@ -2441,8 +2441,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
ProxyInfo info2;
TestCompletionCallback callback2;
@@ -2459,39 +2459,42 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
// We now change out the ConfiguredProxyResolutionService's script fetcher. We
// should restart the initialization with the new fetcher.
- fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ fetcher = std::make_unique<MockPacFileFetcher>();
+ fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
// Now that the PAC script is downloaded, it will have been sent to the proxy
// resolver.
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
GetPendingJobsForURLs(resolver, url1, url2);
}
// Test cancellation of a request, while the PAC script is being fetched.
TEST_F(ConfiguredProxyResolutionServiceTest, CancelWhilePACFetching) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 3 requests.
@@ -2506,8 +2509,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CancelWhilePACFetching) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
ProxyInfo info2;
TestCompletionCallback callback2;
@@ -2526,7 +2529,7 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CancelWhilePACFetching) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
// Cancel the first 2 jobs.
request1.reset();
@@ -2535,13 +2538,13 @@ TEST_F(ConfiguredProxyResolutionServiceTest, CancelWhilePACFetching) {
// At this point the ConfiguredProxyResolutionService should be waiting for
// the PacFileFetcher to invoke its completion callback, notifying it of PAC
// script download completion.
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
// Now that the PAC script is downloaded, it will have been sent to the
// proxy resolver.
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(GURL("http://request3"), resolver.pending_jobs()[0]->url());
@@ -2585,16 +2588,17 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
config.set_pac_url(GURL("http://foopy/proxy.pac"));
config.proxy_rules().ParseFromString("http=foopy:80"); // Won't be used.
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 2 requests.
@@ -2616,22 +2620,22 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Check that nothing has been sent to the proxy resolver factory yet.
- ASSERT_EQ(0u, factory->pending_requests().size());
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
// It should be trying to auto-detect first -- FAIL the autodetect during
// the script download.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(ERR_FAILED, std::string());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(ERR_FAILED, std::string());
// Next it should be trying the custom PAC url.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
// Now finally, the pending jobs should have been sent to the resolver
// (which was initialized with custom PAC script).
@@ -2672,16 +2676,17 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
config.set_pac_url(GURL("http://foopy/proxy.pac"));
config.proxy_rules().ParseFromString("http=foopy:80"); // Won't be used.
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 2 requests.
@@ -2703,24 +2708,24 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Check that nothing has been sent to the proxy resolver factory yet.
- ASSERT_EQ(0u, factory->pending_requests().size());
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
// It should be trying to auto-detect first -- succeed the download.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(OK, "invalid-script-contents");
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(OK, "invalid-script-contents");
// The script contents passed failed basic verification step (since didn't
// contain token FindProxyForURL), so it was never passed to the resolver.
// Next it should be trying the custom PAC url.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
// Now finally, the pending jobs should have been sent to the resolver
// (which was initialized with custom PAC script).
@@ -2753,15 +2758,16 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
config.set_pac_url(GURL("http://foopy/proxy.pac"));
config.proxy_rules().ParseFromString("http=foopy:80");
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 2 jobs.
@@ -2783,21 +2789,21 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Check that nothing has been sent to the proxy resolver factory yet.
- ASSERT_EQ(0u, factory->pending_requests().size());
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
// It should be trying to auto-detect first -- fail the download.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(ERR_FAILED, std::string());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(ERR_FAILED, std::string());
// Next it should be trying the custom PAC url -- fail the download.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(ERR_FAILED, std::string());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(ERR_FAILED, std::string());
// Since we never managed to initialize a resolver, nothing should have been
// sent to it.
- ASSERT_EQ(0u, factory->pending_requests().size());
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
// Verify that jobs ran as expected -- they should have fallen back to
// the manual proxy configuration for HTTP urls.
@@ -2816,16 +2822,17 @@ TEST_F(ConfiguredProxyResolutionServiceTest, BypassDoesntApplyToPac) {
config.proxy_rules().ParseFromString("http=foopy:80"); // Not used.
config.proxy_rules().bypass_rules.ParseFromString("www.google.com");
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 1 requests.
@@ -2839,16 +2846,16 @@ TEST_F(ConfiguredProxyResolutionServiceTest, BypassDoesntApplyToPac) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Check that nothing has been sent to the proxy resolver factory yet.
- ASSERT_EQ(0u, factory->pending_requests().size());
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
// It should be trying to auto-detect first -- succeed the download.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(GURL("http://www.google.com"), resolver.pending_jobs()[0]->url());
@@ -2890,15 +2897,16 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
ProxyConfig config =
ProxyConfig::CreateFromCustomPacURL(GURL("http://foopy/proxy.pac"));
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 1 request.
@@ -2912,12 +2920,12 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// Check that nothing has been sent to the proxy resolver factory yet.
- ASSERT_EQ(0u, factory->pending_requests().size());
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
// InitProxyResolver should have issued a request to the PacFileFetcher
// and be waiting on that to complete.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
}
// Delete the ConfiguredProxyResolutionService while InitProxyResolver has an
@@ -2926,14 +2934,14 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
// deleted prior to the InitProxyResolver).
TEST_F(ConfiguredProxyResolutionServiceTest,
DeleteWhileInitProxyResolverHasOutstandingSet) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
GURL url("http://www.google.com/");
@@ -2947,7 +2955,7 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->script_data()->url());
}
// Test that when going from a configuration that required PAC to one
@@ -2955,12 +2963,13 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
TEST_F(ConfiguredProxyResolutionServiceTest, UpdateConfigFromPACToDirect) {
ProxyConfig config = ProxyConfig::CreateAutoDetect();
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
+ auto* config_service_ptr = config_service.get();
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(false);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
// Start 1 request.
@@ -2975,8 +2984,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, UpdateConfigFromPACToDirect) {
// Successfully set the autodetect script.
EXPECT_EQ(PacFileData::TYPE_AUTO_DETECT,
- factory->pending_requests()[0]->script_data()->type());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->type());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
// Complete the pending request.
ASSERT_EQ(1u, resolver.pending_jobs().size());
@@ -2992,7 +3001,7 @@ TEST_F(ConfiguredProxyResolutionServiceTest, UpdateConfigFromPACToDirect) {
//
// This new configuration no longer has auto_detect set, so
// jobs should complete synchronously now as direct-connect.
- config_service->SetConfig(ProxyConfigWithAnnotation::CreateDirect());
+ config_service_ptr->SetConfig(ProxyConfigWithAnnotation::CreateDirect());
// Start another request -- the effective configuration has changed.
ProxyInfo info2;
@@ -3007,22 +3016,22 @@ TEST_F(ConfiguredProxyResolutionServiceTest, UpdateConfigFromPACToDirect) {
}
TEST_F(ConfiguredProxyResolutionServiceTest, NetworkChangeTriggersPacRefetch) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
RecordingNetLogObserver observer;
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory),
- net::NetLog::Get(),
- /*quick_check_enabled=*/true);
+ ConfiguredProxyResolutionService service(
+ std::move(config_service), std::move(factory), net::NetLog::Get(),
+ /*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Disable the "wait after IP address changes" hack, so this unit-test can
@@ -3040,22 +3049,22 @@ TEST_F(ConfiguredProxyResolutionServiceTest, NetworkChangeTriggersPacRefetch) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered initial download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
// At this point the ConfiguredProxyResolutionService should be waiting for
// the PacFileFetcher to invoke its completion callback, notifying it of PAC
// script download completion.
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
// Now that the PAC script is downloaded, the request will have been sent to
// the proxy resolver.
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(GURL("http://request1"), resolver.pending_jobs()[0]->url());
@@ -3085,21 +3094,21 @@ TEST_F(ConfiguredProxyResolutionServiceTest, NetworkChangeTriggersPacRefetch) {
// This second request should have triggered the re-download of the PAC
// script (since we marked the network as having changed).
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
// Simulate the PAC script fetch as having completed (this time with
// different data).
- fetcher->NotifyFetchCompletion(OK, kValidPacScript2);
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript2);
// Now that the PAC script is downloaded, the second request will have been
// sent to the proxy resolver.
EXPECT_EQ(kValidPacScript216,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(GURL("http://request2"), resolver.pending_jobs()[0]->url());
@@ -3134,19 +3143,20 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterFailure) {
ImmediatePollPolicy poll_policy;
ConfiguredProxyResolutionService::set_pac_script_poll_policy(&poll_policy);
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 1 request.
@@ -3160,11 +3170,11 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterFailure) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered initial download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
// At this point the ConfiguredProxyResolutionService should be waiting for
// the PacFileFetcher to invoke its completion callback, notifying it of PAC
@@ -3172,9 +3182,9 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterFailure) {
//
// We simulate a failed download attempt, the proxy service should now
// fall-back to DIRECT connections.
- fetcher->NotifyFetchCompletion(ERR_FAILED, std::string());
+ fetcher_ptr->NotifyFetchCompletion(ERR_FAILED, std::string());
- ASSERT_TRUE(factory->pending_requests().empty());
+ ASSERT_TRUE(factory_ptr->pending_requests().empty());
// Wait for completion callback, and verify it used DIRECT.
EXPECT_THAT(callback1.WaitForResult(), IsOk());
@@ -3188,24 +3198,24 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterFailure) {
//
// Note that we shouldn't have to wait long here, since our test enables a
// special unit-test mode.
- fetcher->WaitUntilFetch();
+ fetcher_ptr->WaitUntilFetch();
- ASSERT_TRUE(factory->pending_requests().empty());
+ ASSERT_TRUE(factory_ptr->pending_requests().empty());
// Make sure that our background checker is trying to download the expected
// PAC script (same one as before). This time we will simulate a successful
// download of the script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
base::RunLoop().RunUntilIdle();
// Now that the PAC script is downloaded, it should be used to initialize the
// ProxyResolver. Simulate a successful parse.
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
// At this point the ConfiguredProxyResolutionService should have
// re-configured itself to use the PAC script (thereby recovering from the
@@ -3245,19 +3255,20 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
ImmediatePollPolicy poll_policy;
ConfiguredProxyResolutionService::set_pac_script_poll_policy(&poll_policy);
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 1 request.
@@ -3271,22 +3282,22 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered initial download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
// At this point the ConfiguredProxyResolutionService should be waiting for
// the PacFileFetcher to invoke its completion callback, notifying it of PAC
// script download completion.
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
// Now that the PAC script is downloaded, the request will have been sent to
// the proxy resolver.
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(GURL("http://request1"), resolver.pending_jobs()[0]->url());
@@ -3306,25 +3317,25 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
//
// Note that we shouldn't have to wait long here, since our test enables a
// special unit-test mode.
- fetcher->WaitUntilFetch();
+ fetcher_ptr->WaitUntilFetch();
- ASSERT_TRUE(factory->pending_requests().empty());
+ ASSERT_TRUE(factory_ptr->pending_requests().empty());
ASSERT_TRUE(resolver.pending_jobs().empty());
// Make sure that our background checker is trying to download the expected
// PAC script (same one as before). This time we will simulate a successful
// download of a DIFFERENT script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(OK, kValidPacScript2);
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript2);
base::RunLoop().RunUntilIdle();
// Now that the PAC script is downloaded, it should be used to initialize the
// ProxyResolver. Simulate a successful parse.
EXPECT_EQ(kValidPacScript216,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
// At this point the ConfiguredProxyResolutionService should have
// re-configured itself to use the new PAC script.
@@ -3362,19 +3373,20 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
ImmediatePollPolicy poll_policy;
ConfiguredProxyResolutionService::set_pac_script_poll_policy(&poll_policy);
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 1 request.
@@ -3388,22 +3400,22 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered initial download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
// At this point the ConfiguredProxyResolutionService should be waiting for
// the PacFileFetcher to invoke its completion callback, notifying it of PAC
// script download completion.
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
// Now that the PAC script is downloaded, the request will have been sent to
// the proxy resolver.
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(GURL("http://request1"), resolver.pending_jobs()[0]->url());
@@ -3423,21 +3435,21 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
//
// Note that we shouldn't have to wait long here, since our test enables a
// special unit-test mode.
- fetcher->WaitUntilFetch();
+ fetcher_ptr->WaitUntilFetch();
- ASSERT_TRUE(factory->pending_requests().empty());
+ ASSERT_TRUE(factory_ptr->pending_requests().empty());
ASSERT_TRUE(resolver.pending_jobs().empty());
// Make sure that our background checker is trying to download the expected
// PAC script (same one as before). We will simulate the same response as
// last time (i.e. the script is unchanged).
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
base::RunLoop().RunUntilIdle();
- ASSERT_TRUE(factory->pending_requests().empty());
+ ASSERT_TRUE(factory_ptr->pending_requests().empty());
ASSERT_TRUE(resolver.pending_jobs().empty());
// At this point the ConfiguredProxyResolutionService is still running the
@@ -3475,19 +3487,20 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterSuccess) {
ImmediatePollPolicy poll_policy;
ConfiguredProxyResolutionService::set_pac_script_poll_policy(&poll_policy);
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 1 request.
@@ -3501,22 +3514,22 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterSuccess) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered initial download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
// At this point the ConfiguredProxyResolutionService should be waiting for
// the PacFileFetcher to invoke its completion callback, notifying it of PAC
// script download completion.
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
// Now that the PAC script is downloaded, the request will have been sent to
// the proxy resolver.
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(GURL("http://request1"), resolver.pending_jobs()[0]->url());
@@ -3536,17 +3549,17 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterSuccess) {
//
// Note that we shouldn't have to wait long here, since our test enables a
// special unit-test mode.
- fetcher->WaitUntilFetch();
+ fetcher_ptr->WaitUntilFetch();
- ASSERT_TRUE(factory->pending_requests().empty());
+ ASSERT_TRUE(factory_ptr->pending_requests().empty());
ASSERT_TRUE(resolver.pending_jobs().empty());
// Make sure that our background checker is trying to download the expected
// PAC script (same one as before). This time we will simulate a failure
// to download the script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(ERR_FAILED, std::string());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(ERR_FAILED, std::string());
base::RunLoop().RunUntilIdle();
@@ -3650,19 +3663,20 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterActivity) {
ImmediateAfterActivityPollPolicy poll_policy;
ConfiguredProxyResolutionService::set_pac_script_poll_policy(&poll_policy);
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 1 request.
@@ -3676,22 +3690,22 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterActivity) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered initial download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
// Nothing has been sent to the factory yet.
- EXPECT_TRUE(factory->pending_requests().empty());
+ EXPECT_TRUE(factory_ptr->pending_requests().empty());
// At this point the ConfiguredProxyResolutionService should be waiting for
// the PacFileFetcher to invoke its completion callback, notifying it of PAC
// script download completion.
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
// Now that the PAC script is downloaded, the request will have been sent to
// the proxy resolver.
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(GURL("http://request1"), resolver.pending_jobs()[0]->url());
@@ -3708,8 +3722,8 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterActivity) {
// Our PAC poller is set to update ONLY in response to network activity,
// (i.e. another call to ResolveProxy()).
- ASSERT_FALSE(fetcher->has_pending_request());
- ASSERT_TRUE(factory->pending_requests().empty());
+ ASSERT_FALSE(fetcher_ptr->has_pending_request());
+ ASSERT_TRUE(factory_ptr->pending_requests().empty());
ASSERT_TRUE(resolver.pending_jobs().empty());
// Start a second request.
@@ -3733,11 +3747,11 @@ TEST_F(ConfiguredProxyResolutionServiceTest, PACScriptRefetchAfterActivity) {
// In response to getting that resolve request, the poller should have
// started the next poll, and made it as far as to request the download.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
// This time we will fail the download, to simulate a PAC script change.
- fetcher->NotifyFetchCompletion(ERR_FAILED, std::string());
+ fetcher_ptr->NotifyFetchCompletion(ERR_FAILED, std::string());
// Drain the message loop, so ConfiguredProxyResolutionService is notified of
// the change and has a chance to re-configure itself.
@@ -3930,13 +3944,12 @@ TEST_F(ConfiguredProxyResolutionServiceTest, DnsChangeNoopWithoutResolver) {
class SanitizeUrlHelper {
public:
SanitizeUrlHelper() {
- std::unique_ptr<MockProxyConfigService> config_service(
- new MockProxyConfigService("http://foopy/proxy.pac"));
-
- factory = new MockAsyncProxyResolverFactory(false);
-
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(false);
+ auto* factory_ptr = factory.get();
service_ = std::make_unique<ConfiguredProxyResolutionService>(
- std::move(config_service), base::WrapUnique(factory.get()), nullptr,
+ std::move(config_service), std::move(factory), nullptr,
/*quick_check_enabled=*/true);
// Do an initial request to initialize the service (configure the PAC
@@ -3953,8 +3966,8 @@ class SanitizeUrlHelper {
// First step is to download the PAC script.
EXPECT_EQ(GURL("http://foopy/proxy.pac"),
- factory->pending_requests()[0]->script_data()->url());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->url());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
EXPECT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(url, resolver.pending_jobs()[0]->url());
@@ -3994,7 +4007,6 @@ class SanitizeUrlHelper {
private:
MockAsyncProxyResolver resolver;
- raw_ptr<MockAsyncProxyResolverFactory> factory;
std::unique_ptr<ConfiguredProxyResolutionService> service_;
};
@@ -4092,19 +4104,19 @@ TEST_F(ConfiguredProxyResolutionServiceTest, SanitizeUrlForPacScript) {
}
TEST_F(ConfiguredProxyResolutionServiceTest, OnShutdownWithLiveRequest) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
ProxyInfo info;
@@ -4116,29 +4128,29 @@ TEST_F(ConfiguredProxyResolutionServiceTest, OnShutdownWithLiveRequest) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// The first request should have triggered download of PAC script.
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher_ptr->pending_request_url());
service.OnShutdown();
base::RunLoop().RunUntilIdle();
EXPECT_FALSE(callback.have_result());
- EXPECT_FALSE(fetcher->has_pending_request());
+ EXPECT_FALSE(fetcher_ptr->has_pending_request());
}
TEST_F(ConfiguredProxyResolutionServiceTest, OnShutdownFollowedByRequest) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
+ auto config_service =
+ std::make_unique<MockProxyConfigService>("http://foopy/proxy.pac");
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
service.OnShutdown();
@@ -4150,7 +4162,7 @@ TEST_F(ConfiguredProxyResolutionServiceTest, OnShutdownFollowedByRequest) {
GURL("http://request/"), std::string(), NetworkIsolationKey(), &info,
callback.callback(), &request, NetLogWithSource());
EXPECT_THAT(rv, IsOk());
- EXPECT_FALSE(fetcher->has_pending_request());
+ EXPECT_FALSE(fetcher_ptr->has_pending_request());
EXPECT_TRUE(info.is_direct());
}
@@ -4176,7 +4188,7 @@ TEST_F(ConfiguredProxyResolutionServiceTest,
config.proxy_rules().ParseFromString("foopy1:8080");
config.set_auto_detect(false);
- auto service = ConfiguredProxyResolutionService::CreateFixed(
+ auto service = ConfiguredProxyResolutionService::CreateFixedForTest(
ProxyConfigWithAnnotation(config, TRAFFIC_ANNOTATION_FOR_TESTS));
// A normal request should use the proxy.
@@ -4213,16 +4225,17 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ImplicitlyBypassWithPac) {
ProxyConfig config;
config.set_auto_detect(true);
- MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ auto config_service = std::make_unique<MockProxyConfigService>(config);
MockAsyncProxyResolver resolver;
- MockAsyncProxyResolverFactory* factory =
- new MockAsyncProxyResolverFactory(true);
- ConfiguredProxyResolutionService service(base::WrapUnique(config_service),
- base::WrapUnique(factory), nullptr,
+ auto factory = std::make_unique<MockAsyncProxyResolverFactory>(true);
+ auto* factory_ptr = factory.get();
+ ConfiguredProxyResolutionService service(std::move(config_service),
+ std::move(factory), nullptr,
/*quick_check_enabled=*/true);
- MockPacFileFetcher* fetcher = new MockPacFileFetcher;
- service.SetPacFileFetchers(base::WrapUnique(fetcher),
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ auto* fetcher_ptr = fetcher.get();
+ service.SetPacFileFetchers(std::move(fetcher),
std::make_unique<DoNothingDhcpPacFileFetcher>());
// Start 1 requests.
@@ -4236,14 +4249,14 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ImplicitlyBypassWithPac) {
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
// This started auto-detect; complete it.
- ASSERT_EQ(0u, factory->pending_requests().size());
- EXPECT_TRUE(fetcher->has_pending_request());
- EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher->pending_request_url());
- fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+ ASSERT_EQ(0u, factory_ptr->pending_requests().size());
+ EXPECT_TRUE(fetcher_ptr->has_pending_request());
+ EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher_ptr->pending_request_url());
+ fetcher_ptr->NotifyFetchCompletion(OK, kValidPacScript1);
EXPECT_EQ(kValidPacScript116,
- factory->pending_requests()[0]->script_data()->utf16());
- factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
+ factory_ptr->pending_requests()[0]->script_data()->utf16());
+ factory_ptr->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
ASSERT_EQ(1u, resolver.pending_jobs().size());
EXPECT_EQ(GURL("http://www.google.com"), resolver.pending_jobs()[0]->url());
@@ -4276,11 +4289,11 @@ TEST_F(ConfiguredProxyResolutionServiceTest, ImplicitlyBypassWithPac) {
TEST_F(ConfiguredProxyResolutionServiceTest,
CastToConfiguredProxyResolutionService) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService(ProxyConfig::CreateDirect());
+ auto config_service =
+ std::make_unique<MockProxyConfigService>(ProxyConfig::CreateDirect());
ConfiguredProxyResolutionService service(
- base::WrapUnique(config_service),
+ std::move(config_service),
std::make_unique<MockAsyncProxyResolverFactory>(false), nullptr,
/*quick_check_enabled=*/true);
diff --git a/chromium/net/proxy_resolution/mock_proxy_resolver.cc b/chromium/net/proxy_resolution/mock_proxy_resolver.cc
index 15fb145dc3f..4a099722259 100644
--- a/chromium/net/proxy_resolution/mock_proxy_resolver.cc
+++ b/chromium/net/proxy_resolution/mock_proxy_resolver.cc
@@ -54,7 +54,7 @@ int MockAsyncProxyResolver::GetProxyForURL(
CompletionOnceCallback callback,
std::unique_ptr<Request>* request,
const NetLogWithSource& /*net_log*/) {
- std::unique_ptr<Job> job(new Job(this, url, results, std::move(callback)));
+ auto job = std::make_unique<Job>(this, url, results, std::move(callback));
pending_jobs_.push_back(job.get());
*request = std::make_unique<RequestImpl>(std::move(job));
@@ -144,8 +144,8 @@ int MockAsyncProxyResolverFactory::CreateProxyResolver(
std::unique_ptr<ProxyResolver>* resolver,
CompletionOnceCallback callback,
std::unique_ptr<ProxyResolverFactory::Request>* request_handle) {
- scoped_refptr<Request> request =
- new Request(this, pac_script, resolver, std::move(callback));
+ auto request = base::MakeRefCounted<Request>(this, pac_script, resolver,
+ std::move(callback));
pending_requests_.push_back(request);
*request_handle = std::make_unique<Job>(request);
diff --git a/chromium/net/proxy_resolution/multi_threaded_proxy_resolver.cc b/chromium/net/proxy_resolution/multi_threaded_proxy_resolver.cc
index 7a587a0fbc1..1d4429bd4c3 100644
--- a/chromium/net/proxy_resolution/multi_threaded_proxy_resolver.cc
+++ b/chromium/net/proxy_resolution/multi_threaded_proxy_resolver.cc
@@ -59,7 +59,7 @@ class Executor : public base::RefCountedThreadSafe<Executor> {
Executor(Coordinator* coordinator, int thread_number);
// Submit a job to this executor.
- void StartJob(Job* job);
+ void StartJob(scoped_refptr<Job> job);
// Callback for when a job has completed running on the executor's thread.
void OnJobCompleted(Job* job);
@@ -361,7 +361,7 @@ Executor::Executor(Executor::Coordinator* coordinator, int thread_number)
CHECK(thread_->Start());
}
-void Executor::StartJob(Job* job) {
+void Executor::StartJob(scoped_refptr<Job> job) {
DCHECK(!outstanding_job_.get());
outstanding_job_ = job;
@@ -452,8 +452,8 @@ int MultiThreadedProxyResolver::GetProxyForURL(
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!callback.is_null());
- scoped_refptr<GetProxyForURLJob> job(new GetProxyForURLJob(
- url, network_isolation_key, results, std::move(callback), net_log));
+ auto job = base::MakeRefCounted<GetProxyForURLJob>(
+ url, network_isolation_key, results, std::move(callback), net_log);
// Completion will be notified through |callback|, unless the caller cancels
// the request using |request|.
@@ -464,7 +464,7 @@ int MultiThreadedProxyResolver::GetProxyForURL(
Executor* executor = FindIdleExecutor();
if (executor) {
DCHECK_EQ(0u, pending_jobs_.size());
- executor->StartJob(job.get());
+ executor->StartJob(job);
return ERR_IO_PENDING;
}
@@ -483,10 +483,9 @@ int MultiThreadedProxyResolver::GetProxyForURL(
Executor* MultiThreadedProxyResolver::FindIdleExecutor() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- for (auto it = executors_.begin(); it != executors_.end(); ++it) {
- Executor* executor = it->get();
+ for (auto& executor : executors_) {
if (!executor->outstanding_job())
- return executor;
+ return executor.get();
}
return nullptr;
}
@@ -496,10 +495,11 @@ void MultiThreadedProxyResolver::AddNewExecutor() {
DCHECK_LT(executors_.size(), max_num_threads_);
// The "thread number" is used to give the thread a unique name.
int thread_number = executors_.size();
- Executor* executor = new Executor(this, thread_number);
- executor->StartJob(
- new CreateResolverJob(script_data_, resolver_factory_.get()));
- executors_.push_back(base::WrapRefCounted(executor));
+
+ auto executor = base::MakeRefCounted<Executor>(this, thread_number);
+ executor->StartJob(base::MakeRefCounted<CreateResolverJob>(
+ script_data_, resolver_factory_.get()));
+ executors_.push_back(std::move(executor));
}
void MultiThreadedProxyResolver::OnExecutorReady(Executor* executor) {
@@ -508,7 +508,7 @@ void MultiThreadedProxyResolver::OnExecutorReady(Executor* executor) {
scoped_refptr<Job> job = pending_jobs_.front();
pending_jobs_.pop_front();
if (!job->was_cancelled()) {
- executor->StartJob(job.get());
+ executor->StartJob(std::move(job));
return;
}
}
@@ -531,10 +531,10 @@ class MultiThreadedProxyResolverFactory::Job
resolver_factory_(std::move(resolver_factory)),
max_num_threads_(max_num_threads),
script_data_(script_data),
- executor_(new Executor(this, 0)),
+ executor_(base::MakeRefCounted<Executor>(this, 0)),
callback_(std::move(callback)) {
- executor_->StartJob(
- new CreateResolverJob(script_data_, resolver_factory_.get()));
+ executor_->StartJob(base::MakeRefCounted<CreateResolverJob>(
+ script_data_, resolver_factory_.get()));
}
~Job() override {
@@ -594,9 +594,9 @@ int MultiThreadedProxyResolverFactory::CreateProxyResolver(
std::unique_ptr<ProxyResolver>* resolver,
CompletionOnceCallback callback,
std::unique_ptr<Request>* request) {
- std::unique_ptr<Job> job(new Job(this, pac_script, resolver,
+ auto job = std::make_unique<Job>(this, pac_script, resolver,
CreateProxyResolverFactory(),
- max_num_threads_, std::move(callback)));
+ max_num_threads_, std::move(callback));
jobs_.insert(job.get());
*request = std::move(job);
return ERR_IO_PENDING;
diff --git a/chromium/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc b/chromium/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc
index 30a80e5ca0d..12eb336bb4d 100644
--- a/chromium/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc
+++ b/chromium/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc
@@ -188,10 +188,11 @@ class BlockableProxyResolverFactory : public ProxyResolverFactory {
std::unique_ptr<ProxyResolver>* result,
CompletionOnceCallback callback,
std::unique_ptr<Request>* request) override {
- BlockableProxyResolver* resolver = new BlockableProxyResolver;
- result->reset(resolver);
+ auto resolver = std::make_unique<BlockableProxyResolver>();
+ BlockableProxyResolver* resolver_ptr = resolver.get();
+ *result = std::move(resolver);
base::AutoLock lock(lock_);
- resolvers_.push_back(resolver);
+ resolvers_.push_back(resolver_ptr);
script_data_.push_back(script_data);
return OK;
}
@@ -233,8 +234,7 @@ class SingleShotMultiThreadedProxyResolverFactory
class MultiThreadedProxyResolverTest : public TestWithTaskEnvironment {
public:
void Init(size_t num_threads) {
- std::unique_ptr<BlockableProxyResolverFactory> factory_owner(
- new BlockableProxyResolverFactory);
+ auto factory_owner = std::make_unique<BlockableProxyResolverFactory>();
factory_ = factory_owner.get();
resolver_factory_ =
std::make_unique<SingleShotMultiThreadedProxyResolverFactory>(
diff --git a/chromium/net/proxy_resolution/network_delegate_error_observer.cc b/chromium/net/proxy_resolution/network_delegate_error_observer.cc
index 82612459f00..563af122fb7 100644
--- a/chromium/net/proxy_resolution/network_delegate_error_observer.cc
+++ b/chromium/net/proxy_resolution/network_delegate_error_observer.cc
@@ -69,8 +69,7 @@ void NetworkDelegateErrorObserver::Core::Shutdown() {
NetworkDelegateErrorObserver::NetworkDelegateErrorObserver(
NetworkDelegate* network_delegate,
base::SingleThreadTaskRunner* origin_runner)
- : core_(new Core(network_delegate, origin_runner)) {
-}
+ : core_(base::MakeRefCounted<Core>(network_delegate, origin_runner)) {}
NetworkDelegateErrorObserver::~NetworkDelegateErrorObserver() {
core_->Shutdown();
diff --git a/chromium/net/proxy_resolution/pac_file_data.cc b/chromium/net/proxy_resolution/pac_file_data.cc
index 6e695f5b99c..eee2fce42ac 100644
--- a/chromium/net/proxy_resolution/pac_file_data.cc
+++ b/chromium/net/proxy_resolution/pac_file_data.cc
@@ -11,22 +11,26 @@ namespace net {
// static
scoped_refptr<PacFileData> PacFileData::FromUTF8(const std::string& utf8) {
- return new PacFileData(TYPE_SCRIPT_CONTENTS, GURL(), base::UTF8ToUTF16(utf8));
+ return base::WrapRefCounted(
+ new PacFileData(TYPE_SCRIPT_CONTENTS, GURL(), base::UTF8ToUTF16(utf8)));
}
// static
scoped_refptr<PacFileData> PacFileData::FromUTF16(const std::u16string& utf16) {
- return new PacFileData(TYPE_SCRIPT_CONTENTS, GURL(), utf16);
+ return base::WrapRefCounted(
+ new PacFileData(TYPE_SCRIPT_CONTENTS, GURL(), utf16));
}
// static
scoped_refptr<PacFileData> PacFileData::FromURL(const GURL& url) {
- return new PacFileData(TYPE_SCRIPT_URL, url, std::u16string());
+ return base::WrapRefCounted(
+ new PacFileData(TYPE_SCRIPT_URL, url, std::u16string()));
}
// static
scoped_refptr<PacFileData> PacFileData::ForAutoDetect() {
- return new PacFileData(TYPE_AUTO_DETECT, GURL(), std::u16string());
+ return base::WrapRefCounted(
+ new PacFileData(TYPE_AUTO_DETECT, GURL(), std::u16string()));
}
const std::u16string& PacFileData::utf16() const {
diff --git a/chromium/net/proxy_resolution/pac_file_decider.cc b/chromium/net/proxy_resolution/pac_file_decider.cc
index b779e60c2bf..62af8a9e40e 100644
--- a/chromium/net/proxy_resolution/pac_file_decider.cc
+++ b/chromium/net/proxy_resolution/pac_file_decider.cc
@@ -68,7 +68,7 @@ PacFileDataWithSource& PacFileDataWithSource::operator=(
base::Value PacFileDecider::PacSource::NetLogParams(
const GURL& effective_pac_url) const {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
std::string source;
switch (type) {
case PacSource::WPAD_DHCP:
@@ -83,8 +83,8 @@ base::Value PacFileDecider::PacSource::NetLogParams(
source += effective_pac_url.possibly_invalid_spec();
break;
}
- dict.SetStringKey("source", source);
- return dict;
+ dict.Set("source", source);
+ return base::Value(std::move(dict));
}
PacFileDecider::PacFileDecider(PacFileFetcher* pac_file_fetcher,
diff --git a/chromium/net/proxy_resolution/pac_file_decider.h b/chromium/net/proxy_resolution/pac_file_decider.h
index ca8debddcb8..86ba3b7cac8 100644
--- a/chromium/net/proxy_resolution/pac_file_decider.h
+++ b/chromium/net/proxy_resolution/pac_file_decider.h
@@ -43,7 +43,7 @@ class PacFileFetcher;
// both for auto-detect and not.
struct NET_EXPORT_PRIVATE PacFileDataWithSource {
PacFileDataWithSource();
- explicit PacFileDataWithSource(const PacFileDataWithSource&);
+ PacFileDataWithSource(const PacFileDataWithSource&);
~PacFileDataWithSource();
PacFileDataWithSource& operator=(const PacFileDataWithSource&);
diff --git a/chromium/net/proxy_resolution/pac_file_decider_unittest.cc b/chromium/net/proxy_resolution/pac_file_decider_unittest.cc
index fa086e09348..df2cbd23b9c 100644
--- a/chromium/net/proxy_resolution/pac_file_decider_unittest.cc
+++ b/chromium/net/proxy_resolution/pac_file_decider_unittest.cc
@@ -88,9 +88,9 @@ class Rules {
}
const Rule& GetRuleByUrl(const GURL& url) const {
- for (auto it = rules_.begin(); it != rules_.end(); ++it) {
- if (it->url == url)
- return *it;
+ for (const auto& rule : rules_) {
+ if (rule.url == url)
+ return rule;
}
LOG(FATAL) << "Rule not found for " << url;
return rules_[0];
@@ -852,8 +852,7 @@ TEST(PacFileDeciderTest, DhcpCancelledByDestructor) {
Rules rules;
RuleBasedPacFileFetcher fetcher(&rules);
- std::unique_ptr<AsyncFailDhcpFetcher> dhcp_fetcher(
- new AsyncFailDhcpFetcher());
+ auto dhcp_fetcher = std::make_unique<AsyncFailDhcpFetcher>();
ProxyConfig config;
config.set_auto_detect(true);
diff --git a/chromium/net/proxy_resolution/polling_proxy_config_service.cc b/chromium/net/proxy_resolution/polling_proxy_config_service.cc
index a21d4cd8009..cc3b8e6e73e 100644
--- a/chromium/net/proxy_resolution/polling_proxy_config_service.cc
+++ b/chromium/net/proxy_resolution/polling_proxy_config_service.cc
@@ -183,7 +183,9 @@ PollingProxyConfigService::PollingProxyConfigService(
base::TimeDelta poll_interval,
GetConfigFunction get_config_func,
const NetworkTrafficAnnotationTag& traffic_annotation)
- : core_(new Core(poll_interval, get_config_func, traffic_annotation)) {}
+ : core_(base::MakeRefCounted<Core>(poll_interval,
+ get_config_func,
+ traffic_annotation)) {}
PollingProxyConfigService::~PollingProxyConfigService() {
core_->Orphan();
diff --git a/chromium/net/proxy_resolution/proxy_config.cc b/chromium/net/proxy_resolution/proxy_config.cc
index 5908492de9c..89dcb6d0c3b 100644
--- a/chromium/net/proxy_resolution/proxy_config.cc
+++ b/chromium/net/proxy_resolution/proxy_config.cc
@@ -23,9 +23,9 @@ namespace {
// If |proxies| is non-empty, sets it in |dict| under the key |name|.
void AddProxyListToValue(const char* name,
const ProxyList& proxies,
- base::Value* dict) {
+ base::Value::Dict* dict) {
if (!proxies.IsEmpty())
- dict->SetKey(name, proxies.ToValue());
+ dict->Set(name, proxies.ToValue());
}
// Split the |uri_list| on commas and add each entry to |proxy_list| in turn.
@@ -232,18 +232,18 @@ void ProxyConfig::ClearAutomaticSettings() {
}
base::Value ProxyConfig::ToValue() const {
- base::Value dict(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict;
// Output the automatic settings.
if (auto_detect_)
- dict.SetBoolKey("auto_detect", auto_detect_);
+ dict.Set("auto_detect", auto_detect_);
if (has_pac_url()) {
- dict.SetStringKey("pac_url", pac_url_.possibly_invalid_spec());
+ dict.Set("pac_url", pac_url_.possibly_invalid_spec());
if (pac_mandatory_)
- dict.SetBoolKey("pac_mandatory", pac_mandatory_);
+ dict.Set("pac_mandatory", pac_mandatory_);
}
if (from_system_) {
- dict.SetBoolKey("from_system", from_system_);
+ dict.Set("from_system", from_system_);
}
// Output the manual settings.
@@ -253,12 +253,12 @@ base::Value ProxyConfig::ToValue() const {
AddProxyListToValue("single_proxy", proxy_rules_.single_proxies, &dict);
break;
case ProxyRules::Type::PROXY_LIST_PER_SCHEME: {
- base::Value dict2(base::Value::Type::DICTIONARY);
+ base::Value::Dict dict2;
AddProxyListToValue("http", proxy_rules_.proxies_for_http, &dict2);
AddProxyListToValue("https", proxy_rules_.proxies_for_https, &dict2);
AddProxyListToValue("ftp", proxy_rules_.proxies_for_ftp, &dict2);
AddProxyListToValue("fallback", proxy_rules_.fallback_proxies, &dict2);
- dict.SetKey("proxy_per_scheme", std::move(dict2));
+ dict.Set("proxy_per_scheme", std::move(dict2));
break;
}
default:
@@ -269,18 +269,18 @@ base::Value ProxyConfig::ToValue() const {
const ProxyBypassRules& bypass = proxy_rules_.bypass_rules;
if (!bypass.rules().empty()) {
if (proxy_rules_.reverse_bypass)
- dict.SetBoolKey("reverse_bypass", true);
+ dict.Set("reverse_bypass", true);
base::Value list(base::Value::Type::LIST);
for (const auto& bypass_rule : bypass.rules())
list.Append(bypass_rule->ToString());
- dict.SetKey("bypass_list", std::move(list));
+ dict.Set("bypass_list", std::move(list));
}
}
- return dict;
+ return base::Value(std::move(dict));
}
} // namespace net
diff --git a/chromium/net/proxy_resolution/proxy_config_service.cc b/chromium/net/proxy_resolution/proxy_config_service.cc
new file mode 100644
index 00000000000..25d8a321619
--- /dev/null
+++ b/chromium/net/proxy_resolution/proxy_config_service.cc
@@ -0,0 +1,143 @@
+// Copyright 2022 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.
+
+#include "net/proxy_resolution/proxy_config_service.h"
+
+#include <memory>
+
+#include "base/logging.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "build/build_config.h"
+#include "net/proxy_resolution/proxy_config_with_annotation.h"
+
+#if BUILDFLAG(IS_WIN)
+#include "net/proxy_resolution/win/proxy_config_service_win.h"
+#elif BUILDFLAG(IS_IOS)
+#include "net/proxy_resolution/proxy_config_service_ios.h"
+#elif BUILDFLAG(IS_MAC)
+#include "net/proxy_resolution/proxy_config_service_mac.h"
+#elif BUILDFLAG(IS_LINUX)
+#include "net/proxy_resolution/proxy_config_service_linux.h"
+#elif BUILDFLAG(IS_ANDROID)
+#include "net/proxy_resolution/proxy_config_service_android.h"
+#endif
+
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX)
+#include "net/traffic_annotation/network_traffic_annotation.h"
+#endif
+
+namespace net {
+
+namespace {
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX)
+constexpr net::NetworkTrafficAnnotationTag kSystemProxyConfigTrafficAnnotation =
+ net::DefineNetworkTrafficAnnotation("proxy_config_system", R"(
+ semantics {
+ sender: "Proxy Config"
+ description:
+ "Establishing a connection through a proxy server using system proxy "
+ "settings."
+ trigger:
+ "Whenever a network request is made when the system proxy settings "
+ "are used, and they indicate to use a proxy server."
+ data:
+ "Proxy configuration."
+ destination: OTHER
+ destination_other:
+ "The proxy server specified in the configuration."
+ }
+ policy {
+ cookies_allowed: NO
+ setting:
+ "User cannot override system proxy settings, but can change them "
+ "through 'Advanced/System/Open proxy settings'."
+ policy_exception_justification:
+ "Using either of 'ProxyMode', 'ProxyServer', or 'ProxyPacUrl' "
+ "policies can set Chrome to use a specific proxy settings and avoid "
+ "system proxy."
+ })");
+#endif
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+class UnsetProxyConfigService : public ProxyConfigService {
+ public:
+ UnsetProxyConfigService() = default;
+ ~UnsetProxyConfigService() override = default;
+
+ void AddObserver(Observer* observer) override {}
+ void RemoveObserver(Observer* observer) override {}
+ ConfigAvailability GetLatestProxyConfig(
+ ProxyConfigWithAnnotation* config) override {
+ return CONFIG_UNSET;
+ }
+};
+#endif
+
+// Config getter that always returns direct settings.
+class ProxyConfigServiceDirect : public ProxyConfigService {
+ public:
+ // ProxyConfigService implementation:
+ void AddObserver(Observer* observer) override {}
+ void RemoveObserver(Observer* observer) override {}
+ ConfigAvailability GetLatestProxyConfig(
+ ProxyConfigWithAnnotation* config) override {
+ *config = ProxyConfigWithAnnotation::CreateDirect();
+ return CONFIG_VALID;
+ }
+};
+
+} // namespace
+
+// static
+std::unique_ptr<ProxyConfigService>
+ProxyConfigService::CreateSystemProxyConfigService(
+ scoped_refptr<base::SequencedTaskRunner> main_task_runner) {
+#if BUILDFLAG(IS_WIN)
+ return std::make_unique<ProxyConfigServiceWin>(
+ kSystemProxyConfigTrafficAnnotation);
+#elif BUILDFLAG(IS_IOS)
+ return std::make_unique<ProxyConfigServiceIOS>(
+ kSystemProxyConfigTrafficAnnotation);
+#elif BUILDFLAG(IS_MAC)
+ return std::make_unique<ProxyConfigServiceMac>(
+ std::move(main_task_runner), kSystemProxyConfigTrafficAnnotation);
+#elif BUILDFLAG(IS_CHROMEOS_ASH)
+ LOG(ERROR) << "ProxyConfigService for ChromeOS should be created in "
+ << "profile_io_data.cc::CreateProxyConfigService and this should "
+ << "be used only for examples.";
+ return std::make_unique<UnsetProxyConfigService>();
+#elif BUILDFLAG(IS_LINUX)
+ std::unique_ptr<ProxyConfigServiceLinux> linux_config_service(
+ std::make_unique<ProxyConfigServiceLinux>());
+
+ // Assume we got called on the thread that runs the default glib
+ // main loop, so the current thread is where we should be running
+ // gsettings calls from.
+ scoped_refptr<base::SingleThreadTaskRunner> glib_thread_task_runner =
+ base::ThreadTaskRunnerHandle::Get();
+
+ // Synchronously fetch the current proxy config (since we are running on
+ // glib_default_loop). Additionally register for notifications (delivered in
+ // either |glib_default_loop| or an internal sequenced task runner) to
+ // keep us updated when the proxy config changes.
+ linux_config_service->SetupAndFetchInitialConfig(
+ glib_thread_task_runner, std::move(main_task_runner),
+ kSystemProxyConfigTrafficAnnotation);
+
+ return std::move(linux_config_service);
+#elif BUILDFLAG(IS_ANDROID)
+ return std::make_unique<ProxyConfigServiceAndroid>(
+ std::move(main_task_runner), base::ThreadTaskRunnerHandle::Get());
+#elif BUILDFLAG(IS_FUCHSIA)
+ // TODO(crbug.com/889195): Implement a system proxy service for Fuchsia.
+ return std::make_unique<ProxyConfigServiceDirect>();
+#else
+ LOG(WARNING) << "Failed to choose a system proxy settings fetcher "
+ "for this platform.";
+ return std::make_unique<ProxyConfigServiceDirect>();
+#endif
+}
+
+} // namespace net
diff --git a/chromium/net/proxy_resolution/proxy_config_service.h b/chromium/net/proxy_resolution/proxy_config_service.h
index 2f16f29b73a..9c8273781da 100644
--- a/chromium/net/proxy_resolution/proxy_config_service.h
+++ b/chromium/net/proxy_resolution/proxy_config_service.h
@@ -5,8 +5,15 @@
#ifndef NET_PROXY_RESOLUTION_PROXY_CONFIG_SERVICE_H_
#define NET_PROXY_RESOLUTION_PROXY_CONFIG_SERVICE_H_
+#include <memory>
+
+#include "base/memory/ref_counted.h"
#include "net/base/net_export.h"
+namespace base {
+class SequencedTaskRunner;
+} // namespace base
+
namespace net {
class ProxyConfigWithAnnotation;
@@ -27,7 +34,7 @@ class NET_EXPORT ProxyConfigService {
// Observer for being notified when the proxy settings have changed.
class NET_EXPORT Observer {
public:
- virtual ~Observer() {}
+ virtual ~Observer() = default;
// Notification callback that should be invoked by ProxyConfigService
// implementors whenever the configuration changes. |availability| indicates
// the new availability status and can be CONFIG_UNSET or CONFIG_VALID (in
@@ -37,7 +44,7 @@ class NET_EXPORT ProxyConfigService {
ConfigAvailability availability) = 0;
};
- virtual ~ProxyConfigService() {}
+ virtual ~ProxyConfigService() = default;
// Adds/Removes an observer that will be called whenever the proxy
// configuration has changed.
@@ -62,6 +69,12 @@ class NET_EXPORT ProxyConfigService {
// X seconds at which point they check for changes. However that has
// the disadvantage of doing continuous work even during idle periods.
virtual void OnLazyPoll() {}
+
+ // Creates a config service appropriate for this platform that fetches the
+ // system proxy settings. |main_task_runner| is the sequence where the
+ // consumer of the ProxyConfigService will live.
+ static std::unique_ptr<ProxyConfigService> CreateSystemProxyConfigService(
+ scoped_refptr<base::SequencedTaskRunner> main_task_runner);
};
} // namespace net
diff --git a/chromium/net/proxy_resolution/proxy_config_service_android.cc b/chromium/net/proxy_resolution/proxy_config_service_android.cc
index 9dc7a7b3bc8..4eb28c616a2 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_android.cc
+++ b/chromium/net/proxy_resolution/proxy_config_service_android.cc
@@ -451,7 +451,7 @@ class ProxyConfigServiceAndroid::Delegate
const raw_ptr<Delegate> delegate_;
};
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
void ShutdownInJNISequence() {
if (java_proxy_change_listener_.is_null())
@@ -495,9 +495,10 @@ class ProxyConfigServiceAndroid::Delegate
ProxyConfigServiceAndroid::ProxyConfigServiceAndroid(
const scoped_refptr<base::SequencedTaskRunner>& main_task_runner,
const scoped_refptr<base::SequencedTaskRunner>& jni_task_runner)
- : delegate_(new Delegate(main_task_runner,
- jni_task_runner,
- base::BindRepeating(&GetJavaProperty))) {
+ : delegate_(base::MakeRefCounted<Delegate>(
+ main_task_runner,
+ jni_task_runner,
+ base::BindRepeating(&GetJavaProperty))) {
delegate_->SetupJNI();
delegate_->FetchInitialConfig();
}
@@ -528,9 +529,9 @@ ProxyConfigServiceAndroid::ProxyConfigServiceAndroid(
const scoped_refptr<base::SequencedTaskRunner>& main_task_runner,
const scoped_refptr<base::SequencedTaskRunner>& jni_task_runner,
GetPropertyCallback get_property_callback)
- : delegate_(new Delegate(main_task_runner,
- jni_task_runner,
- get_property_callback)) {
+ : delegate_(base::MakeRefCounted<Delegate>(main_task_runner,
+ jni_task_runner,
+ get_property_callback)) {
delegate_->SetupJNI();
delegate_->FetchInitialConfig();
}
diff --git a/chromium/net/proxy_resolution/proxy_config_service_android.h b/chromium/net/proxy_resolution/proxy_config_service_android.h
index ce086542dc5..5161dae6767 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_android.h
+++ b/chromium/net/proxy_resolution/proxy_config_service_android.h
@@ -35,7 +35,7 @@ class NET_EXPORT ProxyConfigServiceAndroid : public ProxyConfigService {
// the .cc file.
class JNIDelegate {
public:
- virtual ~JNIDelegate() {}
+ virtual ~JNIDelegate() = default;
// Called from Java (on JNI thread) to signal that the proxy settings have
// changed. The string and int arguments (the host/port pair for the proxy)
diff --git a/chromium/net/proxy_resolution/proxy_config_service_android_unittest.cc b/chromium/net/proxy_resolution/proxy_config_service_android_unittest.cc
index 8e472901a97..e22c517146c 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_android_unittest.cc
+++ b/chromium/net/proxy_resolution/proxy_config_service_android_unittest.cc
@@ -64,7 +64,8 @@ class ProxyConfigServiceAndroidTestBase : public TestWithTaskEnvironment {
protected:
// Note that the current thread's message loop is initialized by the test
// suite (see net/test/net_test_suite.cc).
- ProxyConfigServiceAndroidTestBase(const StringMap& initial_configuration)
+ explicit ProxyConfigServiceAndroidTestBase(
+ const StringMap& initial_configuration)
: configuration_(initial_configuration),
service_(
base::ThreadTaskRunnerHandle::Get(),
@@ -72,7 +73,7 @@ class ProxyConfigServiceAndroidTestBase : public TestWithTaskEnvironment {
base::BindRepeating(&ProxyConfigServiceAndroidTestBase::GetProperty,
base::Unretained(this))) {}
- ~ProxyConfigServiceAndroidTestBase() override {}
+ ~ProxyConfigServiceAndroidTestBase() override = default;
// testing::Test:
void SetUp() override {
@@ -296,16 +297,16 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideMultipleRules) {
// Multiple rules with schemes are valid
std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule> rules;
- rules.push_back({"http", "httpoverrideproxy.com"});
- rules.push_back({"https", "https://httpoverrideproxy.com"});
+ rules.emplace_back("http", "httpoverrideproxy.com");
+ rules.emplace_back("https", "https://httpoverrideproxy.com");
SetProxyOverride(rules, bypass_rules, false, base::DoNothing());
TestMapping("https://example.com/", "HTTPS httpoverrideproxy.com:443");
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:80");
// Rules with and without scheme can be combined
rules.clear();
- rules.push_back({"http", "overrideproxy1.com"});
- rules.push_back({"*", "overrideproxy2.com"});
+ rules.emplace_back("http", "overrideproxy1.com");
+ rules.emplace_back("*", "overrideproxy2.com");
SetProxyOverride(rules, bypass_rules, false, base::DoNothing());
TestMapping("https://example.com/", "PROXY overrideproxy2.com:80");
TestMapping("http://example.com/", "PROXY overrideproxy1.com:80");
@@ -317,11 +318,11 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideListOfRules) {
std::vector<std::string> bypass_rules;
std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule> rules;
- rules.push_back({"http", "httpproxy1"});
- rules.push_back({"*", "socks5://fallback1"});
- rules.push_back({"http", "httpproxy2"});
- rules.push_back({"*", "fallback2"});
- rules.push_back({"*", "direct://"});
+ rules.emplace_back("http", "httpproxy1");
+ rules.emplace_back("*", "socks5://fallback1");
+ rules.emplace_back("http", "httpproxy2");
+ rules.emplace_back("*", "fallback2");
+ rules.emplace_back("*", "direct://");
SetProxyOverride(rules, bypass_rules, false, base::DoNothing());
TestMapping("http://example.com", "PROXY httpproxy1:80;PROXY httpproxy2:80");
diff --git a/chromium/net/proxy_resolution/proxy_config_service_common_unittest.cc b/chromium/net/proxy_resolution/proxy_config_service_common_unittest.cc
index 87815a58bc7..386137783c9 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_common_unittest.cc
+++ b/chromium/net/proxy_resolution/proxy_config_service_common_unittest.cc
@@ -61,11 +61,10 @@ void MatchesProxyServerHelper(const char* failure_message,
std::string FlattenProxyBypass(const ProxyBypassRules& bypass_rules) {
std::string flattened_proxy_bypass;
- for (auto it = bypass_rules.rules().begin(); it != bypass_rules.rules().end();
- ++it) {
+ for (const auto& bypass_rule : bypass_rules.rules()) {
if (!flattened_proxy_bypass.empty())
flattened_proxy_bypass += ",";
- flattened_proxy_bypass += (*it)->ToString();
+ flattened_proxy_bypass += bypass_rule->ToString();
}
return flattened_proxy_bypass;
}
diff --git a/chromium/net/proxy_resolution/proxy_config_service_ios.cc b/chromium/net/proxy_resolution/proxy_config_service_ios.cc
index 250d3f107c8..d22f25936d8 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_ios.cc
+++ b/chromium/net/proxy_resolution/proxy_config_service_ios.cc
@@ -106,7 +106,6 @@ ProxyConfigServiceIOS::ProxyConfigServiceIOS(
GetCurrentProxyConfig,
traffic_annotation) {}
-ProxyConfigServiceIOS::~ProxyConfigServiceIOS() {
-}
+ProxyConfigServiceIOS::~ProxyConfigServiceIOS() = default;
} // namespace net
diff --git a/chromium/net/proxy_resolution/proxy_config_service_linux.cc b/chromium/net/proxy_resolution/proxy_config_service_linux.cc
index ba86265cd3b..9b51cf450a6 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_linux.cc
+++ b/chromium/net/proxy_resolution/proxy_config_service_linux.cc
@@ -20,6 +20,7 @@
#include "base/files/scoped_file.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/nix/xdg_util.h"
#include "base/observer_list.h"
#include "base/strings/string_number_conversions.h"
@@ -237,7 +238,8 @@ const char kProxyGSettingsSchema[] = "org.gnome.system.proxy";
class SettingGetterImplGSettings
: public ProxyConfigServiceLinux::SettingGetter {
public:
- SettingGetterImplGSettings() : debounce_timer_(new base::OneShotTimer()) {}
+ SettingGetterImplGSettings()
+ : debounce_timer_(std::make_unique<base::OneShotTimer>()) {}
SettingGetterImplGSettings(const SettingGetterImplGSettings&) = delete;
SettingGetterImplGSettings& operator=(const SettingGetterImplGSettings&) =
@@ -314,15 +316,15 @@ class SettingGetterImplGSettings
// We could watch for the change-event signal instead of changed, but
// since we have to watch more than one object, we'd still have to
// debounce change notifications. This is conceptually simpler.
- g_signal_connect(G_OBJECT(client_), "changed",
+ g_signal_connect(G_OBJECT(client_.get()), "changed",
G_CALLBACK(OnGSettingsChangeNotification), this);
- g_signal_connect(G_OBJECT(http_client_), "changed",
+ g_signal_connect(G_OBJECT(http_client_.get()), "changed",
G_CALLBACK(OnGSettingsChangeNotification), this);
- g_signal_connect(G_OBJECT(https_client_), "changed",
+ g_signal_connect(G_OBJECT(https_client_.get()), "changed",
G_CALLBACK(OnGSettingsChangeNotification), this);
- g_signal_connect(G_OBJECT(ftp_client_), "changed",
+ g_signal_connect(G_OBJECT(ftp_client_.get()), "changed",
G_CALLBACK(OnGSettingsChangeNotification), this);
- g_signal_connect(G_OBJECT(socks_client_), "changed",
+ g_signal_connect(G_OBJECT(socks_client_.get()), "changed",
G_CALLBACK(OnGSettingsChangeNotification), this);
// Simulate a change to avoid possibly losing updates before this point.
OnChangeNotification();
@@ -465,12 +467,12 @@ class SettingGetterImplGSettings
setting_getter->OnChangeNotification();
}
- GSettings* client_ = nullptr;
- GSettings* http_client_ = nullptr;
- GSettings* https_client_ = nullptr;
- GSettings* ftp_client_ = nullptr;
- GSettings* socks_client_ = nullptr;
- ProxyConfigServiceLinux::Delegate* notify_delegate_ = nullptr;
+ raw_ptr<GSettings> client_ = nullptr;
+ raw_ptr<GSettings> http_client_ = nullptr;
+ raw_ptr<GSettings> https_client_ = nullptr;
+ raw_ptr<GSettings> ftp_client_ = nullptr;
+ raw_ptr<GSettings> socks_client_ = nullptr;
+ raw_ptr<ProxyConfigServiceLinux::Delegate> notify_delegate_ = nullptr;
std::unique_ptr<base::OneShotTimer> debounce_timer_;
// Task runner for the thread that we make gsettings calls on. It should
@@ -515,7 +517,7 @@ int StringToIntOrDefault(base::StringPiece value, int default_value) {
class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter {
public:
explicit SettingGetterImplKDE(base::Environment* env_var_getter)
- : debounce_timer_(new base::OneShotTimer()),
+ : debounce_timer_(std::make_unique<base::OneShotTimer>()),
env_var_getter_(env_var_getter) {
// This has to be called on the UI thread (http://crbug.com/69057).
base::ThreadRestrictions::ScopedAllowIO allow_io;
@@ -1009,7 +1011,7 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter {
int inotify_fd_ = -1;
std::unique_ptr<base::FileDescriptorWatcher::Controller> inotify_watcher_;
- ProxyConfigServiceLinux::Delegate* notify_delegate_ = nullptr;
+ raw_ptr<ProxyConfigServiceLinux::Delegate> notify_delegate_ = nullptr;
std::unique_ptr<base::OneShotTimer> debounce_timer_;
std::vector<base::FilePath> kde_config_dirs_;
bool indirect_manual_ = false;
@@ -1018,7 +1020,7 @@ class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter {
// We don't own |env_var_getter_|. It's safe to hold a pointer to it, since
// both it and us are owned by ProxyConfigServiceLinux::Delegate, and have the
// same lifetime.
- base::Environment* env_var_getter_;
+ raw_ptr<base::Environment> env_var_getter_;
// We cache these settings whenever we re-read the kioslaverc file.
string_map_type string_table_;
@@ -1233,8 +1235,7 @@ ProxyConfigServiceLinux::Delegate::Delegate(
case base::nix::DESKTOP_ENVIRONMENT_UNITY:
#if defined(USE_GIO)
{
- std::unique_ptr<SettingGetterImplGSettings> gs_getter(
- new SettingGetterImplGSettings());
+ auto gs_getter = std::make_unique<SettingGetterImplGSettings>();
// We have to load symbols and check the GNOME version in use to decide
// if we should use the gsettings getter. See CheckVersion().
if (gs_getter->CheckVersion(env_var_getter_.get()))
@@ -1437,9 +1438,9 @@ void ProxyConfigServiceLinux::Delegate::OnDestroy() {
}
ProxyConfigServiceLinux::ProxyConfigServiceLinux()
- : delegate_(new Delegate(base::Environment::Create(),
- absl::nullopt,
- absl::nullopt)) {}
+ : delegate_(base::MakeRefCounted<Delegate>(base::Environment::Create(),
+ absl::nullopt,
+ absl::nullopt)) {}
ProxyConfigServiceLinux::~ProxyConfigServiceLinux() {
delegate_->PostDestroyTask();
@@ -1448,17 +1449,17 @@ ProxyConfigServiceLinux::~ProxyConfigServiceLinux() {
ProxyConfigServiceLinux::ProxyConfigServiceLinux(
std::unique_ptr<base::Environment> env_var_getter,
const NetworkTrafficAnnotationTag& traffic_annotation)
- : delegate_(new Delegate(std::move(env_var_getter),
- absl::nullopt,
- traffic_annotation)) {}
+ : delegate_(base::MakeRefCounted<Delegate>(std::move(env_var_getter),
+ absl::nullopt,
+ traffic_annotation)) {}
ProxyConfigServiceLinux::ProxyConfigServiceLinux(
std::unique_ptr<base::Environment> env_var_getter,
- SettingGetter* setting_getter,
+ std::unique_ptr<SettingGetter> setting_getter,
const NetworkTrafficAnnotationTag& traffic_annotation)
- : delegate_(new Delegate(std::move(env_var_getter),
- base::WrapUnique(setting_getter),
- traffic_annotation)) {}
+ : delegate_(base::MakeRefCounted<Delegate>(std::move(env_var_getter),
+ std::move(setting_getter),
+ traffic_annotation)) {}
void ProxyConfigServiceLinux::AddObserver(Observer* observer) {
delegate_->AddObserver(observer);
diff --git a/chromium/net/proxy_resolution/proxy_config_service_linux.h b/chromium/net/proxy_resolution/proxy_config_service_linux.h
index fb561c83d83..2210fc4ea77 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_linux.h
+++ b/chromium/net/proxy_resolution/proxy_config_service_linux.h
@@ -41,12 +41,12 @@ class NET_EXPORT_PRIVATE ProxyConfigServiceLinux : public ProxyConfigService {
// files. Defined here so unit tests can construct worst-case inputs.
static const size_t BUFFER_SIZE = 512;
- SettingGetter() {}
+ SettingGetter() = default;
SettingGetter(const SettingGetter&) = delete;
SettingGetter& operator=(const SettingGetter&) = delete;
- virtual ~SettingGetter() {}
+ virtual ~SettingGetter() = default;
// Initializes the class: obtains a gconf/gsettings client, or simulates
// one, in the concrete implementations. Returns true on success. Must be
@@ -290,7 +290,7 @@ class NET_EXPORT_PRIVATE ProxyConfigServiceLinux : public ProxyConfigService {
const NetworkTrafficAnnotationTag& traffic_annotation);
ProxyConfigServiceLinux(
std::unique_ptr<base::Environment> env_var_getter,
- SettingGetter* setting_getter, // TODO(eroman): Use std::unique_ptr.
+ std::unique_ptr<SettingGetter> setting_getter,
const NetworkTrafficAnnotationTag& traffic_annotation);
ProxyConfigServiceLinux(const ProxyConfigServiceLinux&) = delete;
diff --git a/chromium/net/proxy_resolution/proxy_config_service_linux_unittest.cc b/chromium/net/proxy_resolution/proxy_config_service_linux_unittest.cc
index 597a943c6f4..3e2267b26b6 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_linux_unittest.cc
+++ b/chromium/net/proxy_resolution/proxy_config_service_linux_unittest.cc
@@ -15,6 +15,7 @@
#include "base/files/file_util.h"
#include "base/format_macros.h"
#include "base/location.h"
+#include "base/memory/raw_ptr.h"
#include "base/message_loop/message_pump_type.h"
#include "base/run_loop.h"
#include "base/strings/string_util.h"
@@ -131,7 +132,7 @@ class MockEnvironment : public base::Environment {
// Zeroes all environment values.
void Reset() {
- EnvVarValues zero_values = {0};
+ EnvVarValues zero_values = {nullptr};
values = zero_values;
}
@@ -198,7 +199,7 @@ class MockSettingGetter : public ProxyConfigServiceLinux::SettingGetter {
// Zeros all environment values.
void Reset() {
- GSettingsValues zero_values = {0};
+ GSettingsValues zero_values = {nullptr};
values = zero_values;
}
@@ -276,12 +277,12 @@ class MockSettingGetter : public ProxyConfigServiceLinux::SettingGetter {
// Some code duplicated from pac_file_fetcher_unittest.cc.
class SyncConfigGetter : public ProxyConfigService::Observer {
public:
- // Takes ownership of |config_service|.
- explicit SyncConfigGetter(ProxyConfigServiceLinux* config_service)
+ explicit SyncConfigGetter(
+ std::unique_ptr<ProxyConfigServiceLinux> config_service)
: event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
base::WaitableEvent::InitialState::NOT_SIGNALED),
main_thread_("Main_Thread"),
- config_service_(config_service),
+ config_service_(std::move(config_service)),
matches_pac_url_event_(
base::WaitableEvent::ResetPolicy::AUTOMATIC,
base::WaitableEvent::InitialState::NOT_SIGNALED) {
@@ -376,7 +377,7 @@ class SyncConfigGetter : public ProxyConfigService::Observer {
// [Runs on |main_thread_|] Signals |event_| on cleanup completion.
void CleanUp() {
config_service_->RemoveObserver(this);
- delete config_service_;
+ config_service_.reset();
base::RunLoop().RunUntilIdle();
event_.Signal();
}
@@ -389,7 +390,7 @@ class SyncConfigGetter : public ProxyConfigService::Observer {
base::WaitableEvent event_;
base::Thread main_thread_;
- ProxyConfigServiceLinux* config_service_;
+ std::unique_ptr<ProxyConfigServiceLinux> config_service_;
// The config obtained by |main_thread_| and read back by the main
// thread.
@@ -767,12 +768,15 @@ TEST_F(ProxyConfigServiceLinuxTest, BasicGSettingsTest) {
for (size_t i = 0; i < std::size(tests); ++i) {
SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "] %s", i,
tests[i].description.c_str()));
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
- MockSettingGetter* setting_getter = new MockSettingGetter;
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), setting_getter, TRAFFIC_ANNOTATION_FOR_TESTS));
+ auto env = std::make_unique<MockEnvironment>();
+ auto setting_getter = std::make_unique<MockSettingGetter>();
+ auto* setting_getter_ptr = setting_getter.get();
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), std::move(setting_getter),
+ TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
- setting_getter->values = tests[i].values;
+ setting_getter_ptr->values = tests[i].values;
sync_config_getter.SetupAndInitialFetch();
ProxyConfigService::ConfigAvailability availability =
sync_config_getter.SyncGetLatestProxyConfig(&config);
@@ -1096,11 +1100,13 @@ TEST_F(ProxyConfigServiceLinuxTest, BasicEnvTest) {
for (size_t i = 0; i < std::size(tests); ++i) {
SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "] %s", i,
tests[i].description.c_str()));
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values = tests[i].values;
- MockSettingGetter* setting_getter = new MockSettingGetter;
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), setting_getter, TRAFFIC_ANNOTATION_FOR_TESTS));
+ auto setting_getter = std::make_unique<MockSettingGetter>();
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), std::move(setting_getter),
+ TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
sync_config_getter.SetupAndInitialFetch();
ProxyConfigService::ConfigAvailability availability =
@@ -1116,24 +1122,26 @@ TEST_F(ProxyConfigServiceLinuxTest, BasicEnvTest) {
}
TEST_F(ProxyConfigServiceLinuxTest, GSettingsNotification) {
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
- MockSettingGetter* setting_getter = new MockSettingGetter;
- ProxyConfigServiceLinux* service = new ProxyConfigServiceLinux(
- std::move(env), setting_getter, TRAFFIC_ANNOTATION_FOR_TESTS);
- SyncConfigGetter sync_config_getter(service);
+ auto env = std::make_unique<MockEnvironment>();
+ auto setting_getter = std::make_unique<MockSettingGetter>();
+ auto* setting_getter_ptr = setting_getter.get();
+ auto service = std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), std::move(setting_getter), TRAFFIC_ANNOTATION_FOR_TESTS);
+ auto* service_ptr = service.get();
+ SyncConfigGetter sync_config_getter(std::move(service));
ProxyConfigWithAnnotation config;
// Start with no proxy.
- setting_getter->values.mode = "none";
+ setting_getter_ptr->values.mode = "none";
sync_config_getter.SetupAndInitialFetch();
EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
sync_config_getter.SyncGetLatestProxyConfig(&config));
EXPECT_FALSE(config.value().auto_detect());
// Now set to auto-detect.
- setting_getter->values.mode = "auto";
+ setting_getter_ptr->values.mode = "auto";
// Simulate setting change notification callback.
- service->OnCheckProxyConfigSettings();
+ service_ptr->OnCheckProxyConfigSettings();
EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
sync_config_getter.SyncGetLatestProxyConfig(&config));
EXPECT_TRUE(config.value().auto_detect());
@@ -1144,8 +1152,8 @@ TEST_F(ProxyConfigServiceLinuxTest, GSettingsNotification) {
// Trigering the check a *second* time is a regression test for
// https://crbug.com/848237, where a comparison is done between two nullopts.
for (size_t i = 0; i < 2; ++i) {
- setting_getter->values.mode = nullptr;
- service->OnCheckProxyConfigSettings();
+ setting_getter_ptr->values.mode = nullptr;
+ service_ptr->OnCheckProxyConfigSettings();
EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
sync_config_getter.SyncGetLatestProxyConfig(&config));
EXPECT_FALSE(config.value().auto_detect());
@@ -1707,13 +1715,14 @@ TEST_F(ProxyConfigServiceLinuxTest, KDEConfigParser) {
for (size_t i = 0; i < std::size(tests); ++i) {
SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "] %s", i,
tests[i].description.c_str()));
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values = tests[i].env_values;
// Force the KDE getter to be used and tell it where the test is.
env->values.DESKTOP_SESSION = "kde4";
env->values.KDEHOME = kde_home_.value().c_str();
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
// Overwrite the kioslaverc file.
base::WriteFile(kioslaverc_, tests[i].kioslaverc.c_str(),
@@ -1757,11 +1766,12 @@ TEST_F(ProxyConfigServiceLinuxTest, KDEHomePicker) {
{
SCOPED_TRACE("KDE4, no .kde4 directory, verify fallback");
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values.DESKTOP_SESSION = "kde4";
env->values.HOME = user_home_.value().c_str();
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
sync_config_getter.SetupAndInitialFetch();
EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
@@ -1778,11 +1788,12 @@ TEST_F(ProxyConfigServiceLinuxTest, KDEHomePicker) {
{
SCOPED_TRACE("KDE4, .kde4 directory present, use it");
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values.DESKTOP_SESSION = "kde4";
env->values.HOME = user_home_.value().c_str();
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
sync_config_getter.SetupAndInitialFetch();
EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
@@ -1793,11 +1804,12 @@ TEST_F(ProxyConfigServiceLinuxTest, KDEHomePicker) {
{
SCOPED_TRACE("KDE3, .kde4 directory present, ignore it");
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values.DESKTOP_SESSION = "kde";
env->values.HOME = user_home_.value().c_str();
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
sync_config_getter.SetupAndInitialFetch();
EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
@@ -1808,12 +1820,13 @@ TEST_F(ProxyConfigServiceLinuxTest, KDEHomePicker) {
{
SCOPED_TRACE("KDE4, .kde4 directory present, KDEHOME set to .kde");
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values.DESKTOP_SESSION = "kde4";
env->values.HOME = user_home_.value().c_str();
env->values.KDEHOME = kde_home_.value().c_str();
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
sync_config_getter.SetupAndInitialFetch();
EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
@@ -1828,11 +1841,12 @@ TEST_F(ProxyConfigServiceLinuxTest, KDEHomePicker) {
{
SCOPED_TRACE("KDE4, very old .kde4 directory present, use .kde");
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values.DESKTOP_SESSION = "kde4";
env->values.HOME = user_home_.value().c_str();
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
sync_config_getter.SetupAndInitialFetch();
EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
@@ -1848,12 +1862,13 @@ TEST_F(ProxyConfigServiceLinuxTest, KDEHomePicker) {
{
SCOPED_TRACE("KDE5, .kde and .kde4 present, use .config");
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values.XDG_CURRENT_DESKTOP = "KDE";
env->values.KDE_SESSION_VERSION = "5";
env->values.HOME = user_home_.value().c_str();
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
sync_config_getter.SetupAndInitialFetch();
EXPECT_EQ(ProxyConfigService::CONFIG_VALID,
@@ -1873,10 +1888,10 @@ TEST_F(ProxyConfigServiceLinuxTest, KDEFileChanged) {
"Proxy Config Script=http://version1/wpad.dat\n"));
// Initialize the config service using kioslaverc.
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values.DESKTOP_SESSION = "kde4";
env->values.HOME = user_home_.value().c_str();
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
+ SyncConfigGetter sync_config_getter(std::make_unique<ProxyConfigServiceLinux>(
std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
sync_config_getter.SetupAndInitialFetch();
@@ -2008,13 +2023,14 @@ TEST_F(ProxyConfigServiceLinuxTest, KDEMultipleKioslaverc) {
for (size_t i = 0; i < std::size(tests); ++i) {
SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "] %s", i,
tests[i].description.c_str()));
- std::unique_ptr<MockEnvironment> env(new MockEnvironment);
+ auto env = std::make_unique<MockEnvironment>();
env->values.XDG_CURRENT_DESKTOP = "KDE";
env->values.KDE_SESSION_VERSION = "5";
env->values.HOME = user_home_.value().c_str();
env->values.XDG_CONFIG_DIRS = xdg_config_dirs.c_str();
- SyncConfigGetter sync_config_getter(new ProxyConfigServiceLinux(
- std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
+ SyncConfigGetter sync_config_getter(
+ std::make_unique<ProxyConfigServiceLinux>(
+ std::move(env), TRAFFIC_ANNOTATION_FOR_TESTS));
ProxyConfigWithAnnotation config;
// Write the kioslaverc file to specified location.
base::WriteFile(tests[i].kioslaverc_path, tests[i].kioslaverc);
diff --git a/chromium/net/proxy_resolution/proxy_config_service_mac.cc b/chromium/net/proxy_resolution/proxy_config_service_mac.cc
index 645b2cfa84f..77d3cd8f10d 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_mac.cc
+++ b/chromium/net/proxy_resolution/proxy_config_service_mac.cc
@@ -13,6 +13,7 @@
#include "base/logging.h"
#include "base/mac/foundation_util.h"
#include "base/mac/scoped_cftyperef.h"
+#include "base/memory/raw_ptr.h"
#include "base/strings/sys_string_conversions.h"
#include "base/task/sequenced_task_runner.h"
#include "net/base/net_errors.h"
@@ -44,7 +45,7 @@ bool GetBoolFromDictionary(CFDictionaryRef dict,
void GetCurrentProxyConfig(const NetworkTrafficAnnotationTag traffic_annotation,
ProxyConfigWithAnnotation* config) {
base::ScopedCFTypeRef<CFDictionaryRef> config_dict(
- SCDynamicStoreCopyProxies(NULL));
+ SCDynamicStoreCopyProxies(nullptr));
DCHECK(config_dict);
ProxyConfig proxy_config;
proxy_config.set_from_system(true);
@@ -169,9 +170,7 @@ class ProxyConfigServiceMac::Helper
}
// Called when the parent is destroyed.
- void Orphan() {
- parent_ = NULL;
- }
+ void Orphan() { parent_ = nullptr; }
void OnProxyConfigChanged(const ProxyConfigWithAnnotation& new_config) {
if (parent_)
@@ -180,9 +179,9 @@ class ProxyConfigServiceMac::Helper
private:
friend class base::RefCountedThreadSafe<Helper>;
- ~Helper() {}
+ ~Helper() = default;
- ProxyConfigServiceMac* parent_;
+ raw_ptr<ProxyConfigServiceMac> parent_;
};
void ProxyConfigServiceMac::Forwarder::SetDynamicStoreNotificationKeys(
@@ -199,7 +198,7 @@ ProxyConfigServiceMac::ProxyConfigServiceMac(
const scoped_refptr<base::SequencedTaskRunner>& sequenced_task_runner,
const NetworkTrafficAnnotationTag& traffic_annotation)
: forwarder_(this),
- helper_(new Helper(this)),
+ helper_(base::MakeRefCounted<Helper>(this)),
sequenced_task_runner_(sequenced_task_runner),
traffic_annotation_(traffic_annotation) {
DCHECK(sequenced_task_runner_.get());
@@ -242,11 +241,11 @@ void ProxyConfigServiceMac::SetDynamicStoreNotificationKeys(
SCDynamicStoreRef store) {
// Called on notifier thread.
- CFStringRef proxies_key = SCDynamicStoreKeyCreateProxies(NULL);
- CFArrayRef key_array = CFArrayCreate(
- NULL, (const void **)(&proxies_key), 1, &kCFTypeArrayCallBacks);
+ CFStringRef proxies_key = SCDynamicStoreKeyCreateProxies(nullptr);
+ CFArrayRef key_array = CFArrayCreate(nullptr, (const void**)(&proxies_key), 1,
+ &kCFTypeArrayCallBacks);
- bool ret = SCDynamicStoreSetNotificationKeys(store, key_array, NULL);
+ bool ret = SCDynamicStoreSetNotificationKeys(store, key_array, nullptr);
// TODO(willchan): Figure out a proper way to handle this rather than crash.
CHECK(ret);
diff --git a/chromium/net/proxy_resolution/proxy_config_service_mac.h b/chromium/net/proxy_resolution/proxy_config_service_mac.h
index 3773e5319fe..fadb5082369 100644
--- a/chromium/net/proxy_resolution/proxy_config_service_mac.h
+++ b/chromium/net/proxy_resolution/proxy_config_service_mac.h
@@ -8,6 +8,7 @@
#include <memory>
#include "base/compiler_specific.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
#include "net/base/network_config_watcher_mac.h"
@@ -60,7 +61,7 @@ class ProxyConfigServiceMac : public ProxyConfigService {
void OnNetworkConfigChange(CFArrayRef changed_keys) override;
private:
- ProxyConfigServiceMac* const proxy_config_service_;
+ const raw_ptr<ProxyConfigServiceMac> proxy_config_service_;
};
// Methods directly called by the NetworkConfigWatcherMac::Delegate:
diff --git a/chromium/net/proxy_resolution/proxy_config_unittest.cc b/chromium/net/proxy_resolution/proxy_config_unittest.cc
index d4d43aabf02..2d3d9eb94f3 100644
--- a/chromium/net/proxy_resolution/proxy_config_unittest.cc
+++ b/chromium/net/proxy_resolution/proxy_config_unittest.cc
@@ -436,19 +436,19 @@ TEST(ProxyConfigTest, ParseProxyRules) {
ProxyConfig config;
- for (size_t i = 0; i < std::size(tests); ++i) {
- config.proxy_rules().ParseFromString(tests[i].proxy_rules);
+ for (const auto& test : tests) {
+ config.proxy_rules().ParseFromString(test.proxy_rules);
- EXPECT_EQ(tests[i].type, config.proxy_rules().type);
- ExpectProxyServerEquals(tests[i].single_proxy,
+ EXPECT_EQ(test.type, config.proxy_rules().type);
+ ExpectProxyServerEquals(test.single_proxy,
config.proxy_rules().single_proxies);
- ExpectProxyServerEquals(tests[i].proxy_for_http,
+ ExpectProxyServerEquals(test.proxy_for_http,
config.proxy_rules().proxies_for_http);
- ExpectProxyServerEquals(tests[i].proxy_for_https,
+ ExpectProxyServerEquals(test.proxy_for_https,
config.proxy_rules().proxies_for_https);
- ExpectProxyServerEquals(tests[i].proxy_for_ftp,
+ ExpectProxyServerEquals(test.proxy_for_ftp,
config.proxy_rules().proxies_for_ftp);
- ExpectProxyServerEquals(tests[i].fallback_proxy,
+ ExpectProxyServerEquals(test.fallback_proxy,
config.proxy_rules().fallback_proxies);
}
}
diff --git a/chromium/net/proxy_resolution/proxy_list_unittest.cc b/chromium/net/proxy_resolution/proxy_list_unittest.cc
index 2a0132e7630..350c101416e 100644
--- a/chromium/net/proxy_resolution/proxy_list_unittest.cc
+++ b/chromium/net/proxy_resolution/proxy_list_unittest.cc
@@ -65,10 +65,10 @@ TEST(ProxyListTest, SetFromPacString) {
},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
ProxyList list;
- list.SetFromPacString(tests[i].pac_input);
- EXPECT_EQ(tests[i].pac_output, list.ToPacString());
+ list.SetFromPacString(test.pac_input);
+ EXPECT_EQ(test.pac_output, list.ToPacString());
EXPECT_FALSE(list.IsEmpty());
}
}
@@ -91,11 +91,11 @@ TEST(ProxyListTest, RemoveProxiesWithoutScheme) {
},
};
- for (size_t i = 0; i < std::size(tests); ++i) {
+ for (const auto& test : tests) {
ProxyList list;
- list.SetFromPacString(tests[i].pac_input);
- list.RemoveProxiesWithoutScheme(tests[i].filter);
- EXPECT_EQ(tests[i].filtered_pac_output, list.ToPacString());
+ list.SetFromPacString(test.pac_input);
+ list.RemoveProxiesWithoutScheme(test.filter);
+ EXPECT_EQ(test.filtered_pac_output, list.ToPacString());
}
}
diff --git a/chromium/net/proxy_resolution/proxy_resolver.h b/chromium/net/proxy_resolution/proxy_resolver.h
index 39fd2459bed..db6b053a59f 100644
--- a/chromium/net/proxy_resolution/proxy_resolver.h
+++ b/chromium/net/proxy_resolution/proxy_resolver.h
@@ -27,16 +27,16 @@ class NET_EXPORT_PRIVATE ProxyResolver {
public:
class Request {
public:
- virtual ~Request() {} // Cancels the request
+ virtual ~Request() = default; // Cancels the request
virtual LoadState GetLoadState() = 0;
};
- ProxyResolver() {}
+ ProxyResolver() = default;
ProxyResolver(const ProxyResolver&) = delete;
ProxyResolver& operator=(const ProxyResolver&) = delete;
- virtual ~ProxyResolver() {}
+ virtual ~ProxyResolver() = default;
// Gets a list of proxy servers to use for |url|. If the request will
// complete asynchronously returns ERR_IO_PENDING and notifies the result
diff --git a/chromium/net/proxy_resolution/proxy_resolver_error_observer.h b/chromium/net/proxy_resolution/proxy_resolver_error_observer.h
index 9c72375be4f..4ee27bf0632 100644
--- a/chromium/net/proxy_resolution/proxy_resolver_error_observer.h
+++ b/chromium/net/proxy_resolution/proxy_resolver_error_observer.h
@@ -14,13 +14,13 @@ namespace net {
// Interface for observing JavaScript error messages from PAC scripts.
class NET_EXPORT_PRIVATE ProxyResolverErrorObserver {
public:
- ProxyResolverErrorObserver() {}
+ ProxyResolverErrorObserver() = default;
ProxyResolverErrorObserver(const ProxyResolverErrorObserver&) = delete;
ProxyResolverErrorObserver& operator=(const ProxyResolverErrorObserver&) =
delete;
- virtual ~ProxyResolverErrorObserver() {}
+ virtual ~ProxyResolverErrorObserver() = default;
// Handler for when an error is encountered. |line_number| may be -1
// if a line number is not applicable to this error. |error| is a message
diff --git a/chromium/net/proxy_resolution/proxy_resolver_factory.h b/chromium/net/proxy_resolution/proxy_resolver_factory.h
index 8ce7aa6ff02..125b47f192a 100644
--- a/chromium/net/proxy_resolution/proxy_resolver_factory.h
+++ b/chromium/net/proxy_resolution/proxy_resolver_factory.h
@@ -23,7 +23,7 @@ class NET_EXPORT ProxyResolverFactory {
// A handle to a request. Deleting it will cancel the request.
class Request {
public:
- virtual ~Request() {}
+ virtual ~Request() = default;
};
// See |expects_pac_bytes()| for the meaning of |expects_pac_bytes|.
diff --git a/chromium/net/proxy_resolution/proxy_resolver_mac.cc b/chromium/net/proxy_resolution/proxy_resolver_mac.cc
index 50bebc0ae39..df89ff1dc96 100644
--- a/chromium/net/proxy_resolution/proxy_resolver_mac.cc
+++ b/chromium/net/proxy_resolution/proxy_resolver_mac.cc
@@ -75,13 +75,13 @@ ProxyServer::Scheme GetProxyServerScheme(CFStringRef proxy_type) {
// Callback for CFNetworkExecuteProxyAutoConfigurationURL. |client| is a pointer
// to a CFTypeRef. This stashes either |error| or |proxies| in that location.
void ResultCallback(void* client, CFArrayRef proxies, CFErrorRef error) {
- DCHECK((proxies != NULL) == (error == NULL));
+ DCHECK((proxies != nullptr) == (error == nullptr));
CFTypeRef* result_ptr = reinterpret_cast<CFTypeRef*>(client);
- DCHECK(result_ptr != NULL);
- DCHECK(*result_ptr == NULL);
+ DCHECK(result_ptr != nullptr);
+ DCHECK(*result_ptr == nullptr);
- if (error != NULL) {
+ if (error != nullptr) {
*result_ptr = CFRetain(error);
} else {
*result_ptr = CFRetain(proxies);
@@ -133,7 +133,8 @@ class SynchronizedRunLoopObserver final {
SynchronizedRunLoopObserver::SynchronizedRunLoopObserver(base::Lock& lock)
: lock_(lock) {
- CFRunLoopObserverContext observer_context = {0, this, NULL, NULL, NULL};
+ CFRunLoopObserverContext observer_context = {0, this, nullptr, nullptr,
+ nullptr};
observer_.reset(CFRunLoopObserverCreate(
kCFAllocatorDefault,
kCFRunLoopBeforeSources | kCFRunLoopBeforeWaiting | kCFRunLoopExit, true,
@@ -216,7 +217,7 @@ ProxyResolverMac::ProxyResolverMac(
const scoped_refptr<PacFileData>& script_data)
: script_data_(script_data) {}
-ProxyResolverMac::~ProxyResolverMac() {}
+ProxyResolverMac::~ProxyResolverMac() = default;
// Gets the proxy information for a query URL from a PAC. Implementation
// inspired by http://developer.apple.com/samplecode/CFProxySupportTool/
@@ -240,7 +241,7 @@ int ProxyResolverMac::GetProxyForURL(
base::ScopedCFTypeRef<CFStringRef> query_ref(
base::SysUTF8ToCFStringRef(mutable_query_url.spec()));
base::ScopedCFTypeRef<CFURLRef> query_url_ref(
- CFURLCreateWithString(kCFAllocatorDefault, query_ref.get(), NULL));
+ CFURLCreateWithString(kCFAllocatorDefault, query_ref.get(), nullptr));
if (!query_url_ref.get())
return ERR_FAILED;
base::ScopedCFTypeRef<CFStringRef> pac_ref(base::SysUTF8ToCFStringRef(
@@ -248,7 +249,7 @@ int ProxyResolverMac::GetProxyForURL(
? std::string()
: script_data_->url().spec()));
base::ScopedCFTypeRef<CFURLRef> pac_url_ref(
- CFURLCreateWithString(kCFAllocatorDefault, pac_ref.get(), NULL));
+ CFURLCreateWithString(kCFAllocatorDefault, pac_ref.get(), nullptr));
if (!pac_url_ref.get())
return ERR_FAILED;
@@ -257,7 +258,7 @@ int ProxyResolverMac::GetProxyForURL(
// required by CFNetworkExecuteProxyAutoConfigurationURL.
base::ScopedCFTypeRef<CFDictionaryRef> empty_dictionary(
- CFDictionaryCreate(NULL, NULL, NULL, 0, NULL, NULL));
+ CFDictionaryCreate(nullptr, nullptr, nullptr, 0, nullptr, nullptr));
CFArrayRef dummy_result =
CFNetworkCopyProxiesForURL(query_url_ref.get(), empty_dictionary);
if (dummy_result)
@@ -268,8 +269,8 @@ int ProxyResolverMac::GetProxyForURL(
// OK to do. (BTW, CFNetworkExecuteProxyAutoConfigurationURL returns a
// runloop source we need to release despite its name.)
- CFTypeRef result = NULL;
- CFStreamClientContext context = { 0, &result, NULL, NULL, NULL };
+ CFTypeRef result = nullptr;
+ CFStreamClientContext context = {0, &result, nullptr, nullptr, nullptr};
base::ScopedCFTypeRef<CFRunLoopSourceRef> runloop_source(
CFNetworkExecuteProxyAutoConfigurationURL(
pac_url_ref.get(), query_url_ref.get(), ResultCallback, &context));
@@ -304,7 +305,7 @@ int ProxyResolverMac::GetProxyForURL(
}
observer.RemoveFromCurrentRunLoop(private_runloop_mode);
- DCHECK(result != NULL);
+ DCHECK(result != nullptr);
if (CFGetTypeID(result) == CFErrorGetTypeID()) {
// TODO(avi): do something better than this
@@ -313,7 +314,7 @@ int ProxyResolverMac::GetProxyForURL(
}
base::ScopedCFTypeRef<CFArrayRef> proxy_array_ref(
base::mac::CFCastStrict<CFArrayRef>(result));
- DCHECK(proxy_array_ref != NULL);
+ DCHECK(proxy_array_ref != nullptr);
ProxyList proxy_list;
@@ -321,7 +322,7 @@ int ProxyResolverMac::GetProxyForURL(
for (CFIndex i = 0; i < proxy_array_count; ++i) {
CFDictionaryRef proxy_dictionary = base::mac::CFCastStrict<CFDictionaryRef>(
CFArrayGetValueAtIndex(proxy_array_ref.get(), i));
- DCHECK(proxy_dictionary != NULL);
+ DCHECK(proxy_dictionary != nullptr);
// The dictionary may have the following keys:
// - kCFProxyTypeKey : The type of the proxy
diff --git a/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.cc b/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.cc
index 52041a0dd67..948a1cc5682 100644
--- a/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.cc
+++ b/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.cc
@@ -110,7 +110,7 @@ GURL DhcpPacFileAdapterFetcher::GetPacURL() const {
return pac_url_;
}
-DhcpPacFileAdapterFetcher::DhcpQuery::DhcpQuery() {}
+DhcpPacFileAdapterFetcher::DhcpQuery::DhcpQuery() = default;
void DhcpPacFileAdapterFetcher::DhcpQuery::GetPacURLForAdapter(
const std::string& adapter_name) {
@@ -126,7 +126,7 @@ std::string DhcpPacFileAdapterFetcher::DhcpQuery::ImplGetPacURLFromDhcp(
return DhcpPacFileAdapterFetcher::GetPacURLFromDhcp(adapter_name);
}
-DhcpPacFileAdapterFetcher::DhcpQuery::~DhcpQuery() {}
+DhcpPacFileAdapterFetcher::DhcpQuery::~DhcpQuery() = default;
void DhcpPacFileAdapterFetcher::OnDhcpQueryDone(
scoped_refptr<DhcpQuery> dhcp_query,
@@ -194,9 +194,9 @@ DhcpPacFileAdapterFetcher::ImplCreateScriptFetcher() {
return PacFileFetcherImpl::Create(url_request_context_);
}
-DhcpPacFileAdapterFetcher::DhcpQuery*
+scoped_refptr<DhcpPacFileAdapterFetcher::DhcpQuery>
DhcpPacFileAdapterFetcher::ImplCreateDhcpQuery() {
- return new DhcpQuery();
+ return base::MakeRefCounted<DhcpQuery>();
}
base::TimeDelta DhcpPacFileAdapterFetcher::ImplGetTimeout() const {
diff --git a/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.h b/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.h
index 2ecf2250809..40b13cc3e3c 100644
--- a/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.h
+++ b/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win.h
@@ -157,7 +157,7 @@ class NET_EXPORT_PRIVATE DhcpPacFileAdapterFetcher
// Virtual methods introduced to allow unit testing.
virtual std::unique_ptr<PacFileFetcher> ImplCreateScriptFetcher();
- virtual DhcpQuery* ImplCreateDhcpQuery();
+ virtual scoped_refptr<DhcpQuery> ImplCreateDhcpQuery();
virtual base::TimeDelta ImplGetTimeout() const;
private:
diff --git a/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win_unittest.cc b/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win_unittest.cc
index b6d642f3e98..3a096142609 100644
--- a/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win_unittest.cc
+++ b/chromium/net/proxy_resolution/win/dhcp_pac_file_adapter_fetcher_win_unittest.cc
@@ -63,13 +63,14 @@ class MockDhcpPacFileAdapterFetcher : public DhcpPacFileAdapterFetcher {
std::unique_ptr<PacFileFetcher> ImplCreateScriptFetcher() override {
// We don't maintain ownership of the fetcher, it is transferred to
// the caller.
- fetcher_ = new MockPacFileFetcher();
+ auto fetcher = std::make_unique<MockPacFileFetcher>();
+ fetcher_ = fetcher.get();
if (fetcher_delay_ms_ != -1) {
fetcher_timer_.Start(FROM_HERE, base::Milliseconds(fetcher_delay_ms_),
this,
&MockDhcpPacFileAdapterFetcher::OnFetcherTimer);
}
- return base::WrapUnique(fetcher_.get());
+ return fetcher;
}
class DelayingDhcpQuery : public DhcpQuery {
@@ -99,11 +100,11 @@ class MockDhcpPacFileAdapterFetcher : public DhcpPacFileAdapterFetcher {
~DelayingDhcpQuery() override {}
};
- DhcpQuery* ImplCreateDhcpQuery() override {
- dhcp_query_ = new DelayingDhcpQuery();
+ scoped_refptr<DhcpQuery> ImplCreateDhcpQuery() override {
+ dhcp_query_ = base::MakeRefCounted<DelayingDhcpQuery>();
dhcp_query_->dhcp_delay_ = dhcp_delay_;
dhcp_query_->configured_url_ = configured_url_;
- return dhcp_query_.get();
+ return dhcp_query_;
}
// Use a shorter timeout so tests can finish more quickly.
@@ -150,7 +151,7 @@ class FetcherClient {
public:
FetcherClient()
: url_request_context_(CreateTestURLRequestContextBuilder()->Build()),
- fetcher_(new MockDhcpPacFileAdapterFetcher(
+ fetcher_(std::make_unique<MockDhcpPacFileAdapterFetcher>(
url_request_context_.get(),
base::ThreadPool::CreateSequencedTaskRunner(
{base::MayBlock(),
diff --git a/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.cc b/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.cc
index b5b6803df02..cf73ed28d7b 100644
--- a/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.cc
+++ b/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.cc
@@ -201,54 +201,55 @@ class TaskRunnerWithCap : public base::TaskRunner {
};
base::Value NetLogGetAdaptersDoneParams(DhcpAdapterNamesLoggingInfo* info) {
- base::Value result(base::Value::Type::DICTIONARY);
+ base::Value::Dict result;
// Add information on each of the adapters enumerated (including those that
// were subsequently skipped).
- base::Value adapters_value(base::Value::Type::LIST);
+ base::Value::List adapters_list;
for (IP_ADAPTER_ADDRESSES* adapter = info->adapters.get(); adapter;
adapter = adapter->Next) {
- base::Value adapter_value(base::Value::Type::DICTIONARY);
+ base::Value::Dict adapter_value;
- adapter_value.SetStringKey("AdapterName", adapter->AdapterName);
- adapter_value.SetIntKey("IfType", adapter->IfType);
- adapter_value.SetIntKey("Flags", adapter->Flags);
- adapter_value.SetIntKey("OperStatus", adapter->OperStatus);
- adapter_value.SetIntKey("TunnelType", adapter->TunnelType);
+ adapter_value.Set("AdapterName", adapter->AdapterName);
+ adapter_value.Set("IfType", static_cast<int>(adapter->IfType));
+ adapter_value.Set("Flags", static_cast<int>(adapter->Flags));
+ adapter_value.Set("OperStatus", static_cast<int>(adapter->OperStatus));
+ adapter_value.Set("TunnelType", static_cast<int>(adapter->TunnelType));
// "skipped" means the adapter was not ultimately chosen as a candidate for
// testing WPAD.
bool skipped = !IsDhcpCapableAdapter(adapter);
- adapter_value.SetKey("skipped", base::Value(skipped));
+ adapter_value.Set("skipped", base::Value(skipped));
- adapters_value.Append(std::move(adapter_value));
+ adapters_list.Append(std::move(adapter_value));
}
- result.SetKey("adapters", std::move(adapters_value));
-
- result.SetIntKey(
- "origin_to_worker_thread_hop_dt",
- (info->worker_thread_start_time - info->origin_thread_start_time)
- .InMilliseconds());
- result.SetIntKey("worker_to_origin_thread_hop_dt",
- (info->origin_thread_end_time - info->worker_thread_end_time)
- .InMilliseconds());
- result.SetIntKey("worker_dt", (info->worker_thread_end_time -
- info->worker_thread_start_time)
- .InMilliseconds());
+ result.Set("adapters", std::move(adapters_list));
+
+ result.Set("origin_to_worker_thread_hop_dt",
+ static_cast<int>((info->worker_thread_start_time -
+ info->origin_thread_start_time)
+ .InMilliseconds()));
+ result.Set("worker_to_origin_thread_hop_dt",
+ static_cast<int>(
+ (info->origin_thread_end_time - info->worker_thread_end_time)
+ .InMilliseconds()));
+ result.Set("worker_dt", static_cast<int>((info->worker_thread_end_time -
+ info->worker_thread_start_time)
+ .InMilliseconds()));
if (info->error != ERROR_SUCCESS)
- result.SetIntKey("error", info->error);
+ result.Set("error", static_cast<int>(info->error));
- return result;
+ return base::Value(std::move(result));
}
base::Value NetLogFetcherDoneParams(int fetcher_index, int net_error) {
- base::Value result(base::Value::Type::DICTIONARY);
+ base::Value::Dict result;
- result.SetIntKey("fetcher_index", fetcher_index);
- result.SetIntKey("net_error", net_error);
+ result.Set("fetcher_index", fetcher_index);
+ result.Set("net_error", net_error);
- return result;
+ return base::Value(std::move(result));
}
} // namespace
@@ -506,13 +507,15 @@ scoped_refptr<base::TaskRunner> DhcpPacFileFetcherWin::GetTaskRunner() {
return task_runner_;
}
-DhcpPacFileAdapterFetcher* DhcpPacFileFetcherWin::ImplCreateAdapterFetcher() {
- return new DhcpPacFileAdapterFetcher(url_request_context_, task_runner_);
+std::unique_ptr<DhcpPacFileAdapterFetcher>
+DhcpPacFileFetcherWin::ImplCreateAdapterFetcher() {
+ return std::make_unique<DhcpPacFileAdapterFetcher>(url_request_context_,
+ task_runner_);
}
-DhcpPacFileFetcherWin::AdapterQuery*
+scoped_refptr<DhcpPacFileFetcherWin::AdapterQuery>
DhcpPacFileFetcherWin::ImplCreateAdapterQuery() {
- return new AdapterQuery();
+ return base::MakeRefCounted<AdapterQuery>();
}
base::TimeDelta DhcpPacFileFetcherWin::ImplGetMaxWait() {
@@ -574,7 +577,7 @@ bool DhcpPacFileFetcherWin::GetCandidateAdapterNames(
}
DhcpPacFileFetcherWin::AdapterQuery::AdapterQuery()
- : logging_info_(new DhcpAdapterNamesLoggingInfo()) {}
+ : logging_info_(std::make_unique<DhcpAdapterNamesLoggingInfo>()) {}
void DhcpPacFileFetcherWin::AdapterQuery::GetCandidateAdapterNames() {
logging_info_->error = ERROR_NO_DATA;
@@ -598,6 +601,6 @@ bool DhcpPacFileFetcherWin::AdapterQuery::ImplGetCandidateAdapterNames(
info);
}
-DhcpPacFileFetcherWin::AdapterQuery::~AdapterQuery() {}
+DhcpPacFileFetcherWin::AdapterQuery::~AdapterQuery() = default;
} // namespace net
diff --git a/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.h b/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.h
index b25285d7334..d09a8e4b866 100644
--- a/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.h
+++ b/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.h
@@ -110,8 +110,8 @@ class NET_EXPORT_PRIVATE DhcpPacFileFetcherWin
};
// Virtual methods introduced to allow unit testing.
- virtual DhcpPacFileAdapterFetcher* ImplCreateAdapterFetcher();
- virtual AdapterQuery* ImplCreateAdapterQuery();
+ virtual std::unique_ptr<DhcpPacFileAdapterFetcher> ImplCreateAdapterFetcher();
+ virtual scoped_refptr<AdapterQuery> ImplCreateAdapterQuery();
virtual base::TimeDelta ImplGetMaxWait();
virtual void ImplOnGetCandidateAdapterNamesDone() {}
diff --git a/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win_unittest.cc b/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win_unittest.cc
index a4bb2d82b4e..83502ae8dd6 100644
--- a/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win_unittest.cc
+++ b/chromium/net/proxy_resolution/win/dhcp_pac_file_fetcher_win_unittest.cc
@@ -53,7 +53,7 @@ class RealFetchTester {
public:
RealFetchTester()
: context_(CreateTestURLRequestContextBuilder()->Build()),
- fetcher_(new DhcpPacFileFetcherWin(context_.get())) {
+ fetcher_(std::make_unique<DhcpPacFileFetcherWin>(context_.get())) {
// Make sure the test ends.
timeout_.Start(FROM_HERE, base::Seconds(5), this,
&RealFetchTester::OnTimeout);
@@ -177,8 +177,8 @@ class DelayingDhcpPacFileAdapterFetcher : public DhcpPacFileAdapterFetcher {
~DelayingDhcpQuery() override {}
};
- DhcpQuery* ImplCreateDhcpQuery() override {
- return new DelayingDhcpQuery();
+ scoped_refptr<DhcpQuery> ImplCreateDhcpQuery() override {
+ return base::MakeRefCounted<DelayingDhcpQuery>();
}
};
@@ -188,9 +188,10 @@ class DelayingDhcpPacFileFetcherWin : public DhcpPacFileFetcherWin {
explicit DelayingDhcpPacFileFetcherWin(URLRequestContext* context)
: DhcpPacFileFetcherWin(context) {}
- DhcpPacFileAdapterFetcher* ImplCreateAdapterFetcher() override {
- return new DelayingDhcpPacFileAdapterFetcher(url_request_context(),
- GetTaskRunner());
+ std::unique_ptr<DhcpPacFileAdapterFetcher> ImplCreateAdapterFetcher()
+ override {
+ return std::make_unique<DelayingDhcpPacFileAdapterFetcher>(
+ url_request_context(), GetTaskRunner());
}
};
@@ -298,9 +299,9 @@ class MockDhcpPacFileFetcherWin : public DhcpPacFileFetcherWin {
// |ImplCreateAdapterFetcher()|, and its name to the list of adapters
// returned by ImplGetCandidateAdapterNames.
void PushBackAdapter(const std::string& adapter_name,
- DhcpPacFileAdapterFetcher* fetcher) {
+ std::unique_ptr<DhcpPacFileAdapterFetcher> fetcher) {
adapter_query_->mock_adapter_names_.push_back(adapter_name);
- adapter_fetchers_.push_back(fetcher);
+ adapter_fetchers_.push_back(std::move(fetcher));
}
void ConfigureAndPushBackAdapter(const std::string& adapter_name,
@@ -308,22 +309,22 @@ class MockDhcpPacFileFetcherWin : public DhcpPacFileFetcherWin {
int result,
std::u16string pac_script,
base::TimeDelta fetch_delay) {
- std::unique_ptr<DummyDhcpPacFileAdapterFetcher> adapter_fetcher(
- new DummyDhcpPacFileAdapterFetcher(url_request_context(),
- GetTaskRunner()));
+ auto adapter_fetcher = std::make_unique<DummyDhcpPacFileAdapterFetcher>(
+ url_request_context(), GetTaskRunner());
adapter_fetcher->Configure(
did_finish, result, pac_script, fetch_delay.InMilliseconds());
- PushBackAdapter(adapter_name, adapter_fetcher.release());
+ PushBackAdapter(adapter_name, std::move(adapter_fetcher));
}
- DhcpPacFileAdapterFetcher* ImplCreateAdapterFetcher() override {
+ std::unique_ptr<DhcpPacFileAdapterFetcher> ImplCreateAdapterFetcher()
+ override {
++num_fetchers_created_;
- return adapter_fetchers_[next_adapter_fetcher_index_++];
+ return std::move(adapter_fetchers_[next_adapter_fetcher_index_++]);
}
- AdapterQuery* ImplCreateAdapterQuery() override {
+ scoped_refptr<AdapterQuery> ImplCreateAdapterQuery() override {
DCHECK(adapter_query_.get());
- return adapter_query_.get();
+ return adapter_query_;
}
base::TimeDelta ImplGetMaxWait() override {
@@ -335,19 +336,10 @@ class MockDhcpPacFileFetcherWin : public DhcpPacFileFetcherWin {
}
void ResetTestState() {
- // Delete any adapter fetcher objects we didn't hand out.
- std::vector<DhcpPacFileAdapterFetcher*>::const_iterator it =
- adapter_fetchers_.begin();
- for (; it != adapter_fetchers_.end(); ++it) {
- if (num_fetchers_created_-- <= 0) {
- delete (*it);
- }
- }
-
next_adapter_fetcher_index_ = 0;
num_fetchers_created_ = 0;
adapter_fetchers_.clear();
- adapter_query_ = new MockAdapterQuery();
+ adapter_query_ = base::MakeRefCounted<MockAdapterQuery>();
max_wait_ = TestTimeouts::tiny_timeout();
}
@@ -360,7 +352,7 @@ class MockDhcpPacFileFetcherWin : public DhcpPacFileFetcherWin {
// Ownership gets transferred to the implementation class via
// ImplCreateAdapterFetcher, but any objects not handed out are
// deleted on destruction.
- std::vector<DhcpPacFileAdapterFetcher*> adapter_fetchers_;
+ std::vector<std::unique_ptr<DhcpPacFileAdapterFetcher>> adapter_fetchers_;
scoped_refptr<MockAdapterQuery> adapter_query_;
@@ -434,11 +426,10 @@ class FetcherClient {
// the ReuseFetcher test at the bottom.
void TestNormalCaseURLConfiguredOneAdapter(FetcherClient* client) {
auto context = CreateTestURLRequestContextBuilder()->Build();
- std::unique_ptr<DummyDhcpPacFileAdapterFetcher> adapter_fetcher(
- new DummyDhcpPacFileAdapterFetcher(context.get(),
- client->GetTaskRunner()));
+ auto adapter_fetcher = std::make_unique<DummyDhcpPacFileAdapterFetcher>(
+ context.get(), client->GetTaskRunner());
adapter_fetcher->Configure(true, OK, u"bingo", 1);
- client->fetcher_.PushBackAdapter("a", adapter_fetcher.release());
+ client->fetcher_.PushBackAdapter("a", std::move(adapter_fetcher));
client->RunTest();
client->RunMessageLoopUntilComplete();
ASSERT_THAT(client->result_, IsOk());
@@ -607,11 +598,10 @@ TEST(DhcpPacFileFetcherWin, ShortCircuitLessPreferredAdapters) {
void TestImmediateCancel(FetcherClient* client) {
auto context = CreateTestURLRequestContextBuilder()->Build();
- std::unique_ptr<DummyDhcpPacFileAdapterFetcher> adapter_fetcher(
- new DummyDhcpPacFileAdapterFetcher(context.get(),
- client->GetTaskRunner()));
+ auto adapter_fetcher = std::make_unique<DummyDhcpPacFileAdapterFetcher>(
+ context.get(), client->GetTaskRunner());
adapter_fetcher->Configure(true, OK, u"bingo", 1);
- client->fetcher_.PushBackAdapter("a", adapter_fetcher.release());
+ client->fetcher_.PushBackAdapter("a", std::move(adapter_fetcher));
client->RunTest();
client->fetcher_.Cancel();
client->RunMessageLoopUntilWorkerDone();
@@ -669,11 +659,10 @@ TEST(DhcpPacFileFetcherWin, OnShutdown) {
FetcherClient client;
auto context = CreateTestURLRequestContextBuilder()->Build();
- std::unique_ptr<DummyDhcpPacFileAdapterFetcher> adapter_fetcher(
- new DummyDhcpPacFileAdapterFetcher(context.get(),
- client.GetTaskRunner()));
+ auto adapter_fetcher = std::make_unique<DummyDhcpPacFileAdapterFetcher>(
+ context.get(), client.GetTaskRunner());
adapter_fetcher->Configure(true, OK, u"bingo", 1);
- client.fetcher_.PushBackAdapter("a", adapter_fetcher.release());
+ client.fetcher_.PushBackAdapter("a", std::move(adapter_fetcher));
client.RunTest();
client.fetcher_.OnShutdown();
diff --git a/chromium/net/proxy_resolution/win/proxy_config_service_win.h b/chromium/net/proxy_resolution/win/proxy_config_service_win.h
index 886ebfc10cd..6d3df0377ba 100644
--- a/chromium/net/proxy_resolution/win/proxy_config_service_win.h
+++ b/chromium/net/proxy_resolution/win/proxy_config_service_win.h
@@ -18,11 +18,9 @@
#include "net/proxy_resolution/polling_proxy_config_service.h"
#include "net/proxy_resolution/proxy_config_with_annotation.h"
-namespace base {
-namespace win {
+namespace base::win {
class RegKey;
-}
-} // namespace base.
+} // namespace base::win
namespace net {
diff --git a/chromium/net/quic/bidirectional_stream_quic_impl.cc b/chromium/net/quic/bidirectional_stream_quic_impl.cc
index 3f9077000bb..1e017f842d5 100644
--- a/chromium/net/quic/bidirectional_stream_quic_impl.cc
+++ b/chromium/net/quic/bidirectional_stream_quic_impl.cc
@@ -17,7 +17,7 @@
#include "net/socket/next_proto.h"
#include "net/spdy/spdy_http_utils.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_connection.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "quic_http_stream.h"
namespace net {
diff --git a/chromium/net/quic/bidirectional_stream_quic_impl.h b/chromium/net/quic/bidirectional_stream_quic_impl.h
index 3a4442bc09c..33c430982fa 100644
--- a/chromium/net/quic/bidirectional_stream_quic_impl.h
+++ b/chromium/net/quic/bidirectional_stream_quic_impl.h
@@ -17,7 +17,7 @@
#include "net/http/bidirectional_stream_impl.h"
#include "net/quic/quic_chromium_client_session.h"
#include "net/quic/quic_chromium_client_stream.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
namespace base {
class OneShotTimer;
diff --git a/chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc b/chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc
index 42a842808f5..3838daac8b7 100644
--- a/chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -66,9 +66,7 @@
#include "url/scheme_host_port.h"
#include "url/url_constants.h"
-namespace net {
-
-namespace test {
+namespace net::test {
namespace {
@@ -130,7 +128,7 @@ class TestDelegateBase : public BidirectionalStreamImpl::Delegate {
TestDelegateBase(const TestDelegateBase&) = delete;
TestDelegateBase& operator=(const TestDelegateBase&) = delete;
- ~TestDelegateBase() override {}
+ ~TestDelegateBase() override = default;
void OnStreamReady(bool request_headers_sent) override {
CHECK(!is_ready_);
@@ -361,7 +359,7 @@ class DeleteStreamDelegate : public TestDelegateBase {
DeleteStreamDelegate(const DeleteStreamDelegate&) = delete;
DeleteStreamDelegate& operator=(const DeleteStreamDelegate&) = delete;
- ~DeleteStreamDelegate() override {}
+ ~DeleteStreamDelegate() override = default;
void OnStreamReady(bool request_headers_sent) override {
TestDelegateBase::OnStreamReady(request_headers_sent);
@@ -464,14 +462,14 @@ class BidirectionalStreamQuicImplTest
clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(20));
}
- ~BidirectionalStreamQuicImplTest() {
+ ~BidirectionalStreamQuicImplTest() override {
if (session_) {
session_->CloseSessionOnError(
ERR_ABORTED, quic::QUIC_INTERNAL_ERROR,
quic::ConnectionCloseBehavior::SILENT_CLOSE);
}
- for (size_t i = 0; i < writes_.size(); i++) {
- delete writes_[i].packet;
+ for (auto& write : writes_) {
+ delete write.packet;
}
}
@@ -484,13 +482,11 @@ class BidirectionalStreamQuicImplTest
// Adds a packet to the list of expected writes.
void AddWrite(std::unique_ptr<quic::QuicReceivedPacket> packet) {
- writes_.push_back(PacketToWrite(SYNCHRONOUS, packet.release()));
+ writes_.emplace_back(SYNCHRONOUS, packet.release());
}
// Adds a write error to the list of expected writes.
- void AddWriteError(IoMode mode, int rv) {
- writes_.push_back(PacketToWrite(mode, rv));
- }
+ void AddWriteError(IoMode mode, int rv) { writes_.emplace_back(mode, rv); }
void ProcessPacket(std::unique_ptr<quic::QuicReceivedPacket> packet) {
connection_->ProcessUdpPacket(ToQuicSocketAddress(self_addr_),
@@ -516,10 +512,10 @@ class BidirectionalStreamQuicImplTest
base::make_span(mock_writes_.get(), writes_.size()));
socket_data_->set_printer(&printer_);
- std::unique_ptr<MockUDPClientSocket> socket(
- new MockUDPClientSocket(socket_data_.get(), NetLog::Get()));
+ auto socket = std::make_unique<MockUDPClientSocket>(socket_data_.get(),
+ NetLog::Get());
socket->Connect(peer_addr_);
- runner_ = new TestTaskRunner(&clock_);
+ runner_ = base::MakeRefCounted<TestTaskRunner>(&clock_);
helper_ = std::make_unique<QuicChromiumConnectionHelper>(
&clock_, &random_generator_);
alarm_factory_ =
@@ -550,7 +546,7 @@ class BidirectionalStreamQuicImplTest
/*require_confirmation=*/false,
/*migrate_session_early_v2=*/false,
/*migrate_session_on_network_change_v2=*/false,
- /*default_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
+ /*default_network=*/handles::kInvalidNetworkHandle,
quic::QuicTime::Delta::FromMilliseconds(
kDefaultRetransmittableOnWireTimeout.InMilliseconds()),
/*migrate_idle_session=*/false, /*allow_port_migration=*/false,
@@ -876,8 +872,8 @@ TEST_P(BidirectionalStreamQuicImplTest, GetRequest) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->set_trailers_expected(true);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
@@ -984,16 +980,16 @@ TEST_P(BidirectionalStreamQuicImplTest, LoadTimingTwoRequests) {
// Start first request.
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
// Start second request.
scoped_refptr<IOBuffer> read_buffer2 =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate2(
- new TestDelegateBase(read_buffer2.get(), kReadBufferSize));
+ auto delegate2 =
+ std::make_unique<TestDelegateBase>(read_buffer2.get(), kReadBufferSize);
delegate2->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
@@ -1082,8 +1078,8 @@ TEST_P(BidirectionalStreamQuicImplTest, CoalesceDataBuffersNotHeadersFrame) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->DoNotSendRequestHeadersAutomatically();
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
@@ -1213,8 +1209,8 @@ TEST_P(BidirectionalStreamQuicImplTest,
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->DoNotSendRequestHeadersAutomatically();
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
@@ -1339,8 +1335,8 @@ TEST_P(BidirectionalStreamQuicImplTest,
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->DoNotSendRequestHeadersAutomatically();
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
@@ -1443,8 +1439,8 @@ TEST_P(BidirectionalStreamQuicImplTest,
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
- read_buffer.get(), kReadBufferSize, DeleteStreamDelegate::ON_FAILED));
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
+ read_buffer.get(), kReadBufferSize, DeleteStreamDelegate::ON_FAILED);
delegate->DoNotSendRequestHeadersAutomatically();
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
@@ -1480,8 +1476,8 @@ TEST_P(BidirectionalStreamQuicImplTest,
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
- read_buffer.get(), kReadBufferSize, DeleteStreamDelegate::ON_FAILED));
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
+ read_buffer.get(), kReadBufferSize, DeleteStreamDelegate::ON_FAILED);
delegate->DoNotSendRequestHeadersAutomatically();
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
@@ -1531,8 +1527,8 @@ TEST_P(BidirectionalStreamQuicImplTest, PostRequest) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
ConfirmHandshake();
@@ -1619,8 +1615,8 @@ TEST_P(BidirectionalStreamQuicImplTest, EarlyDataOverrideRequest) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->set_trailers_expected(true);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
@@ -1736,8 +1732,8 @@ TEST_P(BidirectionalStreamQuicImplTest, InterleaveReadDataAndSendData) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
ConfirmHandshake();
@@ -1831,8 +1827,8 @@ TEST_P(BidirectionalStreamQuicImplTest, ServerSendsRstAfterHeaders) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
delegate->WaitUntilNextCallback(kOnStreamReady);
@@ -1884,8 +1880,8 @@ TEST_P(BidirectionalStreamQuicImplTest, ServerSendsRstAfterReadData) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
delegate->WaitUntilNextCallback(kOnStreamReady);
@@ -1949,8 +1945,8 @@ TEST_P(BidirectionalStreamQuicImplTest, SessionClosedBeforeReadData) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
ConfirmHandshake();
@@ -2008,8 +2004,8 @@ TEST_P(BidirectionalStreamQuicImplTest, SessionClosedBeforeStartConfirmed) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
delegate->WaitUntilNextCallback(kOnFailed);
@@ -2032,8 +2028,8 @@ TEST_P(BidirectionalStreamQuicImplTest, SessionClosedBeforeStartNotConfirmed) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
delegate->WaitUntilNextCallback(kOnFailed);
@@ -2058,8 +2054,8 @@ TEST_P(BidirectionalStreamQuicImplTest, SessionCloseDuringOnStreamReady) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
- read_buffer.get(), kReadBufferSize, DeleteStreamDelegate::ON_FAILED));
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
+ read_buffer.get(), kReadBufferSize, DeleteStreamDelegate::ON_FAILED);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
ConfirmHandshake();
@@ -2091,9 +2087,9 @@ TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamDuringOnStreamReady) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(
- new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize,
- DeleteStreamDelegate::ON_STREAM_READY));
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
+ read_buffer.get(), kReadBufferSize,
+ DeleteStreamDelegate::ON_STREAM_READY);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
ConfirmHandshake();
@@ -2125,8 +2121,8 @@ TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamAfterReadData) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
ConfirmHandshake();
@@ -2183,9 +2179,9 @@ TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamDuringOnHeadersReceived) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(
- new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize,
- DeleteStreamDelegate::ON_HEADERS_RECEIVED));
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
+ read_buffer.get(), kReadBufferSize,
+ DeleteStreamDelegate::ON_HEADERS_RECEIVED);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
ConfirmHandshake();
@@ -2234,8 +2230,8 @@ TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamDuringOnDataRead) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
- read_buffer.get(), kReadBufferSize, DeleteStreamDelegate::ON_DATA_READ));
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
+ read_buffer.get(), kReadBufferSize, DeleteStreamDelegate::ON_DATA_READ);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
ConfirmHandshake();
@@ -2301,8 +2297,8 @@ TEST_P(BidirectionalStreamQuicImplTest, AsyncFinRead) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
@@ -2371,9 +2367,9 @@ TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamDuringOnTrailersReceived) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<DeleteStreamDelegate> delegate(
- new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize,
- DeleteStreamDelegate::ON_TRAILERS_RECEIVED));
+ auto delegate = std::make_unique<DeleteStreamDelegate>(
+ read_buffer.get(), kReadBufferSize,
+ DeleteStreamDelegate::ON_TRAILERS_RECEIVED);
delegate->Start(&request, net_log_with_source(),
session()->CreateHandle(destination_));
ConfirmHandshake();
@@ -2446,8 +2442,8 @@ TEST_P(BidirectionalStreamQuicImplTest, ReleaseStreamFails) {
scoped_refptr<IOBuffer> read_buffer =
base::MakeRefCounted<IOBuffer>(kReadBufferSize);
- std::unique_ptr<TestDelegateBase> delegate(
- new TestDelegateBase(read_buffer.get(), kReadBufferSize));
+ auto delegate =
+ std::make_unique<TestDelegateBase>(read_buffer.get(), kReadBufferSize);
delegate->set_trailers_expected(true);
// QuicChromiumClientSession::Handle::RequestStream() returns OK synchronously
// because Initialize() has established a Session.
@@ -2461,6 +2457,4 @@ TEST_P(BidirectionalStreamQuicImplTest, ReleaseStreamFails) {
EXPECT_THAT(delegate->error(), IsError(ERR_CONNECTION_CLOSED));
}
-} // namespace test
-
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/crypto/proof_source_chromium.cc b/chromium/net/quic/crypto/proof_source_chromium.cc
index f8631d93405..8da8b0f52ac 100644
--- a/chromium/net/quic/crypto/proof_source_chromium.cc
+++ b/chromium/net/quic/crypto/proof_source_chromium.cc
@@ -16,9 +16,9 @@ using std::string;
namespace net {
-ProofSourceChromium::ProofSourceChromium() {}
+ProofSourceChromium::ProofSourceChromium() = default;
-ProofSourceChromium::~ProofSourceChromium() {}
+ProofSourceChromium::~ProofSourceChromium() = default;
bool ProofSourceChromium::Initialize(const base::FilePath& cert_path,
const base::FilePath& key_path,
diff --git a/chromium/net/quic/crypto/proof_test_chromium.cc b/chromium/net/quic/crypto/proof_test_chromium.cc
index 77f23fcf0af..8933e51532d 100644
--- a/chromium/net/quic/crypto/proof_test_chromium.cc
+++ b/chromium/net/quic/crypto/proof_test_chromium.cc
@@ -22,8 +22,7 @@
using std::string;
-namespace net {
-namespace test {
+namespace net::test {
namespace {
// TestProofVerifierCallback is a simple callback for a quic::ProofVerifier that
@@ -68,8 +67,8 @@ void RunVerification(quic::ProofVerifier* verifier,
string error_details;
std::unique_ptr<quic::ProofVerifyContext> verify_context(
quic::test::crypto_test_utils::ProofVerifyContextForTesting());
- std::unique_ptr<TestProofVerifierCallback> callback(
- new TestProofVerifierCallback(&comp_callback, &ok, &error_details));
+ auto callback = std::make_unique<TestProofVerifierCallback>(
+ &comp_callback, &ok, &error_details);
quic::QuicAsyncStatus status = verifier->VerifyProof(
hostname, port, server_config, quic_version, chlo_hash, certs, "", proof,
@@ -152,10 +151,9 @@ TEST_P(ProofTest, Verify) {
quic::QuicSocketAddress server_addr;
quic::QuicSocketAddress client_addr;
- std::unique_ptr<quic::ProofSource::Callback> cb(
- new TestCallback(&called, &ok, &chain, &proof));
- std::unique_ptr<quic::ProofSource::Callback> first_cb(
- new TestCallback(&first_called, &first_ok, &first_chain, &first_proof));
+ auto cb = std::make_unique<TestCallback>(&called, &ok, &chain, &proof);
+ auto first_cb = std::make_unique<TestCallback>(&first_called, &first_ok,
+ &first_chain, &first_proof);
// GetProof here expects the async method to invoke the callback
// synchronously.
@@ -290,8 +288,7 @@ TEST_P(ProofTest, UseAfterFree) {
quic::QuicCryptoProof proof;
quic::QuicSocketAddress server_addr;
quic::QuicSocketAddress client_addr;
- std::unique_ptr<quic::ProofSource::Callback> cb(
- new TestCallback(&called, &ok, &chain, &proof));
+ auto cb = std::make_unique<TestCallback>(&called, &ok, &chain, &proof);
// GetProof here expects the async method to invoke the callback
// synchronously.
@@ -311,5 +308,4 @@ TEST_P(ProofTest, UseAfterFree) {
}
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/crypto/proof_verifier_chromium.cc b/chromium/net/quic/crypto/proof_verifier_chromium.cc
index f6fdcc5296d..ef2198f4750 100644
--- a/chromium/net/quic/crypto/proof_verifier_chromium.cc
+++ b/chromium/net/quic/crypto/proof_verifier_chromium.cc
@@ -36,7 +36,7 @@ namespace net {
ProofVerifyDetailsChromium::ProofVerifyDetailsChromium() = default;
-ProofVerifyDetailsChromium::~ProofVerifyDetailsChromium() {}
+ProofVerifyDetailsChromium::~ProofVerifyDetailsChromium() = default;
ProofVerifyDetailsChromium::ProofVerifyDetailsChromium(
const ProofVerifyDetailsChromium&) = default;
@@ -574,7 +574,7 @@ ProofVerifierChromium::ProofVerifierChromium(
DCHECK(transport_security_state_);
}
-ProofVerifierChromium::~ProofVerifierChromium() {}
+ProofVerifierChromium::~ProofVerifierChromium() = default;
quic::QuicAsyncStatus ProofVerifierChromium::VerifyProof(
const std::string& hostname,
diff --git a/chromium/net/quic/crypto/proof_verifier_chromium_test.cc b/chromium/net/quic/crypto/proof_verifier_chromium_test.cc
index 22f03519f6f..ca64d1f8959 100644
--- a/chromium/net/quic/crypto/proof_verifier_chromium_test.cc
+++ b/chromium/net/quic/crypto/proof_verifier_chromium_test.cc
@@ -41,8 +41,7 @@
using ::testing::_;
using ::testing::Return;
-namespace net {
-namespace test {
+namespace net::test {
namespace {
@@ -51,8 +50,8 @@ const char kCTAndPKPHost[] = "pkp-expect-ct.preloaded.test";
// CertVerifier that will fail the test if it is ever called.
class FailsTestCertVerifier : public CertVerifier {
public:
- FailsTestCertVerifier() {}
- ~FailsTestCertVerifier() override {}
+ FailsTestCertVerifier() = default;
+ ~FailsTestCertVerifier() override = default;
// CertVerifier implementation
int Verify(const RequestParams& params,
@@ -97,7 +96,7 @@ class MockSCTAuditingDelegate : public SCTAuditingDelegate {
class SignatureSaver : public quic::ProofSource::Callback {
public:
explicit SignatureSaver(std::string* signature) : signature_(signature) {}
- ~SignatureSaver() override {}
+ ~SignatureSaver() override = default;
void Run(bool /*ok*/,
const quiche::QuicheReferenceCountedPointer<
@@ -112,8 +111,8 @@ class SignatureSaver : public quic::ProofSource::Callback {
class DummyProofVerifierCallback : public quic::ProofVerifierCallback {
public:
- DummyProofVerifierCallback() {}
- ~DummyProofVerifierCallback() override {}
+ DummyProofVerifierCallback() = default;
+ ~DummyProofVerifierCallback() override = default;
void Run(bool ok,
const std::string& error_details,
@@ -171,8 +170,9 @@ class MockCertificateReportSender
class ProofVerifierChromiumTest : public ::testing::Test {
public:
ProofVerifierChromiumTest()
- : verify_context_(new ProofVerifyContextChromium(0 /*cert_verify_flags*/,
- NetLogWithSource())) {}
+ : verify_context_(std::make_unique<ProofVerifyContextChromium>(
+ 0 /*cert_verify_flags*/,
+ NetLogWithSource())) {}
void SetUp() override {
EXPECT_CALL(ct_policy_enforcer_, CheckCompliance(_, _, _))
@@ -252,8 +252,7 @@ TEST_F(ProofVerifierChromiumTest, VerifyProof) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -287,8 +286,7 @@ TEST_F(ProofVerifierChromiumTest, FailsIfCertFails) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -342,8 +340,7 @@ TEST_F(ProofVerifierChromiumTest, ValidSCTList) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyCertChain(
kTestHostname, kTestPort, certs_, kTestEmptyOCSPResponse,
ct::GetSCTListForTesting(), verify_context_.get(), &error_details_,
@@ -385,8 +382,7 @@ TEST_F(ProofVerifierChromiumTest, InvalidSCTList) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyCertChain(
kTestHostname, kTestPort, certs_, kTestEmptyOCSPResponse,
ct::GetSCTListWithInvalidSCT(), verify_context_.get(), &error_details_,
@@ -403,8 +399,7 @@ TEST_F(ProofVerifierChromiumTest, FailsIfSignatureFails) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, kTestEmptySignature,
@@ -428,8 +423,7 @@ TEST_F(ProofVerifierChromiumTest, PreservesEVIfAllowed) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -472,8 +466,7 @@ TEST_F(ProofVerifierChromiumTest, StripsEVIfNotAllowed) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -520,8 +513,7 @@ TEST_F(ProofVerifierChromiumTest, IsFatalErrorNotSetForNonFatalError) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -557,8 +549,7 @@ TEST_F(ProofVerifierChromiumTest, IsFatalErrorSetForFatalError) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -597,8 +588,7 @@ TEST_F(ProofVerifierChromiumTest, PKPEnforced) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kCTAndPKPHost, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -648,8 +638,7 @@ TEST_F(ProofVerifierChromiumTest, PKPBypassFlagSet) {
&transport_security_state_, nullptr,
{kCTAndPKPHost}, NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kCTAndPKPHost, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -702,8 +691,7 @@ TEST_F(ProofVerifierChromiumTest, PKPReport) {
&transport_security_state_, nullptr, {},
network_isolation_key);
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kCTAndPKPHost, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -763,8 +751,7 @@ TEST_F(ProofVerifierChromiumTest, CTIsRequired) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -823,8 +810,7 @@ TEST_F(ProofVerifierChromiumTest, PKPAndCTBothTested) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kCTAndPKPHost, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -864,8 +850,7 @@ TEST_F(ProofVerifierChromiumTest, UnknownRootRejected) {
&transport_security_state_, nullptr, {},
NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -896,8 +881,7 @@ TEST_F(ProofVerifierChromiumTest, UnknownRootAcceptedWithOverride) {
&transport_security_state_, nullptr,
{kTestHostname}, NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -933,8 +917,7 @@ TEST_F(ProofVerifierChromiumTest, UnknownRootAcceptedWithWildcardOverride) {
&transport_security_state_, nullptr,
{""}, NetworkIsolationKey());
- std::unique_ptr<DummyProofVerifierCallback> callback(
- new DummyProofVerifierCallback);
+ auto callback = std::make_unique<DummyProofVerifierCallback>();
quic::QuicAsyncStatus status = proof_verifier.VerifyProof(
kTestHostname, kTestPort, kTestConfig, kTestTransportVersion,
kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(),
@@ -998,5 +981,4 @@ TEST_F(ProofVerifierChromiumTest, SCTAuditingReportCollected) {
ASSERT_EQ(quic::QUIC_SUCCESS, status);
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/crypto_test_utils_chromium.cc b/chromium/net/quic/crypto_test_utils_chromium.cc
index d34e2f2b0ea..db68335933e 100644
--- a/chromium/net/quic/crypto_test_utils_chromium.cc
+++ b/chromium/net/quic/crypto_test_utils_chromium.cc
@@ -38,8 +38,7 @@ using std::string;
namespace net::test {
std::unique_ptr<quic::ProofSource> ProofSourceForTestingChromium() {
- std::unique_ptr<net::ProofSourceChromium> source(
- new net::ProofSourceChromium());
+ auto source = std::make_unique<net::ProofSourceChromium>();
base::FilePath certs_dir = net::GetTestCertsDirectory();
CHECK(source->Initialize(certs_dir.AppendASCII("quic-chain.pem"),
certs_dir.AppendASCII("quic-leaf-cert.key"),
diff --git a/chromium/net/quic/dedicated_web_transport_http3_client.cc b/chromium/net/quic/dedicated_web_transport_http3_client.cc
index fdaa2b18f65..9d3116ea232 100644
--- a/chromium/net/quic/dedicated_web_transport_http3_client.cc
+++ b/chromium/net/quic/dedicated_web_transport_http3_client.cc
@@ -10,8 +10,10 @@
#include "base/metrics/histogram_functions.h"
#include "base/strings/abseil_string_conversions.h"
#include "base/threading/thread_task_runner_handle.h"
+#include "net/base/address_list.h"
#include "net/base/port_util.h"
#include "net/base/url_util.h"
+#include "net/http/http_network_session.h"
#include "net/log/net_log_values.h"
#include "net/proxy_resolution/configured_proxy_resolution_service.h"
#include "net/proxy_resolution/proxy_resolution_request.h"
@@ -220,7 +222,7 @@ class WebTransportVisitorProxy : public quic::WebTransportVisitor {
explicit WebTransportVisitorProxy(quic::WebTransportVisitor* visitor)
: visitor_(visitor) {}
- void OnSessionReady(const spdy::SpdyHeaderBlock& block) override {
+ void OnSessionReady(const spdy::Http2HeaderBlock& block) override {
visitor_->OnSessionReady(block);
}
void OnSessionClosed(quic::WebTransportSessionError error_code,
@@ -266,8 +268,6 @@ DedicatedWebTransportHttp3Client::DedicatedWebTransportHttp3Client(
isolation_key_(isolation_key),
context_(context),
visitor_(visitor),
- // TODO(vasilvv): pass ClientSocketFactory through QuicContext.
- client_socket_factory_(ClientSocketFactory::GetDefaultFactory()),
quic_context_(context->quic_context()),
net_log_(NetLogWithSource::Make(context->net_log(),
NetLogSourceType::WEB_TRANSPORT_CLIENT)),
@@ -462,8 +462,10 @@ int DedicatedWebTransportHttp3Client::DoConnect() {
// TODO(vasilvv): consider unifying parts of this code with QuicSocketFactory
// (which currently has a lot of code specific to QuicChromiumClientSession).
- socket_ = client_socket_factory_->CreateDatagramClientSocket(
- DatagramSocket::DEFAULT_BIND, net_log_.net_log(), net_log_.source());
+ socket_ = context_->GetNetworkSessionContext()
+ ->client_socket_factory->CreateDatagramClientSocket(
+ DatagramSocket::DEFAULT_BIND, net_log_.net_log(),
+ net_log_.source());
if (quic_context_->params()->enable_socket_recv_optimization)
socket_->EnableRecvOptimization();
socket_->UseNonBlockingIO();
@@ -596,7 +598,7 @@ int DedicatedWebTransportHttp3Client::DoSendRequest() {
}
connect_stream_ = stream;
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
DCHECK_EQ(url_.scheme(), url::kHttpsScheme);
headers[":scheme"] = url_.scheme();
headers[":method"] = "CONNECT";
@@ -696,7 +698,7 @@ void DedicatedWebTransportHttp3Client::SetErrorIfNecessary(
}
void DedicatedWebTransportHttp3Client::OnSessionReady(
- const spdy::SpdyHeaderBlock& spdy_headers) {
+ const spdy::Http2HeaderBlock& spdy_headers) {
session_ready_ = true;
http_response_info_ = std::make_unique<HttpResponseInfo>();
const int rv =
diff --git a/chromium/net/quic/dedicated_web_transport_http3_client.h b/chromium/net/quic/dedicated_web_transport_http3_client.h
index 801d7c4aef0..b13993c2293 100644
--- a/chromium/net/quic/dedicated_web_transport_http3_client.h
+++ b/chromium/net/quic/dedicated_web_transport_http3_client.h
@@ -68,7 +68,7 @@ class NET_EXPORT DedicatedWebTransportHttp3Client
void OnDatagramProcessed(absl::optional<quic::MessageStatus> status);
// QuicTransportClientSession::ClientVisitor methods.
- void OnSessionReady(const spdy::SpdyHeaderBlock&) override;
+ void OnSessionReady(const spdy::Http2HeaderBlock&) override;
void OnSessionClosed(quic::WebTransportSessionError error_code,
const std::string& error_message) override;
void OnIncomingBidirectionalStreamAvailable() override;
@@ -143,7 +143,6 @@ class NET_EXPORT DedicatedWebTransportHttp3Client
const raw_ptr<URLRequestContext> context_; // Unowned.
const raw_ptr<WebTransportClientVisitor> visitor_; // Unowned.
- const raw_ptr<ClientSocketFactory> client_socket_factory_; // Unowned.
const raw_ptr<QuicContext> quic_context_; // Unowned.
NetLogWithSource net_log_;
raw_ptr<base::SequencedTaskRunner> task_runner_; // Unowned.
diff --git a/chromium/net/quic/dedicated_web_transport_http3_client_test.cc b/chromium/net/quic/dedicated_web_transport_http3_client_test.cc
index ccd5957d05f..a68940ef83f 100644
--- a/chromium/net/quic/dedicated_web_transport_http3_client_test.cc
+++ b/chromium/net/quic/dedicated_web_transport_http3_client_test.cc
@@ -28,8 +28,7 @@
#include "url/gurl.h"
#include "url/origin.h"
-namespace net {
-namespace test {
+namespace net::test {
namespace {
using ::quic::test::MemSliceFromString;
@@ -205,8 +204,8 @@ TEST_F(DedicatedWebTransportHttp3Test, Connect) {
Run();
}
-// TODO(https://crbug.com/1288036): The test is flaky on Mac.
-#if BUILDFLAG(IS_MAC)
+// TODO(https://crbug.com/1288036): The test is flaky on Mac and iOS.
+#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_MAC)
#define MAYBE_CloseTimeout DISABLED_CloseTimeout
#else
#define MAYBE_CloseTimeout CloseTimeout
@@ -263,5 +262,4 @@ TEST_F(DedicatedWebTransportHttp3Test, CloseReason) {
}
} // namespace
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/mock_crypto_client_stream.cc b/chromium/net/quic/mock_crypto_client_stream.cc
index 8183255ad0c..5252179de20 100644
--- a/chromium/net/quic/mock_crypto_client_stream.cc
+++ b/chromium/net/quic/mock_crypto_client_stream.cc
@@ -81,7 +81,7 @@ MockCryptoClientStream::MockCryptoClientStream(
crypto_negotiated_params_->cipher_suite = 1;
}
-MockCryptoClientStream::~MockCryptoClientStream() {}
+MockCryptoClientStream::~MockCryptoClientStream() = default;
void MockCryptoClientStream::OnHandshakeMessage(
const CryptoHandshakeMessage& message) {
diff --git a/chromium/net/quic/mock_crypto_client_stream.h b/chromium/net/quic/mock_crypto_client_stream.h
index d6bf54b370f..0abfd5e6870 100644
--- a/chromium/net/quic/mock_crypto_client_stream.h
+++ b/chromium/net/quic/mock_crypto_client_stream.h
@@ -6,6 +6,7 @@
#define NET_QUIC_MOCK_CRYPTO_CLIENT_STREAM_H_
#include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
#include "net/quic/crypto/proof_verifier_chromium.h"
#include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake.h"
#include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h"
@@ -88,6 +89,10 @@ class MockCryptoClientStream : public quic::QuicCryptoClientStream,
// Notify session that 0-RTT setup is complete.
void NotifySessionZeroRttComplete();
+ base::WeakPtr<MockCryptoClientStream> GetWeakPtr() {
+ return weak_factory_.GetWeakPtr();
+ }
+
static quic::CryptoHandshakeMessage GetDummyCHLOMessage();
protected:
@@ -111,6 +116,7 @@ class MockCryptoClientStream : public quic::QuicCryptoClientStream,
const quic::QuicServerId server_id_;
raw_ptr<const net::ProofVerifyDetailsChromium> proof_verify_details_;
const quic::QuicConfig config_;
+ base::WeakPtrFactory<MockCryptoClientStream> weak_factory_{this};
};
} // namespace net
diff --git a/chromium/net/quic/mock_crypto_client_stream_factory.cc b/chromium/net/quic/mock_crypto_client_stream_factory.cc
index 49a993537b8..af9a93d3e43 100644
--- a/chromium/net/quic/mock_crypto_client_stream_factory.cc
+++ b/chromium/net/quic/mock_crypto_client_stream_factory.cc
@@ -12,16 +12,16 @@ using std::string;
namespace net {
-MockCryptoClientStreamFactory::~MockCryptoClientStreamFactory() {}
+MockCryptoClientStreamFactory::~MockCryptoClientStreamFactory() = default;
MockCryptoClientStreamFactory::MockCryptoClientStreamFactory()
- : config_(new quic::QuicConfig()) {}
+ : config_(std::make_unique<quic::QuicConfig>()) {}
void MockCryptoClientStreamFactory::SetConfig(const quic::QuicConfig& config) {
config_ = std::make_unique<quic::QuicConfig>(config);
}
-quic::QuicCryptoClientStream*
+std::unique_ptr<quic::QuicCryptoClientStream>
MockCryptoClientStreamFactory::CreateQuicCryptoClientStream(
const quic::QuicServerId& server_id,
QuicChromiumClientSession* session,
@@ -32,10 +32,17 @@ MockCryptoClientStreamFactory::CreateQuicCryptoClientStream(
proof_verify_details = proof_verify_details_queue_.front();
proof_verify_details_queue_.pop();
}
- last_stream_ = new MockCryptoClientStream(
- server_id, session, nullptr, *(config_.get()), crypto_config,
- handshake_mode_, proof_verify_details, use_mock_crypter_);
- return last_stream_;
+ std::unique_ptr<MockCryptoClientStream> stream =
+ std::make_unique<MockCryptoClientStream>(
+ server_id, session, nullptr, *(config_.get()), crypto_config,
+ handshake_mode_, proof_verify_details, use_mock_crypter_);
+ streams_.push_back(stream->GetWeakPtr());
+ return stream;
+}
+
+MockCryptoClientStream* MockCryptoClientStreamFactory::last_stream() const {
+ CHECK(!streams_.empty());
+ return streams_.back().get();
}
} // namespace net
diff --git a/chromium/net/quic/mock_crypto_client_stream_factory.h b/chromium/net/quic/mock_crypto_client_stream_factory.h
index 2a703b83fdf..7b0e8017b58 100644
--- a/chromium/net/quic/mock_crypto_client_stream_factory.h
+++ b/chromium/net/quic/mock_crypto_client_stream_factory.h
@@ -6,6 +6,7 @@
#define NET_QUIC_MOCK_CRYPTO_CLIENT_STREAM_FACTORY_H_
#include <memory>
+#include <vector>
#include "base/containers/queue.h"
#include "base/memory/raw_ptr.h"
@@ -29,7 +30,7 @@ class MockCryptoClientStreamFactory : public QuicCryptoClientStreamFactory {
~MockCryptoClientStreamFactory() override;
- quic::QuicCryptoClientStream* CreateQuicCryptoClientStream(
+ std::unique_ptr<quic::QuicCryptoClientStream> CreateQuicCryptoClientStream(
const quic::QuicServerId& server_id,
QuicChromiumClientSession* session,
std::unique_ptr<quic::ProofVerifyContext> proof_verify_context,
@@ -50,7 +51,10 @@ class MockCryptoClientStreamFactory : public QuicCryptoClientStreamFactory {
proof_verify_details_queue_.push(proof_verify_details);
}
- MockCryptoClientStream* last_stream() const { return last_stream_; }
+ MockCryptoClientStream* last_stream() const;
+ const std::vector<base::WeakPtr<MockCryptoClientStream>>& streams() const {
+ return streams_;
+ }
// Sets initial config for new sessions.
void SetConfig(const quic::QuicConfig& config);
@@ -58,7 +62,7 @@ class MockCryptoClientStreamFactory : public QuicCryptoClientStreamFactory {
private:
MockCryptoClientStream::HandshakeMode handshake_mode_ =
MockCryptoClientStream::CONFIRM_HANDSHAKE;
- raw_ptr<MockCryptoClientStream> last_stream_ = nullptr;
+ std::vector<base::WeakPtr<MockCryptoClientStream>> streams_;
base::queue<const ProofVerifyDetailsChromium*> proof_verify_details_queue_;
std::unique_ptr<quic::QuicConfig> config_;
bool use_mock_crypter_ = false;
diff --git a/chromium/net/quic/mock_decrypter.h b/chromium/net/quic/mock_decrypter.h
index f47469eda13..285b026403d 100644
--- a/chromium/net/quic/mock_decrypter.h
+++ b/chromium/net/quic/mock_decrypter.h
@@ -26,7 +26,7 @@ class MockDecrypter : public quic::QuicDecrypter {
MockDecrypter(const MockDecrypter&) = delete;
MockDecrypter& operator=(const MockDecrypter&) = delete;
- ~MockDecrypter() override {}
+ ~MockDecrypter() override = default;
// QuicCrypter implementation
bool SetKey(absl::string_view key) override;
diff --git a/chromium/net/quic/mock_encrypter.h b/chromium/net/quic/mock_encrypter.h
index 8a4dc3b8091..1c2f7aa4764 100644
--- a/chromium/net/quic/mock_encrypter.h
+++ b/chromium/net/quic/mock_encrypter.h
@@ -25,7 +25,7 @@ class MockEncrypter : public quic::QuicEncrypter {
MockEncrypter(const MockEncrypter&) = delete;
MockEncrypter& operator=(const MockEncrypter&) = delete;
- ~MockEncrypter() override {}
+ ~MockEncrypter() override = default;
// QuicEncrypter implementation
bool SetKey(absl::string_view key) override;
diff --git a/chromium/net/quic/mock_quic_data.cc b/chromium/net/quic/mock_quic_data.cc
index 0ba04e7bcad..da0bb625524 100644
--- a/chromium/net/quic/mock_quic_data.cc
+++ b/chromium/net/quic/mock_quic_data.cc
@@ -5,13 +5,12 @@
#include "net/quic/mock_quic_data.h"
#include "net/base/hex_utils.h"
-namespace net {
-namespace test {
+namespace net::test {
MockQuicData::MockQuicData(quic::ParsedQuicVersion version)
: printer_(version) {}
-MockQuicData::~MockQuicData() {}
+MockQuicData::~MockQuicData() = default;
void MockQuicData::AddConnect(IoMode mode, int rv) {
connect_ = std::make_unique<MockConnect>(mode, rv);
@@ -19,29 +18,29 @@ void MockQuicData::AddConnect(IoMode mode, int rv) {
void MockQuicData::AddRead(IoMode mode,
std::unique_ptr<quic::QuicEncryptedPacket> packet) {
- reads_.push_back(
- MockRead(mode, packet->data(), packet->length(), sequence_number_++));
+ reads_.emplace_back(mode, packet->data(), packet->length(),
+ sequence_number_++);
packets_.push_back(std::move(packet));
}
void MockQuicData::AddRead(IoMode mode, int rv) {
- reads_.push_back(MockRead(mode, rv, sequence_number_++));
+ reads_.emplace_back(mode, rv, sequence_number_++);
}
void MockQuicData::AddWrite(IoMode mode,
std::unique_ptr<quic::QuicEncryptedPacket> packet) {
- writes_.push_back(
- MockWrite(mode, packet->data(), packet->length(), sequence_number_++));
+ writes_.emplace_back(mode, packet->data(), packet->length(),
+ sequence_number_++);
packets_.push_back(std::move(packet));
}
void MockQuicData::AddWrite(IoMode mode, int rv) {
- writes_.push_back(MockWrite(mode, rv, sequence_number_++));
+ writes_.emplace_back(mode, rv, sequence_number_++);
}
void MockQuicData::AddWrite(IoMode mode,
int rv,
std::unique_ptr<quic::QuicEncryptedPacket> packet) {
- writes_.push_back(MockWrite(mode, rv, sequence_number_++));
+ writes_.emplace_back(mode, rv, sequence_number_++);
packets_.push_back(std::move(packet));
}
@@ -74,5 +73,4 @@ SequencedSocketData* MockQuicData::GetSequencedSocketData() {
return socket_data_.get();
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/mock_quic_data.h b/chromium/net/quic/mock_quic_data.h
index 6c87c68a184..c163365e6c4 100644
--- a/chromium/net/quic/mock_quic_data.h
+++ b/chromium/net/quic/mock_quic_data.h
@@ -9,8 +9,7 @@
#include "net/socket/socket_test_util.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h"
-namespace net {
-namespace test {
+namespace net::test {
// Helper class to encapsulate MockReads and MockWrites for QUIC.
// Simplify ownership issues and the interaction with the MockSocketFactory.
@@ -73,7 +72,6 @@ class MockQuicData {
QuicPacketPrinter printer_;
};
-} // namespace test
-} // namespace net
+} // namespace net::test
#endif // NET_QUIC_MOCK_QUIC_DATA_H_
diff --git a/chromium/net/quic/network_connection_unittest.cc b/chromium/net/quic/network_connection_unittest.cc
index 6589ff9449b..51054cfb20e 100644
--- a/chromium/net/quic/network_connection_unittest.cc
+++ b/chromium/net/quic/network_connection_unittest.cc
@@ -10,8 +10,7 @@
#include "net/test/test_with_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
constexpr auto CONNECTION_3G = NetworkChangeNotifier::CONNECTION_3G;
constexpr auto CONNECTION_2G = NetworkChangeNotifier::CONNECTION_2G;
@@ -103,5 +102,4 @@ TEST_F(NetworkConnectionTest, ConnectionChange) {
description_ethernet);
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/platform/impl/quic_chromium_clock_test.cc b/chromium/net/quic/platform/impl/quic_chromium_clock_test.cc
index 4ade317f9b5..c6356da8268 100644
--- a/chromium/net/quic/platform/impl/quic_chromium_clock_test.cc
+++ b/chromium/net/quic/platform/impl/quic_chromium_clock_test.cc
@@ -7,8 +7,7 @@
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace quic {
-namespace test {
+namespace quic::test {
TEST(QuicChromiumClockTest, Now) {
QuicChromiumClock clock;
@@ -35,5 +34,4 @@ TEST(QuicChromiumClockTest, WallNow) {
}
}
-} // namespace test
-} // namespace quic
+} // namespace quic::test
diff --git a/chromium/net/quic/properties_based_quic_server_info.cc b/chromium/net/quic/properties_based_quic_server_info.cc
index d41a536c724..338bc059e4d 100644
--- a/chromium/net/quic/properties_based_quic_server_info.cc
+++ b/chromium/net/quic/properties_based_quic_server_info.cc
@@ -33,7 +33,7 @@ PropertiesBasedQuicServerInfo::PropertiesBasedQuicServerInfo(
DCHECK(http_server_properties_);
}
-PropertiesBasedQuicServerInfo::~PropertiesBasedQuicServerInfo() {}
+PropertiesBasedQuicServerInfo::~PropertiesBasedQuicServerInfo() = default;
bool PropertiesBasedQuicServerInfo::Load() {
const string* data = http_server_properties_->GetQuicServerInfo(
diff --git a/chromium/net/quic/properties_based_quic_server_info_test.cc b/chromium/net/quic/properties_based_quic_server_info_test.cc
index 7806fadca3e..967a1cdb0f2 100644
--- a/chromium/net/quic/properties_based_quic_server_info_test.cc
+++ b/chromium/net/quic/properties_based_quic_server_info_test.cc
@@ -15,8 +15,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
namespace {
const char kServerConfigA[] = "server_config_a";
@@ -96,5 +95,4 @@ TEST_F(PropertiesBasedQuicServerInfoTest, Update) {
EXPECT_EQ(kCertB, state3.certs[1]);
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_address_mismatch_test.cc b/chromium/net/quic/quic_address_mismatch_test.cc
index 5c6d5874e2e..956c04776ec 100644
--- a/chromium/net/quic/quic_address_mismatch_test.cc
+++ b/chromium/net/quic/quic_address_mismatch_test.cc
@@ -6,8 +6,7 @@
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
// Test all cases of the GetAddressMismatch function.
TEST(QuicAddressMismatchTest, GetAddressMismatch) {
@@ -95,5 +94,4 @@ TEST(QuicAddressMismatchTest, GetAddressMismatch) {
GetAddressMismatch(IPEndPoint(ip6_1, 80), IPEndPoint(ip4_mapped_1, 443)));
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_chromium_alarm_factory.cc b/chromium/net/quic/quic_chromium_alarm_factory.cc
index 3f7cf21c245..e70fdf70e72 100644
--- a/chromium/net/quic/quic_chromium_alarm_factory.cc
+++ b/chromium/net/quic/quic_chromium_alarm_factory.cc
@@ -78,7 +78,7 @@ QuicChromiumAlarmFactory::QuicChromiumAlarmFactory(
const quic::QuicClock* clock)
: task_runner_(task_runner), clock_(clock) {}
-QuicChromiumAlarmFactory::~QuicChromiumAlarmFactory() {}
+QuicChromiumAlarmFactory::~QuicChromiumAlarmFactory() = default;
quic::QuicArenaScopedPtr<quic::QuicAlarm> QuicChromiumAlarmFactory::CreateAlarm(
quic::QuicArenaScopedPtr<quic::QuicAlarm::Delegate> delegate,
diff --git a/chromium/net/quic/quic_chromium_alarm_factory_test.cc b/chromium/net/quic/quic_chromium_alarm_factory_test.cc
index 1f74a825e59..f40903e11a9 100644
--- a/chromium/net/quic/quic_chromium_alarm_factory_test.cc
+++ b/chromium/net/quic/quic_chromium_alarm_factory_test.cc
@@ -8,8 +8,7 @@
#include "net/third_party/quiche/src/quiche/quic/test_tools/mock_clock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
namespace {
class TestDelegate : public quic::QuicAlarm::DelegateWithoutContext {
@@ -28,7 +27,7 @@ class TestDelegate : public quic::QuicAlarm::DelegateWithoutContext {
class QuicChromiumAlarmFactoryTest : public ::testing::Test {
protected:
QuicChromiumAlarmFactoryTest()
- : runner_(new TestTaskRunner(&clock_)),
+ : runner_(base::MakeRefCounted<TestTaskRunner>(&clock_)),
alarm_factory_(runner_.get(), &clock_) {}
scoped_refptr<TestTaskRunner> runner_;
@@ -226,5 +225,4 @@ TEST_F(QuicChromiumAlarmFactoryTest, CreateAlarmAndUpdate) {
}
} // namespace
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_chromium_client_session.cc b/chromium/net/quic/quic_chromium_client_session.cc
index b84d03fd7ca..d91504d1f1a 100644
--- a/chromium/net/quic/quic_chromium_client_session.cc
+++ b/chromium/net/quic/quic_chromium_client_session.cc
@@ -201,7 +201,7 @@ base::Value NetLogQuicMigrationSuccessParams(
}
base::Value NetLogProbingResultParams(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const quic::QuicSocketAddress* peer_address,
bool is_success) {
base::Value::Dict dict;
@@ -393,10 +393,14 @@ void QuicChromiumClientSession::Handle::OnSessionClosed(
int net_error,
quic::QuicErrorCode quic_error,
bool port_migration_detected,
+ bool quic_connection_migration_attempted,
+ bool quic_connection_migration_successful,
LoadTimingInfo::ConnectTiming connect_timing,
bool was_ever_used) {
session_ = nullptr;
port_migration_detected_ = port_migration_detected;
+ quic_connection_migration_attempted_ = quic_connection_migration_attempted;
+ quic_connection_migration_successful_ = quic_connection_migration_successful;
net_error_ = net_error;
quic_error_ = quic_error;
quic_version_ = quic_version;
@@ -428,6 +432,10 @@ void QuicChromiumClientSession::Handle::PopulateNetErrorDetails(
} else {
details->quic_port_migration_detected = port_migration_detected_;
details->quic_connection_error = quic_error_;
+ details->quic_connection_migration_attempted =
+ quic_connection_migration_attempted_;
+ details->quic_connection_migration_successful =
+ quic_connection_migration_successful_;
}
}
@@ -762,7 +770,7 @@ QuicChromiumClientSession::QuicChromiumPathValidationContext::
QuicChromiumPathValidationContext(
const quic::QuicSocketAddress& self_address,
const quic::QuicSocketAddress& peer_address,
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
std::unique_ptr<DatagramClientSocket> socket,
std::unique_ptr<QuicChromiumPacketWriter> writer,
std::unique_ptr<QuicChromiumPacketReader> reader)
@@ -775,7 +783,7 @@ QuicChromiumClientSession::QuicChromiumPathValidationContext::
QuicChromiumClientSession::QuicChromiumPathValidationContext::
~QuicChromiumPathValidationContext() = default;
-NetworkChangeNotifier::NetworkHandle
+handles::NetworkHandle
QuicChromiumClientSession::QuicChromiumPathValidationContext::network() {
return network_handle_;
}
@@ -803,7 +811,8 @@ QuicChromiumClientSession::ConnectionMigrationValidationResultDelegate::
void QuicChromiumClientSession::ConnectionMigrationValidationResultDelegate::
OnPathValidationSuccess(
- std::unique_ptr<quic::QuicPathValidationContext> context) {
+ std::unique_ptr<quic::QuicPathValidationContext> context,
+ quic::QuicTime start_time) {
auto* chrome_context =
static_cast<QuicChromiumPathValidationContext*>(context.get());
session_->OnConnectionMigrationProbeSucceeded(
@@ -830,7 +839,8 @@ QuicChromiumClientSession::PortMigrationValidationResultDelegate::
void QuicChromiumClientSession::PortMigrationValidationResultDelegate::
OnPathValidationSuccess(
- std::unique_ptr<quic::QuicPathValidationContext> context) {
+ std::unique_ptr<quic::QuicPathValidationContext> context,
+ quic::QuicTime start_time) {
auto* chrome_context =
static_cast<QuicChromiumPathValidationContext*>(context.get());
session_->OnPortMigrationProbeSucceeded(
@@ -857,7 +867,7 @@ QuicChromiumClientSession::QuicChromiumPathValidationWriterDelegate::
base::SequencedTaskRunner* task_runner)
: session_(session),
task_runner_(task_runner),
- network_(NetworkChangeNotifier::kInvalidNetworkHandle) {}
+ network_(handles::kInvalidNetworkHandle) {}
QuicChromiumClientSession::QuicChromiumPathValidationWriterDelegate::
~QuicChromiumPathValidationWriterDelegate() = default;
@@ -886,7 +896,7 @@ void QuicChromiumClientSession::QuicChromiumPathValidationWriterDelegate::
OnWriteUnblocked() {}
void QuicChromiumClientSession::QuicChromiumPathValidationWriterDelegate::
- NotifySessionProbeFailed(NetworkChangeNotifier::NetworkHandle network) {
+ NotifySessionProbeFailed(handles::NetworkHandle network) {
session_->OnProbeFailed(network, peer_address_);
}
@@ -896,7 +906,7 @@ void QuicChromiumClientSession::QuicChromiumPathValidationWriterDelegate::
}
void QuicChromiumClientSession::QuicChromiumPathValidationWriterDelegate::
- set_network(NetworkChangeNotifier::NetworkHandle network) {
+ set_network(handles::NetworkHandle network) {
network_ = network;
}
@@ -913,7 +923,7 @@ QuicChromiumClientSession::QuicChromiumClientSession(
bool require_confirmation,
bool migrate_session_early_v2,
bool migrate_sessions_on_network_change_v2,
- NetworkChangeNotifier::NetworkHandle default_network,
+ handles::NetworkHandle default_network,
quic::QuicTime::Delta retransmittable_on_wire_timeout,
bool migrate_idle_session,
bool allow_port_migration,
@@ -968,12 +978,13 @@ QuicChromiumClientSession::QuicChromiumClientSession(
server_info_(std::move(server_info)),
task_runner_(task_runner),
net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::QUIC_SESSION)),
- logger_(new QuicConnectionLogger(this,
- connection_description,
- std::move(socket_performance_watcher),
- net_log_)),
+ logger_(std::make_unique<QuicConnectionLogger>(
+ this,
+ connection_description,
+ std::move(socket_performance_watcher),
+ net_log_)),
http3_logger_(VersionUsesHttp3(connection->transport_version())
- ? new QuicHttp3Logger(net_log_)
+ ? std::make_unique<QuicHttp3Logger>(net_log_)
: nullptr),
push_delegate_(push_delegate),
headers_include_h2_stream_dependency_(
@@ -987,12 +998,10 @@ QuicChromiumClientSession::QuicChromiumClientSession(
sockets_.back().get(), clock, this, yield_after_packets,
yield_after_duration, net_log_));
CHECK_EQ(packet_readers_.size(), sockets_.size());
- crypto_stream_.reset(
- crypto_client_stream_factory->CreateQuicCryptoClientStream(
- session_key.server_id(), this,
- std::make_unique<ProofVerifyContextChromium>(cert_verify_flags,
- net_log_),
- crypto_config_->GetConfig()));
+ crypto_stream_ = crypto_client_stream_factory->CreateQuicCryptoClientStream(
+ session_key.server_id(), this,
+ std::make_unique<ProofVerifyContextChromium>(cert_verify_flags, net_log_),
+ crypto_config_->GetConfig());
if (VersionUsesHttp3(transport_version()))
set_debug_visitor(http3_logger_.get());
connection->set_debug_visitor(logger_.get());
@@ -1220,8 +1229,10 @@ void QuicChromiumClientSession::OnAcceptChFrameReceivedViaAlps(
void QuicChromiumClientSession::AddHandle(Handle* handle) {
if (going_away_) {
handle->OnSessionClosed(connection()->version(), ERR_UNEXPECTED, error(),
- port_migration_detected_, GetConnectTiming(),
- WasConnectionEverUsed());
+ port_migration_detected_,
+ quic_connection_migration_attempted_,
+ quic_connection_migration_successful_,
+ GetConnectTiming(), WasConnectionEverUsed());
return;
}
@@ -1708,9 +1719,9 @@ void QuicChromiumClientSession::OnConfigNegotiated() {
}
DCHECK_EQ(new_address.GetFamily(), old_address.GetFamily());
- // Specifying kInvalidNetworkHandle for the |network| parameter
+ // Specifying handles::kInvalidNetworkHandle for the |network| parameter
// causes the session to use the default network for the new socket.
- Migrate(NetworkChangeNotifier::kInvalidNetworkHandle, new_address,
+ Migrate(handles::kInvalidNetworkHandle, new_address,
/*close_session_on_error=*/true);
}
@@ -1836,7 +1847,7 @@ void QuicChromiumClientSession::OnConnectionClosed(
RecordConnectionCloseErrorCode(frame, source, session_key_.host(),
OneRttKeysAvailable());
if (OneRttKeysAvailable()) {
- NetworkChangeNotifier::NetworkHandle current_network = GetCurrentNetwork();
+ handles::NetworkHandle current_network = GetCurrentNetwork();
for (auto& observer : connectivity_observer_list_)
observer.OnSessionClosedAfterHandshake(this, current_network, source,
frame.quic_error_code);
@@ -2096,7 +2107,7 @@ int QuicChromiumClientSession::HandleWriteError(
// For now, skip reporting if there are multiple packet writers and
// connection migration is enabled.
if (sockets_.size() == 1u || !migrate_session_early_v2_) {
- NetworkChangeNotifier::NetworkHandle current_network = GetCurrentNetwork();
+ handles::NetworkHandle current_network = GetCurrentNetwork();
for (auto& observer : connectivity_observer_list_) {
observer.OnSessionEncounteringWriteError(this, current_network,
error_code);
@@ -2109,7 +2120,7 @@ int QuicChromiumClientSession::HandleWriteError(
return error_code;
}
- NetworkChangeNotifier::NetworkHandle current_network = GetCurrentNetwork();
+ handles::NetworkHandle current_network = GetCurrentNetwork();
net_log_.AddEventWithInt64Params(
NetLogEventType::QUIC_CONNECTION_MIGRATION_ON_WRITE_ERROR, "network",
@@ -2188,9 +2199,9 @@ void QuicChromiumClientSession::MigrateSessionOnWriteError(
return;
}
- NetworkChangeNotifier::NetworkHandle new_network =
+ handles::NetworkHandle new_network =
stream_factory_->FindAlternateNetwork(GetCurrentNetwork());
- if (new_network == NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (new_network == handles::kInvalidNetworkHandle) {
// No alternate network found.
HistogramAndLogMigrationFailure(MIGRATION_STATUS_NO_ALTERNATE_NETWORK,
connection_id(),
@@ -2285,7 +2296,7 @@ void QuicChromiumClientSession::OnMigrationTimeout(size_t num_sockets) {
}
void QuicChromiumClientSession::OnPortMigrationProbeSucceeded(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address,
const quic::QuicSocketAddress& self_address,
std::unique_ptr<DatagramClientSocket> socket,
@@ -2340,7 +2351,7 @@ void QuicChromiumClientSession::OnPortMigrationProbeSucceeded(
}
void QuicChromiumClientSession::OnConnectionMigrationProbeSucceeded(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address,
const quic::QuicSocketAddress& self_address,
std::unique_ptr<DatagramClientSocket> socket,
@@ -2355,7 +2366,7 @@ void QuicChromiumClientSession::OnConnectionMigrationProbeSucceeded(
return NetLogProbingResultParams(network, &peer_address,
/*is_success=*/true);
});
- if (network == NetworkChangeNotifier::kInvalidNetworkHandle)
+ if (network == handles::kInvalidNetworkHandle)
return;
LogProbeResultToHistogram(current_migration_cause_, true);
@@ -2420,7 +2431,7 @@ void QuicChromiumClientSession::OnConnectionMigrationProbeSucceeded(
}
void QuicChromiumClientSession::OnProbeFailed(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address) {
DCHECK(connection()->connection_migration_use_new_cid());
net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CONNECTIVITY_PROBING_FINISHED,
@@ -2442,7 +2453,7 @@ void QuicChromiumClientSession::OnProbeFailed(
connection()->CancelPathValidation();
}
- if (network != NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (network != handles::kInvalidNetworkHandle) {
// Probing failure can be ignored.
DVLOG(1) << "Connectivity probing failed on <network: " << network
<< ", peer_address: " << peer_address.ToString() << ">.";
@@ -2454,7 +2465,7 @@ void QuicChromiumClientSession::OnProbeFailed(
}
void QuicChromiumClientSession::OnNetworkConnected(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
if (connection()->IsPathDegrading()) {
base::TimeDelta duration =
tick_clock_->NowTicks() - most_recent_path_degrading_timestamp_;
@@ -2491,7 +2502,7 @@ void QuicChromiumClientSession::OnNetworkConnected(
}
void QuicChromiumClientSession::OnNetworkDisconnectedV2(
- NetworkChangeNotifier::NetworkHandle disconnected_network) {
+ handles::NetworkHandle disconnected_network) {
LogMetricsOnNetworkDisconnected();
if (!migrate_session_on_network_change_v2_ || !version().UsesHttp3())
return;
@@ -2511,7 +2522,7 @@ void QuicChromiumClientSession::OnNetworkDisconnectedV2(
if (disconnected_network == default_network_) {
DVLOG(1) << "Default network: " << default_network_ << " is disconnected.";
- default_network_ = NetworkChangeNotifier::kInvalidNetworkHandle;
+ default_network_ = handles::kInvalidNetworkHandle;
current_migrations_to_non_default_network_on_write_error_ = 0;
}
@@ -2535,10 +2546,10 @@ void QuicChromiumClientSession::OnNetworkDisconnectedV2(
}
// Attempt to find alternative network.
- NetworkChangeNotifier::NetworkHandle new_network =
+ handles::NetworkHandle new_network =
stream_factory_->FindAlternateNetwork(disconnected_network);
- if (new_network == NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (new_network == handles::kInvalidNetworkHandle) {
OnNoNewNetwork();
return;
}
@@ -2549,13 +2560,13 @@ void QuicChromiumClientSession::OnNetworkDisconnectedV2(
}
void QuicChromiumClientSession::OnNetworkMadeDefault(
- NetworkChangeNotifier::NetworkHandle new_network) {
+ handles::NetworkHandle new_network) {
LogMetricsOnNetworkMadeDefault();
if (!migrate_session_on_network_change_v2_ || !version().UsesHttp3())
return;
- DCHECK_NE(NetworkChangeNotifier::kInvalidNetworkHandle, new_network);
+ DCHECK_NE(handles::kInvalidNetworkHandle, new_network);
net_log_.AddEventWithInt64Params(
NetLogEventType::QUIC_CONNECTION_MIGRATION_ON_NETWORK_MADE_DEFAULT,
"new_default_network", new_network);
@@ -2586,8 +2597,8 @@ void QuicChromiumClientSession::OnNetworkMadeDefault(
}
void QuicChromiumClientSession::MigrateNetworkImmediately(
- NetworkChangeNotifier::NetworkHandle network) {
- // There is no choice but to migrate to |network|. If any error encoutered,
+ handles::NetworkHandle network) {
+ // There is no choice but to migrate to |network|. If any error encountered,
// close the session. When migration succeeds:
// - if no longer on the default network, start timer to migrate back;
// - otherwise, it's brought to default network, cancel the running timer to
@@ -2690,7 +2701,7 @@ void QuicChromiumClientSession::OnPathDegrading() {
if (most_recent_path_degrading_timestamp_ == base::TimeTicks())
most_recent_path_degrading_timestamp_ = tick_clock_->NowTicks();
- NetworkChangeNotifier::NetworkHandle current_network = GetCurrentNetwork();
+ handles::NetworkHandle current_network = GetCurrentNetwork();
for (auto& observer : connectivity_observer_list_)
observer.OnSessionPathDegrading(this, current_network);
@@ -2706,7 +2717,7 @@ void QuicChromiumClientSession::OnPathDegrading() {
}
void QuicChromiumClientSession::OnForwardProgressMadeAfterPathDegrading() {
- NetworkChangeNotifier::NetworkHandle current_network = GetCurrentNetwork();
+ handles::NetworkHandle current_network = GetCurrentNetwork();
for (auto& observer : connectivity_observer_list_)
observer.OnSessionResumedPostPathDegrading(this, current_network);
}
@@ -2815,8 +2826,10 @@ void QuicChromiumClientSession::CloseAllHandles(int net_error) {
Handle* handle = *handles_.begin();
handles_.erase(handle);
handle->OnSessionClosed(connection()->version(), net_error, error(),
- port_migration_detected_, GetConnectTiming(),
- WasConnectionEverUsed());
+ port_migration_detected_,
+ quic_connection_migration_attempted_,
+ quic_connection_migration_successful_,
+ GetConnectTiming(), WasConnectionEverUsed());
}
}
@@ -2843,6 +2856,8 @@ void QuicChromiumClientSession::NotifyRequestsOfConfirmation(int net_error) {
void QuicChromiumClientSession::MaybeMigrateToDifferentPortOnPathDegrading() {
DCHECK(allow_port_migration_ && !migrate_session_early_v2_);
+ current_migration_cause_ = CHANGE_PORT_ON_PATH_DEGRADING;
+
if (!version().UsesHttp3())
return;
@@ -2861,7 +2876,6 @@ void QuicChromiumClientSession::MaybeMigrateToDifferentPortOnPathDegrading() {
return;
}
- current_migration_cause_ = CHANGE_PORT_ON_PATH_DEGRADING;
net_log_.BeginEvent(NetLogEventType::QUIC_PORT_MIGRATION_TRIGGERED);
if (!stream_factory_)
@@ -2895,9 +2909,9 @@ void QuicChromiumClientSession::
return;
}
- NetworkChangeNotifier::NetworkHandle alternate_network =
+ handles::NetworkHandle alternate_network =
stream_factory_->FindAlternateNetwork(GetCurrentNetwork());
- if (alternate_network == NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (alternate_network == handles::kInvalidNetworkHandle) {
HistogramAndLogMigrationFailure(MIGRATION_STATUS_NO_ALTERNATE_NETWORK,
connection_id(),
"No alternative network on path degrading");
@@ -2924,12 +2938,12 @@ void QuicChromiumClientSession::
}
ProbingResult QuicChromiumClientSession::MaybeStartProbing(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address) {
if (!stream_factory_)
return ProbingResult::FAILURE;
- CHECK_NE(NetworkChangeNotifier::kInvalidNetworkHandle, network);
+ CHECK_NE(handles::kInvalidNetworkHandle, network);
if (!migrate_idle_session_ && !HasActiveRequestStreams()) {
HistogramAndLogMigrationFailure(MIGRATION_STATUS_NO_MIGRATABLE_STREAMS,
@@ -2965,7 +2979,7 @@ ProbingResult QuicChromiumClientSession::MaybeStartProbing(
}
ProbingResult QuicChromiumClientSession::StartProbing(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address) {
if (!connection()->connection_migration_use_new_cid()) {
return ProbingResult::DISABLED_BY_CONFIG;
@@ -2992,12 +3006,11 @@ ProbingResult QuicChromiumClientSession::StartProbing(
}
// Create new packet writer and reader on the probing socket.
- std::unique_ptr<QuicChromiumPacketWriter> probing_writer(
- new QuicChromiumPacketWriter(probing_socket.get(), task_runner_));
- std::unique_ptr<QuicChromiumPacketReader> probing_reader(
- new QuicChromiumPacketReader(probing_socket.get(), clock_, this,
- yield_after_packets_, yield_after_duration_,
- net_log_));
+ auto probing_writer = std::make_unique<QuicChromiumPacketWriter>(
+ probing_socket.get(), task_runner_);
+ auto probing_reader = std::make_unique<QuicChromiumPacketReader>(
+ probing_socket.get(), clock_, this, yield_after_packets_,
+ yield_after_duration_, net_log_);
probing_reader->StartReading();
path_validation_writer_delegate_.set_network(network);
@@ -3041,7 +3054,7 @@ void QuicChromiumClientSession::CancelMigrateBackToDefaultNetworkTimer() {
void QuicChromiumClientSession::TryMigrateBackToDefaultNetwork(
base::TimeDelta timeout) {
- if (default_network_ == NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (default_network_ == handles::kInvalidNetworkHandle) {
DVLOG(1) << "Default network is not connected";
return;
}
@@ -3406,7 +3419,7 @@ void QuicChromiumClientSession::OnCryptoHandshakeComplete() {
// Attempt to migrate back to the default network after handshake has been
// confirmed if the session is not created on the default network.
if (migrate_session_on_network_change_v2_ &&
- default_network_ != NetworkChangeNotifier::kInvalidNetworkHandle &&
+ default_network_ != handles::kInvalidNetworkHandle &&
GetCurrentNetwork() != default_network_ && version().UsesHttp3()) {
current_migration_cause_ = ON_MIGRATE_BACK_TO_DEFAULT_NETWORK;
StartMigrateBackToDefaultNetworkTimer(
@@ -3415,13 +3428,15 @@ void QuicChromiumClientSession::OnCryptoHandshakeComplete() {
}
MigrationResult QuicChromiumClientSession::Migrate(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
IPEndPoint peer_address,
bool close_session_on_error) {
+ quic_connection_migration_attempted_ = true;
+ quic_connection_migration_successful_ = false;
if (!stream_factory_)
return MigrationResult::FAILURE;
- if (network != NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (network != handles::kInvalidNetworkHandle) {
// This is a migration attempt from connection migration.
ResetNonMigratableStreams();
if (!migrate_idle_session_ && !HasActiveRequestStreams()) {
@@ -3459,13 +3474,12 @@ MigrationResult QuicChromiumClientSession::Migrate(
}
// Create new packet reader and writer on the new socket.
- std::unique_ptr<QuicChromiumPacketReader> new_reader(
- new QuicChromiumPacketReader(socket.get(), clock_, this,
- yield_after_packets_, yield_after_duration_,
- net_log_));
+ auto new_reader = std::make_unique<QuicChromiumPacketReader>(
+ socket.get(), clock_, this, yield_after_packets_, yield_after_duration_,
+ net_log_);
new_reader->StartReading();
- std::unique_ptr<QuicChromiumPacketWriter> new_writer(
- new QuicChromiumPacketWriter(socket.get(), task_runner_));
+ auto new_writer =
+ std::make_unique<QuicChromiumPacketWriter>(socket.get(), task_runner_);
static_cast<QuicChromiumPacketWriter*>(connection()->writer())
->set_delegate(nullptr);
@@ -3491,6 +3505,7 @@ MigrationResult QuicChromiumClientSession::Migrate(
}
return MigrationResult::FAILURE;
}
+ quic_connection_migration_successful_ = true;
HistogramAndLogMigrationSuccess(connection_id());
return MigrationResult::SUCCESS;
}
@@ -3541,6 +3556,10 @@ void QuicChromiumClientSession::PopulateNetErrorDetails(
NetErrorDetails* details) const {
details->quic_port_migration_detected = port_migration_detected_;
details->quic_connection_error = error();
+ details->quic_connection_migration_attempted =
+ quic_connection_migration_attempted_;
+ details->quic_connection_migration_successful =
+ quic_connection_migration_successful_;
}
const DatagramClientSocket* QuicChromiumClientSession::GetDefaultSocket()
@@ -3550,8 +3569,7 @@ const DatagramClientSocket* QuicChromiumClientSession::GetDefaultSocket()
return sockets_.back().get();
}
-NetworkChangeNotifier::NetworkHandle
-QuicChromiumClientSession::GetCurrentNetwork() const {
+handles::NetworkHandle QuicChromiumClientSession::GetCurrentNetwork() const {
// If connection migration is enabled, alternate network interface may be
// used to send packet, it is identified as the bound network of the default
// socket. Otherwise, always use |default_network_|.
diff --git a/chromium/net/quic/quic_chromium_client_session.h b/chromium/net/quic/quic_chromium_client_session.h
index f1a38c35968..4a75846c76d 100644
--- a/chromium/net/quic/quic_chromium_client_session.h
+++ b/chromium/net/quic/quic_chromium_client_session.h
@@ -30,6 +30,7 @@
#include "net/base/load_timing_info.h"
#include "net/base/net_error_details.h"
#include "net/base/net_export.h"
+#include "net/base/network_handle.h"
#include "net/base/proxy_server.h"
#include "net/log/net_log_with_source.h"
#include "net/quic/quic_chromium_client_stream.h"
@@ -150,14 +151,13 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
class NET_EXPORT_PRIVATE ConnectivityObserver : public base::CheckedObserver {
public:
// Called when path degrading is detected on |network|.
- virtual void OnSessionPathDegrading(
- QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network) = 0;
+ virtual void OnSessionPathDegrading(QuicChromiumClientSession* session,
+ handles::NetworkHandle network) = 0;
// Called when forward progress is made after path degrading on |network|.
virtual void OnSessionResumedPostPathDegrading(
QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network) = 0;
+ handles::NetworkHandle network) = 0;
// Called when |session| encounters write error on |network|.
// A write error may be caused by the change in the underlying network
@@ -165,22 +165,21 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
// based on the |error_code|.
virtual void OnSessionEncounteringWriteError(
QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
int error_code) = 0;
// Called when |session| is closed by |source| with |error_code|
// and handshake has been confirmed.
virtual void OnSessionClosedAfterHandshake(
QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
quic::ConnectionCloseSource source,
quic::QuicErrorCode error_code) = 0;
// Called when |this| is registered to monitor the connectivity of the
// |session|.
- virtual void OnSessionRegistered(
- QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network) = 0;
+ virtual void OnSessionRegistered(QuicChromiumClientSession* session,
+ handles::NetworkHandle network) = 0;
// Called when |session| is removed.
virtual void OnSessionRemoved(QuicChromiumClientSession* session) = 0;
@@ -312,6 +311,8 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
int net_error,
quic::QuicErrorCode quic_error,
bool port_migration_detected,
+ bool quic_connection_migration_attempted,
+ bool quic_connection_migration_successful,
LoadTimingInfo::ConnectTiming connect_timing,
bool was_ever_used);
@@ -336,6 +337,8 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
int net_error_ = OK;
quic::QuicErrorCode quic_error_ = quic::QUIC_NO_ERROR;
bool port_migration_detected_ = false;
+ bool quic_connection_migration_attempted_ = false;
+ bool quic_connection_migration_successful_ = false;
quic::QuicServerId server_id_;
quic::ParsedQuicVersion quic_version_;
LoadTimingInfo::ConnectTiming connect_timing_;
@@ -431,13 +434,13 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
QuicChromiumPathValidationContext(
const quic::QuicSocketAddress& self_address,
const quic::QuicSocketAddress& peer_address,
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
std::unique_ptr<DatagramClientSocket> socket,
std::unique_ptr<QuicChromiumPacketWriter> writer,
std::unique_ptr<QuicChromiumPacketReader> reader);
~QuicChromiumPathValidationContext() override;
- NetworkChangeNotifier::NetworkHandle network();
+ handles::NetworkHandle network();
quic::QuicPacketWriter* WriterToUse() override;
// Transfer the ownership from |this| to the caller.
@@ -446,7 +449,7 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
std::unique_ptr<QuicChromiumPacketReader> ReleaseReader();
private:
- NetworkChangeNotifier::NetworkHandle network_handle_;
+ handles::NetworkHandle network_handle_;
std::unique_ptr<DatagramClientSocket> socket_;
std::unique_ptr<QuicChromiumPacketWriter> writer_;
std::unique_ptr<QuicChromiumPacketReader> reader_;
@@ -461,7 +464,8 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
QuicChromiumClientSession* session);
void OnPathValidationSuccess(
- std::unique_ptr<quic::QuicPathValidationContext> context) override;
+ std::unique_ptr<quic::QuicPathValidationContext> context,
+ quic::QuicTime start_time) override;
void OnPathValidationFailure(
std::unique_ptr<quic::QuicPathValidationContext> context) override;
@@ -480,7 +484,8 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
QuicChromiumClientSession* session);
void OnPathValidationSuccess(
- std::unique_ptr<quic::QuicPathValidationContext> context) override;
+ std::unique_ptr<quic::QuicPathValidationContext> context,
+ quic::QuicTime start_time) override;
void OnPathValidationFailure(
std::unique_ptr<quic::QuicPathValidationContext> context) override;
@@ -514,17 +519,17 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
void OnWriteUnblocked() override;
void set_peer_address(const quic::QuicSocketAddress& peer_address);
- void set_network(NetworkChangeNotifier::NetworkHandle network);
+ void set_network(handles::NetworkHandle network);
private:
- void NotifySessionProbeFailed(NetworkChangeNotifier::NetworkHandle network);
+ void NotifySessionProbeFailed(handles::NetworkHandle network);
// |session_| owns |this| and should out live |this|.
raw_ptr<QuicChromiumClientSession> session_;
// |task_owner_| should out live |this|.
raw_ptr<base::SequencedTaskRunner> task_runner_;
// The path validation context of the most recent probing.
- NetworkChangeNotifier::NetworkHandle network_;
+ handles::NetworkHandle network_;
quic::QuicSocketAddress peer_address_;
base::WeakPtrFactory<QuicChromiumPathValidationWriterDelegate>
weak_factory_{this};
@@ -552,7 +557,7 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
bool require_confirmation,
bool migrate_sesion_early_v2,
bool migrate_session_on_network_change_v2,
- NetworkChangeNotifier::NetworkHandle default_network,
+ handles::NetworkHandle default_network,
quic::QuicTime::Delta retransmittable_on_wire_timeout,
bool migrate_idle_session,
bool allow_port_migration,
@@ -624,7 +629,7 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
void OnWriteUnblocked() override;
void OnConnectionMigrationProbeSucceeded(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address,
const quic::QuicSocketAddress& self_address,
std::unique_ptr<DatagramClientSocket> socket,
@@ -632,14 +637,14 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
std::unique_ptr<QuicChromiumPacketReader> reader);
void OnPortMigrationProbeSucceeded(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address,
const quic::QuicSocketAddress& self_address,
std::unique_ptr<DatagramClientSocket> socket,
std::unique_ptr<QuicChromiumPacketWriter> writer,
std::unique_ptr<QuicChromiumPacketReader> reader);
- void OnProbeFailed(NetworkChangeNotifier::NetworkHandle network,
+ void OnProbeFailed(handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address);
// quic::QuicSpdySession methods:
@@ -768,10 +773,10 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
void WriteToNewSocket();
// Migrates session over to use |peer_address| and |network|.
- // If |network| is kInvalidNetworkHandle, default network is used. If the
- // migration fails and |close_session_on_error| is true, session will be
+ // If |network| is handles::kInvalidNetworkHandle, default network is used. If
+ // the migration fails and |close_session_on_error| is true, session will be
// closed.
- MigrationResult Migrate(NetworkChangeNotifier::NetworkHandle network,
+ MigrationResult Migrate(handles::NetworkHandle network,
IPEndPoint peer_address,
bool close_session_on_error);
@@ -792,16 +797,15 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
// Called when NetworkChangeNotifier notifies observers of a newly
// connected network. Migrates this session to the newly connected
// network if the session has a pending migration.
- void OnNetworkConnected(NetworkChangeNotifier::NetworkHandle network);
+ void OnNetworkConnected(handles::NetworkHandle network);
// Called when NetworkChangeNotifier broadcasts to observers of
// |disconnected_network|.
- void OnNetworkDisconnectedV2(
- NetworkChangeNotifier::NetworkHandle disconnected_network);
+ void OnNetworkDisconnectedV2(handles::NetworkHandle disconnected_network);
// Called when NetworkChangeNotifier broadcats to observers of a new default
// network. Migrates this session to |new_network| if appropriate.
- void OnNetworkMadeDefault(NetworkChangeNotifier::NetworkHandle new_network);
+ void OnNetworkMadeDefault(handles::NetworkHandle new_network);
// Schedules a migration alarm to wait for a new network.
void OnNoNewNetwork();
@@ -819,9 +823,9 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
const DatagramClientSocket* GetDefaultSocket() const;
// Returns the network interface that is currently used to send packets.
- // If NetworkHandle is not supported, always return
- // NetworkChangeNotifier::kInvalidNetworkHandle.
- NetworkChangeNotifier::NetworkHandle GetCurrentNetwork() const;
+ // If handles::NetworkHandle is not supported, always return
+ // handles::kInvalidNetworkHandle.
+ handles::NetworkHandle GetCurrentNetwork() const;
bool IsAuthorized(const std::string& hostname) override;
@@ -892,12 +896,12 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
// Probe on <network, peer_address>.
// If <network, peer_addres> is identical to the current path, the probe
// is sent on a different port.
- ProbingResult StartProbing(NetworkChangeNotifier::NetworkHandle network,
+ ProbingResult StartProbing(handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address);
// Perform a few checks before StartProbing. If any of those checks fails,
// StartProbing will be skipped.
- ProbingResult MaybeStartProbing(NetworkChangeNotifier::NetworkHandle network,
+ ProbingResult MaybeStartProbing(handles::NetworkHandle network,
const quic::QuicSocketAddress& peer_address);
// Helper method to perform a few checks and initiate connection migration
@@ -916,7 +920,7 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
// default network;
// - If now on the default network, cancel timer to migrate back to default
// network.
- void MigrateNetworkImmediately(NetworkChangeNotifier::NetworkHandle network);
+ void MigrateNetworkImmediately(handles::NetworkHandle network);
void StartMigrateBackToDefaultNetworkTimer(base::TimeDelta delay);
void CancelMigrateBackToDefaultNetworkTimer();
@@ -1017,6 +1021,8 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
bool going_away_ = false;
// True when the session receives a go away from server due to port migration.
bool port_migration_detected_ = false;
+ bool quic_connection_migration_attempted_ = false;
+ bool quic_connection_migration_successful_ = false;
// Not owned. |push_delegate_| outlives the session and handles server pushes
// received by session.
raw_ptr<ServerPushDelegate> push_delegate_;
@@ -1031,7 +1037,7 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
scoped_refptr<QuicChromiumPacketWriter::ReusableIOBuffer> packet_;
// Stores the latest default network platform marks if migration is enabled.
// Otherwise, stores the network interface that is used by the connection.
- NetworkChangeNotifier::NetworkHandle default_network_;
+ handles::NetworkHandle default_network_;
int retry_migrate_back_count_ = 0;
base::OneShotTimer migrate_back_to_default_timer_;
MigrationCause current_migration_cause_ = UNKNOWN_CAUSE;
diff --git a/chromium/net/quic/quic_chromium_client_session_peer.cc b/chromium/net/quic/quic_chromium_client_session_peer.cc
index d04cc48743a..ebb966aaf1f 100644
--- a/chromium/net/quic/quic_chromium_client_session_peer.cc
+++ b/chromium/net/quic/quic_chromium_client_session_peer.cc
@@ -8,8 +8,7 @@
#include "net/quic/quic_chromium_client_session.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-namespace net {
-namespace test {
+namespace net::test {
// static
void QuicChromiumClientSessionPeer::SetHostname(
QuicChromiumClientSession* session,
@@ -49,5 +48,4 @@ bool QuicChromiumClientSessionPeer::GetSessionGoingAway(
return session->going_away_;
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_chromium_client_session_test.cc b/chromium/net/quic/quic_chromium_client_session_test.cc
index ca0e1ea3bd2..d5d4a4ed58a 100644
--- a/chromium/net/quic/quic_chromium_client_session_test.cc
+++ b/chromium/net/quic/quic_chromium_client_session_test.cc
@@ -76,8 +76,7 @@
using testing::_;
-namespace net {
-namespace test {
+namespace net::test {
namespace {
const IPEndPoint kIpEndPoint = IPEndPoint(IPAddress::IPv4AllZeros(), 0);
@@ -85,8 +84,8 @@ const char kServerHostname[] = "test.example.com";
const uint16_t kServerPort = 443;
const size_t kMaxReadersPerQuicSession = 5;
-const NetworkChangeNotifier::NetworkHandle kDefaultNetworkForTests = 1;
-const NetworkChangeNotifier::NetworkHandle kNewNetworkForTests = 2;
+const handles::NetworkHandle kDefaultNetworkForTests = 1;
+const handles::NetworkHandle kNewNetworkForTests = 2;
struct TestParams {
quic::ParsedQuicVersion version;
@@ -134,10 +133,11 @@ class QuicChromiumClientSessionTest
config_(quic::test::DefaultQuicConfig()),
crypto_config_(
quic::test::crypto_test_utils::ProofVerifierForTesting()),
- default_read_(new MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)),
- socket_data_(
- new SequencedSocketData(base::make_span(default_read_.get(), 1),
- base::span<MockWrite>())),
+ default_read_(
+ std::make_unique<MockRead>(SYNCHRONOUS, ERR_IO_PENDING, 0)),
+ socket_data_(std::make_unique<SequencedSocketData>(
+ base::make_span(default_read_.get(), 1),
+ base::span<MockWrite>())),
helper_(&clock_, &random_),
transport_security_state_(std::make_unique<TransportSecurityState>()),
session_key_(kServerHostname,
@@ -148,7 +148,7 @@ class QuicChromiumClientSessionTest
SecureDnsPolicy::kAllow,
/*require_dns_https_alpn=*/false),
destination_(url::kHttpsScheme, kServerHostname, kServerPort),
- default_network_(NetworkChangeNotifier::kInvalidNetworkHandle),
+ default_network_(handles::kInvalidNetworkHandle),
client_maker_(version_,
quic::QuicUtils::CreateRandomConnectionId(&random_),
&clock_,
@@ -251,14 +251,13 @@ class QuicChromiumClientSessionTest
ASSERT_THAT(session_->CryptoConnect(callback_.callback()), IsOk());
}
- QuicChromiumPacketWriter* CreateQuicChromiumPacketWriter(
+ std::unique_ptr<QuicChromiumPacketWriter> CreateQuicChromiumPacketWriter(
DatagramClientSocket* socket,
QuicChromiumClientSession* session) const {
- std::unique_ptr<QuicChromiumPacketWriter> writer(
- new QuicChromiumPacketWriter(
- socket, base::ThreadTaskRunnerHandle::Get().get()));
+ auto writer = std::make_unique<QuicChromiumPacketWriter>(
+ socket, base::ThreadTaskRunnerHandle::Get().get());
writer->set_delegate(session);
- return writer.release();
+ return writer;
}
quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
@@ -304,7 +303,7 @@ class QuicChromiumClientSessionTest
QuicSessionKey session_key_;
url::SchemeHostPort destination_;
std::unique_ptr<TestingQuicChromiumClientSession> session_;
- NetworkChangeNotifier::NetworkHandle default_network_;
+ handles::NetworkHandle default_network_;
std::unique_ptr<QuicConnectivityMonitor> connectivity_monitor_;
TestServerPushDelegate test_push_delegate_;
raw_ptr<quic::QuicConnectionVisitorInterface> visitor_;
@@ -2026,12 +2025,11 @@ TEST_P(QuicChromiumClientSessionTest, MigrateToSocket) {
EXPECT_THAT(new_socket->Connect(kIpEndPoint), IsOk());
// Create reader and writer.
- std::unique_ptr<QuicChromiumPacketReader> new_reader(
- new QuicChromiumPacketReader(new_socket.get(), &clock_, session_.get(),
- kQuicYieldAfterPacketsRead,
- quic::QuicTime::Delta::FromMilliseconds(
- kQuicYieldAfterDurationMilliseconds),
- net_log_with_source_));
+ auto new_reader = std::make_unique<QuicChromiumPacketReader>(
+ new_socket.get(), &clock_, session_.get(), kQuicYieldAfterPacketsRead,
+ quic::QuicTime::Delta::FromMilliseconds(
+ kQuicYieldAfterDurationMilliseconds),
+ net_log_with_source_);
new_reader->StartReading();
std::unique_ptr<QuicChromiumPacketWriter> new_writer(
CreateQuicChromiumPacketWriter(new_socket.get(), session_.get()));
@@ -2133,12 +2131,11 @@ TEST_P(QuicChromiumClientSessionTest, MigrateToSocketMaxReaders) {
EXPECT_THAT(new_socket->Connect(kIpEndPoint), IsOk());
// Create reader and writer.
- std::unique_ptr<QuicChromiumPacketReader> new_reader(
- new QuicChromiumPacketReader(new_socket.get(), &clock_, session_.get(),
- kQuicYieldAfterPacketsRead,
- quic::QuicTime::Delta::FromMilliseconds(
- kQuicYieldAfterDurationMilliseconds),
- net_log_with_source_));
+ auto new_reader = std::make_unique<QuicChromiumPacketReader>(
+ new_socket.get(), &clock_, session_.get(), kQuicYieldAfterPacketsRead,
+ quic::QuicTime::Delta::FromMilliseconds(
+ kQuicYieldAfterDurationMilliseconds),
+ net_log_with_source_);
new_reader->StartReading();
std::unique_ptr<QuicChromiumPacketWriter> new_writer(
CreateQuicChromiumPacketWriter(new_socket.get(), session_.get()));
@@ -2176,12 +2173,11 @@ TEST_P(QuicChromiumClientSessionTest, MigrateToSocketMaxReaders) {
EXPECT_THAT(new_socket->Connect(kIpEndPoint), IsOk());
// Create reader and writer.
- std::unique_ptr<QuicChromiumPacketReader> new_reader(
- new QuicChromiumPacketReader(new_socket.get(), &clock_, session_.get(),
- kQuicYieldAfterPacketsRead,
- quic::QuicTime::Delta::FromMilliseconds(
- kQuicYieldAfterDurationMilliseconds),
- net_log_with_source_));
+ auto new_reader = std::make_unique<QuicChromiumPacketReader>(
+ new_socket.get(), &clock_, session_.get(), kQuicYieldAfterPacketsRead,
+ quic::QuicTime::Delta::FromMilliseconds(
+ kQuicYieldAfterDurationMilliseconds),
+ net_log_with_source_);
new_reader->StartReading();
std::unique_ptr<QuicChromiumPacketWriter> new_writer(
CreateQuicChromiumPacketWriter(new_socket.get(), session_.get()));
@@ -2266,12 +2262,11 @@ TEST_P(QuicChromiumClientSessionTest, MigrateToSocketReadError) {
EXPECT_THAT(new_socket->Connect(kIpEndPoint), IsOk());
// Create reader and writer.
- std::unique_ptr<QuicChromiumPacketReader> new_reader(
- new QuicChromiumPacketReader(new_socket.get(), &clock_, session_.get(),
- kQuicYieldAfterPacketsRead,
- quic::QuicTime::Delta::FromMilliseconds(
- kQuicYieldAfterDurationMilliseconds),
- net_log_with_source_));
+ auto new_reader = std::make_unique<QuicChromiumPacketReader>(
+ new_socket.get(), &clock_, session_.get(), kQuicYieldAfterPacketsRead,
+ quic::QuicTime::Delta::FromMilliseconds(
+ kQuicYieldAfterDurationMilliseconds),
+ net_log_with_source_);
new_reader->StartReading();
std::unique_ptr<QuicChromiumPacketWriter> new_writer(
CreateQuicChromiumPacketWriter(new_socket.get(), session_.get()));
@@ -2424,13 +2419,13 @@ TEST_P(QuicChromiumClientSessionTest, ResetOnEmptyResponseHeaders) {
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
}
-// This test verifies that when NetworkHandle is not supported and there is no
-// network change, session reports to the connectivity monitor correctly on path
-// degrading detection and recovery.
+// This test verifies that when handles::NetworkHandle is not supported and
+// there is no network change, session reports to the connectivity monitor
+// correctly on path degrading detection and recovery.
TEST_P(QuicChromiumClientSessionTest,
DegradingWithoutNetworkChange_NoNetworkHandle) {
// Add a connectivity monitor for testing.
- default_network_ = NetworkChangeNotifier::kInvalidNetworkHandle;
+ default_network_ = handles::kInvalidNetworkHandle;
connectivity_monitor_ =
std::make_unique<QuicConnectivityMonitor>(default_network_);
@@ -2459,13 +2454,13 @@ TEST_P(QuicChromiumClientSessionTest,
EXPECT_EQ(0u, connectivity_monitor_->GetNumDegradingSessions());
}
-// This test verifies that when the NetworkHandle is not supported, and there
-// are speculated network change reported via OnIPAddressChange, session
+// This test verifies that when the handles::NetworkHandle is not supported, and
+// there are speculated network change reported via OnIPAddressChange, session
// still reports to the connectivity monitor correctly on path degrading
// detection and recovery.
TEST_P(QuicChromiumClientSessionTest, DegradingWithIPAddressChange) {
- // Default network is always set to kInvalidNetworkHandle.
- default_network_ = NetworkChangeNotifier::kInvalidNetworkHandle;
+ // Default network is always set to handles::kInvalidNetworkHandle.
+ default_network_ = handles::kInvalidNetworkHandle;
connectivity_monitor_ =
std::make_unique<QuicConnectivityMonitor>(default_network_);
@@ -2480,12 +2475,12 @@ TEST_P(QuicChromiumClientSessionTest, DegradingWithIPAddressChange) {
session_->ReallyOnPathDegrading();
EXPECT_EQ(1u, connectivity_monitor_->GetNumDegradingSessions());
- // When NetworkHandle is not supported, network change is notified via
- // IP address change.
+ // When handles::NetworkHandle is not supported, network change is notified
+ // via IP address change.
connectivity_monitor_->OnIPAddressChanged();
EXPECT_EQ(0u, connectivity_monitor_->GetNumDegradingSessions());
- // When NetworkHandle is not supported and IP address changes,
+ // When handles::NetworkHandle is not supported and IP address changes,
// session either goes away or gets closed. When it goes away,
// reporting to connectivity monitor is disabled.
connectivity_monitor_->OnSessionGoingAwayOnIPAddressChange(session_.get());
@@ -2505,11 +2500,12 @@ TEST_P(QuicChromiumClientSessionTest, DegradingWithIPAddressChange) {
EXPECT_EQ(0u, connectivity_monitor_->GetNumDegradingSessions());
}
-// This test verifies that when NetworkHandle is supported but migration is
-// not supported and there's no network change, session reports to
+// This test verifies that when handles::NetworkHandle is supported but
+// migration is not supported and there's no network change, session reports to
// connectivity monitor correctly on path degrading detection or recovery.
-// Default network change is currently reported with valid NetworkHandles
-// while session's current network interface is tracked by |default_network_|.
+// Default network change is currently reported with valid
+// handles::NetworkHandles while session's current network interface is tracked
+// by |default_network_|.
TEST_P(QuicChromiumClientSessionTest,
DegradingOnDeafultNetwork_WithoutMigration) {
default_network_ = kDefaultNetworkForTests;
@@ -2538,9 +2534,9 @@ TEST_P(QuicChromiumClientSessionTest,
EXPECT_EQ(0u, connectivity_monitor_->GetNumDegradingSessions());
}
-// This test verifies that when NetworkHandle is supported but migrations is not
-// supported and there is network changes, session reports to the connectivity
-// monitor correctly on path degrading detection or recovery.
+// This test verifies that when handles::NetworkHandle is supported but
+// migrations is not supported and there is network changes, session reports to
+// the connectivity monitor correctly on path degrading detection or recovery.
TEST_P(QuicChromiumClientSessionTest,
DegradingWithDeafultNetworkChange_WithoutMigration) {
default_network_ = kDefaultNetworkForTests;
@@ -2626,7 +2622,7 @@ TEST_P(QuicChromiumClientSessionTest, WriteErrorDuringCryptoConnect) {
TEST_P(QuicChromiumClientSessionTest, WriteErrorAfterHandshakeConfirmed) {
// Add a connectivity monitor for testing.
- default_network_ = NetworkChangeNotifier::kInvalidNetworkHandle;
+ default_network_ = handles::kInvalidNetworkHandle;
connectivity_monitor_ =
std::make_unique<QuicConnectivityMonitor>(default_network_);
@@ -2666,5 +2662,4 @@ TEST_P(QuicChromiumClientSessionTest, WriteErrorAfterHandshakeConfirmed) {
}
} // namespace
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_chromium_client_stream.cc b/chromium/net/quic/quic_chromium_client_stream.cc
index 11a2dd570d7..fe7e3a5e1ef 100644
--- a/chromium/net/quic/quic_chromium_client_stream.cc
+++ b/chromium/net/quic/quic_chromium_client_stream.cc
@@ -73,6 +73,9 @@ void QuicChromiumClientStream::Handle::OnEarlyHintsAvailable() {
}
void QuicChromiumClientStream::Handle::OnInitialHeadersAvailable() {
+ if (headers_received_start_time_.is_null())
+ headers_received_start_time_ = base::TimeTicks::Now();
+
if (!read_headers_callback_)
return; // Wait for ReadInitialHeaders to be called.
@@ -99,6 +102,11 @@ void QuicChromiumClientStream::Handle::OnDataAvailable() {
if (!read_body_callback_)
return; // Wait for ReadBody to be called.
+ // TODO(https://crbug.com/1335423): Change to DCHECK() or remove after bug is
+ // fixed.
+ CHECK(read_body_buffer_);
+ CHECK_GT(read_body_buffer_len_, 0);
+
int rv = stream_->Read(read_body_buffer_, read_body_buffer_len_);
if (rv == ERR_IO_PENDING)
return; // Spurrious, likely because of trailers?
@@ -203,6 +211,11 @@ int QuicChromiumClientStream::Handle::ReadBody(
if (rv != ERR_IO_PENDING)
return rv;
+ // TODO(https://crbug.com/1335423): Change to DCHECK() or remove after bug is
+ // fixed.
+ CHECK(buffer);
+ CHECK_GT(buffer_len, 0);
+
SetCallback(std::move(callback), &read_body_callback_);
read_body_buffer_ = buffer;
read_body_buffer_len_ = buffer_len;
@@ -665,6 +678,10 @@ void QuicChromiumClientStream::OnError(int error) {
}
int QuicChromiumClientStream::Read(IOBuffer* buf, int buf_len) {
+ // TODO(https://crbug.com/1335423): Change to DCHECK_GT() or remove after bug
+ // is fixed.
+ CHECK_GT(buf_len, 0);
+
if (IsDoneReading())
return 0; // EOF
diff --git a/chromium/net/quic/quic_chromium_client_stream.h b/chromium/net/quic/quic_chromium_client_stream.h
index b254848fe90..f67150e0ded 100644
--- a/chromium/net/quic/quic_chromium_client_stream.h
+++ b/chromium/net/quic/quic_chromium_client_stream.h
@@ -26,7 +26,7 @@
#include "net/http/http_stream.h"
#include "net/log/net_log_with_source.h"
#include "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
namespace quic {
@@ -135,6 +135,10 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream
return first_early_hints_time_;
}
+ base::TimeTicks headers_received_start_time() const {
+ return headers_received_start_time_;
+ }
+
// TODO(rch): Move these test-only methods to a peer, or else remove.
void OnPromiseHeaderList(quic::QuicStreamId promised_id,
size_t frame_len,
@@ -213,6 +217,8 @@ class NET_EXPORT_PRIVATE QuicChromiumClientStream
// The time at which the first 103 Early Hints response is received.
base::TimeTicks first_early_hints_time_;
+ base::TimeTicks headers_received_start_time_;
+
base::WeakPtrFactory<Handle> weak_factory_{this};
};
diff --git a/chromium/net/quic/quic_chromium_client_stream_test.cc b/chromium/net/quic/quic_chromium_client_stream_test.cc
index 72f627dae57..ca08d843ca6 100644
--- a/chromium/net/quic/quic_chromium_client_stream_test.cc
+++ b/chromium/net/quic/quic_chromium_client_stream_test.cc
@@ -34,8 +34,7 @@
using testing::_;
using testing::Return;
-namespace net {
-namespace test {
+namespace net::test {
namespace {
class MockQuicClientSessionBase : public quic::QuicSpdyClientSessionBase {
@@ -158,7 +157,7 @@ MockQuicClientSessionBase::MockQuicClientSessionBase(
.WillByDefault(testing::Return(quic::QuicConsumedData(0, false)));
}
-MockQuicClientSessionBase::~MockQuicClientSessionBase() {}
+MockQuicClientSessionBase::~MockQuicClientSessionBase() = default;
class QuicChromiumClientStreamTest
: public ::testing::TestWithParam<quic::ParsedQuicVersion>,
@@ -1179,5 +1178,4 @@ TEST_P(QuicChromiumClientStreamTest, TrailersAfterEarlyHintsWithoutRead) {
}
} // namespace
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_chromium_connection_helper.cc b/chromium/net/quic/quic_chromium_connection_helper.cc
index 9ccdc22b9cf..85d6a0709e5 100644
--- a/chromium/net/quic/quic_chromium_connection_helper.cc
+++ b/chromium/net/quic/quic_chromium_connection_helper.cc
@@ -19,7 +19,7 @@ QuicChromiumConnectionHelper::QuicChromiumConnectionHelper(
quic::QuicRandom* random_generator)
: clock_(clock), random_generator_(random_generator) {}
-QuicChromiumConnectionHelper::~QuicChromiumConnectionHelper() {}
+QuicChromiumConnectionHelper::~QuicChromiumConnectionHelper() = default;
const quic::QuicClock* QuicChromiumConnectionHelper::GetClock() const {
return clock_;
diff --git a/chromium/net/quic/quic_chromium_connection_helper_test.cc b/chromium/net/quic/quic_chromium_connection_helper_test.cc
index 3e946c96185..3049fdcf198 100644
--- a/chromium/net/quic/quic_chromium_connection_helper_test.cc
+++ b/chromium/net/quic/quic_chromium_connection_helper_test.cc
@@ -8,8 +8,7 @@
#include "net/third_party/quiche/src/quiche/quic/test_tools/mock_random.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
namespace {
class QuicChromiumConnectionHelperTest : public ::testing::Test {
@@ -30,5 +29,4 @@ TEST_F(QuicChromiumConnectionHelperTest, GetRandomGenerator) {
}
} // namespace
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_chromium_packet_reader.cc b/chromium/net/quic/quic_chromium_packet_reader.cc
index b2756f92973..34c3a6e402b 100644
--- a/chromium/net/quic/quic_chromium_packet_reader.cc
+++ b/chromium/net/quic/quic_chromium_packet_reader.cc
@@ -38,7 +38,7 @@ QuicChromiumPacketReader::QuicChromiumPacketReader(
read_buffer_(base::MakeRefCounted<IOBufferWithSize>(kReadBufferSize)),
net_log_(net_log) {}
-QuicChromiumPacketReader::~QuicChromiumPacketReader() {}
+QuicChromiumPacketReader::~QuicChromiumPacketReader() = default;
void QuicChromiumPacketReader::StartReading() {
for (;;) {
diff --git a/chromium/net/quic/quic_chromium_packet_reader.h b/chromium/net/quic/quic_chromium_packet_reader.h
index bdb54b2869c..9db08249c0a 100644
--- a/chromium/net/quic/quic_chromium_packet_reader.h
+++ b/chromium/net/quic/quic_chromium_packet_reader.h
@@ -30,7 +30,7 @@ class NET_EXPORT_PRIVATE QuicChromiumPacketReader {
public:
class NET_EXPORT_PRIVATE Visitor {
public:
- virtual ~Visitor() {}
+ virtual ~Visitor() = default;
// Called when the read operation failed. The visitor returns
// whether the reader should keep reading.
virtual bool OnReadError(int result,
diff --git a/chromium/net/quic/quic_chromium_packet_writer.cc b/chromium/net/quic/quic_chromium_packet_writer.cc
index f1fcd2c42f9..4540cb94318 100644
--- a/chromium/net/quic/quic_chromium_packet_writer.cc
+++ b/chromium/net/quic/quic_chromium_packet_writer.cc
@@ -71,7 +71,7 @@ const net::NetworkTrafficAnnotationTag kTrafficAnnotation =
QuicChromiumPacketWriter::ReusableIOBuffer::ReusableIOBuffer(size_t capacity)
: IOBuffer(capacity), capacity_(capacity) {}
-QuicChromiumPacketWriter::ReusableIOBuffer::~ReusableIOBuffer() {}
+QuicChromiumPacketWriter::ReusableIOBuffer::~ReusableIOBuffer() = default;
void QuicChromiumPacketWriter::ReusableIOBuffer::Set(const char* buffer,
size_t buf_len) {
@@ -92,7 +92,7 @@ QuicChromiumPacketWriter::QuicChromiumPacketWriter(
&QuicChromiumPacketWriter::OnWriteComplete, weak_factory_.GetWeakPtr());
}
-QuicChromiumPacketWriter::~QuicChromiumPacketWriter() {}
+QuicChromiumPacketWriter::~QuicChromiumPacketWriter() = default;
void QuicChromiumPacketWriter::set_force_write_blocked(
bool force_write_blocked) {
diff --git a/chromium/net/quic/quic_clock_skew_detector_test.cc b/chromium/net/quic/quic_clock_skew_detector_test.cc
index 30deae8c042..ee7d6e36a02 100644
--- a/chromium/net/quic/quic_clock_skew_detector_test.cc
+++ b/chromium/net/quic/quic_clock_skew_detector_test.cc
@@ -9,8 +9,7 @@
#include "net/third_party/quiche/src/quiche/quic/test_tools/mock_random.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
namespace {
class QuicClockSkewDetectorTest : public ::testing::Test {
@@ -66,5 +65,4 @@ TEST_F(QuicClockSkewDetectorTest, LargeOffsetThenSmallOffset) {
}
} // namespace
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_connectivity_monitor.cc b/chromium/net/quic/quic_connectivity_monitor.cc
index 6bd7f46bf15..1040a92855c 100644
--- a/chromium/net/quic/quic_connectivity_monitor.cc
+++ b/chromium/net/quic/quic_connectivity_monitor.cc
@@ -20,14 +20,14 @@ bool IsErrorRelatedToConnectivity(int error_code) {
} // namespace
QuicConnectivityMonitor::QuicConnectivityMonitor(
- NetworkChangeNotifier::NetworkHandle default_network)
+ handles::NetworkHandle default_network)
: default_network_(default_network) {}
QuicConnectivityMonitor::~QuicConnectivityMonitor() = default;
void QuicConnectivityMonitor::RecordConnectivityStatsToHistograms(
const std::string& notification,
- NetworkChangeNotifier::NetworkHandle affected_network) const {
+ handles::NetworkHandle affected_network) const {
if (notification == "OnNetworkSoonToDisconnect" ||
notification == "OnNetworkDisconnected") {
// If the disconnected network is not the default network, ignore
@@ -106,13 +106,13 @@ size_t QuicConnectivityMonitor::GetCountForWriteErrorCode(
}
void QuicConnectivityMonitor::SetInitialDefaultNetwork(
- NetworkChangeNotifier::NetworkHandle default_network) {
+ handles::NetworkHandle default_network) {
default_network_ = default_network;
}
void QuicConnectivityMonitor::OnSessionPathDegrading(
QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
if (network != default_network_)
return;
@@ -136,7 +136,7 @@ void QuicConnectivityMonitor::OnSessionPathDegrading(
void QuicConnectivityMonitor::OnSessionResumedPostPathDegrading(
QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
if (network != default_network_)
return;
@@ -154,7 +154,7 @@ void QuicConnectivityMonitor::OnSessionResumedPostPathDegrading(
void QuicConnectivityMonitor::OnSessionEncounteringWriteError(
QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
int error_code) {
if (network != default_network_)
return;
@@ -182,7 +182,7 @@ void QuicConnectivityMonitor::OnSessionEncounteringWriteError(
void QuicConnectivityMonitor::OnSessionClosedAfterHandshake(
QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
quic::ConnectionCloseSource source,
quic::QuicErrorCode error_code) {
if (network != default_network_)
@@ -206,7 +206,7 @@ void QuicConnectivityMonitor::OnSessionClosedAfterHandshake(
void QuicConnectivityMonitor::OnSessionRegistered(
QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network) {
if (network != default_network_)
return;
@@ -224,7 +224,7 @@ void QuicConnectivityMonitor::OnSessionRemoved(
}
void QuicConnectivityMonitor::OnDefaultNetworkUpdated(
- NetworkChangeNotifier::NetworkHandle default_network) {
+ handles::NetworkHandle default_network) {
default_network_ = default_network;
active_sessions_.clear();
degrading_sessions_.clear();
@@ -235,12 +235,12 @@ void QuicConnectivityMonitor::OnDefaultNetworkUpdated(
}
void QuicConnectivityMonitor::OnIPAddressChanged() {
- // If NetworkHandle is supported, connectivity monitor will receive
+ // If handles::NetworkHandle is supported, connectivity monitor will receive
// notifications via OnDefaultNetworkUpdated.
if (NetworkChangeNotifier::AreNetworkHandlesSupported())
return;
- DCHECK_EQ(default_network_, NetworkChangeNotifier::kInvalidNetworkHandle);
+ DCHECK_EQ(default_network_, handles::kInvalidNetworkHandle);
degrading_sessions_.clear();
write_error_map_.clear();
}
diff --git a/chromium/net/quic/quic_connectivity_monitor.h b/chromium/net/quic/quic_connectivity_monitor.h
index 5be9fd5d60f..117f6f05402 100644
--- a/chromium/net/quic/quic_connectivity_monitor.h
+++ b/chromium/net/quic/quic_connectivity_monitor.h
@@ -8,7 +8,7 @@
#include <set>
#include "base/numerics/clamped_math.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/quic/quic_chromium_client_session.h"
namespace net {
@@ -17,13 +17,13 @@ namespace net {
// default network interface.
// Reset all raw observations (reported by sessions) when the default network
// is changed, which happens either:
-// - via OnDefaultNetworkUpdated if NetworkHandle is supported on the platform;
+// - via OnDefaultNetworkUpdated if handles::NetworkHandle is supported on the
+// platform;
// - via OnIPAddressChanged otherwise.
class NET_EXPORT_PRIVATE QuicConnectivityMonitor
: public QuicChromiumClientSession::ConnectivityObserver {
public:
- explicit QuicConnectivityMonitor(
- NetworkChangeNotifier::NetworkHandle default_network);
+ explicit QuicConnectivityMonitor(handles::NetworkHandle default_network);
QuicConnectivityMonitor(const QuicConnectivityMonitor&) = delete;
QuicConnectivityMonitor& operator=(const QuicConnectivityMonitor&) = delete;
@@ -33,7 +33,7 @@ class NET_EXPORT_PRIVATE QuicConnectivityMonitor
// Records connectivity related stats to histograms.
void RecordConnectivityStatsToHistograms(
const std::string& platform_notification,
- NetworkChangeNotifier::NetworkHandle affected_network) const;
+ handles::NetworkHandle affected_network) const;
// Returns the number of sessions that are currently degrading on the default
// network interface.
@@ -45,45 +45,39 @@ class NET_EXPORT_PRIVATE QuicConnectivityMonitor
// Called to set up the initial default network, which happens when the
// default network tracking is lost upon |this| creation.
- void SetInitialDefaultNetwork(
- NetworkChangeNotifier::NetworkHandle default_network);
+ void SetInitialDefaultNetwork(handles::NetworkHandle default_network);
- // Called when NetworkHandle is supported and the default network interface
- // used by the platform is updated.
- void OnDefaultNetworkUpdated(
- NetworkChangeNotifier::NetworkHandle default_network);
+ // Called when handles::NetworkHandle is supported and the default network
+ // interface used by the platform is updated.
+ void OnDefaultNetworkUpdated(handles::NetworkHandle default_network);
- // Called when NetworkHandle is NOT supported and the IP address of the
- // primary interface changes. This includes when the primary interface itself
- // changes.
+ // Called when handles::NetworkHandle is NOT supported and the IP address of
+ // the primary interface changes. This includes when the primary interface
+ // itself changes.
void OnIPAddressChanged();
// Called when |session| is marked as going away due to IP address change.
void OnSessionGoingAwayOnIPAddressChange(QuicChromiumClientSession* session);
// QuicChromiumClientSession::ConnectivityObserver implementation.
- void OnSessionPathDegrading(
- QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network) override;
+ void OnSessionPathDegrading(QuicChromiumClientSession* session,
+ handles::NetworkHandle network) override;
void OnSessionResumedPostPathDegrading(
QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network) override;
+ handles::NetworkHandle network) override;
- void OnSessionEncounteringWriteError(
- QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network,
- int error_code) override;
+ void OnSessionEncounteringWriteError(QuicChromiumClientSession* session,
+ handles::NetworkHandle network,
+ int error_code) override;
- void OnSessionClosedAfterHandshake(
- QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network,
- quic::ConnectionCloseSource source,
- quic::QuicErrorCode error_code) override;
+ void OnSessionClosedAfterHandshake(QuicChromiumClientSession* session,
+ handles::NetworkHandle network,
+ quic::ConnectionCloseSource source,
+ quic::QuicErrorCode error_code) override;
- void OnSessionRegistered(
- QuicChromiumClientSession* session,
- NetworkChangeNotifier::NetworkHandle network) override;
+ void OnSessionRegistered(QuicChromiumClientSession* session,
+ handles::NetworkHandle network) override;
void OnSessionRemoved(QuicChromiumClientSession* session) override;
@@ -95,9 +89,9 @@ class NET_EXPORT_PRIVATE QuicConnectivityMonitor
// QUIC_PACKET_WRITE_ERROR/QUIC_TOO_MANY_RTOS by self.
using QuicErrorCodeMap = base::flat_map<quic::QuicErrorCode, size_t>;
- // If NetworkHandle is not supported, always set to
- // NetworkChangeNotifier::kInvalidNetworkHandle.
- NetworkChangeNotifier::NetworkHandle default_network_;
+ // If handles::NetworkHandle is not supported, always set to
+ // handles::kInvalidNetworkHandle.
+ handles::NetworkHandle default_network_;
// Sessions that are currently degrading on the |default_network_|.
std::set<QuicChromiumClientSession*> degrading_sessions_;
// Sessions that are currently active on the |default_network_|.
diff --git a/chromium/net/quic/quic_context.cc b/chromium/net/quic/quic_context.cc
index 0264fb07ad1..9f10dcf781d 100644
--- a/chromium/net/quic/quic_context.cc
+++ b/chromium/net/quic/quic_context.cc
@@ -6,6 +6,7 @@
#include "net/quic/platform/impl/quic_chromium_clock.h"
#include "net/quic/quic_chromium_connection_helper.h"
+#include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h"
#include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_random.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_constants.h"
@@ -51,7 +52,12 @@ quic::QuicConfig InitializeQuicConfig(const QuicParams& params) {
config.set_max_idle_time_before_crypto_handshake(
quic::QuicTime::Delta::FromMicroseconds(
params.max_idle_time_before_crypto_handshake.InMicroseconds()));
- config.SetConnectionOptionsToSend(params.connection_options);
+ quic::QuicTagVector copt_to_send = params.connection_options;
+ if (std::find(copt_to_send.begin(), copt_to_send.end(), quic::kRVCM) ==
+ copt_to_send.end()) {
+ copt_to_send.push_back(quic::kRVCM);
+ }
+ config.SetConnectionOptionsToSend(copt_to_send);
config.SetClientConnectionOptions(params.client_connection_options);
config.set_max_undecryptable_packets(kMaxUndecryptablePackets);
config.SetInitialSessionFlowControlWindowToSend(
diff --git a/chromium/net/quic/quic_context.h b/chromium/net/quic/quic_context.h
index a698a7aa46f..cc49d51796c 100644
--- a/chromium/net/quic/quic_context.h
+++ b/chromium/net/quic/quic_context.h
@@ -192,7 +192,8 @@ struct NET_EXPORT QuicParams {
class NET_EXPORT_PRIVATE QuicContext {
public:
QuicContext();
- QuicContext(std::unique_ptr<quic::QuicConnectionHelperInterface> helper);
+ explicit QuicContext(
+ std::unique_ptr<quic::QuicConnectionHelperInterface> helper);
~QuicContext();
quic::QuicConnectionHelperInterface* helper() { return helper_.get(); }
diff --git a/chromium/net/quic/quic_crypto_client_stream_factory.cc b/chromium/net/quic/quic_crypto_client_stream_factory.cc
index 708e8dabcd7..4b2bd7e4846 100644
--- a/chromium/net/quic/quic_crypto_client_stream_factory.cc
+++ b/chromium/net/quic/quic_crypto_client_stream_factory.cc
@@ -15,15 +15,14 @@ namespace {
class DefaultCryptoStreamFactory : public QuicCryptoClientStreamFactory {
public:
- quic::QuicCryptoClientStream* CreateQuicCryptoClientStream(
+ std::unique_ptr<quic::QuicCryptoClientStream> CreateQuicCryptoClientStream(
const quic::QuicServerId& server_id,
QuicChromiumClientSession* session,
std::unique_ptr<quic::ProofVerifyContext> proof_verify_context,
quic::QuicCryptoClientConfig* crypto_config) override {
- return new quic::QuicCryptoClientStream(server_id, session,
- std::move(proof_verify_context),
- crypto_config, session,
- /*has_application_state = */ true);
+ return std::make_unique<quic::QuicCryptoClientStream>(
+ server_id, session, std::move(proof_verify_context), crypto_config,
+ session, /*has_application_state = */ true);
}
};
diff --git a/chromium/net/quic/quic_crypto_client_stream_factory.h b/chromium/net/quic/quic_crypto_client_stream_factory.h
index 9fd64637b79..b6d4a772e2c 100644
--- a/chromium/net/quic/quic_crypto_client_stream_factory.h
+++ b/chromium/net/quic/quic_crypto_client_stream_factory.h
@@ -27,9 +27,10 @@ namespace net {
// to facilitate testing code with mock implementations.
class NET_EXPORT QuicCryptoClientStreamFactory {
public:
- virtual ~QuicCryptoClientStreamFactory() {}
+ virtual ~QuicCryptoClientStreamFactory() = default;
- virtual quic::QuicCryptoClientStream* CreateQuicCryptoClientStream(
+ virtual std::unique_ptr<quic::QuicCryptoClientStream>
+ CreateQuicCryptoClientStream(
const quic::QuicServerId& server_id,
QuicChromiumClientSession* session,
std::unique_ptr<quic::ProofVerifyContext> proof_verify_context,
diff --git a/chromium/net/quic/quic_end_to_end_unittest.cc b/chromium/net/quic/quic_end_to_end_unittest.cc
index c8c982d6725..6ccb73a1b5a 100644
--- a/chromium/net/quic/quic_end_to_end_unittest.cc
+++ b/chromium/net/quic/quic_end_to_end_unittest.cc
@@ -66,7 +66,7 @@ class TestTransactionFactory : public HttpTransactionFactory {
: session_(std::make_unique<HttpNetworkSession>(session_params,
session_context)) {}
- ~TestTransactionFactory() override {}
+ ~TestTransactionFactory() override = default;
// HttpTransactionFactory methods
int CreateTransaction(RequestPriority priority,
@@ -88,9 +88,8 @@ class TestTransactionFactory : public HttpTransactionFactory {
class QuicEndToEndTest : public ::testing::Test, public WithTaskEnvironment {
protected:
QuicEndToEndTest()
- : host_resolver_impl_(CreateResolverImpl()),
- host_resolver_(std::move(host_resolver_impl_)),
- ssl_config_service_(new SSLConfigServiceDefaults),
+ : host_resolver_(CreateResolverImpl()),
+ ssl_config_service_(std::make_unique<SSLConfigServiceDefaults>()),
proxy_resolution_service_(
ConfiguredProxyResolutionService::CreateDirect()),
auth_handler_factory_(HttpAuthHandlerFactory::CreateDefault()) {
@@ -124,8 +123,8 @@ class QuicEndToEndTest : public ::testing::Test, public WithTaskEnvironment {
// Creates a mock host resolver in which test.example.com
// resolves to localhost.
- static MockHostResolver* CreateResolverImpl() {
- MockHostResolver* resolver = new MockHostResolver();
+ static std::unique_ptr<MockHostResolver> CreateResolverImpl() {
+ auto resolver = std::make_unique<MockHostResolver>();
resolver->rules()->AddRule("test.example.com", "127.0.0.1");
return resolver;
}
@@ -214,7 +213,6 @@ class QuicEndToEndTest : public ::testing::Test, public WithTaskEnvironment {
}
QuicContext quic_context_;
- std::unique_ptr<MockHostResolver> host_resolver_impl_;
MappedHostResolver host_resolver_;
MockCertVerifier cert_verifier_;
TransportSecurityState transport_security_state_;
diff --git a/chromium/net/quic/quic_http3_logger.cc b/chromium/net/quic/quic_http3_logger.cc
index ad77d255a2c..b1fef6c22ec 100644
--- a/chromium/net/quic/quic_http3_logger.cc
+++ b/chromium/net/quic/quic_http3_logger.cc
@@ -88,7 +88,7 @@ base::Value::List ElideQuicHeaderListForNetLog(
QuicHttp3Logger::QuicHttp3Logger(const NetLogWithSource& net_log)
: net_log_(net_log) {}
-QuicHttp3Logger::~QuicHttp3Logger() {}
+QuicHttp3Logger::~QuicHttp3Logger() = default;
void QuicHttp3Logger::OnControlStreamCreated(quic::QuicStreamId stream_id) {
if (!net_log_.IsCapturing()) {
diff --git a/chromium/net/quic/quic_http_stream.cc b/chromium/net/quic/quic_http_stream.cc
index dcbcaefa8b0..8d78f375ab9 100644
--- a/chromium/net/quic/quic_http_stream.cc
+++ b/chromium/net/quic/quic_http_stream.cc
@@ -381,6 +381,8 @@ bool QuicHttpStream::GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const {
is_first_stream = stream_->IsFirstStream();
load_timing_info->first_early_hints_time =
stream_->first_early_hints_time();
+ load_timing_info->receive_headers_start =
+ stream_->headers_received_start_time();
}
if (is_first_stream) {
@@ -700,8 +702,6 @@ int QuicHttpStream::ProcessResponseHeaders(
response_info_->connection_info =
ConnectionInfoFromQuicVersion(quic_session()->GetQuicVersion());
- response_info_->vary_data.Init(*request_info_,
- *response_info_->headers.get());
response_info_->was_alpn_negotiated = true;
response_info_->alpn_negotiated_protocol =
HttpResponseInfo::ConnectionInfoToString(response_info_->connection_info);
diff --git a/chromium/net/quic/quic_http_stream_test.cc b/chromium/net/quic/quic_http_stream_test.cc
index 84e671890a4..285025629c0 100644
--- a/chromium/net/quic/quic_http_stream_test.cc
+++ b/chromium/net/quic/quic_http_stream_test.cc
@@ -87,8 +87,7 @@ using testing::_;
using testing::AnyNumber;
using testing::Return;
-namespace net {
-namespace test {
+namespace net::test {
namespace {
const char kUploadData[] = "Really nifty data!";
@@ -191,7 +190,7 @@ class ReadErrorUploadDataStream : public UploadDataStream {
ReadErrorUploadDataStream& operator=(const ReadErrorUploadDataStream&) =
delete;
- ~ReadErrorUploadDataStream() override {}
+ ~ReadErrorUploadDataStream() override = default;
private:
void CompleteRead() { UploadDataStream::OnReadCompleted(ERR_FAILED); }
@@ -299,22 +298,20 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<TestParams>,
MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
}
- ~QuicHttpStreamTest() {
+ ~QuicHttpStreamTest() override {
session_->CloseSessionOnError(ERR_ABORTED, quic::QUIC_INTERNAL_ERROR,
quic::ConnectionCloseBehavior::SILENT_CLOSE);
- for (size_t i = 0; i < writes_.size(); i++) {
- delete writes_[i].packet;
+ for (auto& write : writes_) {
+ delete write.packet;
}
}
// Adds a packet to the list of expected writes.
void AddWrite(std::unique_ptr<quic::QuicReceivedPacket> packet) {
- writes_.push_back(PacketToWrite(SYNCHRONOUS, packet.release()));
+ writes_.emplace_back(SYNCHRONOUS, packet.release());
}
- void AddWrite(IoMode mode, int rv) {
- writes_.push_back(PacketToWrite(mode, rv));
- }
+ void AddWrite(IoMode mode, int rv) { writes_.emplace_back(mode, rv); }
// Returns the packet to be written at position |pos|.
quic::QuicReceivedPacket* GetWrite(size_t pos) { return writes_[pos].packet; }
@@ -346,10 +343,10 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<TestParams>,
base::make_span(mock_writes_.get(), writes_.size()));
socket_data_->set_printer(&printer_);
- std::unique_ptr<MockUDPClientSocket> socket(
- new MockUDPClientSocket(socket_data_.get(), NetLog::Get()));
+ auto socket = std::make_unique<MockUDPClientSocket>(socket_data_.get(),
+ NetLog::Get());
socket->Connect(peer_addr_);
- runner_ = new TestTaskRunner(&clock_);
+ runner_ = base::MakeRefCounted<TestTaskRunner>(&clock_);
send_algorithm_ = new quic::test::MockSendAlgorithm();
EXPECT_CALL(*send_algorithm_, InRecovery()).WillRepeatedly(Return(false));
EXPECT_CALL(*send_algorithm_, InSlowStart()).WillRepeatedly(Return(false));
@@ -406,7 +403,7 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<TestParams>,
/*require_confirmation=*/false,
/*migrate_session_early_v2=*/false,
/*migrate_session_on_network_change_v2=*/false,
- /*default_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
+ /*default_network=*/handles::kInvalidNetworkHandle,
quic::QuicTime::Delta::FromMilliseconds(
kDefaultRetransmittableOnWireTimeout.InMilliseconds()),
/*migrate_idle_session=*/false, /*allow_port_migration=*/false,
@@ -2801,5 +2798,4 @@ TEST_P(QuicHttpStreamTest, GetAcceptChViaAlps) {
histogram_tester.ExpectTotalCount("Net.QuicSession.AcceptChForOrigin", 1);
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_http_utils.h b/chromium/net/quic/quic_http_utils.h
index 66b07f0ffe4..dbb5c2fd305 100644
--- a/chromium/net/quic/quic_http_utils.h
+++ b/chromium/net/quic/quic_http_utils.h
@@ -10,7 +10,7 @@
#include "net/base/request_priority.h"
#include "net/log/net_log_capture_mode.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h"
namespace net {
diff --git a/chromium/net/quic/quic_http_utils_test.cc b/chromium/net/quic/quic_http_utils_test.cc
index 322e0dd9c0f..d6b662b89b1 100644
--- a/chromium/net/quic/quic_http_utils_test.cc
+++ b/chromium/net/quic/quic_http_utils_test.cc
@@ -11,8 +11,7 @@
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_alt_svc_wire_format.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
TEST(QuicHttpUtilsTest, ConvertRequestPriorityToQuicPriority) {
EXPECT_EQ(0u, ConvertRequestPriorityToQuicPriority(HIGHEST));
@@ -36,5 +35,4 @@ TEST(QuicHttpUtilsTest, ConvertQuicPriorityToRequestPriority) {
}
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_network_transaction_unittest.cc b/chromium/net/quic/quic_network_transaction_unittest.cc
index a24eb007504..16d29da8157 100644
--- a/chromium/net/quic/quic_network_transaction_unittest.cc
+++ b/chromium/net/quic/quic_network_transaction_unittest.cc
@@ -94,8 +94,7 @@
using ::testing::ElementsAre;
using ::testing::Key;
-namespace net {
-namespace test {
+namespace net::test {
namespace {
@@ -233,7 +232,7 @@ class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
TestSocketPerformanceWatcher& operator=(const TestSocketPerformanceWatcher&) =
delete;
- ~TestSocketPerformanceWatcher() override {}
+ ~TestSocketPerformanceWatcher() override = default;
bool ShouldNotifyUpdatedRTT() const override {
return *should_notify_updated_rtt_;
@@ -260,7 +259,7 @@ class TestSocketPerformanceWatcherFactory
TestSocketPerformanceWatcherFactory& operator=(
const TestSocketPerformanceWatcherFactory&) = delete;
- ~TestSocketPerformanceWatcherFactory() override {}
+ ~TestSocketPerformanceWatcherFactory() override = default;
// SocketPerformanceWatcherFactory implementation:
std::unique_ptr<SocketPerformanceWatcher> CreateSocketPerformanceWatcher(
@@ -270,9 +269,8 @@ class TestSocketPerformanceWatcherFactory
return nullptr;
}
++watcher_count_;
- return std::unique_ptr<SocketPerformanceWatcher>(
- new TestSocketPerformanceWatcher(&should_notify_updated_rtt_,
- &rtt_notification_received_));
+ return std::make_unique<TestSocketPerformanceWatcher>(
+ &should_notify_updated_rtt_, &rtt_notification_received_);
}
size_t watcher_count() const { return watcher_count_; }
@@ -299,7 +297,7 @@ class QuicNetworkTransactionTest
client_headers_include_h2_stream_dependency_(
GetParam().client_headers_include_h2_stream_dependency),
supported_versions_(quic::test::SupportedVersions(version_)),
- client_maker_(new QuicTestPacketMaker(
+ client_maker_(std::make_unique<QuicTestPacketMaker>(
version_,
quic::QuicUtils::CreateRandomConnectionId(
context_.random_generator()),
@@ -314,15 +312,15 @@ class QuicNetworkTransactionTest
kDefaultServerHostName,
quic::Perspective::IS_SERVER,
false),
- quic_task_runner_(new TestTaskRunner(context_.mock_clock())),
- ssl_config_service_(new SSLConfigServiceDefaults),
+ quic_task_runner_(
+ base::MakeRefCounted<TestTaskRunner>(context_.mock_clock())),
+ ssl_config_service_(std::make_unique<SSLConfigServiceDefaults>()),
proxy_resolution_service_(
ConfiguredProxyResolutionService::CreateDirect()),
auth_handler_factory_(HttpAuthHandlerFactory::CreateDefault()),
http_server_properties_(std::make_unique<HttpServerProperties>()),
ssl_data_(ASYNC, OK) {
FLAGS_quic_enable_http3_grease_randomness = false;
- FLAGS_quic_enable_chaos_protection = false;
request_.method = "GET";
std::string url("https://");
url.append(kDefaultServerHostName);
@@ -1669,7 +1667,7 @@ TEST_P(QuicNetworkTransactionTest, 408Response) {
TEST_P(QuicNetworkTransactionTest, QuicProxy) {
session_params_.enable_quic = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC mail.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -1720,7 +1718,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) {
session_params_.enable_quic = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC " + proxy_host + ":70", TRAFFIC_ANNOTATION_FOR_TESTS);
client_maker_->set_hostname(origin_host);
@@ -3238,6 +3236,9 @@ TEST_P(QuicNetworkTransactionTest,
TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmed) {
context_.params()->retry_without_alt_svc_on_quic_errors = false;
context_.params()->idle_connection_timeout = base::Seconds(5);
+ // Turn off port migration to avoid dealing with unnecessary complexity in
+ // this test.
+ context_.params()->allow_port_migration = false;
// The request will initially go out over QUIC.
MockQuicData quic_data(version_);
@@ -3437,6 +3438,9 @@ TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmedThenBroken2) {
return;
}
context_.params()->idle_connection_timeout = base::Seconds(5);
+ // Turn off port migration to avoid dealing with unnecessary complexity in
+ // this test.
+ context_.params()->allow_port_migration = false;
// The request will initially go out over QUIC.
MockQuicData quic_data(version_);
@@ -5049,7 +5053,7 @@ TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
return;
}
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS);
// Since we are using a proxy, the QUIC job will not succeed.
@@ -6053,7 +6057,8 @@ TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
ExpectBrokenAlternateProtocolMapping();
}
-TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
+// TODO(crbug.com/1347664): This test is failing on various platforms.
+TEST_P(QuicNetworkTransactionTest, DISABLED_ConnectionCloseDuringConnect) {
if (version_.AlpnDeferToRFCv1()) {
// These versions currently do not support Alt-Svc.
return;
@@ -6118,7 +6123,7 @@ TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnectProxy) {
const HostPortPair host_port_pair("myproxy.org", 443);
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC myproxy.org:443; HTTPS myproxy.org:443",
TRAFFIC_ANNOTATION_FOR_TESTS);
proxy_resolution_service_->SetProxyDelegate(&test_proxy_delegate);
@@ -6253,8 +6258,8 @@ TEST_P(QuicNetworkTransactionTest, QuicUploadWriteError) {
request_.upload_data_stream = &upload_data;
- std::unique_ptr<HttpNetworkTransaction> trans(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
+ auto trans = std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY,
+ session_.get());
TestCompletionCallback callback;
int rv = trans->Start(&request_, callback.callback(), net_log_with_source_);
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -7022,7 +7027,7 @@ class QuicNetworkTransactionWithDestinationTest
GetParam().client_headers_include_h2_stream_dependency),
supported_versions_(quic::test::SupportedVersions(version_)),
destination_type_(GetParam().destination_type),
- ssl_config_service_(new SSLConfigServiceDefaults),
+ ssl_config_service_(std::make_unique<SSLConfigServiceDefaults>()),
proxy_resolution_service_(
ConfiguredProxyResolutionService::CreateDirect()),
auth_handler_factory_(HttpAuthHandlerFactory::CreateDefault()),
@@ -7157,8 +7162,7 @@ class QuicNetworkTransactionWithDestinationTest
}
void AddRefusedSocketData() {
- std::unique_ptr<StaticSocketDataProvider> refused_data(
- new StaticSocketDataProvider());
+ auto refused_data = std::make_unique<StaticSocketDataProvider>();
MockConnect refused_connect(SYNCHRONOUS, ERR_CONNECTION_REFUSED);
refused_data->set_connect_data(refused_connect);
socket_factory_.AddSocketDataProvider(refused_data.get());
@@ -7166,8 +7170,7 @@ class QuicNetworkTransactionWithDestinationTest
}
void AddHangingSocketData() {
- std::unique_ptr<StaticSocketDataProvider> hanging_data(
- new StaticSocketDataProvider());
+ auto hanging_data = std::make_unique<StaticSocketDataProvider>();
MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
hanging_data->set_connect_data(hanging_connect);
socket_factory_.AddSocketDataProvider(hanging_data.get());
@@ -7377,8 +7380,8 @@ TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
AddHangingSocketData();
AddHangingSocketData();
- scoped_refptr<TestTaskRunner> quic_task_runner(
- new TestTaskRunner(context_.mock_clock()));
+ auto quic_task_runner =
+ base::MakeRefCounted<TestTaskRunner>(context_.mock_clock());
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner.get(),
@@ -7702,7 +7705,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectHttpsServer) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -7795,7 +7798,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectSpdyServer) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -7889,7 +7892,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectReuseTransportSocket) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -8016,7 +8019,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectReuseQuicSession) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -8176,7 +8179,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectFailure) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -8227,7 +8230,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyQuicConnectionError) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -8268,7 +8271,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectBadCertificate) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -8403,7 +8406,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyUserAgent) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -8455,7 +8458,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyRequestPriority) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
const RequestPriority request_priority = MEDIUM;
@@ -8500,7 +8503,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyMultipleRequestsError) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
const RequestPriority kRequestPriority = MEDIUM;
@@ -8591,7 +8594,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyAuth) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
MockQuicData mock_quic_data(version_);
@@ -8962,7 +8965,7 @@ TEST_P(QuicNetworkTransactionTest, NetworkIsolation) {
if (use_proxy) {
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC mail.example.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
} else {
proxy_resolution_service_ =
@@ -9253,7 +9256,7 @@ TEST_P(QuicNetworkTransactionTest, NetworkIsolationTunnel) {
session_params_.enable_quic = true;
session_params_.enable_quic_proxies_for_https_urls = true;
proxy_resolution_service_ =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"QUIC proxy.example.org:70", TRAFFIC_ANNOTATION_FOR_TESTS);
const char kGetRequest[] =
@@ -9417,7 +9420,8 @@ TEST_P(QuicNetworkTransactionTest, AllowHTTP1MockTest) {
SendRequestAndExpectQuicResponse("hello!");
}
-TEST_P(QuicNetworkTransactionTest, AllowHTTP1UploadPauseAndResume) {
+// TODO(crbug.com/1347664): This test is failing on various platforms.
+TEST_P(QuicNetworkTransactionTest, DISABLED_AllowHTTP1UploadPauseAndResume) {
context_.params()->origins_to_force_quic_on.insert(
HostPortPair::FromString("mail.example.org:443"));
@@ -9478,7 +9482,9 @@ TEST_P(QuicNetworkTransactionTest, AllowHTTP1UploadPauseAndResume) {
CheckResponseData(&trans, "hello!");
}
-TEST_P(QuicNetworkTransactionTest, AllowHTTP1UploadFailH1AndResumeQuic) {
+// TODO(crbug.com/1347664): This test is failing on various platforms.
+TEST_P(QuicNetworkTransactionTest,
+ DISABLED_AllowHTTP1UploadFailH1AndResumeQuic) {
if (version_.AlpnDeferToRFCv1()) {
// These versions currently do not support Alt-Svc.
return;
@@ -9593,16 +9599,13 @@ TEST_P(QuicNetworkTransactionTest, IncorrectHttp3GoAway) {
// a client-initiated bidirectional stream. Any other kind of stream ID
// should cause the client to close the connection.
quic::GoAwayFrame goaway{3};
- std::unique_ptr<char[]> goaway_buffer;
- auto goaway_length =
- quic::HttpEncoder::SerializeGoAwayFrame(goaway, &goaway_buffer);
+ auto goaway_buffer = quic::HttpEncoder::SerializeGoAwayFrame(goaway);
const quic::QuicStreamId control_stream_id =
quic::QuicUtils::GetFirstUnidirectionalStreamId(
version_.transport_version, quic::Perspective::IS_SERVER);
mock_quic_data.AddRead(
- ASYNC, ConstructServerDataPacket(
- read_packet_number++, control_stream_id, false, false,
- absl::string_view(goaway_buffer.get(), goaway_length)));
+ ASYNC, ConstructServerDataPacket(read_packet_number++, control_stream_id,
+ false, false, goaway_buffer));
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientAckAndConnectionClosePacket(
@@ -9669,16 +9672,13 @@ TEST_P(QuicNetworkTransactionTest, RetryOnHttp3GoAway) {
// GOAWAY with stream_id2 informs the client that stream_id2 (and streams with
// larger IDs) have not been processed and can safely be retried.
quic::GoAwayFrame goaway{stream_id2};
- std::unique_ptr<char[]> goaway_buffer;
- auto goaway_length =
- quic::HttpEncoder::SerializeGoAwayFrame(goaway, &goaway_buffer);
+ auto goaway_buffer = quic::HttpEncoder::SerializeGoAwayFrame(goaway);
const quic::QuicStreamId control_stream_id =
quic::QuicUtils::GetFirstUnidirectionalStreamId(
version_.transport_version, quic::Perspective::IS_SERVER);
mock_quic_data1.AddRead(
- ASYNC, ConstructServerDataPacket(
- read_packet_number1++, control_stream_id, false, false,
- absl::string_view(goaway_buffer.get(), goaway_length)));
+ ASYNC, ConstructServerDataPacket(read_packet_number1++, control_stream_id,
+ false, false, goaway_buffer));
mock_quic_data1.AddWrite(
ASYNC, ConstructClientAckPacket(write_packet_number1++, 2, 1));
@@ -9775,5 +9775,4 @@ TEST_P(QuicNetworkTransactionTest, RetryOnHttp3GoAway) {
// TODO(yoichio): Add the TCP job reuse case. See crrev.com/c/2174099.
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_proxy_client_socket.cc b/chromium/net/quic/quic_proxy_client_socket.cc
index 3daf0ced65a..8ca0ef8d5a9 100644
--- a/chromium/net/quic/quic_proxy_client_socket.cc
+++ b/chromium/net/quic/quic_proxy_client_socket.cc
@@ -29,12 +29,12 @@ QuicProxyClientSocket::QuicProxyClientSocket(
const std::string& user_agent,
const HostPortPair& endpoint,
const NetLogWithSource& net_log,
- HttpAuthController* auth_controller,
+ scoped_refptr<HttpAuthController> auth_controller,
ProxyDelegate* proxy_delegate)
: stream_(std::move(stream)),
session_(std::move(session)),
endpoint_(endpoint),
- auth_(auth_controller),
+ auth_(std::move(auth_controller)),
proxy_server_(proxy_server),
proxy_delegate_(proxy_delegate),
user_agent_(user_agent),
diff --git a/chromium/net/quic/quic_proxy_client_socket.h b/chromium/net/quic/quic_proxy_client_socket.h
index 1bbf40dc5a6..f1b0e23ac8c 100644
--- a/chromium/net/quic/quic_proxy_client_socket.h
+++ b/chromium/net/quic/quic_proxy_client_socket.h
@@ -38,7 +38,7 @@ class NET_EXPORT_PRIVATE QuicProxyClientSocket : public ProxyClientSocket {
const std::string& user_agent,
const HostPortPair& endpoint,
const NetLogWithSource& net_log,
- HttpAuthController* auth_controller,
+ scoped_refptr<HttpAuthController> auth_controller,
ProxyDelegate* proxy_delegate);
QuicProxyClientSocket(const QuicProxyClientSocket&) = delete;
diff --git a/chromium/net/quic/quic_proxy_client_socket_unittest.cc b/chromium/net/quic/quic_proxy_client_socket_unittest.cc
index 49aeb0522ae..9dd9c00de60 100644
--- a/chromium/net/quic/quic_proxy_client_socket_unittest.cc
+++ b/chromium/net/quic/quic_proxy_client_socket_unittest.cc
@@ -68,8 +68,7 @@ using testing::_;
using testing::AnyNumber;
using testing::Return;
-namespace net {
-namespace test {
+namespace net::test {
namespace {
@@ -133,13 +132,13 @@ class QuicProxyClientSocketTest : public ::testing::TestWithParam<TestParams>,
quic::QuicConnectionIdLength connection_id_length,
quic::QuicPacketNumberLength packet_number_length,
quic::QuicStreamOffset offset) {
- quic::QuicVariableLengthIntegerLength retry_token_length_length =
- quic::VARIABLE_LENGTH_INTEGER_LENGTH_0;
- quic::QuicVariableLengthIntegerLength length_length =
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ quiche::QuicheVariableLengthIntegerLength length_length =
quic::QuicVersionHasLongHeaderLengths(version.transport_version) &&
include_version
- ? quic::VARIABLE_LENGTH_INTEGER_LENGTH_2
- : quic::VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ ? quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2
+ : quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
size_t min_data_length = 1;
size_t min_packet_length =
quic::NullEncrypter(quic::Perspective::IS_CLIENT)
@@ -189,7 +188,7 @@ class QuicProxyClientSocketTest : public ::testing::TestWithParam<TestParams>,
destination_endpoint_(url::kHttpsScheme, kOriginHost, kOriginPort),
http_auth_cache_(
false /* key_server_entries_by_network_isolation_key */),
- host_resolver_(new MockCachingHostResolver()),
+ host_resolver_(std::make_unique<MockCachingHostResolver>()),
http_auth_handler_factory_(HttpAuthHandlerFactory::CreateDefault()) {
FLAGS_quic_enable_http3_grease_randomness = false;
IPAddress ip(192, 0, 2, 33);
@@ -211,10 +210,10 @@ class QuicProxyClientSocketTest : public ::testing::TestWithParam<TestParams>,
}
void Initialize() {
- std::unique_ptr<MockUDPClientSocket> socket(new MockUDPClientSocket(
- mock_quic_data_.InitializeAndGetSequencedSocketData(), NetLog::Get()));
+ auto socket = std::make_unique<MockUDPClientSocket>(
+ mock_quic_data_.InitializeAndGetSequencedSocketData(), NetLog::Get());
socket->Connect(peer_addr_);
- runner_ = new TestTaskRunner(&clock_);
+ runner_ = base::MakeRefCounted<TestTaskRunner>(&clock_);
send_algorithm_ = new quic::test::MockSendAlgorithm();
EXPECT_CALL(*send_algorithm_, InRecovery()).WillRepeatedly(Return(false));
EXPECT_CALL(*send_algorithm_, InSlowStart()).WillRepeatedly(Return(false));
@@ -271,7 +270,7 @@ class QuicProxyClientSocketTest : public ::testing::TestWithParam<TestParams>,
/*require_confirmation=*/false,
/*migrate_session_early_v2=*/false,
/*migrate_session_on_network_change_v2=*/false,
- /*default_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
+ /*default_network=*/handles::kInvalidNetworkHandle,
quic::QuicTime::Delta::FromMilliseconds(
kDefaultRetransmittableOnWireTimeout.InMilliseconds()),
/*migrate_idle_session=*/true, /*allow_port_migration=*/false,
@@ -324,10 +323,10 @@ class QuicProxyClientSocketTest : public ::testing::TestWithParam<TestParams>,
// `proxy_endpoint_` once it supports `url::SchemeHostPort`.
HostPortPair::FromSchemeHostPort(destination_endpoint_),
NetLogWithSource::Make(NetLogSourceType::NONE),
- new HttpAuthController(HttpAuth::AUTH_PROXY, proxy_endpoint_.GetURL(),
- NetworkIsolationKey(), &http_auth_cache_,
- http_auth_handler_factory_.get(),
- host_resolver_.get()),
+ base::MakeRefCounted<HttpAuthController>(
+ HttpAuth::AUTH_PROXY, proxy_endpoint_.GetURL(),
+ NetworkIsolationKey(), &http_auth_cache_,
+ http_auth_handler_factory_.get(), host_resolver_.get()),
proxy_delegate_.get());
session_->StartReading();
@@ -355,7 +354,7 @@ class QuicProxyClientSocketTest : public ::testing::TestWithParam<TestParams>,
return client_maker_.MakeAckAndRstPacket(
packet_number, !kIncludeVersion, client_data_stream_id1_, error_code,
largest_received, smallest_received,
- /*include_stop_sending=*/false);
+ /*include_stop_sending_if_v99=*/false);
}
std::unique_ptr<quic::QuicReceivedPacket> ConstructAckAndRstPacket(
@@ -2006,7 +2005,7 @@ class DeleteSockCallback : public TestCompletionCallbackBase {
DeleteSockCallback(const DeleteSockCallback&) = delete;
DeleteSockCallback& operator=(const DeleteSockCallback&) = delete;
- ~DeleteSockCallback() override {}
+ ~DeleteSockCallback() override = default;
CompletionOnceCallback callback() {
return base::BindOnce(&DeleteSockCallback::OnComplete,
@@ -2089,5 +2088,4 @@ INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
::testing::ValuesIn(GetTestParams()),
::testing::PrintToStringParamName());
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_server_info.cc b/chromium/net/quic/quic_server_info.cc
index 4b49337536a..bbf722884d0 100644
--- a/chromium/net/quic/quic_server_info.cc
+++ b/chromium/net/quic/quic_server_info.cc
@@ -20,9 +20,9 @@ const int kQuicCryptoConfigVersion = 2;
namespace net {
-QuicServerInfo::State::State() {}
+QuicServerInfo::State::State() = default;
-QuicServerInfo::State::~State() {}
+QuicServerInfo::State::~State() = default;
void QuicServerInfo::State::Clear() {
base::STLClearObject(&server_config);
@@ -36,7 +36,7 @@ void QuicServerInfo::State::Clear() {
QuicServerInfo::QuicServerInfo(const quic::QuicServerId& server_id)
: server_id_(server_id) {}
-QuicServerInfo::~QuicServerInfo() {}
+QuicServerInfo::~QuicServerInfo() = default;
const QuicServerInfo::State& QuicServerInfo::state() const {
return state_;
@@ -138,8 +138,8 @@ string QuicServerInfo::SerializeInner() const {
p.WriteString(state_.server_config_sig);
p.WriteUInt32(state_.certs.size());
- for (size_t i = 0; i < state_.certs.size(); i++)
- p.WriteString(state_.certs[i]);
+ for (const auto& cert : state_.certs)
+ p.WriteString(cert);
return string(reinterpret_cast<const char*>(p.data()), p.size());
}
diff --git a/chromium/net/quic/quic_stream_factory.cc b/chromium/net/quic/quic_stream_factory.cc
index 0c2ed488c53..4dae80305ba 100644
--- a/chromium/net/quic/quic_stream_factory.cc
+++ b/chromium/net/quic/quic_stream_factory.cc
@@ -32,6 +32,7 @@
#include "base/trace_event/trace_event.h"
#include "base/values.h"
#include "crypto/openssl_util.h"
+#include "net/base/address_list.h"
#include "net/base/features.h"
#include "net/base/ip_address.h"
#include "net/base/net_errors.h"
@@ -77,8 +78,6 @@
#include "url/scheme_host_port.h"
#include "url/url_constants.h"
-using NetworkHandle = net::NetworkChangeNotifier::NetworkHandle;
-
namespace net {
namespace {
@@ -339,7 +338,7 @@ class QuicStreamFactory::CryptoClientConfigHandle
map_iterator->second->AddRef();
}
- explicit CryptoClientConfigHandle(const CryptoClientConfigHandle& other)
+ CryptoClientConfigHandle(const CryptoClientConfigHandle& other)
: CryptoClientConfigHandle(other.map_iterator_) {}
CryptoClientConfigHandle& operator=(const CryptoClientConfigHandle&) = delete;
@@ -528,7 +527,7 @@ class QuicStreamFactory::Job {
QuicChromiumClientSession* session_ = nullptr;
// If connection migraiton is supported, |network_| denotes the network on
// which |session_| is created.
- NetworkChangeNotifier::NetworkHandle network_;
+ handles::NetworkHandle network_;
CompletionOnceCallback host_resolution_callback_;
CompletionOnceCallback callback_;
std::unique_ptr<HostResolver::ResolveHostRequest> resolve_host_request_;
@@ -573,7 +572,7 @@ QuicStreamFactory::Job::Job(
net_log_(
NetLogWithSource::Make(net_log.net_log(),
NetLogSourceType::QUIC_STREAM_FACTORY_JOB)),
- network_(NetworkChangeNotifier::kInvalidNetworkHandle) {
+ network_(handles::kInvalidNetworkHandle) {
DCHECK_EQ(quic_version.IsKnown(), !require_dns_https_alpn);
net_log_.BeginEvent(NetLogEventType::QUIC_STREAM_FACTORY_JOB,
[&] { return NetLogQuicStreamFactoryJobParams(&key_); });
@@ -951,10 +950,9 @@ int QuicStreamFactory::Job::DoConfirmConnection(int rv) {
session_->error() == quic::QUIC_PACKET_WRITE_ERROR) {
// Retry the connection on an alternate network if crypto handshake failed
// with network idle time out or handshake time out.
- DCHECK(network_ != NetworkChangeNotifier::kInvalidNetworkHandle);
+ DCHECK(network_ != handles::kInvalidNetworkHandle);
network_ = factory_->FindAlternateNetwork(network_);
- connection_retried_ =
- network_ != NetworkChangeNotifier::kInvalidNetworkHandle;
+ connection_retried_ = network_ != handles::kInvalidNetworkHandle;
UMA_HISTOGRAM_BOOLEAN(
"Net.QuicStreamFactory.AttemptMigrationBeforeHandshake",
connection_retried_);
@@ -995,7 +993,7 @@ int QuicStreamFactory::Job::DoConfirmConnection(int rv) {
base::UmaHistogramSparse(
"Net.QuicStreamFactory.MigrationBeforeHandshakeFailedReason", -rv);
}
- } else if (network_ != NetworkChangeNotifier::kInvalidNetworkHandle &&
+ } else if (network_ != handles::kInvalidNetworkHandle &&
network_ != factory_->default_network()) {
UMA_HISTOGRAM_BOOLEAN("Net.QuicStreamFactory.ConnectionOnNonDefaultNetwork",
rv == OK);
@@ -1136,6 +1134,21 @@ void QuicStreamRequest::SetSession(
session_ = std::move(session);
}
+bool QuicStreamRequest::CanUseExistingSession(
+ const GURL& url,
+ PrivacyMode privacy_mode,
+ const SocketTag& socket_tag,
+ const NetworkIsolationKey& network_isolation_key,
+ SecureDnsPolicy secure_dns_policy,
+ bool require_dns_https_alpn,
+ const url::SchemeHostPort& destination) const {
+ return factory_->CanUseExistingSession(
+ QuicSessionKey(HostPortPair::FromURL(url), privacy_mode, socket_tag,
+ network_isolation_key, secure_dns_policy,
+ require_dns_https_alpn),
+ destination);
+}
+
QuicStreamFactory::QuicSessionAliasKey::QuicSessionAliasKey(
url::SchemeHostPort destination,
QuicSessionKey session_key)
@@ -1194,7 +1207,7 @@ QuicStreamFactory::QuicStreamFactory(
yield_after_packets_(kQuicYieldAfterPacketsRead),
yield_after_duration_(quic::QuicTime::Delta::FromMilliseconds(
kQuicYieldAfterDurationMilliseconds)),
- default_network_(NetworkChangeNotifier::kInvalidNetworkHandle),
+ default_network_(handles::kInvalidNetworkHandle),
connectivity_monitor_(default_network_),
ssl_config_service_(ssl_config_service),
use_network_isolation_key_for_crypto_configs_(
@@ -1234,13 +1247,15 @@ QuicStreamFactory::~QuicStreamFactory() {
bool QuicStreamFactory::CanUseExistingSession(
const QuicSessionKey& session_key,
- const url::SchemeHostPort& destination) {
+ const url::SchemeHostPort& destination) const {
if (base::Contains(active_sessions_, session_key))
return true;
for (const auto& key_value : active_sessions_) {
QuicChromiumClientSession* session = key_value.second;
- if (destination == all_sessions_[session].destination() &&
+ const auto& it = all_sessions_.find(session);
+ if ((it != all_sessions_.end()) &&
+ (destination == it->second.destination()) &&
session->CanPool(session_key.host(), session_key)) {
return true;
}
@@ -1348,14 +1363,14 @@ int QuicStreamFactory::Create(const QuicSessionKey& session_key,
void QuicStreamFactory::OnSessionGoingAway(QuicChromiumClientSession* session) {
const AliasSet& aliases = session_aliases_[session];
- for (auto it = aliases.begin(); it != aliases.end(); ++it) {
- const QuicSessionKey& session_key = it->session_key();
+ for (const auto& alias : aliases) {
+ const QuicSessionKey& session_key = alias.session_key();
DCHECK(active_sessions_.count(session_key));
DCHECK_EQ(session, active_sessions_[session_key]);
// Track sessions which have recently gone away so that we can disable
// port suggestions.
if (session->goaway_received())
- gone_away_aliases_.insert(*it);
+ gone_away_aliases_.insert(alias);
active_sessions_.erase(session_key);
ProcessGoingAwaySession(session, session_key.server_id(), true);
@@ -1428,17 +1443,16 @@ void QuicStreamFactory::CloseAllSessions(int error,
base::Value QuicStreamFactory::QuicStreamFactoryInfoToValue() const {
base::Value::List list;
- for (auto it = active_sessions_.begin(); it != active_sessions_.end(); ++it) {
- const quic::QuicServerId& server_id = it->first.server_id();
- QuicChromiumClientSession* session = it->second;
+ for (const auto& active_session : active_sessions_) {
+ const quic::QuicServerId& server_id = active_session.first.server_id();
+ QuicChromiumClientSession* session = active_session.second;
const AliasSet& aliases = session_aliases_.find(session)->second;
// Only add a session to the list once.
if (server_id == aliases.begin()->server_id()) {
std::set<HostPortPair> hosts;
- for (auto alias_it = aliases.begin(); alias_it != aliases.end();
- ++alias_it) {
- hosts.insert(HostPortPair(alias_it->server_id().host(),
- alias_it->server_id().port()));
+ for (const auto& alias : aliases) {
+ hosts.insert(
+ HostPortPair(alias.server_id().host(), alias.server_id().port()));
}
list.Append(session->GetInfoAsValue(hosts));
}
@@ -1460,14 +1474,14 @@ void QuicStreamFactory::ClearCachedStatesInCryptoConfig(
int QuicStreamFactory::ConfigureSocket(DatagramClientSocket* socket,
IPEndPoint addr,
- NetworkHandle network,
+ handles::NetworkHandle network,
const SocketTag& socket_tag) {
socket->UseNonBlockingIO();
int rv;
if (params_.migrate_sessions_on_network_change_v2) {
// If caller leaves network unspecified, use current default network.
- if (network == NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (network == handles::kInvalidNetworkHandle) {
rv = socket->ConnectUsingDefaultNetwork(addr);
} else {
rv = socket->ConnectUsingNetwork(network, addr);
@@ -1524,16 +1538,16 @@ int QuicStreamFactory::ConfigureSocket(DatagramClientSocket* socket,
return OK;
}
-NetworkHandle QuicStreamFactory::FindAlternateNetwork(
- NetworkHandle old_network) {
+handles::NetworkHandle QuicStreamFactory::FindAlternateNetwork(
+ handles::NetworkHandle old_network) {
// Find a new network that sessions bound to |old_network| can be migrated to.
NetworkChangeNotifier::NetworkList network_list;
NetworkChangeNotifier::GetConnectedNetworks(&network_list);
- for (NetworkHandle new_network : network_list) {
+ for (handles::NetworkHandle new_network : network_list) {
if (new_network != old_network)
return new_network;
}
- return NetworkChangeNotifier::kInvalidNetworkHandle;
+ return handles::kInvalidNetworkHandle;
}
std::unique_ptr<DatagramClientSocket> QuicStreamFactory::CreateSocket(
@@ -1547,8 +1561,8 @@ std::unique_ptr<DatagramClientSocket> QuicStreamFactory::CreateSocket(
}
void QuicStreamFactory::OnIPAddressChanged() {
- CollectDataOnPlatformNotification(
- NETWORK_IP_ADDRESS_CHANGED, NetworkChangeNotifier::kInvalidNetworkHandle);
+ CollectDataOnPlatformNotification(NETWORK_IP_ADDRESS_CHANGED,
+ handles::kInvalidNetworkHandle);
// Do nothing if connection migration is turned on.
if (params_.migrate_sessions_on_network_change_v2)
return;
@@ -1564,7 +1578,7 @@ void QuicStreamFactory::OnIPAddressChanged() {
}
}
-void QuicStreamFactory::OnNetworkConnected(NetworkHandle network) {
+void QuicStreamFactory::OnNetworkConnected(handles::NetworkHandle network) {
CollectDataOnPlatformNotification(NETWORK_CONNECTED, network);
if (params_.migrate_sessions_on_network_change_v2) {
NetLogWithSource net_log = NetLogWithSource::Make(
@@ -1584,7 +1598,7 @@ void QuicStreamFactory::OnNetworkConnected(NetworkHandle network) {
}
}
-void QuicStreamFactory::OnNetworkDisconnected(NetworkHandle network) {
+void QuicStreamFactory::OnNetworkDisconnected(handles::NetworkHandle network) {
CollectDataOnPlatformNotification(NETWORK_DISCONNECTED, network);
if (params_.migrate_sessions_on_network_change_v2) {
NetLogWithSource net_log = NetLogWithSource::Make(
@@ -1606,23 +1620,24 @@ void QuicStreamFactory::OnNetworkDisconnected(NetworkHandle network) {
// This method is expected to only be called when migrating from Cellular to
// WiFi on Android, and should always be preceded by OnNetworkMadeDefault().
-void QuicStreamFactory::OnNetworkSoonToDisconnect(NetworkHandle network) {
+void QuicStreamFactory::OnNetworkSoonToDisconnect(
+ handles::NetworkHandle network) {
CollectDataOnPlatformNotification(NETWORK_SOON_TO_DISCONNECT, network);
}
-void QuicStreamFactory::OnNetworkMadeDefault(NetworkHandle network) {
+void QuicStreamFactory::OnNetworkMadeDefault(handles::NetworkHandle network) {
CollectDataOnPlatformNotification(NETWORK_MADE_DEFAULT, network);
connectivity_monitor_.OnDefaultNetworkUpdated(network);
// Clear alternative services that were marked as broken until default network
// changes.
if (params_.retry_on_alternate_network_before_handshake &&
- default_network_ != NetworkChangeNotifier::kInvalidNetworkHandle &&
+ default_network_ != handles::kInvalidNetworkHandle &&
network != default_network_) {
http_server_properties_->OnDefaultNetworkChanged();
}
- DCHECK_NE(NetworkChangeNotifier::kInvalidNetworkHandle, network);
+ DCHECK_NE(handles::kInvalidNetworkHandle, network);
default_network_ = network;
if (params_.migrate_sessions_on_network_change_v2) {
@@ -1785,33 +1800,32 @@ bool QuicStreamFactory::HasActiveJob(const QuicSessionKey& session_key) const {
return base::Contains(active_jobs_, session_key);
}
-int QuicStreamFactory::CreateSession(
- const QuicSessionAliasKey& key,
- quic::ParsedQuicVersion quic_version,
- int cert_verify_flags,
- bool require_confirmation,
- const AddressList& address_list,
- base::TimeTicks dns_resolution_start_time,
- base::TimeTicks dns_resolution_end_time,
- const NetLogWithSource& net_log,
- QuicChromiumClientSession** session,
- NetworkChangeNotifier::NetworkHandle* network) {
+int QuicStreamFactory::CreateSession(const QuicSessionAliasKey& key,
+ quic::ParsedQuicVersion quic_version,
+ int cert_verify_flags,
+ bool require_confirmation,
+ const AddressList& address_list,
+ base::TimeTicks dns_resolution_start_time,
+ base::TimeTicks dns_resolution_end_time,
+ const NetLogWithSource& net_log,
+ QuicChromiumClientSession** session,
+ handles::NetworkHandle* network) {
TRACE_EVENT0(NetTracingCategory(), "QuicStreamFactory::CreateSession");
IPEndPoint addr = *address_list.begin();
const quic::QuicServerId& server_id = key.server_id();
std::unique_ptr<DatagramClientSocket> socket(
CreateSocket(net_log.net_log(), net_log.source()));
- // Passing in kInvalidNetworkHandle binds socket to default network.
+ // Passing in handles::kInvalidNetworkHandle binds socket to default network.
int rv = ConfigureSocket(socket.get(), addr, *network,
key.session_key().socket_tag());
if (rv != OK)
return rv;
if (params_.migrate_sessions_on_network_change_v2 &&
- *network == NetworkChangeNotifier::kInvalidNetworkHandle) {
+ *network == handles::kInvalidNetworkHandle) {
*network = socket->GetBoundNetwork();
- if (default_network_ == NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (default_network_ == handles::kInvalidNetworkHandle) {
// QuicStreamFactory may miss the default network signal before its
// creation, update |default_network_| when the first socket is bound
// to the default network.
@@ -2268,7 +2282,7 @@ void QuicStreamFactory::OnAllCryptoClientRefReleased(
void QuicStreamFactory::CollectDataOnPlatformNotification(
enum QuicPlatformNotification notification,
- NetworkChangeNotifier::NetworkHandle affected_network) const {
+ handles::NetworkHandle affected_network) const {
UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.PlatformNotification",
notification, NETWORK_NOTIFICATION_MAX);
connectivity_monitor_.RecordConnectivityStatsToHistograms(
diff --git a/chromium/net/quic/quic_stream_factory.h b/chromium/net/quic/quic_stream_factory.h
index c509693549b..c19c053629a 100644
--- a/chromium/net/quic/quic_stream_factory.h
+++ b/chromium/net/quic/quic_stream_factory.h
@@ -25,6 +25,7 @@
#include "net/base/host_port_pair.h"
#include "net/base/net_export.h"
#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/base/proxy_server.h"
#include "net/cert/cert_database.h"
#include "net/dns/public/secure_dns_policy.h"
@@ -183,6 +184,14 @@ class NET_EXPORT_PRIVATE QuicStreamRequest {
const NetLogWithSource& net_log() const { return net_log_; }
+ bool CanUseExistingSession(const GURL& url,
+ PrivacyMode privacy_mode,
+ const SocketTag& socket_tag,
+ const NetworkIsolationKey& network_isolation_key,
+ SecureDnsPolicy secure_dns_policy,
+ bool require_dns_https_alpn,
+ const url::SchemeHostPort& destination) const;
+
private:
raw_ptr<QuicStreamFactory> factory_;
QuicSessionKey session_key_;
@@ -258,7 +267,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
// request can be pooled to an existing session to the IP address of
// |destination|.
bool CanUseExistingSession(const QuicSessionKey& session_key,
- const url::SchemeHostPort& destination);
+ const url::SchemeHostPort& destination) const;
// Fetches a QuicChromiumClientSession to |host_port_pair| which will be
// owned by |request|.
@@ -307,18 +316,18 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
// Helper method that configures a DatagramClientSocket. Socket is
// bound to the default network if the |network| param is
- // NetworkChangeNotifier::kInvalidNetworkHandle.
+ // handles::kInvalidNetworkHandle.
// Returns net_error code.
int ConfigureSocket(DatagramClientSocket* socket,
IPEndPoint addr,
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const SocketTag& socket_tag);
// Finds an alternative to |old_network| from the platform's list of connected
- // networks. Returns NetworkChangeNotifier::kInvalidNetworkHandle if no
+ // networks. Returns handles::kInvalidNetworkHandle if no
// alternative is found.
- NetworkChangeNotifier::NetworkHandle FindAlternateNetwork(
- NetworkChangeNotifier::NetworkHandle old_network);
+ handles::NetworkHandle FindAlternateNetwork(
+ handles::NetworkHandle old_network);
// Creates a datagram socket. |source| is the NetLogSource for the entity
// trying to create the socket, if it has one.
@@ -333,14 +342,10 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
void OnIPAddressChanged() override;
// NetworkChangeNotifier::NetworkObserver methods:
- void OnNetworkConnected(
- NetworkChangeNotifier::NetworkHandle network) override;
- void OnNetworkDisconnected(
- NetworkChangeNotifier::NetworkHandle network) override;
- void OnNetworkSoonToDisconnect(
- NetworkChangeNotifier::NetworkHandle network) override;
- void OnNetworkMadeDefault(
- NetworkChangeNotifier::NetworkHandle network) override;
+ void OnNetworkConnected(handles::NetworkHandle network) override;
+ void OnNetworkDisconnected(handles::NetworkHandle network) override;
+ void OnNetworkSoonToDisconnect(handles::NetworkHandle network) override;
+ void OnNetworkMadeDefault(handles::NetworkHandle network) override;
// CertDatabase::Observer methods:
@@ -372,9 +377,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
push_delegate_ = push_delegate;
}
- NetworkChangeNotifier::NetworkHandle default_network() const {
- return default_network_;
- }
+ handles::NetworkHandle default_network() const { return default_network_; }
// Returns the stored DNS aliases for the session key.
const std::set<std::string>& GetDnsAliasesForSessionKey(
@@ -416,7 +419,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
base::TimeTicks dns_resolution_end_time,
const NetLogWithSource& net_log,
QuicChromiumClientSession** session,
- NetworkChangeNotifier::NetworkHandle* network);
+ handles::NetworkHandle* network);
void ActivateSession(const QuicSessionAliasKey& key,
QuicChromiumClientSession* session,
std::set<std::string> dns_aliases);
@@ -498,7 +501,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
// metrics from |connectivity_monitor_| and add to histograms.
void CollectDataOnPlatformNotification(
enum QuicPlatformNotification notification,
- NetworkChangeNotifier::NetworkHandle affected_network) const;
+ handles::NetworkHandle affected_network) const;
std::unique_ptr<QuicCryptoClientConfigHandle> GetCryptoConfigForTesting(
const NetworkIsolationKey& network_isolation_key);
@@ -593,7 +596,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
// If |migrate_sessions_early_v2_| is true, tracks the current default
// network, and is updated OnNetworkMadeDefault.
// Otherwise, always set to NetworkChangeNotifier::kInvalidNetwork.
- NetworkChangeNotifier::NetworkHandle default_network_;
+ handles::NetworkHandle default_network_;
// Local address of socket that was created in CreateSession.
IPEndPoint local_address_;
diff --git a/chromium/net/quic/quic_stream_factory_peer.cc b/chromium/net/quic/quic_stream_factory_peer.cc
index 2d078b43fe0..8774aee82fb 100644
--- a/chromium/net/quic/quic_stream_factory_peer.cc
+++ b/chromium/net/quic/quic_stream_factory_peer.cc
@@ -21,8 +21,7 @@
using std::string;
-namespace net {
-namespace test {
+namespace net::test {
const quic::QuicConfig* QuicStreamFactoryPeer::GetConfig(
QuicStreamFactory* factory) {
@@ -88,9 +87,8 @@ bool QuicStreamFactoryPeer::HasLiveSession(
SecureDnsPolicy::kAllow, /*require_dns_https_alpn=*/false);
QuicStreamFactory::QuicSessionAliasKey alias_key(std::move(destination),
session_key);
- for (auto it = factory->all_sessions_.begin();
- it != factory->all_sessions_.end(); ++it) {
- if (it->second == alias_key)
+ for (const auto& it : factory->all_sessions_) {
+ if (it.second == alias_key)
return true;
}
return false;
@@ -98,9 +96,8 @@ bool QuicStreamFactoryPeer::HasLiveSession(
bool QuicStreamFactoryPeer::IsLiveSession(QuicStreamFactory* factory,
QuicChromiumClientSession* session) {
- for (auto it = factory->all_sessions_.begin();
- it != factory->all_sessions_.end(); ++it) {
- if (it->first == session)
+ for (const auto& it : factory->all_sessions_) {
+ if (it.first == session)
return true;
}
return false;
@@ -196,5 +193,4 @@ void QuicStreamFactoryPeer::SetAlarmFactory(
factory->alarm_factory_ = std::move(alarm_factory);
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_stream_factory_test.cc b/chromium/net/quic/quic_stream_factory_test.cc
index 79c9947df8b..7058c78fa4b 100644
--- a/chromium/net/quic/quic_stream_factory_test.cc
+++ b/chromium/net/quic/quic_stream_factory_test.cc
@@ -89,9 +89,7 @@
using std::string;
-namespace net {
-
-namespace test {
+namespace net::test {
class QuicHttpStreamPeer {
public:
@@ -114,7 +112,7 @@ const char kServer4Url[] = "https://images.example.org/";
const int kDefaultRTTMilliSecs = 300;
const size_t kMinRetryTimeForDefaultNetworkSecs = 1;
const size_t kWaitTimeForNewNetworkSecs = 10;
-const IPAddress kCachedIPAddress = IPAddress(192, 168, 0, 2);
+const char kCachedIPAddress[] = "192.168.0.2";
const char kNonCachedIPAddress[] = "192.168.0.1";
const quic::QuicConnectionId kNewCID = quic::test::TestConnectionId(12345678);
@@ -164,8 +162,7 @@ class TestConnectionMigrationSocketFactory : public MockClientSocketFactory {
NetLog* net_log,
const NetLogSource& source) override {
SocketDataProvider* data_provider = mock_data().GetNext();
- std::unique_ptr<MockUDPClientSocket> socket(
- new MockUDPClientSocket(data_provider, net_log));
+ auto socket = std::make_unique<MockUDPClientSocket>(data_provider, net_log);
socket->set_source_host(IPAddress(192, 0, 2, next_source_host_num_++));
return std::move(socket);
}
@@ -192,8 +189,7 @@ class TestPortMigrationSocketFactory : public MockClientSocketFactory {
NetLog* net_log,
const NetLogSource& source) override {
SocketDataProvider* data_provider = mock_data().GetNext();
- std::unique_ptr<MockUDPClientSocket> socket(
- new MockUDPClientSocket(data_provider, net_log));
+ auto socket = std::make_unique<MockUDPClientSocket>(data_provider, net_log);
socket->set_source_port(next_source_port_num_++);
return std::move(socket);
}
@@ -206,12 +202,12 @@ class QuicStreamFactoryTestBase : public WithTaskEnvironment {
protected:
QuicStreamFactoryTestBase(quic::ParsedQuicVersion version,
bool client_headers_include_h2_stream_dependency)
- : host_resolver_(
- new MockHostResolver(/*default_result=*/MockHostResolverBase::
- RuleResolver::GetLocalhostResult())),
- ssl_config_service_(new SSLConfigServiceDefaults),
- socket_factory_(new MockClientSocketFactory),
- runner_(new TestTaskRunner(context_.mock_clock())),
+ : host_resolver_(std::make_unique<MockHostResolver>(
+ /*default_result=*/MockHostResolverBase::RuleResolver::
+ GetLocalhostResult())),
+ ssl_config_service_(std::make_unique<SSLConfigServiceDefaults>()),
+ socket_factory_(std::make_unique<MockClientSocketFactory>()),
+ runner_(base::MakeRefCounted<TestTaskRunner>(context_.mock_clock())),
version_(version),
client_maker_(version_,
quic::QuicUtils::CreateRandomConnectionId(
@@ -241,7 +237,6 @@ class QuicStreamFactoryTestBase : public WithTaskEnvironment {
base::Unretained(this))),
quic_params_(context_.params()) {
FLAGS_quic_enable_http3_grease_randomness = false;
- FLAGS_quic_enable_chaos_protection = false;
quic_params_->headers_include_h2_stream_dependency =
client_headers_include_h2_stream_dependency;
context_.AdvanceTime(quic::QuicTime::Delta::FromSeconds(1));
@@ -260,7 +255,6 @@ class QuicStreamFactoryTestBase : public WithTaskEnvironment {
void SetIetfConnectionMigrationFlagsAndConnectionOptions() {
FLAGS_quic_reloadable_flag_quic_connection_migration_use_new_cid_v2 = true;
- quic_params_->connection_options.push_back(quic::kRVCM);
}
void InitializeConnectionMigrationV2Test(
@@ -1330,7 +1324,7 @@ TEST_P(QuicStreamFactoryTest, CachedInitialRttWithNetworkIsolationKey) {
for (const auto& network_isolation_key :
{kNetworkIsolationKey1, kNetworkIsolationKey2, NetworkIsolationKey()}) {
- SCOPED_TRACE(network_isolation_key.ToString());
+ SCOPED_TRACE(network_isolation_key.ToDebugString());
ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
@@ -6749,8 +6743,9 @@ TEST_P(QuicStreamFactoryTest, MigrateBackToDefaultPostMigrationOnWriteError) {
// This test verifies that the connection will not attempt connection migration
// (send connectivity probes on alternate path) when path degrading is detected
// and handshake is not confirmed.
+// TODO(crbug.com/1347664): This test is failing on various platforms.
TEST_P(QuicStreamFactoryTest,
- NoMigrationOnPathDegradingBeforeHandshakeConfirmed) {
+ DISABLED_NoMigrationOnPathDegradingBeforeHandshakeConfirmed) {
InitializeConnectionMigrationV2Test(
{kDefaultNetworkForTests, kNewNetworkForTests});
@@ -6802,13 +6797,16 @@ TEST_P(QuicStreamFactoryTest,
// This test verifies that if a connection is closed with
// QUIC_NETWORK_IDLE_TIMEOUT before handshake is completed and there is no
// alternate network, no new connection will be created.
-TEST_P(QuicStreamFactoryTest, NoAlternateNetworkBeforeHandshakeOnIdleTimeout) {
+// TODO(crbug.com/1347664): This test is failing on various platforms.
+TEST_P(QuicStreamFactoryTest,
+ DISABLED_NoAlternateNetworkBeforeHandshakeOnIdleTimeout) {
TestNoAlternateNetworkBeforeHandshake(quic::QUIC_NETWORK_IDLE_TIMEOUT);
}
// This test verifies that if a connection is closed with QUIC_HANDSHAKE_TIMEOUT
// and there is no alternate network, no new connection will be created.
-TEST_P(QuicStreamFactoryTest, NoAlternateNetworkOnHandshakeTimeout) {
+// TODO(crbug.com/1347664): This test is failing on various platforms.
+TEST_P(QuicStreamFactoryTest, DISABLED_NoAlternateNetworkOnHandshakeTimeout) {
TestNoAlternateNetworkBeforeHandshake(quic::QUIC_HANDSHAKE_TIMEOUT);
}
@@ -6880,12 +6878,15 @@ void QuicStreamFactoryTestBase::TestNoAlternateNetworkBeforeHandshake(
EXPECT_TRUE(socket_data.AllWriteDataConsumed());
}
-TEST_P(QuicStreamFactoryTest, NewConnectionBeforeHandshakeAfterIdleTimeout) {
+// TODO(crbug.com/1347664): This test is failing on various platforms.
+TEST_P(QuicStreamFactoryTest,
+ DISABLED_NewConnectionBeforeHandshakeAfterIdleTimeout) {
TestNewConnectionOnAlternateNetworkBeforeHandshake(
quic::QUIC_NETWORK_IDLE_TIMEOUT);
}
-TEST_P(QuicStreamFactoryTest, NewConnectionAfterHandshakeTimeout) {
+// TODO(crbug.com/1347664): This test is failing on various platforms.
+TEST_P(QuicStreamFactoryTest, DISABLED_NewConnectionAfterHandshakeTimeout) {
TestNewConnectionOnAlternateNetworkBeforeHandshake(
quic::QUIC_HANDSHAKE_TIMEOUT);
}
@@ -7142,8 +7143,9 @@ TEST_P(QuicStreamFactoryTest, MigrationOnWriteErrorBeforeHandshakeConfirmed) {
// Test that if the original connection is closed with QUIC_PACKET_WRITE_ERROR
// before handshake is confirmed and new connection before handshake is turned
// on, a new connection will be retried on the alternate network.
+// TODO(crbug.com/1347664): This test is failing on various platforms.
TEST_P(QuicStreamFactoryTest,
- RetryConnectionOnWriteErrorBeforeHandshakeConfirmed) {
+ DISABLED_RetryConnectionOnWriteErrorBeforeHandshakeConfirmed) {
quic_params_->retry_on_alternate_network_before_handshake = true;
InitializeConnectionMigrationV2Test(
{kDefaultNetworkForTests, kNewNetworkForTests});
@@ -8325,7 +8327,9 @@ TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncAsync) {
// Verifies that a connection is closed when connection migration is triggered
// on network being disconnected and the handshake is not confirmed.
-TEST_P(QuicStreamFactoryTest, NoMigrationBeforeHandshakeOnNetworkDisconnected) {
+// TODO(crbug.com/1347664): This test is failing on various platforms.
+TEST_P(QuicStreamFactoryTest,
+ DISABLED_NoMigrationBeforeHandshakeOnNetworkDisconnected) {
if (!version_.UsesHttp3())
return;
InitializeConnectionMigrationV2Test(
@@ -10928,6 +10932,13 @@ TEST_P(QuicStreamFactoryTest, ServerMigration) {
quic::test::TestConnectionId(12345678);
MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
+ NetErrorDetails details;
+ EXPECT_FALSE(details.quic_connection_migration_attempted);
+ EXPECT_FALSE(details.quic_connection_migration_successful);
+ session->PopulateNetErrorDetails(&details);
+ EXPECT_FALSE(details.quic_connection_migration_attempted);
+ EXPECT_FALSE(details.quic_connection_migration_successful);
+
// Send GET request on stream.
HttpResponseInfo response;
HttpRequestHeaders request_headers;
@@ -10986,7 +10997,7 @@ TEST_P(QuicStreamFactoryTest, ServerMigration) {
const uint8_t kTestIpAddress[] = {1, 2, 3, 4};
const uint16_t kTestPort = 123;
- session->Migrate(NetworkChangeNotifier::kInvalidNetworkHandle,
+ session->Migrate(handles::kInvalidNetworkHandle,
IPEndPoint(IPAddress(kTestIpAddress), kTestPort), true);
session->GetDefaultSocket()->GetPeerAddress(&ip);
@@ -10998,6 +11009,10 @@ TEST_P(QuicStreamFactoryTest, ServerMigration) {
EXPECT_TRUE(HasActiveSession(scheme_host_port_));
EXPECT_EQ(1u, session->GetNumActiveStreams());
+ session->PopulateNetErrorDetails(&details);
+ EXPECT_TRUE(details.quic_connection_migration_attempted);
+ EXPECT_TRUE(details.quic_connection_migration_successful);
+
// Run the message loop so that data queued in the new socket is read by the
// packet reader.
base::RunLoop().RunUntilIdle();
@@ -11015,6 +11030,124 @@ TEST_P(QuicStreamFactoryTest, ServerMigration) {
EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
}
+TEST_P(QuicStreamFactoryTest, ServerMigrationNonMigratableStream) {
+ quic_params_->allow_server_migration = true;
+ SetIetfConnectionMigrationFlagsAndConnectionOptions();
+ Initialize();
+
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ client_maker_.set_save_packet_frames(true);
+
+ int packet_num = 1;
+ MockQuicData socket_data(version_);
+ socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
+ if (VersionUsesHttp3(version_.transport_version)) {
+ socket_data.AddWrite(SYNCHRONOUS,
+ ConstructInitialSettingsPacket(packet_num++));
+ }
+ socket_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructGetRequestPacket(packet_num++,
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ true, true));
+ if (VersionUsesHttp3(version_.transport_version)) {
+ socket_data.AddWrite(
+ SYNCHRONOUS, client_maker_.MakeDataPacket(
+ packet_num++, GetQpackDecoderStreamId(), true, false,
+ StreamCancellationQpackDecoderInstruction(0)));
+ }
+ socket_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientRstPacket(packet_num++, quic::QUIC_STREAM_CANCELLED));
+ socket_data.AddSocketDataToFactory(socket_factory_.get());
+
+ // Create request and QuicHttpStream.
+ QuicStreamRequest request(factory_.get());
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
+ SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
+ /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
+ /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, callback_.WaitForResult());
+ std::unique_ptr<HttpStream> stream = CreateStream(&request);
+ EXPECT_TRUE(stream.get());
+
+ // Cause QUIC stream to be created.
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("https://www.example.org/");
+ request_info.traffic_annotation =
+ MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+ stream->RegisterRequest(&request_info);
+ EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
+ CompletionOnceCallback()));
+
+ // Ensure that session is alive and active.
+ QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(scheme_host_port_));
+ quic::QuicConnectionId cid_on_new_path =
+ quic::test::TestConnectionId(12345678);
+ MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
+
+ // Disable connection migration on the request streams.
+ QuicChromiumClientStream* chrome_stream =
+ static_cast<QuicChromiumClientStream*>(
+ quic::test::QuicSessionPeer::GetStream(
+ session, GetNthClientInitiatedBidirectionalStreamId(0)));
+ EXPECT_TRUE(chrome_stream);
+ chrome_stream->DisableConnectionMigrationToCellularNetwork();
+
+ NetErrorDetails details;
+ EXPECT_FALSE(details.quic_connection_migration_attempted);
+ EXPECT_FALSE(details.quic_connection_migration_successful);
+ session->PopulateNetErrorDetails(&details);
+ EXPECT_FALSE(details.quic_connection_migration_attempted);
+ EXPECT_FALSE(details.quic_connection_migration_successful);
+
+ // Send GET request on stream.
+ HttpResponseInfo response;
+ HttpRequestHeaders request_headers;
+ EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
+ callback_.callback()));
+
+ // The specific network isn't important, we just want something !=
+ // handles::kInvalidNetworkHandle to specify a non-default network.
+ constexpr handles::NetworkHandle kNonDefaultNetwork = 1;
+ constexpr uint8_t kTestIpAddress[] = {1, 2, 3, 4};
+ constexpr uint16_t kTestPort = 123;
+ session->Migrate(kNonDefaultNetwork,
+ IPEndPoint(IPAddress(kTestIpAddress), kTestPort), true);
+
+ // The session should exist but no longer be active since its only stream has
+ // been reset.
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_FALSE(HasActiveSession(scheme_host_port_));
+
+ session->PopulateNetErrorDetails(&details);
+ EXPECT_TRUE(details.quic_connection_migration_attempted);
+ EXPECT_FALSE(details.quic_connection_migration_successful);
+
+ // Run the message loop so that data queued due to the reset is read by the
+ // packet reader.
+ base::RunLoop().RunUntilIdle();
+
+ // Verify that the request failed since connection the stream couldn't be
+ // migrated.
+ EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
+ stream->ReadResponseHeaders(callback_.callback()));
+ EXPECT_EQ(nullptr, response.headers);
+
+ stream.reset();
+
+ EXPECT_TRUE(socket_data.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data.AllWriteDataConsumed());
+}
+
TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv4) {
// Add alternate IPv4 server address to config.
IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
@@ -11290,14 +11423,14 @@ TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
Initialize();
std::vector<string> cannoncial_suffixes;
- cannoncial_suffixes.push_back(string(".c.youtube.com"));
- cannoncial_suffixes.push_back(string(".googlevideo.com"));
+ cannoncial_suffixes.emplace_back(".c.youtube.com");
+ cannoncial_suffixes.emplace_back(".googlevideo.com");
- for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
+ for (const auto& cannoncial_suffix : cannoncial_suffixes) {
string r1_host_name("r1");
string r2_host_name("r2");
- r1_host_name.append(cannoncial_suffixes[i]);
- r2_host_name.append(cannoncial_suffixes[i]);
+ r1_host_name.append(cannoncial_suffix);
+ r2_host_name.append(cannoncial_suffix);
url::SchemeHostPort scheme_host_port1(url::kHttpsScheme, r1_host_name, 80);
// Need to hold onto this through the test, to keep the
@@ -11330,14 +11463,14 @@ TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
Initialize();
std::vector<string> cannoncial_suffixes;
- cannoncial_suffixes.push_back(string(".c.youtube.com"));
- cannoncial_suffixes.push_back(string(".googlevideo.com"));
+ cannoncial_suffixes.emplace_back(".c.youtube.com");
+ cannoncial_suffixes.emplace_back(".googlevideo.com");
- for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
+ for (const auto& cannoncial_suffix : cannoncial_suffixes) {
string r3_host_name("r3");
string r4_host_name("r4");
- r3_host_name.append(cannoncial_suffixes[i]);
- r4_host_name.append(cannoncial_suffixes[i]);
+ r3_host_name.append(cannoncial_suffix);
+ r4_host_name.append(cannoncial_suffix);
url::SchemeHostPort scheme_host_port1(url::kHttpsScheme, r3_host_name, 80);
// Need to hold onto this through the test, to keep the
@@ -11585,7 +11718,9 @@ TEST_P(QuicStreamFactoryTest, CryptoConfigCache) {
// With different NetworkIsolationKeys enabled for HttpServerProperties, there
// should only be one global CryptoCache per NetworkIsolationKey.
-TEST_P(QuicStreamFactoryTest, CryptoConfigCacheWithNetworkIsolationKey) {
+// TODO(https://crbug.com/1335453): The test is flaky.
+TEST_P(QuicStreamFactoryTest,
+ DISABLED_CryptoConfigCacheWithNetworkIsolationKey) {
const char kUserAgentId1[] = "spoon";
const char kUserAgentId2[] = "fork";
const char kUserAgentId3[] = "another spoon";
@@ -11695,7 +11830,7 @@ TEST_P(QuicStreamFactoryTest, CryptoConfigCacheMRUWithNetworkIsolationKey) {
std::vector<NetworkIsolationKey> network_isolation_keys;
for (int i = 0; i < kNumSessionsToMake; ++i) {
SchemefulSite site(GURL(base::StringPrintf("https://foo%i.test/", i)));
- network_isolation_keys.push_back(NetworkIsolationKey(site, site));
+ network_isolation_keys.emplace_back(site, site);
std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle =
QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
@@ -11764,7 +11899,7 @@ TEST_P(QuicStreamFactoryTest,
std::vector<NetworkIsolationKey> network_isolation_keys;
for (int i = 0; i < kNumSessionsToMake; ++i) {
SchemefulSite site(GURL(base::StringPrintf("https://foo%i.test/", i)));
- network_isolation_keys.push_back(NetworkIsolationKey(site, site));
+ network_isolation_keys.emplace_back(site, site);
}
const quic::QuicServerId kQuicServerId(
@@ -12330,9 +12465,8 @@ class QuicStreamFactoryWithDestinationTest
}
void AddHangingSocketData() {
- std::unique_ptr<SequencedSocketData> sequenced_socket_data(
- new SequencedSocketData(base::make_span(&hanging_read_, 1),
- base::span<MockWrite>()));
+ auto sequenced_socket_data = std::make_unique<SequencedSocketData>(
+ base::make_span(&hanging_read_, 1), base::span<MockWrite>());
socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
}
@@ -12792,6 +12926,8 @@ TEST_P(QuicStreamFactoryTest, ConfigConnectionOptions) {
Initialize();
+ // RVCM will be default enabled as a connection option.
+ quic_params_->connection_options.push_back(quic::kRVCM);
const quic::QuicConfig* config =
QuicStreamFactoryPeer::GetConfig(factory_.get());
EXPECT_EQ(quic_params_->connection_options, config->SendConnectionOptions());
@@ -13193,9 +13329,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionSync) {
// Set up an address in stale resolver cache.
host_resolver_->set_synchronous_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13290,9 +13424,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13326,8 +13458,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
- EXPECT_EQ(session->peer_address().host().ToString(),
- kCachedIPAddress.ToString());
+ EXPECT_EQ(session->peer_address().host().ToString(), kCachedIPAddress);
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -13345,9 +13476,7 @@ TEST_P(QuicStreamFactoryTest,
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13392,8 +13521,7 @@ TEST_P(QuicStreamFactoryTest,
QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
- EXPECT_EQ(session->peer_address().host().ToString(),
- kCachedIPAddress.ToString());
+ EXPECT_EQ(session->peer_address().host().ToString(), kCachedIPAddress);
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -13411,9 +13539,7 @@ TEST_P(QuicStreamFactoryTest,
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13454,8 +13580,7 @@ TEST_P(QuicStreamFactoryTest,
EXPECT_TRUE(stream.get());
QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
- EXPECT_EQ(session->peer_address().host().ToString(),
- kCachedIPAddress.ToString());
+ EXPECT_EQ(session->peer_address().host().ToString(), kCachedIPAddress);
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -13473,9 +13598,7 @@ TEST_P(QuicStreamFactoryTest,
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13550,9 +13673,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13635,9 +13756,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13767,9 +13886,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13828,9 +13945,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13872,9 +13987,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13937,9 +14050,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatchError) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -13990,9 +14101,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncErrorStaleAsync) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -14049,9 +14158,7 @@ TEST_P(QuicStreamFactoryTest,
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -14157,9 +14264,7 @@ TEST_P(QuicStreamFactoryTest, StaleNetworkFailedAfterHandshake) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -14232,9 +14337,7 @@ TEST_P(QuicStreamFactoryTest, StaleNetworkFailedBeforeHandshake) {
// Set up an address in stale resolver cache.
host_resolver_->set_ondemand_mode(true);
- host_resolver_->rules()->AddRule(
- scheme_host_port_.host(),
- AddressList::CreateFromIPAddress(kCachedIPAddress, 0));
+ host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
/*optional_parameters=*/absl::nullopt);
@@ -14750,8 +14853,11 @@ void QuicStreamFactoryTestBase::TestRequireDnsHttpsAlpn(
bool expect_success) {
quic_params_->supported_versions = {version_};
host_resolver_ = std::make_unique<MockCachingHostResolver>();
- host_resolver_->rules()->AddRule(scheme_host_port_.host(),
- std::move(endpoints));
+ host_resolver_->rules()->AddRule(
+ scheme_host_port_.host(),
+ MockHostResolverBase::RuleResolver::RuleResult(
+ std::move(endpoints),
+ /*aliases=*/std::set<std::string>{scheme_host_port_.host()}));
Initialize();
ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
@@ -14996,5 +15102,4 @@ TEST_P(QuicStreamFactoryDnsAliasPoolingTest, IPPooling) {
EXPECT_EQ(expected_dns_aliases2_, stream2->GetDnsAliases());
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_test_packet_maker.cc b/chromium/net/quic/quic_test_packet_maker.cc
index 374f14b4c8b..373c1f17bcb 100644
--- a/chromium/net/quic/quic_test_packet_maker.cc
+++ b/chromium/net/quic/quic_test_packet_maker.cc
@@ -20,8 +20,7 @@
#include "net/third_party/quiche/src/quiche/quic/test_tools/mock_random.h"
#include "net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h"
-namespace net {
-namespace test {
+namespace net::test {
namespace {
quic::QuicFrames CloneFrames(const quic::QuicFrames& frames) {
@@ -791,8 +790,8 @@ QuicTestPacketMaker::MakeRequestHeadersAndMultipleDataFramesPacket(
std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
spdy_headers_frame_length);
- for (size_t i = 0; i < data_writes.size(); ++i) {
- data += data_writes[i];
+ for (const auto& data_write : data_writes) {
+ data += data_write;
}
AddQuicStreamFrame(stream_id, fin, data);
@@ -1272,10 +1271,8 @@ std::string QuicTestPacketMaker::QpackEncodeHeaders(
qpack_encoder_.EncodeHeaderList(stream_id, headers, nullptr);
// Generate HEADERS frame header.
- std::unique_ptr<char[]> headers_frame_header;
- const size_t headers_frame_header_length =
- quic::HttpEncoder::SerializeHeadersFrameHeader(encoded_headers.size(),
- &headers_frame_header);
+ const std::string headers_frame_header =
+ quic::HttpEncoder::SerializeHeadersFrameHeader(encoded_headers.size());
// Possible add a PUSH stream type.
if (!quic::QuicUtils::IsBidirectionalStreamId(stream_id, version_) &&
@@ -1285,7 +1282,7 @@ std::string QuicTestPacketMaker::QpackEncodeHeaders(
}
// Add the HEADERS frame header.
- data += std::string(headers_frame_header.get(), headers_frame_header_length);
+ data += headers_frame_header;
// Add the HEADERS frame payload.
data += encoded_headers;
@@ -1315,9 +1312,9 @@ void QuicTestPacketMaker::InitializeHeader(uint64_t packet_number,
header_.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header_.retry_token_length_length =
- quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
- header_.length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header_.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
}
@@ -1664,10 +1661,7 @@ std::string QuicTestPacketMaker::GenerateHttp3SettingsData() {
quic::kDefaultMaximumBlockedStreams;
// Greased setting.
settings.values[0x40] = 20;
- std::unique_ptr<char[]> buffer;
- quic::QuicByteCount frame_length =
- quic::HttpEncoder::SerializeSettingsFrame(settings, &buffer);
- return std::string(buffer.get(), frame_length);
+ return quic::HttpEncoder::SerializeSettingsFrame(settings);
}
std::string QuicTestPacketMaker::GenerateHttp3PriorityData(
@@ -1678,17 +1672,11 @@ std::string QuicTestPacketMaker::GenerateHttp3PriorityData(
priority_update.prioritized_element_id = stream_id;
priority_update.priority_field_value =
base::StrCat({"u=", base::NumberToString(priority)});
- std::unique_ptr<char[]> buffer;
- quic::QuicByteCount frame_length =
- quic::HttpEncoder::SerializePriorityUpdateFrame(priority_update, &buffer);
- return std::string(buffer.get(), frame_length);
+ return quic::HttpEncoder::SerializePriorityUpdateFrame(priority_update);
}
std::string QuicTestPacketMaker::GenerateHttp3GreaseData() {
- std::unique_ptr<char[]> buffer;
- quic::QuicByteCount frame_length =
- quic::HttpEncoder::SerializeGreasingFrame(&buffer);
- return std::string(buffer.get(), frame_length);
+ return quic::HttpEncoder::SerializeGreasingFrame();
}
void QuicTestPacketMaker::MaybeAddHttp3SettingsFrames() {
@@ -1714,5 +1702,4 @@ void QuicTestPacketMaker::MaybeAddHttp3SettingsFrames() {
AddQuicStreamFrame(stream_id, false, data);
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/quic_test_packet_maker.h b/chromium/net/quic/quic_test_packet_maker.h
index f015f9ee5bd..5f58a37d7d8 100644
--- a/chromium/net/quic/quic_test_packet_maker.h
+++ b/chromium/net/quic/quic_test_packet_maker.h
@@ -23,14 +23,12 @@
#include "net/third_party/quiche/src/quiche/quic/core/quic_stream_frame_data_producer.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
#include "net/third_party/quiche/src/quiche/quic/test_tools/mock_random.h"
-#include "net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h"
#include "net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_test_utils.h"
#include "net/third_party/quiche/src/quiche/quic/test_tools/simple_data_producer.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h"
-namespace net {
-namespace test {
+namespace net::test {
class QuicTestPacketMaker {
public:
@@ -598,7 +596,7 @@ class QuicTestPacketMaker {
std::string host_;
spdy::SpdyFramer spdy_request_framer_;
spdy::SpdyFramer spdy_response_framer_;
- quic::test::NoopDecoderStreamErrorDelegate decoder_stream_error_delegate_;
+ quic::NoopDecoderStreamErrorDelegate decoder_stream_error_delegate_;
quic::test::NoopQpackStreamSenderDelegate encoder_stream_sender_delegate_;
quic::QpackEncoder qpack_encoder_;
quic::test::MockRandom random_generator_;
@@ -623,7 +621,6 @@ class QuicTestPacketMaker {
std::unique_ptr<quic::test::SimpleDataProducer> data_producer_;
};
-} // namespace test
-} // namespace net
+} // namespace net::test
#endif // NET_QUIC_QUIC_TEST_PACKET_MAKER_H_
diff --git a/chromium/net/quic/test_quic_crypto_client_config_handle.h b/chromium/net/quic/test_quic_crypto_client_config_handle.h
index ded55fb12c6..a4145663d81 100644
--- a/chromium/net/quic/test_quic_crypto_client_config_handle.h
+++ b/chromium/net/quic/test_quic_crypto_client_config_handle.h
@@ -18,7 +18,8 @@ namespace net {
// QuicCryptoClientConfig and returns it as needed. Does nothing on destruction.
class TestQuicCryptoClientConfigHandle : public QuicCryptoClientConfigHandle {
public:
- TestQuicCryptoClientConfigHandle(quic::QuicCryptoClientConfig* crypto_config);
+ explicit TestQuicCryptoClientConfigHandle(
+ quic::QuicCryptoClientConfig* crypto_config);
TestQuicCryptoClientConfigHandle& operator=(
const TestQuicCryptoClientConfigHandle&) = delete;
diff --git a/chromium/net/quic/test_task_runner.cc b/chromium/net/quic/test_task_runner.cc
index a03df2df2d7..b35e7b7184f 100644
--- a/chromium/net/quic/test_task_runner.cc
+++ b/chromium/net/quic/test_task_runner.cc
@@ -11,8 +11,7 @@
#include "net/third_party/quiche/src/quiche/quic/test_tools/mock_clock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
namespace {
@@ -26,14 +25,14 @@ base::TimeTicks NowInTicks(const quic::MockClock& clock) {
TestTaskRunner::TestTaskRunner(quic::MockClock* clock) : clock_(clock) {}
-TestTaskRunner::~TestTaskRunner() {}
+TestTaskRunner::~TestTaskRunner() = default;
bool TestTaskRunner::PostDelayedTask(const base::Location& from_here,
base::OnceClosure task,
base::TimeDelta delay) {
EXPECT_GE(delay, base::TimeDelta());
- tasks_.push_back(PostedTask(from_here, std::move(task), NowInTicks(*clock_),
- delay, base::TestPendingTask::NESTABLE));
+ tasks_.emplace_back(from_here, std::move(task), NowInTicks(*clock_), delay,
+ base::TestPendingTask::NESTABLE);
return true;
}
@@ -107,5 +106,4 @@ std::vector<PostedTask>::iterator TestTaskRunner::FindNextTask() {
ShouldRunBeforeLessThan());
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/quic/test_task_runner.h b/chromium/net/quic/test_task_runner.h
index 63af4797292..291423e023f 100644
--- a/chromium/net/quic/test_task_runner.h
+++ b/chromium/net/quic/test_task_runner.h
@@ -19,9 +19,7 @@
namespace quic {
class MockClock;
} // namespace quic
-namespace net {
-
-namespace test {
+namespace net::test {
typedef base::TestPendingTask PostedTask;
@@ -71,8 +69,6 @@ class TestTaskRunner : public base::SequencedTaskRunner {
std::vector<PostedTask> tasks_;
};
-} // namespace test
-
-} // namespace net
+} // namespace net::test
#endif // NET_QUIC_TEST_TASK_RUNNER_H_
diff --git a/chromium/net/reporting/reporting_cache_impl.cc b/chromium/net/reporting/reporting_cache_impl.cc
index f3405d3baea..c9765152f14 100644
--- a/chromium/net/reporting/reporting_cache_impl.cc
+++ b/chromium/net/reporting/reporting_cache_impl.cc
@@ -389,8 +389,8 @@ void ReportingCacheImpl::OnParsedHeader(
// Consistency check: the new client should have the same NIK and origin as
// all groups parsed from this header.
- DCHECK_EQ(new_group.group_key.network_isolation_key,
- new_client.network_isolation_key);
+ DCHECK(new_group.group_key.network_isolation_key ==
+ new_client.network_isolation_key);
DCHECK_EQ(new_group.group_key.origin, new_client.origin);
for (const auto& parsed_endpoint_info : parsed_endpoint_group.endpoints) {
@@ -867,8 +867,8 @@ void ReportingCacheImpl::SetV1EndpointForTesting(
DCHECK(!reporting_source.is_empty());
DCHECK(group_key.IsDocumentEndpoint());
DCHECK_EQ(reporting_source, group_key.reporting_source.value());
- DCHECK_EQ(group_key.network_isolation_key,
- isolation_info.network_isolation_key());
+ DCHECK(group_key.network_isolation_key ==
+ isolation_info.network_isolation_key());
ReportingEndpoint::EndpointInfo info;
info.url = url;
diff --git a/chromium/net/reporting/reporting_cache_impl.h b/chromium/net/reporting/reporting_cache_impl.h
index 7e14df6631d..4ffac185bb5 100644
--- a/chromium/net/reporting/reporting_cache_impl.h
+++ b/chromium/net/reporting/reporting_cache_impl.h
@@ -35,7 +35,7 @@ namespace net {
class ReportingCacheImpl : public ReportingCache {
public:
- ReportingCacheImpl(ReportingContext* context);
+ explicit ReportingCacheImpl(ReportingContext* context);
ReportingCacheImpl(const ReportingCacheImpl&) = delete;
ReportingCacheImpl& operator=(const ReportingCacheImpl&) = delete;
diff --git a/chromium/net/reporting/reporting_delegate.cc b/chromium/net/reporting/reporting_delegate.cc
index e246d443f20..e2f676d4b6c 100644
--- a/chromium/net/reporting/reporting_delegate.cc
+++ b/chromium/net/reporting/reporting_delegate.cc
@@ -14,7 +14,7 @@ namespace {
class ReportingDelegateImpl : public ReportingDelegate {
public:
- ReportingDelegateImpl(URLRequestContext* request_context)
+ explicit ReportingDelegateImpl(URLRequestContext* request_context)
: request_context_(request_context) {
DCHECK(request_context);
}
diff --git a/chromium/net/reporting/reporting_delivery_agent.cc b/chromium/net/reporting/reporting_delivery_agent.cc
index edc9f2a1104..149681a8949 100644
--- a/chromium/net/reporting/reporting_delivery_agent.cc
+++ b/chromium/net/reporting/reporting_delivery_agent.cc
@@ -135,13 +135,12 @@ class Delivery {
const ReportList::const_iterator reports_begin,
const ReportList::const_iterator reports_end) {
DCHECK(reports_begin != reports_end);
- DCHECK_EQ(endpoint.group_key.network_isolation_key,
- network_isolation_key());
+ DCHECK(endpoint.group_key.network_isolation_key == network_isolation_key());
DCHECK(IsSubdomainOf(target_.origin.host() /* subdomain */,
endpoint.group_key.origin.host() /* superdomain */));
for (auto it = reports_begin; it != reports_end; ++it) {
DCHECK_EQ((*reports_begin)->GetGroupKey(), (*it)->GetGroupKey());
- DCHECK_EQ((*it)->network_isolation_key, network_isolation_key());
+ DCHECK((*it)->network_isolation_key == network_isolation_key());
DCHECK_EQ(url::Origin::Create((*it)->url), target_.origin);
DCHECK_EQ((*it)->group, endpoint.group_key.group_name);
// Report origin is equal to, or a subdomain of, the endpoint
diff --git a/chromium/net/reporting/reporting_delivery_agent_unittest.cc b/chromium/net/reporting/reporting_delivery_agent_unittest.cc
index 5d38ffe241f..5042b35284f 100644
--- a/chromium/net/reporting/reporting_delivery_agent_unittest.cc
+++ b/chromium/net/reporting/reporting_delivery_agent_unittest.cc
@@ -160,15 +160,16 @@ TEST_F(ReportingDeliveryAgentTest, SuccessfulImmediateUpload) {
ASSERT_TRUE(value->is_list());
ASSERT_EQ(1u, value->GetList().size());
- base::Value& report = value->GetList()[0];
+ const base::Value& report = value->GetList()[0];
ASSERT_TRUE(report.is_dict());
- EXPECT_EQ(5u, report.GetDict().size());
-
- ExpectDictIntegerValue(0, report, "age");
- ExpectDictStringValue(kType_, report, "type");
- ExpectDictStringValue(kUrl_.spec(), report, "url");
- ExpectDictStringValue(kUserAgent_, report, "user_agent");
- const base::Value::Dict* body = report.GetDict().FindDict("body");
+ const base::Value::Dict& report_dict = report.GetDict();
+ EXPECT_EQ(5u, report_dict.size());
+
+ ExpectDictIntegerValue(0, report_dict, "age");
+ ExpectDictStringValue(kType_, report_dict, "type");
+ ExpectDictStringValue(kUrl_.spec(), report_dict, "url");
+ ExpectDictStringValue(kUserAgent_, report_dict, "user_agent");
+ const base::Value::Dict* body = report_dict.FindDict("body");
EXPECT_EQ("value", *body->FindString("key"));
}
pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
@@ -238,12 +239,13 @@ TEST_F(ReportingDeliveryAgentTest, SuccessfulImmediateUploadDocumentReport) {
const base::Value& report = value->GetList()[0];
ASSERT_TRUE(report.is_dict());
+ const base::Value::Dict& report_dict = report.GetDict();
- ExpectDictIntegerValue(0, report, "age");
- ExpectDictStringValue(kType_, report, "type");
- ExpectDictStringValue(kUrl_.spec(), report, "url");
- ExpectDictStringValue(kUserAgent_, report, "user_agent");
- const base::Value::Dict* body = report.GetDict().FindDict("body");
+ ExpectDictIntegerValue(0, report_dict, "age");
+ ExpectDictStringValue(kType_, report_dict, "type");
+ ExpectDictStringValue(kUrl_.spec(), report_dict, "url");
+ ExpectDictStringValue(kUserAgent_, report_dict, "user_agent");
+ const base::Value::Dict* body = report_dict.FindDict("body");
EXPECT_EQ("value", *body->FindString("key"));
}
pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
@@ -314,15 +316,16 @@ TEST_F(ReportingDeliveryAgentTest, SuccessfulImmediateSubdomainUpload) {
ASSERT_TRUE(value->is_list());
ASSERT_EQ(1u, value->GetList().size());
- base::Value& report = value->GetList()[0];
+ const base::Value& report = value->GetList()[0];
ASSERT_TRUE(report.is_dict());
- EXPECT_EQ(5u, report.GetDict().size());
-
- ExpectDictIntegerValue(0, report, "age");
- ExpectDictStringValue(kType_, report, "type");
- ExpectDictStringValue(kSubdomainUrl_.spec(), report, "url");
- ExpectDictStringValue(kUserAgent_, report, "user_agent");
- const base::Value::Dict* body = report.GetDict().FindDict("body");
+ const base::Value::Dict& report_dict = report.GetDict();
+ EXPECT_EQ(5u, report_dict.size());
+
+ ExpectDictIntegerValue(0, report_dict, "age");
+ ExpectDictStringValue(kType_, report_dict, "type");
+ ExpectDictStringValue(kSubdomainUrl_.spec(), report_dict, "url");
+ ExpectDictStringValue(kUserAgent_, report_dict, "user_agent");
+ const base::Value::Dict* body = report_dict.FindDict("body");
EXPECT_EQ("value", *body->FindString("key"));
}
pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
@@ -393,15 +396,16 @@ TEST_F(ReportingDeliveryAgentTest, SuccessfulDelayedUpload) {
ASSERT_TRUE(value->is_list());
ASSERT_EQ(1u, value->GetList().size());
- base::Value& report = value->GetList()[0];
+ const base::Value& report = value->GetList()[0];
ASSERT_TRUE(report.is_dict());
- EXPECT_EQ(5u, report.GetDict().size());
-
- ExpectDictIntegerValue(0, report, "age");
- ExpectDictStringValue(kType_, report, "type");
- ExpectDictStringValue(kUrl_.spec(), report, "url");
- ExpectDictStringValue(kUserAgent_, report, "user_agent");
- const base::Value::Dict* body = report.GetDict().FindDict("body");
+ const base::Value::Dict& report_dict = report.GetDict();
+ EXPECT_EQ(5u, report_dict.size());
+
+ ExpectDictIntegerValue(0, report_dict, "age");
+ ExpectDictStringValue(kType_, report_dict, "type");
+ ExpectDictStringValue(kUrl_.spec(), report_dict, "url");
+ ExpectDictStringValue(kUserAgent_, report_dict, "user_agent");
+ const base::Value::Dict* body = report_dict.FindDict("body");
EXPECT_EQ("value", *body->FindString("key"));
}
pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
@@ -559,7 +563,16 @@ TEST_F(ReportingDeliveryAgentTest, ConcurrentRemove) {
EXPECT_TRUE(reports.empty());
}
-TEST_F(ReportingDeliveryAgentTest, ConcurrentRemoveDuringPermissionsCheck) {
+// Flaky on ChromeOS: https://crbug.com/1348434
+#if defined(CHROMEOS)
+#define MAYBE_ConcurrentRemoveDuringPermissionsCheck \
+ DISABLED_ConcurrentRemoveDuringPermissionsCheck
+#else
+#define MAYBE_ConcurrentRemoveDuringPermissionsCheck \
+ ConcurrentRemoveDuringPermissionsCheck
+#endif
+TEST_F(ReportingDeliveryAgentTest,
+ MAYBE_ConcurrentRemoveDuringPermissionsCheck) {
// Pause the permissions check, so that we can try to remove some reports
// while we're in the middle of verifying that we can upload them. (This is
// similar to the previous test, but removes the reports during a different
diff --git a/chromium/net/reporting/reporting_endpoint_manager.cc b/chromium/net/reporting/reporting_endpoint_manager.cc
index f3ad603e01b..12a2a549cfd 100644
--- a/chromium/net/reporting/reporting_endpoint_manager.cc
+++ b/chromium/net/reporting/reporting_endpoint_manager.cc
@@ -112,8 +112,7 @@ class ReportingEndpointManagerImpl : public ReportingEndpointManager {
int random_index = rand_callback_.Run(0, total_weight - 1);
int weight_so_far = 0;
- for (size_t i = 0; i < available_endpoints.size(); ++i) {
- const ReportingEndpoint& endpoint = available_endpoints[i];
+ for (const auto& endpoint : available_endpoints) {
weight_so_far += endpoint.info.weight;
if (random_index < weight_so_far) {
return endpoint;
diff --git a/chromium/net/reporting/reporting_garbage_collector.cc b/chromium/net/reporting/reporting_garbage_collector.cc
index 463f76ebcee..b7b3809de6a 100644
--- a/chromium/net/reporting/reporting_garbage_collector.cc
+++ b/chromium/net/reporting/reporting_garbage_collector.cc
@@ -26,7 +26,7 @@ namespace {
class ReportingGarbageCollectorImpl : public ReportingGarbageCollector,
public ReportingCacheObserver {
public:
- ReportingGarbageCollectorImpl(ReportingContext* context)
+ explicit ReportingGarbageCollectorImpl(ReportingContext* context)
: context_(context), timer_(std::make_unique<base::OneShotTimer>()) {
context_->AddCacheObserver(this);
}
diff --git a/chromium/net/reporting/reporting_network_change_observer.cc b/chromium/net/reporting/reporting_network_change_observer.cc
index adbbc291713..f77dee50e6f 100644
--- a/chromium/net/reporting/reporting_network_change_observer.cc
+++ b/chromium/net/reporting/reporting_network_change_observer.cc
@@ -19,7 +19,7 @@ class ReportingNetworkChangeObserverImpl
: public ReportingNetworkChangeObserver,
public NetworkChangeNotifier::NetworkChangeObserver {
public:
- ReportingNetworkChangeObserverImpl(ReportingContext* context)
+ explicit ReportingNetworkChangeObserverImpl(ReportingContext* context)
: context_(context) {
NetworkChangeNotifier::AddNetworkChangeObserver(this);
}
diff --git a/chromium/net/reporting/reporting_service.h b/chromium/net/reporting/reporting_service.h
index de9fe0cd824..a473073a5bb 100644
--- a/chromium/net/reporting/reporting_service.h
+++ b/chromium/net/reporting/reporting_service.h
@@ -139,7 +139,7 @@ class NET_EXPORT ReportingService {
virtual ReportingContext* GetContextForTesting() const = 0;
protected:
- ReportingService() {}
+ ReportingService() = default;
};
} // namespace net
diff --git a/chromium/net/reporting/reporting_service_unittest.cc b/chromium/net/reporting/reporting_service_unittest.cc
index d7c85e2e2c5..4307df3fbfa 100644
--- a/chromium/net/reporting/reporting_service_unittest.cc
+++ b/chromium/net/reporting/reporting_service_unittest.cc
@@ -325,7 +325,12 @@ TEST_P(ReportingServiceTest, SendReportsAndRemoveSourceWithPendingReports) {
context()->cache()->GetExpiredSources().contains(kReportingSource_));
}
-TEST_P(ReportingServiceTest, ProcessReportingEndpointsHeaderPathAbsolute) {
+#if BUILDFLAG(IS_CHROMEOS)
+#define MAYBE_ProcessReportingEndpointsHeaderPathAbsolute DISABLED_ProcessReportingEndpointsHeaderPathAbsolute
+#else
+#define MAYBE_ProcessReportingEndpointsHeaderPathAbsolute ProcessReportingEndpointsHeaderPathAbsolute
+#endif
+TEST_P(ReportingServiceTest, MAYBE_ProcessReportingEndpointsHeaderPathAbsolute) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(net::features::kDocumentReporting);
auto parsed_header = ParseReportingEndpoints(kGroup_ + "=\"/path-absolute\"");
diff --git a/chromium/net/reporting/reporting_test_util.cc b/chromium/net/reporting/reporting_test_util.cc
index 08cf719231c..f39c2820f46 100644
--- a/chromium/net/reporting/reporting_test_util.cc
+++ b/chromium/net/reporting/reporting_test_util.cc
@@ -178,12 +178,13 @@ TestReportingContext::TestReportingContext(
TestReportingRandIntCallback(),
std::make_unique<TestReportingUploader>(),
std::make_unique<TestReportingDelegate>(),
- store),
- delivery_timer_(new base::MockOneShotTimer()),
- garbage_collection_timer_(new base::MockOneShotTimer()) {
- garbage_collector()->SetTimerForTesting(
- base::WrapUnique(garbage_collection_timer_.get()));
- delivery_agent()->SetTimerForTesting(base::WrapUnique(delivery_timer_.get()));
+ store) {
+ auto delivery_timer = std::make_unique<base::MockOneShotTimer>();
+ delivery_timer_ = delivery_timer.get();
+ auto garbage_collection_timer = std::make_unique<base::MockOneShotTimer>();
+ garbage_collection_timer_ = garbage_collection_timer.get();
+ garbage_collector()->SetTimerForTesting(std::move(garbage_collection_timer));
+ delivery_agent()->SetTimerForTesting(std::move(delivery_timer));
}
TestReportingContext::~TestReportingContext() {
diff --git a/chromium/net/reporting/reporting_uploader.cc b/chromium/net/reporting/reporting_uploader.cc
index 0f978deb858..3aa46ce7a8e 100644
--- a/chromium/net/reporting/reporting_uploader.cc
+++ b/chromium/net/reporting/reporting_uploader.cc
@@ -109,7 +109,8 @@ struct PendingUpload {
class ReportingUploaderImpl : public ReportingUploader, URLRequest::Delegate {
public:
- ReportingUploaderImpl(const URLRequestContext* context) : context_(context) {
+ explicit ReportingUploaderImpl(const URLRequestContext* context)
+ : context_(context) {
DCHECK(context_);
}
diff --git a/chromium/net/server/http_connection.cc b/chromium/net/server/http_connection.cc
index 180e0a4d9e0..b57e1a357fc 100644
--- a/chromium/net/server/http_connection.cc
+++ b/chromium/net/server/http_connection.cc
@@ -27,6 +27,7 @@ int HttpConnection::ReadIOBuffer::GetCapacity() const {
void HttpConnection::ReadIOBuffer::SetCapacity(int capacity) {
DCHECK_LE(GetSize(), capacity);
+ data_ = nullptr;
base_->SetCapacity(capacity);
data_ = base_->data();
}
@@ -81,6 +82,8 @@ void HttpConnection::ReadIOBuffer::DidConsume(int bytes) {
int new_capacity = GetCapacity() / kCapacityIncreaseFactor;
if (new_capacity < kMinimumBufSize)
new_capacity = kMinimumBufSize;
+ // this avoids the pointer to dangle until `SetCapacity` gets called.
+ data_ = nullptr;
// realloc() within GrowableIOBuffer::SetCapacity() could move data even
// when size is reduced. If unconsumed_size == 0, i.e. no data exists in
// the buffer, free internal buffer first to guarantee no data move.
@@ -129,6 +132,7 @@ void HttpConnection::QueuedWriteIOBuffer::DidConsume(int size) {
if (size < GetSizeToWrite()) {
data_ += size;
} else { // size == GetSizeToWrite(). Updates data_ to next pending data.
+ data_ = nullptr;
pending_data_.pop();
data_ =
IsEmpty() ? nullptr : const_cast<char*>(pending_data_.front()->data());
diff --git a/chromium/net/server/http_server.h b/chromium/net/server/http_server.h
index 30f1735d6ab..4aece408326 100644
--- a/chromium/net/server/http_server.h
+++ b/chromium/net/server/http_server.h
@@ -33,7 +33,7 @@ class HttpServer {
// destroy the HttpServer in any of these callbacks.
class Delegate {
public:
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
virtual void OnConnect(int connection_id) = 0;
virtual void OnHttpRequest(int connection_id,
diff --git a/chromium/net/server/http_server_unittest.cc b/chromium/net/server/http_server_unittest.cc
index a48b18a0436..3e1fdc6c9e1 100644
--- a/chromium/net/server/http_server_unittest.cc
+++ b/chromium/net/server/http_server_unittest.cc
@@ -181,8 +181,8 @@ class HttpServerTest : public TestWithTaskEnvironment,
HttpServerTest() = default;
void SetUp() override {
- std::unique_ptr<ServerSocket> server_socket(
- new TCPServerSocket(nullptr, NetLogSource()));
+ auto server_socket =
+ std::make_unique<TCPServerSocket>(nullptr, NetLogSource());
server_socket->ListenWithAddressAndPort("127.0.0.1", 0, 1);
server_ = std::make_unique<HttpServer>(std::move(server_socket), this);
ASSERT_THAT(server_->GetLocalAddress(&server_address_), IsOk());
@@ -948,6 +948,8 @@ class MockStreamSocket : public StreamSocket {
MockStreamSocket(const MockStreamSocket&) = delete;
MockStreamSocket& operator=(const MockStreamSocket&) = delete;
+ ~MockStreamSocket() override = default;
+
// StreamSocket
int Connect(CompletionOnceCallback callback) override {
return ERR_NOT_IMPLEMENTED;
@@ -1025,8 +1027,6 @@ class MockStreamSocket : public StreamSocket {
}
private:
- ~MockStreamSocket() override = default;
-
bool connected_ = true;
scoped_refptr<IOBuffer> read_buf_;
int read_buf_len_ = 0;
@@ -1036,17 +1036,18 @@ class MockStreamSocket : public StreamSocket {
};
TEST_F(HttpServerTest, RequestWithBodySplitAcrossPackets) {
- MockStreamSocket* socket = new MockStreamSocket();
- HandleAcceptResult(base::WrapUnique<StreamSocket>(socket));
+ auto socket = std::make_unique<MockStreamSocket>();
+ auto* socket_ptr = socket.get();
+ HandleAcceptResult(std::move(socket));
std::string body("body");
std::string request_text = base::StringPrintf(
"GET /test HTTP/1.1\r\n"
"SomeHeader: 1\r\n"
"Content-Length: %" PRIuS "\r\n\r\n%s",
body.length(), body.c_str());
- socket->DidRead(request_text.c_str(), request_text.length() - 2);
+ socket_ptr->DidRead(request_text.c_str(), request_text.length() - 2);
ASSERT_FALSE(HasRequest());
- socket->DidRead(request_text.c_str() + request_text.length() - 2, 2);
+ socket_ptr->DidRead(request_text.c_str() + request_text.length() - 2, 2);
ASSERT_TRUE(HasRequest());
ASSERT_EQ(body, WaitForRequest().info.data);
}
diff --git a/chromium/net/socket/client_socket_factory.cc b/chromium/net/socket/client_socket_factory.cc
index b4947b9f2d2..02d58f67c44 100644
--- a/chromium/net/socket/client_socket_factory.cc
+++ b/chromium/net/socket/client_socket_factory.cc
@@ -20,17 +20,16 @@ namespace {
class DefaultClientSocketFactory : public ClientSocketFactory {
public:
- DefaultClientSocketFactory() {}
+ DefaultClientSocketFactory() = default;
// Note: This code never runs, as the factory is defined as a Leaky singleton.
- ~DefaultClientSocketFactory() override {}
+ ~DefaultClientSocketFactory() override = default;
std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
NetLog* net_log,
const NetLogSource& source) override {
- return std::unique_ptr<DatagramClientSocket>(
- new UDPClientSocket(bind_type, net_log, source));
+ return std::make_unique<UDPClientSocket>(bind_type, net_log, source);
}
std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
diff --git a/chromium/net/socket/client_socket_factory.h b/chromium/net/socket/client_socket_factory.h
index b4fffce6060..1eb8214e89f 100644
--- a/chromium/net/socket/client_socket_factory.h
+++ b/chromium/net/socket/client_socket_factory.h
@@ -31,7 +31,7 @@ class NetworkQualityEstimator;
// testing code with mock socket implementations.
class NET_EXPORT ClientSocketFactory {
public:
- virtual ~ClientSocketFactory() {}
+ virtual ~ClientSocketFactory() = default;
// |source| is the NetLogSource for the entity trying to create the socket,
// if it has one.
diff --git a/chromium/net/socket/client_socket_pool.h b/chromium/net/socket/client_socket_pool.h
index f0e6f988c7f..d91478a45d7 100644
--- a/chromium/net/socket/client_socket_pool.h
+++ b/chromium/net/socket/client_socket_pool.h
@@ -43,7 +43,7 @@ class StreamSocket;
// socket pools to communicate with higher layer pools.
class NET_EXPORT HigherLayeredPool {
public:
- virtual ~HigherLayeredPool() {}
+ virtual ~HigherLayeredPool() = default;
// Instructs the HigherLayeredPool to close an idle connection. Return true if
// one was closed. Closing an idle connection will call into the lower layer
@@ -55,7 +55,7 @@ class NET_EXPORT HigherLayeredPool {
// socket pools to communicate with lower layer pools.
class NET_EXPORT LowerLayeredPool {
public:
- virtual ~LowerLayeredPool() {}
+ virtual ~LowerLayeredPool() = default;
// Returns true if a there is currently a request blocked on the per-pool
// (not per-host) max socket limit, either in this pool, or one that it is
@@ -329,6 +329,10 @@ class NET_EXPORT ClientSocketPool : public LowerLayeredPool {
virtual base::Value GetInfoAsValue(const std::string& name,
const std::string& type) const = 0;
+ // Returns whether a connected (idle or handed out) or connecting socket
+ // exists for the group. This method is not supported for WebSockets.
+ virtual bool HasActiveSocket(const GroupId& group_id) const = 0;
+
// Returns the maximum amount of time to wait before retrying a connect.
static const int kMaxConnectRetryIntervalMs = 250;
diff --git a/chromium/net/socket/client_socket_pool_base_unittest.cc b/chromium/net/socket/client_socket_pool_base_unittest.cc
index c5dded33dc0..b41b2daeeb1 100644
--- a/chromium/net/socket/client_socket_pool_base_unittest.cc
+++ b/chromium/net/socket/client_socket_pool_base_unittest.cc
@@ -579,8 +579,8 @@ class TestConnectJobFactory : public ConnectJobFactory {
namespace {
void MockClientSocketFactory::SignalJobs() {
- for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
- (*it)->Signal();
+ for (auto* waiting_job : waiting_jobs_) {
+ waiting_job->Signal();
}
waiting_jobs_.clear();
}
@@ -875,7 +875,7 @@ TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
for (const auto& privacy_mode : kPrivacyModes) {
SCOPED_TRACE(privacy_mode);
for (const auto& network_isolation_key : kNetworkIsolationKeys) {
- SCOPED_TRACE(network_isolation_key.ToString());
+ SCOPED_TRACE(network_isolation_key.ToDebugString());
for (const auto& secure_dns_policy : kSecureDnsPolicys) {
SCOPED_TRACE(static_cast<int>(secure_dns_policy));
@@ -1257,30 +1257,30 @@ TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
- ClientSocketHandle handle;
TestCompletionCallback callback;
- EXPECT_EQ(
- ERR_IO_PENDING,
- handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
- SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
- callback.callback(), ClientSocketPool::ProxyAuthCallback(),
- pool_.get(), NetLogWithSource()));
+ ClientSocketHandle stalled_handle;
+ EXPECT_EQ(ERR_IO_PENDING,
+ stalled_handle.Init(
+ TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
+ SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
+ callback.callback(), ClientSocketPool::ProxyAuthCallback(),
+ pool_.get(), NetLogWithSource()));
ClientSocketHandle handles[4];
- for (size_t i = 0; i < std::size(handles); ++i) {
- EXPECT_EQ(ERR_IO_PENDING,
- handles[i].Init(
- TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
- SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
- callback.callback(), ClientSocketPool::ProxyAuthCallback(),
- pool_.get(), NetLogWithSource()));
+ for (auto& handle : handles) {
+ EXPECT_EQ(
+ ERR_IO_PENDING,
+ handle.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
+ SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
+ callback.callback(), ClientSocketPool::ProxyAuthCallback(),
+ pool_.get(), NetLogWithSource()));
}
// One will be stalled, cancel all the handles now.
// This should hit the OnAvailableSocketSlot() code where we previously had
// stalled groups, but no longer have any.
- for (size_t i = 0; i < std::size(handles); ++i)
- handles[i].Reset();
+ for (auto& handle : handles)
+ handle.Reset();
}
TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
diff --git a/chromium/net/socket/client_socket_pool_unittest.cc b/chromium/net/socket/client_socket_pool_unittest.cc
index 8f8c24c0f3a..462467a8518 100644
--- a/chromium/net/socket/client_socket_pool_unittest.cc
+++ b/chromium/net/socket/client_socket_pool_unittest.cc
@@ -77,7 +77,7 @@ TEST(ClientSocketPool, GroupIdOperators) {
for (const auto& privacy_mode : kPrivacyModes) {
SCOPED_TRACE(privacy_mode);
for (const auto& network_isolation_key : kNetworkIsolationKeys) {
- SCOPED_TRACE(network_isolation_key.ToString());
+ SCOPED_TRACE(network_isolation_key.ToDebugString());
for (const auto& secure_dns_policy : kDisableSecureDnsValues) {
ClientSocketPool::GroupId group_id(
url::SchemeHostPort(scheme, host, port), privacy_mode,
diff --git a/chromium/net/socket/connect_job.h b/chromium/net/socket/connect_job.h
index 3b4d784994e..3a4657cb32a 100644
--- a/chromium/net/socket/connect_job.h
+++ b/chromium/net/socket/connect_job.h
@@ -127,12 +127,12 @@ class NET_EXPORT_PRIVATE ConnectJob {
// function doesn't own |job|.
class NET_EXPORT_PRIVATE Delegate {
public:
- Delegate() {}
+ Delegate() = default;
Delegate(const Delegate&) = delete;
Delegate& operator=(const Delegate&) = delete;
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
// Alerts the delegate that the connection completed. |job| must be
// destroyed by the delegate. A std::unique_ptr<> isn't used because the
diff --git a/chromium/net/socket/connect_job_unittest.cc b/chromium/net/socket/connect_job_unittest.cc
index 8e8918b49ce..a413457f391 100644
--- a/chromium/net/socket/connect_job_unittest.cc
+++ b/chromium/net/socket/connect_job_unittest.cc
@@ -68,8 +68,8 @@ class TestConnectJob : public ConnectJob {
return ResolveErrorInfo(net::OK);
}
int ConnectInternal() override {
- SetSocket(std::unique_ptr<StreamSocket>(new MockTCPClientSocket(
- AddressList(), net_log().net_log(), &socket_data_provider_)),
+ SetSocket(std::make_unique<MockTCPClientSocket>(
+ AddressList(), net_log().net_log(), &socket_data_provider_),
absl::nullopt /* dns_aliases */);
return socket()->Connect(base::BindOnce(
&TestConnectJob::NotifyDelegateOfCompletion, base::Unretained(this)));
diff --git a/chromium/net/socket/datagram_client_socket.h b/chromium/net/socket/datagram_client_socket.h
index 9ec34829de1..3342e1effd5 100644
--- a/chromium/net/socket/datagram_client_socket.h
+++ b/chromium/net/socket/datagram_client_socket.h
@@ -7,7 +7,7 @@
#include "net/base/datagram_buffer.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/socket/datagram_socket.h"
#include "net/socket/socket.h"
@@ -19,7 +19,7 @@ class SocketTag;
class NET_EXPORT_PRIVATE DatagramClientSocket : public DatagramSocket,
public Socket {
public:
- ~DatagramClientSocket() override {}
+ ~DatagramClientSocket() override = default;
// Initialize this socket as a client socket to server at |address|.
// Returns a network error code.
@@ -30,7 +30,7 @@ class NET_EXPORT_PRIVATE DatagramClientSocket : public DatagramSocket,
// received via |network|. This call will fail if |network| has disconnected.
// Communication using this socket will fail if |network| disconnects.
// Returns a net error code.
- virtual int ConnectUsingNetwork(NetworkChangeNotifier::NetworkHandle network,
+ virtual int ConnectUsingNetwork(handles::NetworkHandle network,
const IPEndPoint& address) = 0;
// Same as ConnectUsingNetwork, except that the current default network is
@@ -39,9 +39,9 @@ class NET_EXPORT_PRIVATE DatagramClientSocket : public DatagramSocket,
// Returns the network that either ConnectUsingNetwork() or
// ConnectUsingDefaultNetwork() bound this socket to. Returns
- // NetworkChangeNotifier::kInvalidNetworkHandle if not explicitly bound via
+ // handles::kInvalidNetworkHandle if not explicitly bound via
// ConnectUsingNetwork() or ConnectUsingDefaultNetwork().
- virtual NetworkChangeNotifier::NetworkHandle GetBoundNetwork() const = 0;
+ virtual handles::NetworkHandle GetBoundNetwork() const = 0;
// Apply |tag| to this socket.
virtual void ApplySocketTag(const SocketTag& tag) = 0;
@@ -50,82 +50,6 @@ class NET_EXPORT_PRIVATE DatagramClientSocket : public DatagramSocket,
// By default, this method is no-op.
virtual void EnableRecvOptimization() {}
- // As Write, but internally this can delay writes and batch them up
- // for writing in a separate task. This is to increase throughput
- // in bulk transfer scenarios (in QUIC) where a substantial
- // proportion of CPU time is spend in kernel UDP writes, and total
- // CPU time of the net IO thread saturates single core capacity.
- // The batching is required to allow overlapped computation time
- // between user and kernel packet processing.
- //
- // Returns the number of bytes written or a net error code. A
- // return value of zero is possible, because with batching enabled,
- // the underlying socket write may be delayed so as to accumulate
- // multiple buffers. The return value may also be larger than the
- // number of bytes in |buffers| due to completion of previous
- // writes. [ Writing the batch to the socket typically happens on a
- // different thread/cpu core. ]
- //
- // As with |Write|, a return value of ERR_IO_PENDING indicates the
- // caller should suspend further writes until the callback fires.
- //
- // If a socket write returns an error, it will be surfaced either as
- // the return value from the next call to |WriteAsync|, or via the
- // callback.
- //
- // Not all platforms will implement this, see |write_async_enabled()|
- // below.
- virtual int WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) = 0;
-
- // |buffer| is copied to an internal |DatagramBuffer|, caller
- // |retains ownership of |buffer|.
- virtual int WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) = 0;
-
- // With WriteAsync, the caller may wish to try unwritten buffers on
- // a new socket, e.g. with QUIC connection migration.
- virtual DatagramBuffers GetUnwrittenBuffers() = 0;
-
- // Enable |WriteAsync()|. May be a noop, see |WriteAsyncEnabled()|
- // below. Must be called right after construction and before other
- // calls. This is intended to support rollout of |WriteAsync| for
- // QUIC via a Finch trial, using the kWRBA client connection option.
- virtual void SetWriteAsyncEnabled(bool enabled) = 0;
-
- // Needed with |WriteAsync()| enabled, for socket's
- // |DatagramBufferPool|. Must be called right after construction
- // and before other calls.
- virtual void SetMaxPacketSize(size_t max_packet_size) = 0;
-
- // This is true if the |SetWriteAsyncEnabled(true)| has been called
- // *and* the platform supports |WriteAsync()|.
- virtual bool WriteAsyncEnabled() = 0;
-
- // In |WriteAsync()|, allow socket writing to happen on a separate
- // core when advantageous. This can increase maximum single-stream
- // throughput. Must be called right after construction and before
- // other calls. This is intended to support QUIC Finch trials, using
- // the kMLTC client connection option.
- virtual void SetWriteMultiCoreEnabled(bool enabled) = 0;
-
- // In |WriteAsync()|, use |sendmmsg()| on platforms that support it.
- // This can increase maximum single-stream throughput. Must be
- // called right after construction and before other calls. This is
- // intended to support QUIC Finch trials, using the kMMSG client
- // connection option.
- virtual void SetSendmmsgEnabled(bool enabled) = 0;
-
- // This is to (de-)activate batching in |WriteAsync|, e.g. in
- // |QuicChromiumClientSession| based on whether there are large
- // upload stream(s) active.
- virtual void SetWriteBatchingActive(bool active) = 0;
-
// Set interface to use for data sent to multicast groups. If
// |interface_index| set to 0, default interface is used.
// Must be called before Connect(), ConnectUsingNetwork() or
diff --git a/chromium/net/socket/datagram_server_socket.h b/chromium/net/socket/datagram_server_socket.h
index b826d01b7dc..bd5f2330140 100644
--- a/chromium/net/socket/datagram_server_socket.h
+++ b/chromium/net/socket/datagram_server_socket.h
@@ -21,7 +21,7 @@ class IOBuffer;
// A UDP Socket.
class NET_EXPORT DatagramServerSocket : public DatagramSocket {
public:
- ~DatagramServerSocket() override {}
+ ~DatagramServerSocket() override = default;
// Initialize this socket as a server socket listening at |address|.
// Returns a network error code.
diff --git a/chromium/net/socket/datagram_socket.h b/chromium/net/socket/datagram_socket.h
index f696905e742..e6758a75aca 100644
--- a/chromium/net/socket/datagram_socket.h
+++ b/chromium/net/socket/datagram_socket.h
@@ -22,7 +22,7 @@ class NET_EXPORT_PRIVATE DatagramSocket {
DEFAULT_BIND,
};
- virtual ~DatagramSocket() {}
+ virtual ~DatagramSocket() = default;
// Close the socket.
virtual void Close() = 0;
diff --git a/chromium/net/socket/fuzzed_datagram_client_socket.cc b/chromium/net/socket/fuzzed_datagram_client_socket.cc
index 897332e1932..a4c71aba822 100644
--- a/chromium/net/socket/fuzzed_datagram_client_socket.cc
+++ b/chromium/net/socket/fuzzed_datagram_client_socket.cc
@@ -50,7 +50,7 @@ int FuzzedDatagramClientSocket::Connect(const IPEndPoint& address) {
}
int FuzzedDatagramClientSocket::ConnectUsingNetwork(
- NetworkChangeNotifier::NetworkHandle network,
+ handles::NetworkHandle network,
const IPEndPoint& address) {
CHECK(!connected_);
return ERR_NOT_IMPLEMENTED;
@@ -62,9 +62,8 @@ int FuzzedDatagramClientSocket::FuzzedDatagramClientSocket::
return ERR_NOT_IMPLEMENTED;
}
-NetworkChangeNotifier::NetworkHandle
-FuzzedDatagramClientSocket::GetBoundNetwork() const {
- return NetworkChangeNotifier::kInvalidNetworkHandle;
+handles::NetworkHandle FuzzedDatagramClientSocket::GetBoundNetwork() const {
+ return handles::kInvalidNetworkHandle;
}
void FuzzedDatagramClientSocket::ApplySocketTag(const SocketTag& tag) {}
@@ -93,34 +92,6 @@ int FuzzedDatagramClientSocket::GetLocalAddress(IPEndPoint* address) const {
void FuzzedDatagramClientSocket::UseNonBlockingIO() {}
-int FuzzedDatagramClientSocket::WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) {
- return -1;
-}
-
-int FuzzedDatagramClientSocket::WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) {
- return -1;
-}
-
-DatagramBuffers FuzzedDatagramClientSocket::GetUnwrittenBuffers() {
- DatagramBuffers result;
- return result;
-}
-
-void FuzzedDatagramClientSocket::SetWriteAsyncEnabled(bool enabled) {}
-bool FuzzedDatagramClientSocket::WriteAsyncEnabled() {
- return false;
-}
-void FuzzedDatagramClientSocket::SetMaxPacketSize(size_t max_packet_size) {}
-void FuzzedDatagramClientSocket::SetWriteMultiCoreEnabled(bool enabled) {}
-void FuzzedDatagramClientSocket::SetSendmmsgEnabled(bool enabled) {}
-void FuzzedDatagramClientSocket::SetWriteBatchingActive(bool active) {}
int FuzzedDatagramClientSocket::SetMulticastInterface(
uint32_t interface_index) {
return ERR_NOT_IMPLEMENTED;
diff --git a/chromium/net/socket/fuzzed_datagram_client_socket.h b/chromium/net/socket/fuzzed_datagram_client_socket.h
index d13b2e49e70..3bf0e4b6056 100644
--- a/chromium/net/socket/fuzzed_datagram_client_socket.h
+++ b/chromium/net/socket/fuzzed_datagram_client_socket.h
@@ -12,7 +12,7 @@
#include "base/memory/weak_ptr.h"
#include "net/base/completion_once_callback.h"
#include "net/base/ip_endpoint.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/log/net_log_with_source.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
@@ -38,10 +38,10 @@ class FuzzedDatagramClientSocket : public DatagramClientSocket {
// DatagramClientSocket implementation:
int Connect(const IPEndPoint& address) override;
- int ConnectUsingNetwork(NetworkChangeNotifier::NetworkHandle network,
+ int ConnectUsingNetwork(handles::NetworkHandle network,
const IPEndPoint& address) override;
int ConnectUsingDefaultNetwork(const IPEndPoint& address) override;
- NetworkChangeNotifier::NetworkHandle GetBoundNetwork() const override;
+ handles::NetworkHandle GetBoundNetwork() const override;
void ApplySocketTag(const SocketTag& tag) override;
// DatagramSocket implementation:
@@ -49,22 +49,6 @@ class FuzzedDatagramClientSocket : public DatagramClientSocket {
int GetPeerAddress(IPEndPoint* address) const override;
int GetLocalAddress(IPEndPoint* address) const override;
void UseNonBlockingIO() override;
- int WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) override;
- int WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) override;
- DatagramBuffers GetUnwrittenBuffers() override;
- void SetWriteAsyncEnabled(bool enabled) override;
- void SetMaxPacketSize(size_t max_packet_size) override;
- bool WriteAsyncEnabled() override;
- void SetWriteMultiCoreEnabled(bool enabled) override;
- void SetSendmmsgEnabled(bool enabled) override;
- void SetWriteBatchingActive(bool active) override;
int SetMulticastInterface(uint32_t interface_index) override;
const NetLogWithSource& NetLog() const override;
diff --git a/chromium/net/socket/fuzzed_socket_factory.cc b/chromium/net/socket/fuzzed_socket_factory.cc
index ec213e107cf..e13059813b6 100644
--- a/chromium/net/socket/fuzzed_socket_factory.cc
+++ b/chromium/net/socket/fuzzed_socket_factory.cc
@@ -126,8 +126,7 @@ FuzzedSocketFactory::CreateTransportClientSocket(
NetworkQualityEstimator* network_quality_estimator,
NetLog* net_log,
const NetLogSource& source) {
- std::unique_ptr<FuzzedSocket> socket(
- new FuzzedSocket(data_provider_, net_log));
+ auto socket = std::make_unique<FuzzedSocket>(data_provider_, net_log);
socket->set_fuzz_connect_result(fuzz_connect_result_);
// Just use the first address.
socket->set_remote_address(*addresses.begin());
diff --git a/chromium/net/socket/network_binding_client_socket_factory.cc b/chromium/net/socket/network_binding_client_socket_factory.cc
index 5098396f8c1..af2e0cd9d01 100644
--- a/chromium/net/socket/network_binding_client_socket_factory.cc
+++ b/chromium/net/socket/network_binding_client_socket_factory.cc
@@ -10,7 +10,7 @@
namespace net {
NetworkBindingClientSocketFactory::NetworkBindingClientSocketFactory(
- NetworkChangeNotifier::NetworkHandle network)
+ handles::NetworkHandle network)
: network_(network) {}
std::unique_ptr<DatagramClientSocket>
diff --git a/chromium/net/socket/network_binding_client_socket_factory.h b/chromium/net/socket/network_binding_client_socket_factory.h
index 887139d8397..8a49e2c5298 100644
--- a/chromium/net/socket/network_binding_client_socket_factory.h
+++ b/chromium/net/socket/network_binding_client_socket_factory.h
@@ -5,7 +5,7 @@
#ifndef NET_SOCKET_NETWORK_BINDING_CLIENT_SOCKET_FACTORY_H_
#define NET_SOCKET_NETWORK_BINDING_CLIENT_SOCKET_FACTORY_H_
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/socket/client_socket_factory.h"
namespace net {
@@ -13,8 +13,7 @@ namespace net {
// A ClientSocketFactory to create sockets bound to `network`.
class NetworkBindingClientSocketFactory : public ClientSocketFactory {
public:
- explicit NetworkBindingClientSocketFactory(
- NetworkChangeNotifier::NetworkHandle network);
+ explicit NetworkBindingClientSocketFactory(handles::NetworkHandle network);
NetworkBindingClientSocketFactory(const NetworkBindingClientSocketFactory&) =
delete;
@@ -42,7 +41,7 @@ class NetworkBindingClientSocketFactory : public ClientSocketFactory {
const SSLConfig& ssl_config) override;
private:
- NetworkChangeNotifier::NetworkHandle network_;
+ handles::NetworkHandle network_;
};
} // namespace net
diff --git a/chromium/net/socket/socket_bio_adapter.h b/chromium/net/socket/socket_bio_adapter.h
index 487e9b7e4a4..4aee476796e 100644
--- a/chromium/net/socket/socket_bio_adapter.h
+++ b/chromium/net/socket/socket_bio_adapter.h
@@ -63,7 +63,7 @@ class NET_EXPORT_PRIVATE SocketBIOAdapter {
virtual void OnWriteReady() = 0;
protected:
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
};
// Creates a new SocketBIOAdapter for the specified socket. |socket| and
diff --git a/chromium/net/socket/socket_performance_watcher.h b/chromium/net/socket/socket_performance_watcher.h
index 8665cbdcb5e..38b5b9db691 100644
--- a/chromium/net/socket/socket_performance_watcher.h
+++ b/chromium/net/socket/socket_performance_watcher.h
@@ -18,7 +18,7 @@ namespace net {
// thread.
class NET_EXPORT_PRIVATE SocketPerformanceWatcher {
public:
- virtual ~SocketPerformanceWatcher() {}
+ virtual ~SocketPerformanceWatcher() = default;
// Returns true if |this| SocketPerformanceWatcher is interested in receiving
// an updated RTT estimate (via OnUpdatedRTTAvailable).
diff --git a/chromium/net/socket/socket_performance_watcher_factory.h b/chromium/net/socket/socket_performance_watcher_factory.h
index 28d2948e4fe..992aab8d68e 100644
--- a/chromium/net/socket/socket_performance_watcher_factory.h
+++ b/chromium/net/socket/socket_performance_watcher_factory.h
@@ -27,7 +27,7 @@ class NET_EXPORT_PRIVATE SocketPerformanceWatcherFactory {
SocketPerformanceWatcherFactory& operator=(
const SocketPerformanceWatcherFactory&) = delete;
- virtual ~SocketPerformanceWatcherFactory() {}
+ virtual ~SocketPerformanceWatcherFactory() = default;
// Creates a socket performance watcher that will record statistics for a
// single socket that uses |protocol| as the transport layer protocol.
@@ -40,7 +40,7 @@ class NET_EXPORT_PRIVATE SocketPerformanceWatcherFactory {
const AddressList& address_list) = 0;
protected:
- SocketPerformanceWatcherFactory() {}
+ SocketPerformanceWatcherFactory() = default;
};
} // namespace net
diff --git a/chromium/net/socket/socket_posix.cc b/chromium/net/socket/socket_posix.cc
index 1e054bd7506..92ffb1ec5a5 100644
--- a/chromium/net/socket/socket_posix.cc
+++ b/chromium/net/socket/socket_posix.cc
@@ -437,7 +437,7 @@ int SocketPosix::DoAccept(std::unique_ptr<SocketPosix>* socket) {
if (new_socket < 0)
return MapAcceptError(errno);
- std::unique_ptr<SocketPosix> accepted_socket(new SocketPosix);
+ auto accepted_socket = std::make_unique<SocketPosix>();
int rv = accepted_socket->AdoptConnectedSocket(new_socket, new_peer_address);
if (rv != OK)
return rv;
diff --git a/chromium/net/socket/socket_tag.h b/chromium/net/socket/socket_tag.h
index 8ba7e4366bf..47bc9d7cffc 100644
--- a/chromium/net/socket/socket_tag.h
+++ b/chromium/net/socket/socket_tag.h
@@ -35,7 +35,7 @@ class NET_EXPORT SocketTag {
#else
SocketTag() = default;
#endif // BUILDFLAG(IS_ANDROID)
- ~SocketTag() {}
+ ~SocketTag() = default;
bool operator<(const SocketTag& other) const;
bool operator==(const SocketTag& other) const;
diff --git a/chromium/net/socket/socket_test_util.cc b/chromium/net/socket/socket_test_util.cc
index 0bc5665cba9..f1c52adaf44 100644
--- a/chromium/net/socket/socket_test_util.cc
+++ b/chromium/net/socket/socket_test_util.cc
@@ -177,7 +177,7 @@ void SocketDataProvider::DetachSocket() {
socket_ = nullptr;
}
-SocketDataProvider::SocketDataProvider() {}
+SocketDataProvider::SocketDataProvider() = default;
SocketDataProvider::~SocketDataProvider() {
if (socket_)
@@ -766,8 +766,7 @@ MockClientSocketFactory::CreateDatagramClientSocket(
NetLog* net_log,
const NetLogSource& source) {
SocketDataProvider* data_provider = mock_data_.GetNext();
- std::unique_ptr<MockUDPClientSocket> socket(
- new MockUDPClientSocket(data_provider, net_log));
+ auto socket = std::make_unique<MockUDPClientSocket>(data_provider, net_log);
if (bind_type == DatagramSocket::RANDOM_BIND)
socket->set_source_port(static_cast<uint16_t>(base::RandInt(1025, 65535)));
udp_client_socket_ports_.push_back(socket->source_port());
@@ -847,8 +846,8 @@ std::unique_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket(
EXPECT_EQ(*next_ssl_data->expected_ech_config_list,
ssl_config.ech_config_list);
}
- return std::unique_ptr<SSLClientSocket>(new MockSSLClientSocket(
- std::move(stream_socket), host_and_port, ssl_config, next_ssl_data));
+ return std::make_unique<MockSSLClientSocket>(
+ std::move(stream_socket), host_and_port, ssl_config, next_ssl_data);
}
MockClientSocket::MockClientSocket(const NetLogWithSource& net_log)
@@ -1572,82 +1571,6 @@ int MockUDPClientSocket::Write(
return write_result.result;
}
-int MockUDPClientSocket::WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
- DCHECK(buffer);
- DCHECK_GT(buf_len, 0u);
- DCHECK(callback);
-
- if (!connected_ || !data_)
- return ERR_UNEXPECTED;
- data_transferred_ = true;
-
- std::string data(buffer, buf_len);
- MockWriteResult write_result = data_->OnWrite(data);
-
- // ERR_IO_PENDING is a signal that the socket data will call back
- // asynchronously.
- if (write_result.result == ERR_IO_PENDING) {
- pending_write_callback_ = std::move(callback);
- return ERR_IO_PENDING;
- }
- if (write_result.mode == ASYNC) {
- RunCallbackAsync(std::move(callback), write_result.result);
- return ERR_IO_PENDING;
- }
- return write_result.result;
-}
-
-int MockUDPClientSocket::WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
- DCHECK(!buffers.empty());
- DCHECK(callback);
-
- if (!connected_ || !data_)
- return ERR_UNEXPECTED;
-
- unwritten_buffers_ = std::move(buffers);
-
- int rv = 0;
- size_t buf_len = 0;
- do {
- auto& buf = unwritten_buffers_.front();
-
- buf_len = buf->length();
- std::string data(buf->data(), buf_len);
- MockWriteResult write_result = data_->OnWrite(data);
- rv = write_result.result;
-
- // ERR_IO_PENDING is a signal that the socket data will call back
- // asynchronously.
- if (write_result.result == ERR_IO_PENDING) {
- pending_write_callback_ = std::move(callback);
- return ERR_IO_PENDING;
- }
- if (write_result.mode == ASYNC) {
- RunCallbackAsync(std::move(callback), write_result.result);
- return ERR_IO_PENDING;
- }
-
- if (rv < 0) {
- return rv;
- }
-
- unwritten_buffers_.pop_front();
- } while (!unwritten_buffers_.empty());
-
- return buf_len;
-}
-
-DatagramBuffers MockUDPClientSocket::GetUnwrittenBuffers() {
- return std::move(unwritten_buffers_);
-}
-
int MockUDPClientSocket::SetReceiveBufferSize(int32_t size) {
return OK;
}
@@ -1679,14 +1602,6 @@ int MockUDPClientSocket::GetLocalAddress(IPEndPoint* address) const {
void MockUDPClientSocket::UseNonBlockingIO() {}
-void MockUDPClientSocket::SetWriteAsyncEnabled(bool enabled) {}
-bool MockUDPClientSocket::WriteAsyncEnabled() {
- return false;
-}
-void MockUDPClientSocket::SetMaxPacketSize(size_t max_packet_size) {}
-void MockUDPClientSocket::SetWriteMultiCoreEnabled(bool enabled) {}
-void MockUDPClientSocket::SetSendmmsgEnabled(bool enabled) {}
-void MockUDPClientSocket::SetWriteBatchingActive(bool active) {}
int MockUDPClientSocket::SetMulticastInterface(uint32_t interface_index) {
return OK;
}
@@ -1703,9 +1618,8 @@ int MockUDPClientSocket::Connect(const IPEndPoint& address) {
return data_->connect_data().result;
}
-int MockUDPClientSocket::ConnectUsingNetwork(
- NetworkChangeNotifier::NetworkHandle network,
- const IPEndPoint& address) {
+int MockUDPClientSocket::ConnectUsingNetwork(handles::NetworkHandle network,
+ const IPEndPoint& address) {
DCHECK(!connected_);
if (!data_)
return ERR_UNEXPECTED;
@@ -1725,8 +1639,7 @@ int MockUDPClientSocket::ConnectUsingDefaultNetwork(const IPEndPoint& address) {
return data_->connect_data().result;
}
-NetworkChangeNotifier::NetworkHandle MockUDPClientSocket::GetBoundNetwork()
- const {
+handles::NetworkHandle MockUDPClientSocket::GetBoundNetwork() const {
return network_;
}
@@ -1979,11 +1892,12 @@ int MockTransportClientSocketPool::RequestSocket(
std::unique_ptr<StreamSocket> socket =
client_socket_factory_->CreateTransportClientSocket(
AddressList(), nullptr, nullptr, net_log.net_log(), NetLogSource());
- MockConnectJob* job = new MockConnectJob(
+ auto job = std::make_unique<MockConnectJob>(
std::move(socket), handle, socket_tag, std::move(callback), priority);
- job_list_.push_back(base::WrapUnique(job));
+ auto* job_ptr = job.get();
+ job_list_.push_back(std::move(job));
handle->set_group_generation(1);
- return job->Connect();
+ return job_ptr->Connect();
}
void MockTransportClientSocketPool::SetPriority(
@@ -2022,7 +1936,7 @@ void MockTransportClientSocketPool::ReleaseSocket(
WrappedStreamSocket::WrappedStreamSocket(
std::unique_ptr<StreamSocket> transport)
: transport_(std::move(transport)) {}
-WrappedStreamSocket::~WrappedStreamSocket() {}
+WrappedStreamSocket::~WrappedStreamSocket() = default;
int WrappedStreamSocket::Bind(const net::IPEndPoint& local_addr) {
NOTREACHED();
@@ -2128,10 +2042,10 @@ MockTaggingClientSocketFactory::CreateTransportClientSocket(
NetworkQualityEstimator* network_quality_estimator,
NetLog* net_log,
const NetLogSource& source) {
- std::unique_ptr<MockTaggingStreamSocket> socket(new MockTaggingStreamSocket(
+ auto socket = std::make_unique<MockTaggingStreamSocket>(
MockClientSocketFactory::CreateTransportClientSocket(
addresses, std::move(socket_performance_watcher),
- network_quality_estimator, net_log, source)));
+ network_quality_estimator, net_log, source));
tcp_socket_ = socket.get();
return std::move(socket);
}
diff --git a/chromium/net/socket/socket_test_util.h b/chromium/net/socket/socket_test_util.h
index bacfd83c5ac..1db07eefef6 100644
--- a/chromium/net/socket/socket_test_util.h
+++ b/chromium/net/socket/socket_test_util.h
@@ -55,8 +55,8 @@ class NetLog;
struct NetworkTrafficAnnotationTag;
class X509Certificate;
-const NetworkChangeNotifier::NetworkHandle kDefaultNetworkForTests = 1;
-const NetworkChangeNotifier::NetworkHandle kNewNetworkForTests = 2;
+const handles::NetworkHandle kDefaultNetworkForTests = 1;
+const handles::NetworkHandle kNewNetworkForTests = 2;
enum {
// A private network error code used by the socket test utility classes.
@@ -953,8 +953,8 @@ class MockSSLClientSocket : public AsyncSocket, public SSLClientSocket {
class MockUDPClientSocket : public DatagramClientSocket, public AsyncSocket {
public:
- MockUDPClientSocket(SocketDataProvider* data = nullptr,
- net::NetLog* net_log = nullptr);
+ explicit MockUDPClientSocket(SocketDataProvider* data = nullptr,
+ net::NetLog* net_log = nullptr);
MockUDPClientSocket(const MockUDPClientSocket&) = delete;
MockUDPClientSocket& operator=(const MockUDPClientSocket&) = delete;
@@ -969,16 +969,6 @@ class MockUDPClientSocket : public DatagramClientSocket, public AsyncSocket {
int buf_len,
CompletionOnceCallback callback,
const NetworkTrafficAnnotationTag& traffic_annotation) override;
- int WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) override;
- int WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) override;
- DatagramBuffers GetUnwrittenBuffers() override;
int SetReceiveBufferSize(int32_t size) override;
int SetSendBufferSize(int32_t size) override;
@@ -989,21 +979,15 @@ class MockUDPClientSocket : public DatagramClientSocket, public AsyncSocket {
int GetPeerAddress(IPEndPoint* address) const override;
int GetLocalAddress(IPEndPoint* address) const override;
void UseNonBlockingIO() override;
- void SetWriteAsyncEnabled(bool enabled) override;
- void SetMaxPacketSize(size_t max_packet_size) override;
- bool WriteAsyncEnabled() override;
- void SetWriteMultiCoreEnabled(bool enabled) override;
- void SetSendmmsgEnabled(bool enabled) override;
- void SetWriteBatchingActive(bool active) override;
int SetMulticastInterface(uint32_t interface_index) override;
const NetLogWithSource& NetLog() const override;
// DatagramClientSocket implementation.
int Connect(const IPEndPoint& address) override;
- int ConnectUsingNetwork(NetworkChangeNotifier::NetworkHandle network,
+ int ConnectUsingNetwork(handles::NetworkHandle network,
const IPEndPoint& address) override;
int ConnectUsingDefaultNetwork(const IPEndPoint& address) override;
- NetworkChangeNotifier::NetworkHandle GetBoundNetwork() const override;
+ handles::NetworkHandle GetBoundNetwork() const override;
void ApplySocketTag(const SocketTag& tag) override;
void SetMsgConfirm(bool confirm) override {}
@@ -1045,8 +1029,7 @@ class MockUDPClientSocket : public DatagramClientSocket, public AsyncSocket {
IPEndPoint peer_addr_;
// Network that the socket is bound to.
- NetworkChangeNotifier::NetworkHandle network_ =
- NetworkChangeNotifier::kInvalidNetworkHandle;
+ handles::NetworkHandle network_ = handles::kInvalidNetworkHandle;
// While an asynchronous IO is pending, we save our user-buffer state.
scoped_refptr<IOBuffer> pending_read_buf_ = nullptr;
@@ -1167,7 +1150,7 @@ class MockTransportSocketParams
private:
friend class base::RefCounted<MockTransportSocketParams>;
- ~MockTransportSocketParams() {}
+ ~MockTransportSocketParams() = default;
};
class MockTransportClientSocketPool : public TransportClientSocketPool {
@@ -1310,7 +1293,7 @@ class MockTaggingStreamSocket : public WrappedStreamSocket {
MockTaggingStreamSocket(const MockTaggingStreamSocket&) = delete;
MockTaggingStreamSocket& operator=(const MockTaggingStreamSocket&) = delete;
- ~MockTaggingStreamSocket() override {}
+ ~MockTaggingStreamSocket() override = default;
// StreamSocket implementation.
int Connect(CompletionOnceCallback callback) override;
@@ -1360,7 +1343,8 @@ class MockTaggingClientSocketFactory : public MockClientSocketFactory {
MockUDPClientSocket* GetLastProducedUDPSocket() const { return udp_socket_; }
private:
- raw_ptr<MockTaggingStreamSocket> tcp_socket_ = nullptr;
+ // TODO(crbug.com/1298696): Breaks net_unittests.
+ raw_ptr<MockTaggingStreamSocket, DegradeToNoOpWhenMTE> tcp_socket_ = nullptr;
raw_ptr<MockUDPClientSocket> udp_socket_ = nullptr;
};
diff --git a/chromium/net/socket/socks5_client_socket_fuzzer.cc b/chromium/net/socket/socks5_client_socket_fuzzer.cc
index 5ea5f3f9489..ed3ae4ed98f 100644
--- a/chromium/net/socket/socks5_client_socket_fuzzer.cc
+++ b/chromium/net/socket/socks5_client_socket_fuzzer.cc
@@ -33,8 +33,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
FuzzedDataProvider data_provider(data, size);
net::TestCompletionCallback callback;
- std::unique_ptr<net::FuzzedSocket> fuzzed_socket(
- new net::FuzzedSocket(&data_provider, net::NetLog::Get()));
+ auto fuzzed_socket =
+ std::make_unique<net::FuzzedSocket>(&data_provider, net::NetLog::Get());
CHECK_EQ(net::OK, fuzzed_socket->Connect(callback.callback()));
net::SOCKS5ClientSocket socket(std::move(fuzzed_socket),
diff --git a/chromium/net/socket/socks5_client_socket_unittest.cc b/chromium/net/socket/socks5_client_socket_unittest.cc
index 613d2671c90..e0db5b90cc0 100644
--- a/chromium/net/socket/socks5_client_socket_unittest.cc
+++ b/chromium/net/socket/socks5_client_socket_unittest.cc
@@ -92,7 +92,9 @@ std::unique_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket(
NetLog* net_log) {
TestCompletionCallback callback;
data_ = std::make_unique<StaticSocketDataProvider>(reads, writes);
- tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get());
+ auto tcp_sock = std::make_unique<MockTCPClientSocket>(address_list_, net_log,
+ data_.get());
+ tcp_sock_ = tcp_sock.get();
int rv = tcp_sock_->Connect(callback.callback());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -102,7 +104,7 @@ std::unique_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket(
// The SOCKS5ClientSocket takes ownership of |tcp_sock_|, but keep a
// non-owning pointer to it.
- return std::make_unique<SOCKS5ClientSocket>(base::WrapUnique(tcp_sock_.get()),
+ return std::make_unique<SOCKS5ClientSocket>(std::move(tcp_sock),
HostPortPair(hostname, port),
TRAFFIC_ANNOTATION_FOR_TESTS);
}
@@ -361,21 +363,22 @@ TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) {
TEST_F(SOCKS5ClientSocketTest, Tag) {
StaticSocketDataProvider data;
- MockTaggingStreamSocket* tagging_sock =
- new MockTaggingStreamSocket(std::unique_ptr<StreamSocket>(
- new MockTCPClientSocket(address_list_, NetLog::Get(), &data)));
+ auto tagging_sock = std::make_unique<MockTaggingStreamSocket>(
+ std::make_unique<MockTCPClientSocket>(address_list_, NetLog::Get(),
+ &data));
+ auto* tagging_sock_ptr = tagging_sock.get();
// |socket| takes ownership of |tagging_sock|, but keep a non-owning pointer
// to it.
- SOCKS5ClientSocket socket(std::unique_ptr<StreamSocket>(tagging_sock),
+ SOCKS5ClientSocket socket(std::move(tagging_sock),
HostPortPair("localhost", 80),
TRAFFIC_ANNOTATION_FOR_TESTS);
- EXPECT_EQ(tagging_sock->tag(), SocketTag());
+ EXPECT_EQ(tagging_sock_ptr->tag(), SocketTag());
#if BUILDFLAG(IS_ANDROID)
SocketTag tag(0x12345678, 0x87654321);
socket.ApplySocketTag(tag);
- EXPECT_EQ(tagging_sock->tag(), tag);
+ EXPECT_EQ(tagging_sock_ptr->tag(), tag);
#endif // BUILDFLAG(IS_ANDROID)
}
diff --git a/chromium/net/socket/socks_client_socket.cc b/chromium/net/socket/socks_client_socket.cc
index a68872601e6..1355a5d0b9c 100644
--- a/chromium/net/socket/socks_client_socket.cc
+++ b/chromium/net/socket/socks_client_socket.cc
@@ -10,6 +10,7 @@
#include "base/callback_helpers.h"
#include "base/compiler_specific.h"
#include "base/sys_byteorder.h"
+#include "net/base/address_list.h"
#include "net/base/io_buffer.h"
#include "net/dns/public/dns_query_type.h"
#include "net/dns/public/secure_dns_policy.h"
diff --git a/chromium/net/socket/socks_client_socket_fuzzer.cc b/chromium/net/socket/socks_client_socket_fuzzer.cc
index 58da3f1ab3b..76650a40daf 100644
--- a/chromium/net/socket/socks_client_socket_fuzzer.cc
+++ b/chromium/net/socket/socks_client_socket_fuzzer.cc
@@ -46,8 +46,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
}
net::TestCompletionCallback callback;
- std::unique_ptr<net::FuzzedSocket> fuzzed_socket(
- new net::FuzzedSocket(&data_provider, net::NetLog::Get()));
+ auto fuzzed_socket =
+ std::make_unique<net::FuzzedSocket>(&data_provider, net::NetLog::Get());
CHECK_EQ(net::OK, fuzzed_socket->Connect(callback.callback()));
net::SOCKSClientSocket socket(
diff --git a/chromium/net/socket/socks_client_socket_unittest.cc b/chromium/net/socket/socks_client_socket_unittest.cc
index df7e47a1bbd..4ecade09887 100644
--- a/chromium/net/socket/socks_client_socket_unittest.cc
+++ b/chromium/net/socket/socks_client_socket_unittest.cc
@@ -63,8 +63,7 @@ class SOCKSClientSocketTest : public PlatformTest, public WithTaskEnvironment {
};
SOCKSClientSocketTest::SOCKSClientSocketTest()
- : host_resolver_(new MockHostResolver) {
-}
+ : host_resolver_(std::make_unique<MockHostResolver>()) {}
// Set up platform before every test case
void SOCKSClientSocketTest::SetUp() {
@@ -427,24 +426,25 @@ TEST_F(SOCKSClientSocketTest, NoIPv6RealResolver) {
TEST_F(SOCKSClientSocketTest, Tag) {
StaticSocketDataProvider data;
- MockTaggingStreamSocket* tagging_sock =
- new MockTaggingStreamSocket(std::unique_ptr<StreamSocket>(
- new MockTCPClientSocket(address_list_, NetLog::Get(), &data)));
+ auto tagging_sock = std::make_unique<MockTaggingStreamSocket>(
+ std::make_unique<MockTCPClientSocket>(address_list_, NetLog::Get(),
+ &data));
+ auto* tagging_sock_ptr = tagging_sock.get();
- std::unique_ptr<ClientSocketHandle> connection(new ClientSocketHandle);
+ auto connection = std::make_unique<ClientSocketHandle>();
// |connection| takes ownership of |tagging_sock|, but keep a
// non-owning pointer to it.
MockHostResolver host_resolver;
SOCKSClientSocket socket(
- std::unique_ptr<StreamSocket>(tagging_sock),
- HostPortPair("localhost", 80), NetworkIsolationKey(), DEFAULT_PRIORITY,
- &host_resolver, SecureDnsPolicy::kAllow, TRAFFIC_ANNOTATION_FOR_TESTS);
+ std::move(tagging_sock), HostPortPair("localhost", 80),
+ NetworkIsolationKey(), DEFAULT_PRIORITY, &host_resolver,
+ SecureDnsPolicy::kAllow, TRAFFIC_ANNOTATION_FOR_TESTS);
- EXPECT_EQ(tagging_sock->tag(), SocketTag());
+ EXPECT_EQ(tagging_sock_ptr->tag(), SocketTag());
#if BUILDFLAG(IS_ANDROID)
SocketTag tag(0x12345678, 0x87654321);
socket.ApplySocketTag(tag);
- EXPECT_EQ(tagging_sock->tag(), tag);
+ EXPECT_EQ(tagging_sock_ptr->tag(), tag);
#endif // BUILDFLAG(IS_ANDROID)
}
diff --git a/chromium/net/socket/socks_connect_job.cc b/chromium/net/socket/socks_connect_job.cc
index 5436afa0da6..5bcecc50dce 100644
--- a/chromium/net/socket/socks_connect_job.cc
+++ b/chromium/net/socket/socks_connect_job.cc
@@ -182,12 +182,13 @@ int SOCKSConnectJob::DoSOCKSConnect() {
transport_connect_job_->PassSocket(), socks_params_->destination(),
socks_params_->traffic_annotation());
} else {
- socks_socket_ptr_ = new SOCKSClientSocket(
+ auto socks_socket = std::make_unique<SOCKSClientSocket>(
transport_connect_job_->PassSocket(), socks_params_->destination(),
socks_params_->network_isolation_key(), priority(), host_resolver(),
socks_params_->transport_params()->secure_dns_policy(),
socks_params_->traffic_annotation());
- socket_.reset(socks_socket_ptr_);
+ socks_socket_ptr_ = socks_socket.get();
+ socket_ = std::move(socks_socket);
}
transport_connect_job_.reset();
return socket_->Connect(
diff --git a/chromium/net/socket/socks_connect_job_unittest.cc b/chromium/net/socket/socks_connect_job_unittest.cc
index ff3821a6b3f..deafcc0398a 100644
--- a/chromium/net/socket/socks_connect_job_unittest.cc
+++ b/chromium/net/socket/socks_connect_job_unittest.cc
@@ -66,7 +66,7 @@ class SOCKSConnectJobTest : public testing::Test, public WithTaskEnvironment {
NetLog::Get(),
nullptr /* websocket_endpoint_lock_manager */) {}
- ~SOCKSConnectJobTest() override {}
+ ~SOCKSConnectJobTest() override = default;
static scoped_refptr<SOCKSSocketParams> CreateSOCKSParams(
SOCKSVersion socks_version,
diff --git a/chromium/net/socket/ssl_client_socket.cc b/chromium/net/socket/ssl_client_socket.cc
index 08bfe9515c4..1df26854ca8 100644
--- a/chromium/net/socket/ssl_client_socket.cc
+++ b/chromium/net/socket/ssl_client_socket.cc
@@ -6,8 +6,10 @@
#include <string>
+#include "base/feature_list.h"
#include "base/logging.h"
#include "base/observer_list.h"
+#include "net/base/features.h"
#include "net/socket/ssl_client_socket_impl.h"
#include "net/socket/stream_socket.h"
#include "net/ssl/ssl_client_session_cache.h"
@@ -76,6 +78,11 @@ SSLClientContext::~SSLClientContext() {
CertDatabase::GetInstance()->RemoveObserver(this);
}
+bool SSLClientContext::EncryptedClientHelloEnabled() const {
+ return config_.ech_enabled &&
+ base::FeatureList::IsEnabled(features::kEncryptedClientHello);
+}
+
std::unique_ptr<SSLClientSocket> SSLClientContext::CreateSSLClientSocket(
std::unique_ptr<StreamSocket> stream_socket,
const HostPortPair& host_and_port,
diff --git a/chromium/net/socket/ssl_client_socket.h b/chromium/net/socket/ssl_client_socket.h
index 35ca2173688..d9da9917f3f 100644
--- a/chromium/net/socket/ssl_client_socket.h
+++ b/chromium/net/socket/ssl_client_socket.h
@@ -134,6 +134,10 @@ class NET_EXPORT SSLClientContext : public SSLConfigService::Observer,
return sct_auditing_delegate_;
}
+ // Returns whether ECH (Encrypted ClientHello) should be enabled. This
+ // function checks both config() and feature flags.
+ bool EncryptedClientHelloEnabled() const;
+
// Creates a new SSLClientSocket which can then be used to establish an SSL
// connection to |host_and_port| over the already-connected |stream_socket|.
std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
diff --git a/chromium/net/socket/ssl_client_socket_impl.cc b/chromium/net/socket/ssl_client_socket_impl.cc
index fd2171c2a60..e140cb7ad51 100644
--- a/chromium/net/socket/ssl_client_socket_impl.cc
+++ b/chromium/net/socket/ssl_client_socket_impl.cc
@@ -45,7 +45,7 @@
#include "net/cert/ct_policy_enforcer.h"
#include "net/cert/ct_policy_status.h"
#include "net/cert/ct_verifier.h"
-#include "net/cert/internal/parse_certificate.h"
+#include "net/cert/pki/parse_certificate.h"
#include "net/cert/sct_auditing_delegate.h"
#include "net/cert/sct_status_flags.h"
#include "net/cert/x509_certificate_net_log_param.h"
@@ -632,9 +632,9 @@ void SSLClientSocketImpl::GetSSLCertRequestInfo(
const STACK_OF(CRYPTO_BUFFER)* authorities =
SSL_get0_server_requested_CAs(ssl_.get());
for (const CRYPTO_BUFFER* ca_name : authorities) {
- cert_request_info->cert_authorities.push_back(
- std::string(reinterpret_cast<const char*>(CRYPTO_BUFFER_data(ca_name)),
- CRYPTO_BUFFER_len(ca_name)));
+ cert_request_info->cert_authorities.emplace_back(
+ reinterpret_cast<const char*>(CRYPTO_BUFFER_data(ca_name)),
+ CRYPTO_BUFFER_len(ca_name));
}
cert_request_info->cert_key_types.clear();
@@ -907,11 +907,11 @@ int SSLClientSocketImpl::Init() {
host_and_port_, &client_cert_, &client_private_key_);
}
- if (base::FeatureList::IsEnabled(features::kEncryptedClientHello)) {
+ if (context_->EncryptedClientHelloEnabled()) {
SSL_set_enable_ech_grease(ssl_.get(), 1);
}
if (!ssl_config_.ech_config_list.empty()) {
- DCHECK(base::FeatureList::IsEnabled(features::kEncryptedClientHello));
+ DCHECK(context_->EncryptedClientHelloEnabled());
net_log_.AddEvent(NetLogEventType::SSL_ECH_CONFIG_LIST, [&] {
base::Value::Dict dict;
dict.Set("bytes", NetLogBinaryValue(ssl_config_.ech_config_list));
diff --git a/chromium/net/socket/ssl_client_socket_unittest.cc b/chromium/net/socket/ssl_client_socket_unittest.cc
index a01a1538f5e..3b022704ed4 100644
--- a/chromium/net/socket/ssl_client_socket_unittest.cc
+++ b/chromium/net/socket/ssl_client_socket_unittest.cc
@@ -836,8 +836,8 @@ class SSLClientSocketTest : public PlatformTest, public WithTaskEnvironment {
const SSLConfig& ssl_config,
const HostPortPair& host_port_pair,
int* result) {
- std::unique_ptr<StreamSocket> transport(new TCPClientSocket(
- addr_, nullptr, nullptr, NetLog::Get(), NetLogSource()));
+ auto transport = std::make_unique<TCPClientSocket>(
+ addr_, nullptr, nullptr, NetLog::Get(), NetLogSource());
int rv = callback_.GetResult(transport->Connect(callback_.callback()));
if (rv != OK) {
LOG(ERROR) << "Could not connect to test server";
@@ -1125,10 +1125,10 @@ class SSLClientSocketFalseStartTest : public SSLClientSocketTest {
std::unique_ptr<SSLClientSocket>* out_sock) {
CHECK(embedded_test_server());
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(real_transport));
int rv = callback->GetResult(transport->Connect(callback->callback()));
EXPECT_THAT(rv, IsOk());
@@ -1244,12 +1244,12 @@ int MakeHTTPRequest(StreamSocket* socket, const char* path = "/") {
// as early data.
class ZeroRTTResponse : public test_server::HttpResponse {
public:
- ZeroRTTResponse(bool zero_rtt) : zero_rtt_(zero_rtt) {}
+ explicit ZeroRTTResponse(bool zero_rtt) : zero_rtt_(zero_rtt) {}
ZeroRTTResponse(const ZeroRTTResponse&) = delete;
ZeroRTTResponse& operator=(const ZeroRTTResponse&) = delete;
- ~ZeroRTTResponse() override {}
+ ~ZeroRTTResponse() override = default;
void SendResponse(
base::WeakPtr<test_server::HttpResponseDelegate> delegate) override {
@@ -1318,8 +1318,8 @@ class SSLClientSocketZeroRTTTest : public SSLClientSocketTest {
real_transport_ = std::make_unique<TCPClientSocket>(
addr(), nullptr, nullptr, nullptr, NetLogSource());
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(real_transport_)));
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(real_transport_));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback_.GetResult(transport->Connect(callback_.callback()));
@@ -1452,8 +1452,8 @@ TEST_P(SSLClientSocketVersionTest, Connect) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> transport(new TCPClientSocket(
- addr(), nullptr, nullptr, NetLog::Get(), NetLogSource()));
+ auto transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, NetLog::Get(), NetLogSource());
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -1652,8 +1652,8 @@ TEST_P(SSLClientSocketReadTest, Read) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
+ auto transport = std::make_unique<TCPClientSocket>(addr(), nullptr, nullptr,
+ nullptr, NetLogSource());
EXPECT_EQ(0, transport->GetTotalReceivedBytes());
int rv = callback.GetResult(transport->Connect(callback.callback()));
@@ -1709,10 +1709,10 @@ TEST_F(SSLClientSocketTest, Connect_WithSynchronousError) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, SSLServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<SynchronousErrorStreamSocket> transport(
- new SynchronousErrorStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<SynchronousErrorStreamSocket>(std::move(real_transport));
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -1736,10 +1736,10 @@ TEST_P(SSLClientSocketReadTest, Read_WithSynchronousError) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<SynchronousErrorStreamSocket> transport(
- new SynchronousErrorStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<SynchronousErrorStreamSocket>(std::move(real_transport));
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -1786,15 +1786,15 @@ TEST_P(SSLClientSocketVersionTest, Write_WithSynchronousError) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
// Note: |error_socket|'s ownership is handed to |transport|, but a pointer
// is retained in order to configure additional errors.
- std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
- new SynchronousErrorStreamSocket(std::move(real_transport)));
+ auto error_socket =
+ std::make_unique<SynchronousErrorStreamSocket>(std::move(real_transport));
SynchronousErrorStreamSocket* raw_error_socket = error_socket.get();
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(error_socket)));
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(error_socket));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -1851,15 +1851,15 @@ TEST_P(SSLClientSocketVersionTest, Write_WithSynchronousErrorNoRead) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, SSLServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
// Note: intermediate sockets' ownership are handed to |sock|, but a pointer
// is retained in order to query them.
- std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
- new SynchronousErrorStreamSocket(std::move(real_transport)));
+ auto error_socket =
+ std::make_unique<SynchronousErrorStreamSocket>(std::move(real_transport));
SynchronousErrorStreamSocket* raw_error_socket = error_socket.get();
- std::unique_ptr<CountingStreamSocket> counting_socket(
- new CountingStreamSocket(std::move(error_socket)));
+ auto counting_socket =
+ std::make_unique<CountingStreamSocket>(std::move(error_socket));
CountingStreamSocket* raw_counting_socket = counting_socket.get();
int rv = callback.GetResult(counting_socket->Connect(callback.callback()));
ASSERT_THAT(rv, IsOk());
@@ -1953,15 +1953,15 @@ TEST_P(SSLClientSocketReadTest, Read_DeleteWhilePendingFullDuplex) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
// Note: |error_socket|'s ownership is handed to |transport|, but a pointer
// is retained in order to configure additional errors.
- std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
- new SynchronousErrorStreamSocket(std::move(real_transport)));
+ auto error_socket =
+ std::make_unique<SynchronousErrorStreamSocket>(std::move(real_transport));
SynchronousErrorStreamSocket* raw_error_socket = error_socket.get();
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(error_socket)));
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(error_socket));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
@@ -2037,15 +2037,15 @@ TEST_P(SSLClientSocketReadTest, Read_WithWriteError) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
// Note: |error_socket|'s ownership is handed to |transport|, but a pointer
// is retained in order to configure additional errors.
- std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
- new SynchronousErrorStreamSocket(std::move(real_transport)));
+ auto error_socket =
+ std::make_unique<SynchronousErrorStreamSocket>(std::move(real_transport));
SynchronousErrorStreamSocket* raw_error_socket = error_socket.get();
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(error_socket)));
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(error_socket));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
@@ -2126,10 +2126,10 @@ TEST_F(SSLClientSocketTest, Connect_WithZeroReturn) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, SSLServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<SynchronousErrorStreamSocket> transport(
- new SynchronousErrorStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<SynchronousErrorStreamSocket>(std::move(real_transport));
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -2152,10 +2152,10 @@ TEST_P(SSLClientSocketReadTest, Read_WithZeroReturn) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<SynchronousErrorStreamSocket> transport(
- new SynchronousErrorStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<SynchronousErrorStreamSocket>(std::move(real_transport));
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -2183,13 +2183,13 @@ TEST_P(SSLClientSocketReadTest, Read_WithAsyncZeroReturn) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
- new SynchronousErrorStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto error_socket =
+ std::make_unique<SynchronousErrorStreamSocket>(std::move(real_transport));
SynchronousErrorStreamSocket* raw_error_socket = error_socket.get();
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(error_socket)));
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(error_socket));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -2266,10 +2266,10 @@ TEST_P(SSLClientSocketReadTest, Read_ManySmallRecords) {
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<ReadBufferingStreamSocket> transport(
- new ReadBufferingStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<ReadBufferingStreamSocket>(std::move(real_transport));
ReadBufferingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
ASSERT_THAT(rv, IsOk());
@@ -2341,8 +2341,8 @@ TEST_P(SSLClientSocketReadTest, Read_FullLogging) {
TestCompletionCallback callback;
log_observer_.SetObserverCaptureMode(NetLogCaptureMode::kEverything);
- std::unique_ptr<StreamSocket> transport(new TCPClientSocket(
- addr(), nullptr, nullptr, NetLog::Get(), NetLogSource()));
+ auto transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, NetLog::Get(), NetLogSource());
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -2410,7 +2410,7 @@ TEST_F(SSLClientSocketTest, PrematureApplicationData) {
TestCompletionCallback callback;
std::unique_ptr<StreamSocket> transport(
- new MockTCPClientSocket(addr(), nullptr, &data));
+ std::make_unique<MockTCPClientSocket>(addr(), nullptr, &data));
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -2470,8 +2470,8 @@ TEST_F(SSLClientSocketTest, ClientSocketHandleNotFromPool) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, SSLServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
+ auto transport = std::make_unique<TCPClientSocket>(addr(), nullptr, nullptr,
+ nullptr, NetLogSource());
int rv = callback.GetResult(transport->Connect(callback.callback()));
EXPECT_THAT(rv, IsOk());
@@ -2748,10 +2748,10 @@ TEST_P(SSLClientSocketCertRequestInfoTest, TwoAuthorities) {
SSLServerConfig config = GetServerConfig();
config.client_cert_type = SSLServerConfig::OPTIONAL_CLIENT_CERT;
- config.cert_authorities.push_back(
- std::string(std::begin(kThawteDN), std::end(kThawteDN)));
- config.cert_authorities.push_back(
- std::string(std::begin(kDiginotarDN), std::end(kDiginotarDN)));
+ config.cert_authorities.emplace_back(std::begin(kThawteDN),
+ std::end(kThawteDN));
+ config.cert_authorities.emplace_back(std::begin(kDiginotarDN),
+ std::end(kDiginotarDN));
ASSERT_TRUE(StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, config));
scoped_refptr<SSLCertRequestInfo> request_info = GetCertRequest();
ASSERT_TRUE(request_info.get());
@@ -2959,10 +2959,10 @@ TEST_P(SSLClientSocketVersionTest, ReusableAfterWrite) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, GetServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(real_transport));
FakeBlockingStreamSocket* raw_transport = transport.get();
ASSERT_THAT(callback.GetResult(transport->Connect(callback.callback())),
IsOk());
@@ -3021,8 +3021,8 @@ TEST_P(SSLClientSocketVersionTest, SessionResumption) {
sock_.reset();
// Using a different HostPortPair uses a different session cache key.
- std::unique_ptr<StreamSocket> transport(new TCPClientSocket(
- addr(), nullptr, nullptr, NetLog::Get(), NetLogSource()));
+ auto transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, NetLog::Get(), NetLogSource());
TestCompletionCallback callback;
ASSERT_THAT(callback.GetResult(transport->Connect(callback.callback())),
IsOk());
@@ -3051,7 +3051,7 @@ class FakePeerAddressSocket : public WrappedStreamSocket {
FakePeerAddressSocket(std::unique_ptr<StreamSocket> socket,
const IPEndPoint& address)
: WrappedStreamSocket(std::move(socket)), address_(address) {}
- ~FakePeerAddressSocket() override {}
+ ~FakePeerAddressSocket() override = default;
int GetPeerAddress(IPEndPoint* address) const override {
*address = address_;
@@ -3080,8 +3080,8 @@ TEST_F(SSLClientSocketTest, SessionResumption_RSA) {
for (int i = 0; i < 3; i++) {
SCOPED_TRACE(i);
- std::unique_ptr<StreamSocket> transport(new TCPClientSocket(
- addr(), nullptr, nullptr, NetLog::Get(), NetLogSource()));
+ auto transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, NetLog::Get(), NetLogSource());
TestCompletionCallback callback;
ASSERT_THAT(callback.GetResult(transport->Connect(callback.callback())),
IsOk());
@@ -4218,10 +4218,10 @@ TEST_F(SSLClientSocketTest, HandshakeFailureServerHello) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, SSLServerConfig()));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(real_transport));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
ASSERT_THAT(rv, IsOk());
@@ -4253,10 +4253,10 @@ TEST_F(SSLClientSocketTest, HandshakeFailureNoClientCerts) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, server_config));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(real_transport));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
ASSERT_THAT(rv, IsOk());
@@ -4302,10 +4302,10 @@ TEST_F(SSLClientSocketTest, LateHandshakeFailureMissingClientCerts) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, server_config));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(real_transport));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
ASSERT_THAT(rv, IsOk());
@@ -4352,10 +4352,10 @@ TEST_F(SSLClientSocketTest, LateHandshakeFailureSendClientCerts) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, server_config));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(real_transport));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
ASSERT_THAT(rv, IsOk());
@@ -4404,10 +4404,10 @@ TEST_F(SSLClientSocketTest, AccessDeniedNoClientCerts) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, server_config));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(real_transport));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
ASSERT_THAT(rv, IsOk());
@@ -4451,10 +4451,10 @@ TEST_F(SSLClientSocketTest, AccessDeniedClientCerts) {
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, server_config));
TestCompletionCallback callback;
- std::unique_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr(), nullptr, nullptr, nullptr, NetLogSource()));
- std::unique_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(std::move(real_transport)));
+ auto real_transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, nullptr, NetLogSource());
+ auto transport =
+ std::make_unique<FakeBlockingStreamSocket>(std::move(real_transport));
FakeBlockingStreamSocket* raw_transport = transport.get();
int rv = callback.GetResult(transport->Connect(callback.callback()));
ASSERT_THAT(rv, IsOk());
@@ -4932,8 +4932,8 @@ TEST_P(SSLClientSocketReadTest, IdleAfterRead) {
server_listener.Accept(&server_transport, server_callback.callback());
TestCompletionCallback client_callback;
- std::unique_ptr<TCPClientSocket> client_transport(new TCPClientSocket(
- AddressList(server_address), nullptr, nullptr, nullptr, NetLogSource()));
+ auto client_transport = std::make_unique<TCPClientSocket>(
+ AddressList(server_address), nullptr, nullptr, nullptr, NetLogSource());
int client_rv = client_transport->Connect(client_callback.callback());
EXPECT_THAT(server_callback.GetResult(server_rv), IsOk());
@@ -5087,23 +5087,23 @@ TEST_F(SSLClientSocketTest, Tag) {
ASSERT_TRUE(
StartEmbeddedTestServer(EmbeddedTestServer::CERT_OK, SSLServerConfig()));
- std::unique_ptr<StreamSocket> transport(new TCPClientSocket(
- addr(), nullptr, nullptr, NetLog::Get(), NetLogSource()));
+ auto transport = std::make_unique<TCPClientSocket>(
+ addr(), nullptr, nullptr, NetLog::Get(), NetLogSource());
- MockTaggingStreamSocket* tagging_sock =
- new MockTaggingStreamSocket(std::move(transport));
+ auto tagging_sock =
+ std::make_unique<MockTaggingStreamSocket>(std::move(transport));
+ auto* tagging_sock_ptr = tagging_sock.get();
// |sock| takes ownership of |tagging_sock|, but keep a
// non-owning pointer to it.
- std::unique_ptr<SSLClientSocket> sock(
- CreateSSLClientSocket(std::unique_ptr<StreamSocket>(tagging_sock),
- host_port_pair(), SSLConfig()));
+ std::unique_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
+ std::move(tagging_sock), host_port_pair(), SSLConfig()));
- EXPECT_EQ(tagging_sock->tag(), SocketTag());
+ EXPECT_EQ(tagging_sock_ptr->tag(), SocketTag());
#if BUILDFLAG(IS_ANDROID)
SocketTag tag(0x12345678, 0x87654321);
sock->ApplySocketTag(tag);
- EXPECT_EQ(tagging_sock->tag(), tag);
+ EXPECT_EQ(tagging_sock_ptr->tag(), tag);
#endif // BUILDFLAG(IS_ANDROID)
}
diff --git a/chromium/net/socket/ssl_connect_job.cc b/chromium/net/socket/ssl_connect_job.cc
index d6f9c9d0eb2..7c26c38069c 100644
--- a/chromium/net/socket/ssl_connect_job.cc
+++ b/chromium/net/socket/ssl_connect_job.cc
@@ -277,7 +277,7 @@ int SSLConnectJob::DoTransportConnect() {
absl::optional<TransportConnectJob::EndpointResultOverride>
endpoint_result_override;
if (ech_retry_configs_) {
- DCHECK(base::FeatureList::IsEnabled(features::kEncryptedClientHello));
+ DCHECK(ssl_client_context()->EncryptedClientHelloEnabled());
DCHECK(endpoint_result_);
endpoint_result_override.emplace(*endpoint_result_, dns_aliases_);
}
@@ -391,7 +391,7 @@ int SSLConnectJob::DoSSLConnect() {
ssl_config.privacy_mode = params_->privacy_mode();
ssl_config.disable_legacy_crypto = disable_legacy_crypto_with_fallback_;
- if (base::FeatureList::IsEnabled(features::kEncryptedClientHello)) {
+ if (ssl_client_context()->EncryptedClientHelloEnabled()) {
if (ech_retry_configs_) {
ssl_config.ech_config_list = *ech_retry_configs_;
} else if (endpoint_result_) {
@@ -445,7 +445,7 @@ int SSLConnectJob::DoSSLConnectComplete(int result) {
endpoint_result_ && !endpoint_result_->metadata.ech_config_list.empty();
if (!ech_retry_configs_ && result == ERR_ECH_NOT_NEGOTIATED &&
- base::FeatureList::IsEnabled(features::kEncryptedClientHello)) {
+ ssl_client_context()->EncryptedClientHelloEnabled()) {
// We used ECH, and the server could not decrypt the ClientHello. However,
// it was able to handshake with the public name and send authenticated
// retry configs. If this is not the first time around, retry the connection
@@ -553,14 +553,16 @@ int SSLConnectJob::DoSSLConnectComplete(int result) {
//
// SHA-1 certificate chains are no longer accepted, however servers may
// send extra unused certificates, most commonly a copy of the trust
- // anchor.
- bool sent_sha1_cert =
- ssl_info.unverified_cert &&
- x509_util::HasSHA1Signature(ssl_info.unverified_cert->cert_buffer());
+ // anchor. We only need to check for RSASSA-PKCS1-v1_5 signatures, because
+ // other SHA-1 signature types have already been removed from the
+ // ClientHello.
+ bool sent_sha1_cert = ssl_info.unverified_cert &&
+ x509_util::HasRsaPkcs1Sha1Signature(
+ ssl_info.unverified_cert->cert_buffer());
if (!sent_sha1_cert && ssl_info.unverified_cert) {
for (const auto& cert :
ssl_info.unverified_cert->intermediate_buffers()) {
- if (x509_util::HasSHA1Signature(cert.get())) {
+ if (x509_util::HasRsaPkcs1Sha1Signature(cert.get())) {
sent_sha1_cert = true;
break;
}
@@ -575,7 +577,7 @@ int SSLConnectJob::DoSSLConnectComplete(int result) {
: SSLLegacyCryptoFallback::kUnknownReason;
}
}
- UMA_HISTOGRAM_ENUMERATION("Net.SSLLegacyCryptoFallback", fallback);
+ UMA_HISTOGRAM_ENUMERATION("Net.SSLLegacyCryptoFallback2", fallback);
}
base::UmaHistogramSparse("Net.SSL_Connection_Error", std::abs(result));
diff --git a/chromium/net/socket/ssl_connect_job_unittest.cc b/chromium/net/socket/ssl_connect_job_unittest.cc
index 8decba5028e..cb327a5139d 100644
--- a/chromium/net/socket/ssl_connect_job_unittest.cc
+++ b/chromium/net/socket/ssl_connect_job_unittest.cc
@@ -97,35 +97,38 @@ class SSLConnectJobTest : public WithTaskEnvironment, public testing::Test {
: WithTaskEnvironment(base::test::TaskEnvironment::TimeSource::MOCK_TIME),
proxy_resolution_service_(
ConfiguredProxyResolutionService::CreateDirect()),
- ssl_config_service_(new SSLConfigServiceDefaults),
+ ssl_config_service_(std::make_unique<SSLConfigServiceDefaults>()),
http_auth_handler_factory_(HttpAuthHandlerFactory::CreateDefault()),
session_(CreateNetworkSession()),
- direct_transport_socket_params_(new TransportSocketParams(
- url::SchemeHostPort(url::kHttpsScheme, "host", 443),
- NetworkIsolationKey(),
- SecureDnsPolicy::kAllow,
- OnHostResolutionCallback(),
- /*supported_alpns=*/{"h2", "http/1.1"})),
+ direct_transport_socket_params_(
+ base::MakeRefCounted<TransportSocketParams>(
+ url::SchemeHostPort(url::kHttpsScheme, "host", 443),
+ NetworkIsolationKey(),
+ SecureDnsPolicy::kAllow,
+ OnHostResolutionCallback(),
+ /*supported_alpns=*/
+ base::flat_set<std::string>({"h2", "http/1.1"}))),
proxy_transport_socket_params_(
- new TransportSocketParams(HostPortPair("proxy", 443),
- NetworkIsolationKey(),
- SecureDnsPolicy::kAllow,
- OnHostResolutionCallback(),
- /*supported_alpns=*/{})),
- socks_socket_params_(
- new SOCKSSocketParams(proxy_transport_socket_params_,
- true,
- HostPortPair("sockshost", 443),
- NetworkIsolationKey(),
- TRAFFIC_ANNOTATION_FOR_TESTS)),
- http_proxy_socket_params_(
- new HttpProxySocketParams(proxy_transport_socket_params_,
- nullptr /* ssl_params */,
- false /* is_quic */,
- HostPortPair("host", 80),
- /*tunnel=*/true,
- TRAFFIC_ANNOTATION_FOR_TESTS,
- NetworkIsolationKey())),
+ base::MakeRefCounted<TransportSocketParams>(
+ HostPortPair("proxy", 443),
+ NetworkIsolationKey(),
+ SecureDnsPolicy::kAllow,
+ OnHostResolutionCallback(),
+ /*supported_alpns=*/base::flat_set<std::string>({}))),
+ socks_socket_params_(base::MakeRefCounted<SOCKSSocketParams>(
+ proxy_transport_socket_params_,
+ true,
+ HostPortPair("sockshost", 443),
+ NetworkIsolationKey(),
+ TRAFFIC_ANNOTATION_FOR_TESTS)),
+ http_proxy_socket_params_(base::MakeRefCounted<HttpProxySocketParams>(
+ proxy_transport_socket_params_,
+ nullptr /* ssl_params */,
+ false /* is_quic */,
+ HostPortPair("host", 80),
+ /*tunnel=*/true,
+ TRAFFIC_ANNOTATION_FOR_TESTS,
+ NetworkIsolationKey())),
common_connect_job_params_(session_->CreateCommonConnectJobParams()) {}
~SSLConnectJobTest() override = default;
@@ -158,7 +161,7 @@ class SSLConnectJobTest : public WithTaskEnvironment, public testing::Test {
"Basic realm=MyRealm1", AuthCredentials(kFoo, kBar), "/");
}
- HttpNetworkSession* CreateNetworkSession() {
+ std::unique_ptr<HttpNetworkSession> CreateNetworkSession() {
HttpNetworkSessionContext session_context;
session_context.host_resolver = &host_resolver_;
session_context.cert_verifier = &cert_verifier_;
@@ -171,7 +174,8 @@ class SSLConnectJobTest : public WithTaskEnvironment, public testing::Test {
http_auth_handler_factory_.get();
session_context.http_server_properties = &http_server_properties_;
session_context.quic_context = &quic_context_;
- return new HttpNetworkSession(HttpNetworkSessionParams(), session_context);
+ return std::make_unique<HttpNetworkSession>(HttpNetworkSessionParams(),
+ session_context);
}
protected:
@@ -655,7 +659,7 @@ TEST_F(SSLConnectJobTest, LegacyCryptoFallbackHistograms) {
test_delegate.StartJobExpectingResult(ssl_connect_job.get(), OK,
/*expect_sync_result=*/false);
- tester.ExpectUniqueSample("Net.SSLLegacyCryptoFallback", test.expected, 1);
+ tester.ExpectUniqueSample("Net.SSLLegacyCryptoFallback2", test.expected, 1);
}
}
@@ -1263,7 +1267,9 @@ TEST_F(SSLConnectJobTest, EncryptedClientHello) {
endpoint2.ip_endpoints = {IPEndPoint(ParseIP("2::"), 8442)};
endpoint2.metadata.supported_protocol_alpns = {"http/1.1"};
endpoint2.metadata.ech_config_list = ech_config_list2;
- host_resolver_.rules()->AddRule("host", std::vector{endpoint1, endpoint2});
+ host_resolver_.rules()->AddRule(
+ "host", MockHostResolverBase::RuleResolver::RuleResult(
+ std::vector{endpoint1, endpoint2}));
for (bool feature_enabled : {true, false}) {
SCOPED_TRACE(feature_enabled);
@@ -1336,7 +1342,9 @@ TEST_F(SSLConnectJobTest, ECHStaleConfig) {
endpoint2.ip_endpoints = {IPEndPoint(ParseIP("2::"), 8442)};
endpoint2.metadata.supported_protocol_alpns = {"http/1.1"};
endpoint2.metadata.ech_config_list = ech_config_list2;
- host_resolver_.rules()->AddRule("host", std::vector{endpoint1, endpoint2});
+ host_resolver_.rules()->AddRule(
+ "host", MockHostResolverBase::RuleResolver::RuleResult(
+ std::vector{endpoint1, endpoint2}));
// The first connection attempt will be to `endpoint1`, which will fail.
StaticSocketDataProvider data1;
@@ -1396,7 +1404,9 @@ TEST_F(SSLConnectJobTest, ECHRollback) {
endpoint2.ip_endpoints = {IPEndPoint(ParseIP("2::"), 8442)};
endpoint2.metadata.supported_protocol_alpns = {"http/1.1"};
endpoint2.metadata.ech_config_list = ech_config_list2;
- host_resolver_.rules()->AddRule("host", std::vector{endpoint1, endpoint2});
+ host_resolver_.rules()->AddRule(
+ "host", MockHostResolverBase::RuleResolver::RuleResult(
+ std::vector{endpoint1, endpoint2}));
// The first connection attempt will be to `endpoint1`, which will fail.
StaticSocketDataProvider data1;
@@ -1453,7 +1463,9 @@ TEST_F(SSLConnectJobTest, ECHTooManyRetries) {
endpoint.ip_endpoints = {IPEndPoint(ParseIP("1::"), 8441)};
endpoint.metadata.supported_protocol_alpns = {"http/1.1"};
endpoint.metadata.ech_config_list = ech_config_list1;
- host_resolver_.rules()->AddRule("host", std::vector{endpoint});
+ host_resolver_.rules()->AddRule(
+ "host",
+ MockHostResolverBase::RuleResolver::RuleResult(std::vector{endpoint}));
// The first connection attempt will succeed.
StaticSocketDataProvider data1;
@@ -1502,7 +1514,9 @@ TEST_F(SSLConnectJobTest, ECHWrongRetryError) {
endpoint.ip_endpoints = {IPEndPoint(ParseIP("1::"), 8441)};
endpoint.metadata.supported_protocol_alpns = {"http/1.1"};
endpoint.metadata.ech_config_list = ech_config_list1;
- host_resolver_.rules()->AddRule("host", std::vector{endpoint});
+ host_resolver_.rules()->AddRule(
+ "host",
+ MockHostResolverBase::RuleResolver::RuleResult(std::vector{endpoint}));
// The first connection attempt will succeed.
StaticSocketDataProvider data1;
@@ -1547,7 +1561,9 @@ TEST_F(SSLConnectJobTest, ECHRecoveryThenLegacyCrypto) {
endpoint2.ip_endpoints = {IPEndPoint(ParseIP("2::"), 8442)};
endpoint2.metadata.supported_protocol_alpns = {"http/1.1"};
endpoint2.metadata.ech_config_list = ech_config_list2;
- host_resolver_.rules()->AddRule("host", std::vector{endpoint1, endpoint2});
+ host_resolver_.rules()->AddRule(
+ "host", MockHostResolverBase::RuleResolver::RuleResult(
+ std::vector{endpoint1, endpoint2}));
// The first connection attempt will be to `endpoint1`, which will fail.
StaticSocketDataProvider data1;
@@ -1623,7 +1639,9 @@ TEST_F(SSLConnectJobTest, LegacyCryptoThenECHRecovery) {
endpoint2.ip_endpoints = {IPEndPoint(ParseIP("2::"), 8442)};
endpoint2.metadata.supported_protocol_alpns = {"http/1.1"};
endpoint2.metadata.ech_config_list = ech_config_list2;
- host_resolver_.rules()->AddRule("host", std::vector{endpoint1, endpoint2});
+ host_resolver_.rules()->AddRule(
+ "host", MockHostResolverBase::RuleResolver::RuleResult(
+ std::vector{endpoint1, endpoint2}));
// The first connection attempt will be to `endpoint1`, which will fail.
StaticSocketDataProvider data1;
diff --git a/chromium/net/socket/ssl_server_socket.h b/chromium/net/socket/ssl_server_socket.h
index b5221ed9047..4b1dcc97d07 100644
--- a/chromium/net/socket/ssl_server_socket.h
+++ b/chromium/net/socket/ssl_server_socket.h
@@ -37,7 +37,7 @@ class X509Certificate;
// A server socket that uses SSL as the transport layer.
class SSLServerSocket : public SSLSocket {
public:
- ~SSLServerSocket() override {}
+ ~SSLServerSocket() override = default;
// Perform the SSL server handshake, and notify the supplied callback
// if the process completes asynchronously. If Disconnect is called before
@@ -48,7 +48,7 @@ class SSLServerSocket : public SSLSocket {
class SSLServerContext {
public:
- virtual ~SSLServerContext() {}
+ virtual ~SSLServerContext() = default;
// Creates an SSL server socket over an already-connected transport socket.
// The caller must ensure the returned socket does not outlive the server
diff --git a/chromium/net/socket/ssl_server_socket_unittest.cc b/chromium/net/socket/ssl_server_socket_unittest.cc
index 1225c7aa194..71b37bfa882 100644
--- a/chromium/net/socket/ssl_server_socket_unittest.cc
+++ b/chromium/net/socket/ssl_server_socket_unittest.cc
@@ -349,13 +349,14 @@ TEST(FakeSocketTest, DataTransfer) {
class SSLServerSocketTest : public PlatformTest, public WithTaskEnvironment {
public:
SSLServerSocketTest()
- : ssl_config_service_(new TestSSLConfigService(SSLContextConfig())),
- cert_verifier_(new MockCertVerifier()),
- client_cert_verifier_(new MockClientCertVerifier()),
- transport_security_state_(new TransportSecurityState),
- ct_policy_enforcer_(new MockCTPolicyEnforcer),
- ssl_client_session_cache_(
- new SSLClientSessionCache(SSLClientSessionCache::Config())) {}
+ : ssl_config_service_(
+ std::make_unique<TestSSLConfigService>(SSLContextConfig())),
+ cert_verifier_(std::make_unique<MockCertVerifier>()),
+ client_cert_verifier_(std::make_unique<MockClientCertVerifier>()),
+ transport_security_state_(std::make_unique<TransportSecurityState>()),
+ ct_policy_enforcer_(std::make_unique<MockCTPolicyEnforcer>()),
+ ssl_client_session_cache_(std::make_unique<SSLClientSessionCache>(
+ SSLClientSessionCache::Config())) {}
void SetUp() override {
PlatformTest::SetUp();
@@ -448,8 +449,8 @@ class SSLServerSocketTest : public PlatformTest, public WithTaskEnvironment {
static const uint8_t kClientCertCAName[] = {
0x30, 0x0f, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55,
0x04, 0x03, 0x0c, 0x04, 0x42, 0x20, 0x43, 0x41};
- server_ssl_config_.cert_authorities.push_back(std::string(
- std::begin(kClientCertCAName), std::end(kClientCertCAName)));
+ server_ssl_config_.cert_authorities.emplace_back(
+ std::begin(kClientCertCAName), std::end(kClientCertCAName));
scoped_refptr<X509Certificate> expected_client_cert(
ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName));
diff --git a/chromium/net/socket/ssl_socket.h b/chromium/net/socket/ssl_socket.h
index 61410da3b9d..301807e523d 100644
--- a/chromium/net/socket/ssl_socket.h
+++ b/chromium/net/socket/ssl_socket.h
@@ -15,18 +15,18 @@ namespace net {
// and server SSL sockets.
class NET_EXPORT SSLSocket : public StreamSocket {
public:
- ~SSLSocket() override {}
+ ~SSLSocket() override = default;
- // Exports data derived from the SSL master-secret (see RFC 5705).
- // If |has_context| is false, uses the no-context construction from the
- // RFC and |context| is ignored. The call will fail with an error if
- // the socket is not connected or the SSL implementation does not
- // support the operation.
- virtual int ExportKeyingMaterial(const base::StringPiece& label,
- bool has_context,
- const base::StringPiece& context,
- unsigned char* out,
- unsigned int outlen) = 0;
+ // Exports data derived from the SSL master-secret (see RFC 5705).
+ // If |has_context| is false, uses the no-context construction from the
+ // RFC and |context| is ignored. The call will fail with an error if
+ // the socket is not connected or the SSL implementation does not
+ // support the operation.
+ virtual int ExportKeyingMaterial(const base::StringPiece& label,
+ bool has_context,
+ const base::StringPiece& context,
+ unsigned char* out,
+ unsigned int outlen) = 0;
};
} // namespace net
diff --git a/chromium/net/socket/stream_socket.h b/chromium/net/socket/stream_socket.h
index 6c2f8b2a3cc..f3eb4fc254e 100644
--- a/chromium/net/socket/stream_socket.h
+++ b/chromium/net/socket/stream_socket.h
@@ -27,7 +27,7 @@ class NET_EXPORT StreamSocket : public Socket {
public:
using BeforeConnectCallback = base::RepeatingCallback<int()>;
- ~StreamSocket() override {}
+ ~StreamSocket() override = default;
// Sets a callback to be invoked before establishing a connection. This allows
// setting options, like receive and send buffer size, when they will take
diff --git a/chromium/net/socket/tcp_client_socket.cc b/chromium/net/socket/tcp_client_socket.cc
index 6b25b06bdaa..3f921f41b9c 100644
--- a/chromium/net/socket/tcp_client_socket.cc
+++ b/chromium/net/socket/tcp_client_socket.cc
@@ -36,7 +36,7 @@ TCPClientSocket::TCPClientSocket(
NetworkQualityEstimator* network_quality_estimator,
net::NetLog* net_log,
const net::NetLogSource& source,
- NetworkChangeNotifier::NetworkHandle network)
+ handles::NetworkHandle network)
: TCPClientSocket(
std::make_unique<TCPSocket>(std::move(socket_performance_watcher),
net_log,
@@ -56,7 +56,18 @@ TCPClientSocket::TCPClientSocket(std::unique_ptr<TCPSocket> connected_socket,
// TODO(https://crbug.com/1123197: Pass non-null
// NetworkQualityEstimator
nullptr /* network_quality_estimator */,
- NetworkChangeNotifier::kInvalidNetworkHandle) {}
+ handles::kInvalidNetworkHandle) {}
+
+TCPClientSocket::TCPClientSocket(
+ std::unique_ptr<TCPSocket> unconnected_socket,
+ const AddressList& addresses,
+ NetworkQualityEstimator* network_quality_estimator)
+ : TCPClientSocket(std::move(unconnected_socket),
+ addresses,
+ -1 /* current_address_index */,
+ nullptr /* bind_address */,
+ network_quality_estimator,
+ handles::kInvalidNetworkHandle) {}
TCPClientSocket::~TCPClientSocket() {
Disconnect();
@@ -73,7 +84,7 @@ std::unique_ptr<TCPClientSocket> TCPClientSocket::CreateFromBoundSocket(
return base::WrapUnique(new TCPClientSocket(
std::move(bound_socket), addresses, -1 /* current_address_index */,
std::make_unique<IPEndPoint>(bound_address), network_quality_estimator,
- NetworkChangeNotifier::kInvalidNetworkHandle));
+ handles::kInvalidNetworkHandle));
}
int TCPClientSocket::Bind(const IPEndPoint& address) {
@@ -150,7 +161,7 @@ TCPClientSocket::TCPClientSocket(
int current_address_index,
std::unique_ptr<IPEndPoint> bind_address,
NetworkQualityEstimator* network_quality_estimator,
- NetworkChangeNotifier::NetworkHandle network)
+ handles::NetworkHandle network)
: socket_(std::move(socket)),
bind_address_(std::move(bind_address)),
addresses_(addresses),
@@ -232,9 +243,7 @@ int TCPClientSocket::DoConnect() {
next_connect_state_ = CONNECT_STATE_CONNECT_COMPLETE;
- if (socket_->IsValid()) {
- DCHECK(bind_address_);
- } else {
+ if (!socket_->IsValid()) {
int result = OpenSocket(endpoint.GetFamily());
if (result != OK)
return result;
@@ -541,7 +550,7 @@ int TCPClientSocket::OpenSocket(AddressFamily family) {
if (result != OK)
return result;
- if (network_ != NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (network_ != handles::kInvalidNetworkHandle) {
result = socket_->BindToNetwork(network_);
if (result != OK) {
socket_->Close();
diff --git a/chromium/net/socket/tcp_client_socket.h b/chromium/net/socket/tcp_client_socket.h
index 891f36b21ad..b8508252db4 100644
--- a/chromium/net/socket/tcp_client_socket.h
+++ b/chromium/net/socket/tcp_client_socket.h
@@ -62,14 +62,19 @@ class NET_EXPORT TCPClientSocket : public TransportClientSocket,
NetworkQualityEstimator* network_quality_estimator,
net::NetLog* net_log,
const net::NetLogSource& source,
- NetworkChangeNotifier::NetworkHandle network =
- NetworkChangeNotifier::kInvalidNetworkHandle);
+ handles::NetworkHandle network = handles::kInvalidNetworkHandle);
// Adopts the given, connected socket and then acts as if Connect() had been
// called. This function is used by TCPServerSocket and for testing.
TCPClientSocket(std::unique_ptr<TCPSocket> connected_socket,
const IPEndPoint& peer_address);
+ // Adopts an unconnected TCPSocket. This function is used by
+ // TCPClientSocketBrokered.
+ TCPClientSocket(std::unique_ptr<TCPSocket> unconnected_socket,
+ const AddressList& addresses,
+ NetworkQualityEstimator* network_quality_estimator);
+
// Creates a TCPClientSocket from a bound-but-not-connected socket.
static std::unique_ptr<TCPClientSocket> CreateFromBoundSocket(
std::unique_ptr<TCPSocket> bound_socket,
@@ -140,13 +145,13 @@ class NET_EXPORT TCPClientSocket : public TransportClientSocket,
// address index in `addresses` of the server `socket` is connected to, or -1
// if not connected. `bind_address`, if present, is the address `socket` is
// bound to. `network` is the network the socket is required to be bound to,
- // or NetworkChangeNotifier::kInvalidNetworkHandle if no binding is required.
+ // or handles::kInvalidNetworkHandle if no binding is required.
TCPClientSocket(std::unique_ptr<TCPSocket> socket,
const AddressList& addresses,
int current_address_index,
std::unique_ptr<IPEndPoint> bind_address,
NetworkQualityEstimator* network_quality_estimator,
- NetworkChangeNotifier::NetworkHandle network);
+ handles::NetworkHandle network);
// A helper method shared by Read() and ReadIfReady(). If |read_if_ready| is
// set to true, ReadIfReady() will be used instead of Read().
@@ -236,7 +241,7 @@ class NET_EXPORT TCPClientSocket : public TransportClientSocket,
base::OneShotTimer connect_attempt_timer_;
- NetworkChangeNotifier::NetworkHandle network_;
+ handles::NetworkHandle network_;
base::WeakPtrFactory<TCPClientSocket> weak_ptr_factory_{this};
};
diff --git a/chromium/net/socket/tcp_client_socket_unittest.cc b/chromium/net/socket/tcp_client_socket_unittest.cc
index 4d5d3f1b416..0dd88c4b995 100644
--- a/chromium/net/socket/tcp_client_socket_unittest.cc
+++ b/chromium/net/socket/tcp_client_socket_unittest.cc
@@ -330,8 +330,7 @@ TEST_F(TCPClientSocketTest, MAYBE_TestSocketPerformanceWatcher) {
for (size_t i = 0; i < kNumIPs; ++i)
ip_list.push_back(IPAddress(72, 14, 213, i));
- std::unique_ptr<TestSocketPerformanceWatcher> watcher(
- new TestSocketPerformanceWatcher());
+ auto watcher = std::make_unique<TestSocketPerformanceWatcher>();
TestSocketPerformanceWatcher* watcher_ptr = watcher.get();
std::vector<std::string> aliases({"example.com"});
diff --git a/chromium/net/socket/tcp_socket_posix.cc b/chromium/net/socket/tcp_socket_posix.cc
index 8d9f5bc5ca6..ac53c0f3705 100644
--- a/chromium/net/socket/tcp_socket_posix.cc
+++ b/chromium/net/socket/tcp_socket_posix.cc
@@ -182,8 +182,7 @@ int TCPSocketPosix::Open(AddressFamily family) {
return rv;
}
-int TCPSocketPosix::BindToNetwork(
- NetworkChangeNotifier::NetworkHandle network) {
+int TCPSocketPosix::BindToNetwork(handles::NetworkHandle network) {
DCHECK(IsValid());
DCHECK(!IsConnected());
#if BUILDFLAG(IS_ANDROID)
@@ -474,7 +473,7 @@ void TCPSocketPosix::Close() {
}
bool TCPSocketPosix::IsValid() const {
- return socket_ != NULL && socket_->socket_fd() != kInvalidSocket;
+ return socket_ != nullptr && socket_->socket_fd() != kInvalidSocket;
}
void TCPSocketPosix::DetachFromThread() {
@@ -500,14 +499,6 @@ void TCPSocketPosix::EndLoggingMultipleConnectAttempts(int net_error) {
}
}
-int TCPSocketPosix::OpenAndReleaseSocketDescriptor(AddressFamily family,
- SocketDescriptor* out) {
- std::unique_ptr<SocketPosix> new_socket = std::make_unique<SocketPosix>();
- int rv = new_socket->Open(ConvertAddressFamily(family));
- *out = new_socket->ReleaseConnectedSocket();
- return rv;
-}
-
SocketDescriptor TCPSocketPosix::ReleaseSocketDescriptorForTesting() {
SocketDescriptor socket_descriptor = socket_->ReleaseConnectedSocket();
socket_.reset();
diff --git a/chromium/net/socket/tcp_socket_posix.h b/chromium/net/socket/tcp_socket_posix.h
index 7d5feff6b8e..6cad47a82e7 100644
--- a/chromium/net/socket/tcp_socket_posix.h
+++ b/chromium/net/socket/tcp_socket_posix.h
@@ -13,7 +13,7 @@
#include "net/base/address_family.h"
#include "net/base/completion_once_callback.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/log/net_log_with_source.h"
#include "net/socket/socket_descriptor.h"
#include "net/socket/socket_performance_watcher.h"
@@ -150,11 +150,6 @@ class NET_EXPORT TCPSocketPosix {
const NetLogWithSource& net_log() const { return net_log_; }
- // Opens the socket and returns the underlying SocketDescriptor as well as the
- // result of Open(). This method is used by the socket broker.
- static int OpenAndReleaseSocketDescriptor(AddressFamily family,
- SocketDescriptor* out);
-
// Return the underlying SocketDescriptor and clean up this object, which may
// no longer be used. This method should be used only for testing. No read,
// write, or accept operations should be pending.
@@ -177,7 +172,7 @@ class NET_EXPORT TCPSocketPosix {
// Connect() and/or Bind(). This call will fail if `network` has disconnected.
// Communication using this socket will fail if `network` disconnects.
// Returns a net error code.
- int BindToNetwork(NetworkChangeNotifier::NetworkHandle network);
+ int BindToNetwork(handles::NetworkHandle network);
private:
void AcceptCompleted(std::unique_ptr<TCPSocketPosix>* tcp_socket,
diff --git a/chromium/net/socket/tcp_socket_unittest.cc b/chromium/net/socket/tcp_socket_unittest.cc
index 28264b40b4e..be9ab1b5982 100644
--- a/chromium/net/socket/tcp_socket_unittest.cc
+++ b/chromium/net/socket/tcp_socket_unittest.cc
@@ -178,8 +178,8 @@ class TCPSocketTest : public PlatformTest, public WithTaskEnvironment {
TestCompletionCallback connect_callback;
- std::unique_ptr<TestSocketPerformanceWatcher> watcher(
- new TestSocketPerformanceWatcher(should_notify_updated_rtt));
+ auto watcher = std::make_unique<TestSocketPerformanceWatcher>(
+ should_notify_updated_rtt);
TestSocketPerformanceWatcher* watcher_ptr = watcher.get();
TCPSocket connecting_socket(std::move(watcher), nullptr, NetLogSource());
@@ -1020,7 +1020,7 @@ TEST_F(TCPSocketTest, BindToNetwork) {
if (!NetworkChangeNotifier::AreNetworkHandlesSupported())
GTEST_SKIP() << "Network handles are required to test BindToNetwork.";
- const NetworkChangeNotifier::NetworkHandle wrong_network_handle = 65536;
+ const handles::NetworkHandle wrong_network_handle = 65536;
// Try binding to this IP to trigger the underlying BindToNetwork call.
const IPEndPoint ip(IPAddress::IPv4Localhost(), 0);
// TestCompletionCallback connect_callback;
@@ -1034,9 +1034,9 @@ TEST_F(TCPSocketTest, BindToNetwork) {
EXPECT_NE(ERR_NOT_IMPLEMENTED, rv);
// Connecting using an existing network should succeed.
- const NetworkChangeNotifier::NetworkHandle network_handle =
+ const handles::NetworkHandle network_handle =
NetworkChangeNotifier::GetDefaultNetwork();
- if (network_handle != NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (network_handle != handles::kInvalidNetworkHandle) {
TCPClientSocket connecting_socket(local_address_list(), nullptr, nullptr,
nullptr, NetLogSource(),
wrong_network_handle);
diff --git a/chromium/net/socket/tcp_socket_win.cc b/chromium/net/socket/tcp_socket_win.cc
index ad385406162..f8ddee0f0a0 100644
--- a/chromium/net/socket/tcp_socket_win.cc
+++ b/chromium/net/socket/tcp_socket_win.cc
@@ -144,7 +144,7 @@ class TCPSocketWin::Core : public base::RefCounted<Core> {
class ReadDelegate : public base::win::ObjectWatcher::Delegate {
public:
explicit ReadDelegate(Core* core) : core_(core) {}
- ~ReadDelegate() override {}
+ ~ReadDelegate() override = default;
// base::ObjectWatcher::Delegate methods:
void OnObjectSignaled(HANDLE object) override;
@@ -156,7 +156,7 @@ class TCPSocketWin::Core : public base::RefCounted<Core> {
class WriteDelegate : public base::win::ObjectWatcher::Delegate {
public:
explicit WriteDelegate(Core* core) : core_(core) {}
- ~WriteDelegate() override {}
+ ~WriteDelegate() override = default;
// base::ObjectWatcher::Delegate methods:
void OnObjectSignaled(HANDLE object) override;
@@ -307,7 +307,7 @@ int TCPSocketWin::AdoptConnectedSocket(SocketDescriptor socket,
return result;
}
- core_ = new Core(this);
+ core_ = base::MakeRefCounted<Core>(this);
peer_address_ = std::make_unique<IPEndPoint>(peer_address);
return OK;
@@ -749,29 +749,6 @@ void TCPSocketWin::EndLoggingMultipleConnectAttempts(int net_error) {
}
}
-int TCPSocketWin::OpenAndReleaseSocketDescriptor(AddressFamily family,
- SocketDescriptor* out) {
- THREAD_CHECKER(thread_checker);
- DCHECK_CALLED_ON_VALID_THREAD(thread_checker);
-
- SOCKET new_socket = CreatePlatformSocket(ConvertAddressFamily(family),
- SOCK_STREAM, IPPROTO_TCP);
- int os_error = WSAGetLastError();
- int result = OK;
- if (new_socket == INVALID_SOCKET) {
- PLOG(ERROR) << "CreatePlatformSocket() returned an error";
- result = MapSystemError(os_error);
- }
-
- if (!SetNonBlockingAndGetError(new_socket, &os_error)) {
- result = MapSystemError(os_error);
- }
-
- *out = new_socket;
- new_socket = INVALID_SOCKET;
- return result;
-}
-
SocketDescriptor TCPSocketWin::ReleaseSocketDescriptorForTesting() {
SocketDescriptor socket_descriptor = socket_;
socket_ = INVALID_SOCKET;
@@ -804,8 +781,8 @@ int TCPSocketWin::AcceptInternal(std::unique_ptr<TCPSocketWin>* socket,
net_log_.EndEventWithNetErrorCode(NetLogEventType::TCP_ACCEPT, net_error);
return net_error;
}
- std::unique_ptr<TCPSocketWin> tcp_socket(
- new TCPSocketWin(nullptr, net_log_.net_log(), net_log_.source()));
+ auto tcp_socket = std::make_unique<TCPSocketWin>(nullptr, net_log_.net_log(),
+ net_log_.source());
int adopt_result = tcp_socket->AdoptConnectedSocket(new_socket, ip_end_point);
if (adopt_result != OK) {
net_log_.EndEventWithNetErrorCode(NetLogEventType::TCP_ACCEPT,
@@ -853,7 +830,7 @@ int TCPSocketWin::DoConnect() {
return CreateNetLogIPEndPointParams(peer_address_.get());
});
- core_ = new Core(this);
+ core_ = base::MakeRefCounted<Core>(this);
// WSAEventSelect sets the socket to non-blocking mode as a side effect.
// Our connect() and recv() calls require that the socket be non-blocking.
@@ -1064,7 +1041,7 @@ void TCPSocketWin::ApplySocketTag(const SocketTag& tag) {
CHECK(tag == SocketTag());
}
-int TCPSocketWin::BindToNetwork(NetworkChangeNotifier::NetworkHandle network) {
+int TCPSocketWin::BindToNetwork(handles::NetworkHandle network) {
NOTIMPLEMENTED();
return ERR_NOT_IMPLEMENTED;
}
diff --git a/chromium/net/socket/tcp_socket_win.h b/chromium/net/socket/tcp_socket_win.h
index 1b2ad4ebc84..36fcb08f330 100644
--- a/chromium/net/socket/tcp_socket_win.h
+++ b/chromium/net/socket/tcp_socket_win.h
@@ -17,7 +17,7 @@
#include "net/base/address_family.h"
#include "net/base/completion_once_callback.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/log/net_log_with_source.h"
#include "net/socket/socket_descriptor.h"
#include "net/socket/socket_performance_watcher.h"
@@ -123,11 +123,6 @@ class NET_EXPORT TCPSocketWin : public base::win::ObjectWatcher::Delegate {
const NetLogWithSource& net_log() const { return net_log_; }
- // Opens the socket and returns the underlying SocketDescriptor as well as the
- // result of Open(). This method is used by the socket broker.
- static int OpenAndReleaseSocketDescriptor(AddressFamily family,
- SocketDescriptor* out);
-
// Return the underlying SocketDescriptor and clean up this object, which may
// no longer be used. This method should be used only for testing. No read,
// write, or accept operations should be pending.
@@ -141,7 +136,7 @@ class NET_EXPORT TCPSocketWin : public base::win::ObjectWatcher::Delegate {
void ApplySocketTag(const SocketTag& tag);
// Not implemented. Returns ERR_NOT_IMPLEMENTED.
- int BindToNetwork(NetworkChangeNotifier::NetworkHandle network);
+ int BindToNetwork(handles::NetworkHandle network);
// May return nullptr.
SocketPerformanceWatcher* socket_performance_watcher() const {
diff --git a/chromium/net/socket/transport_client_socket.cc b/chromium/net/socket/transport_client_socket.cc
index 8b3e013d1ac..76e4514725a 100644
--- a/chromium/net/socket/transport_client_socket.cc
+++ b/chromium/net/socket/transport_client_socket.cc
@@ -19,10 +19,4 @@ bool TransportClientSocket::SetKeepAlive(bool enable, int delay_secs) {
return false;
}
-void TransportClientSocket::SetSocketCreatorForTesting(
- base::RepeatingCallback<std::unique_ptr<net::TransportClientSocket>(void)>
- socket_creator) {
- NOTIMPLEMENTED();
-}
-
} // namespace net
diff --git a/chromium/net/socket/transport_client_socket.h b/chromium/net/socket/transport_client_socket.h
index 5ff1edd4dcc..4bb5ec1c8f5 100644
--- a/chromium/net/socket/transport_client_socket.h
+++ b/chromium/net/socket/transport_client_socket.h
@@ -50,12 +50,6 @@ class NET_EXPORT TransportClientSocket : public StreamSocket {
// should always be ready after successful connection or slightly earlier
// during BeforeConnect handlers.
virtual bool SetKeepAlive(bool enable, int delay_secs);
-
- // Sets a callback that returns a TransportClientSocket. Used in tests for
- // TCPClientSocketBrokered to create a MockTCPClientSocket.
- virtual void SetSocketCreatorForTesting(
- base::RepeatingCallback<std::unique_ptr<net::TransportClientSocket>(void)>
- socket_creator);
};
} // namespace net
diff --git a/chromium/net/socket/transport_client_socket_pool.cc b/chromium/net/socket/transport_client_socket_pool.cc
index 8c110567034..39e6f11064f 100644
--- a/chromium/net/socket/transport_client_socket_pool.cc
+++ b/chromium/net/socket/transport_client_socket_pool.cc
@@ -97,7 +97,7 @@ TransportClientSocketPool::Request::Request(
DCHECK_EQ(priority_, MAXIMUM_PRIORITY);
}
-TransportClientSocketPool::Request::~Request() {}
+TransportClientSocketPool::Request::~Request() = default;
void TransportClientSocketPool::Request::AssignJob(ConnectJob* job) {
DCHECK(job);
@@ -220,8 +220,8 @@ bool TransportClientSocketPool::IsStalled() const {
// |max_sockets_per_group_|. (If the number of sockets is equal to
// |max_sockets_per_group_|, then the request is stalled on the group limit,
// which does not count.)
- for (auto it = group_map_.begin(); it != group_map_.end(); ++it) {
- if (it->second->CanUseAdditionalSocketSlot(max_sockets_per_group_))
+ for (const auto& it : group_map_) {
+ if (it.second->CanUseAdditionalSocketSlot(max_sockets_per_group_))
return true;
}
return false;
@@ -744,6 +744,10 @@ base::Value TransportClientSocketPool::GetInfoAsValue(
return base::Value(std::move(dict));
}
+bool TransportClientSocketPool::HasActiveSocket(const GroupId& group_id) const {
+ return HasGroup(group_id);
+}
+
bool TransportClientSocketPool::IdleSocket::IsUsable(
const char** net_log_reason_utf8) const {
DCHECK(net_log_reason_utf8);
@@ -887,8 +891,8 @@ bool TransportClientSocketPool::CloseOneIdleConnectionInHigherLayeredPool() {
// This pool doesn't have any idle sockets. It's possible that a pool at a
// higher layer is holding one of this sockets active, but it's actually idle.
// Query the higher layers.
- for (auto it = higher_pools_.begin(); it != higher_pools_.end(); ++it) {
- if ((*it)->CloseOneIdleConnection())
+ for (auto* higher_pool : higher_pools_) {
+ if (higher_pool->CloseOneIdleConnection())
return true;
}
return false;
@@ -1060,8 +1064,8 @@ bool TransportClientSocketPool::FindTopStalledGroup(Group** group,
Group* top_group = nullptr;
const GroupId* top_group_id = nullptr;
bool has_stalled_group = false;
- for (auto i = group_map_.begin(); i != group_map_.end(); ++i) {
- Group* curr_group = i->second;
+ for (const auto& it : group_map_) {
+ Group* curr_group = it.second;
if (!curr_group->has_unbound_requests())
continue;
if (curr_group->CanUseAdditionalSocketSlot(max_sockets_per_group_)) {
@@ -1073,7 +1077,7 @@ bool TransportClientSocketPool::FindTopStalledGroup(Group** group,
curr_group->TopPendingPriority() > top_group->TopPendingPriority();
if (has_higher_priority) {
top_group = curr_group;
- top_group_id = &i->first;
+ top_group_id = &it.first;
}
}
}
@@ -1775,11 +1779,10 @@ TransportClientSocketPool::Group::FindAndRemoveUnboundRequest(
void TransportClientSocketPool::Group::SetPendingErrorForAllBoundRequests(
int pending_error) {
- for (auto bound_pair = bound_requests_.begin();
- bound_pair != bound_requests_.end(); ++bound_pair) {
+ for (auto& bound_request : bound_requests_) {
// Earlier errors take precedence.
- if (bound_pair->pending_error == OK)
- bound_pair->pending_error = pending_error;
+ if (bound_request.pending_error == OK)
+ bound_request.pending_error = pending_error;
}
}
diff --git a/chromium/net/socket/transport_client_socket_pool.h b/chromium/net/socket/transport_client_socket_pool.h
index e215025ccdc..724c8c0fd30 100644
--- a/chromium/net/socket/transport_client_socket_pool.h
+++ b/chromium/net/socket/transport_client_socket_pool.h
@@ -224,6 +224,7 @@ class NET_EXPORT_PRIVATE TransportClientSocketPool
const ClientSocketHandle* handle) const override;
base::Value GetInfoAsValue(const std::string& name,
const std::string& type) const override;
+ bool HasActiveSocket(const GroupId& group_id) const override;
bool RequestInGroupWithHandleHasJobForTesting(
const GroupId& group_id,
diff --git a/chromium/net/socket/transport_client_socket_pool_unittest.cc b/chromium/net/socket/transport_client_socket_pool_unittest.cc
index 3a6e3e1dd9b..ab55ba4de07 100644
--- a/chromium/net/socket/transport_client_socket_pool_unittest.cc
+++ b/chromium/net/socket/transport_client_socket_pool_unittest.cc
@@ -2063,6 +2063,73 @@ TEST_F(TransportClientSocketPoolTest, NetworkIsolationKeySocks5Proxy) {
session_deps_.host_resolver->request_network_isolation_key(2));
}
+TEST_F(TransportClientSocketPoolTest, HasActiveSocket) {
+ const url::SchemeHostPort kEndpoint1(url::kHttpScheme, "host1.test", 80);
+ const url::SchemeHostPort kEndpoint2(url::kHttpScheme, "host2.test", 80);
+
+ ClientSocketHandle handle;
+ ClientSocketPool::GroupId group_id1(
+ kEndpoint1, PrivacyMode::PRIVACY_MODE_DISABLED, NetworkIsolationKey(),
+ SecureDnsPolicy::kAllow);
+ ClientSocketPool::GroupId group_id2(
+ kEndpoint2, PrivacyMode::PRIVACY_MODE_DISABLED, NetworkIsolationKey(),
+ SecureDnsPolicy::kAllow);
+
+ // HasActiveSocket() must return false before creating a socket.
+ EXPECT_FALSE(pool_->HasActiveSocket(group_id1));
+
+ TestCompletionCallback callback1;
+ int rv1 =
+ handle.Init(group_id1, params_, absl::nullopt /* proxy_annotation_tag */,
+ LOW, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
+ callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
+ pool_.get(), NetLogWithSource());
+ EXPECT_THAT(rv1, IsError(ERR_IO_PENDING));
+
+ // HasActiveSocket() must return true while connecting.
+ EXPECT_TRUE(pool_->HasActiveSocket(group_id1));
+ EXPECT_FALSE(handle.is_initialized());
+ EXPECT_FALSE(handle.socket());
+
+ EXPECT_THAT(callback1.WaitForResult(), IsOk());
+
+ // HasActiveSocket() must return true after handed out.
+ EXPECT_TRUE(pool_->HasActiveSocket(group_id1));
+ EXPECT_TRUE(handle.is_initialized());
+ EXPECT_TRUE(handle.socket());
+
+ handle.Reset();
+
+ // HasActiveSocket returns true for the idle socket.
+ EXPECT_TRUE(pool_->HasActiveSocket(group_id1));
+ // Now we should have 1 idle socket.
+ EXPECT_EQ(1, pool_->IdleSocketCount());
+
+ // HasActiveSocket() for group_id2 must still return false.
+ EXPECT_FALSE(pool_->HasActiveSocket(group_id2));
+
+ TestCompletionCallback callback2;
+ int rv2 =
+ handle.Init(group_id2, params_, absl::nullopt /* proxy_annotation_tag */,
+ LOW, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
+ callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
+ pool_.get(), NetLogWithSource());
+ EXPECT_THAT(rv2, IsError(ERR_IO_PENDING));
+
+ // HasActiveSocket(group_id2) must return true while connecting.
+ EXPECT_TRUE(pool_->HasActiveSocket(group_id2));
+
+ // HasActiveSocket(group_id1) must still return true.
+ EXPECT_TRUE(pool_->HasActiveSocket(group_id2));
+
+ // Close the sockets.
+ pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
+
+ // HasActiveSocket() must return false after closing the socket.
+ EXPECT_FALSE(pool_->HasActiveSocket(group_id1));
+ EXPECT_FALSE(pool_->HasActiveSocket(group_id2));
+}
+
// Test that SocketTag passed into TransportClientSocketPool is applied to
// returned sockets.
#if BUILDFLAG(IS_ANDROID)
diff --git a/chromium/net/socket/transport_connect_job_unittest.cc b/chromium/net/socket/transport_connect_job_unittest.cc
index a30b119525f..449e3f0aafd 100644
--- a/chromium/net/socket/transport_connect_job_unittest.cc
+++ b/chromium/net/socket/transport_connect_job_unittest.cc
@@ -65,7 +65,7 @@ class TransportConnectJobTest : public WithTaskEnvironment,
NetLog::Get(),
nullptr /* websocket_endpoint_lock_manager */) {}
- ~TransportConnectJobTest() override {}
+ ~TransportConnectJobTest() override = default;
static scoped_refptr<TransportSocketParams> DefaultParams() {
return base::MakeRefCounted<TransportSocketParams>(
@@ -479,7 +479,9 @@ TEST_F(TransportConnectJobTest, EndpointResult) {
endpoint.ip_endpoints = {IPEndPoint(ParseIP("1::"), 8443),
IPEndPoint(ParseIP("1.1.1.1"), 8443)};
endpoint.metadata.supported_protocol_alpns = {"h2"};
- host_resolver_.rules()->AddRule(kHostName, std::vector{endpoint});
+ host_resolver_.rules()->AddRule(
+ kHostName,
+ MockHostResolverBase::RuleResolver::RuleResult(std::vector{endpoint}));
// The first access succeeds.
MockTransportClientSocketFactory::Rule rule(
@@ -517,7 +519,8 @@ TEST_F(TransportConnectJobTest, MultipleRoutesFallback) {
endpoints[1].metadata.supported_protocol_alpns = {"h3"};
endpoints[2].ip_endpoints = {IPEndPoint(ParseIP("4::"), 443),
IPEndPoint(ParseIP("4.4.4.4"), 443)};
- host_resolver_.rules()->AddRule(kHostName, endpoints);
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(endpoints));
MockTransportClientSocketFactory::Rule rules[] = {
// `endpoints[0]`'s addresses each fail.
@@ -568,8 +571,9 @@ TEST_F(TransportConnectJobTest, MultipleRoutesIPV4Fallback) {
endpoint2.metadata.supported_protocol_alpns = {"h3"};
endpoint3.ip_endpoints = {IPEndPoint(ParseIP("3::"), 443),
IPEndPoint(ParseIP("3.3.3.3"), 443)};
- host_resolver_.rules()->AddRule(kHostName,
- std::vector{endpoint1, endpoint2, endpoint3});
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(
+ std::vector{endpoint1, endpoint2, endpoint3}));
MockTransportClientSocketFactory::Rule rules[] = {
// `endpoint1`'s IPv6 address fails, but takes long enough that the IPv4
@@ -630,7 +634,8 @@ TEST_F(TransportConnectJobTest, MultipleRoutesSuspended) {
endpoints[0].ip_endpoints = {IPEndPoint(ParseIP("1::"), 8443)};
endpoints[0].metadata.supported_protocol_alpns = {"h3", "h2", "http/1.1"};
endpoints[1].ip_endpoints = {IPEndPoint(ParseIP("2::"), 443)};
- host_resolver_.rules()->AddRule(kHostName, endpoints);
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(endpoints));
// The first connect attempt will fail with `ERR_NETWORK_IO_SUSPENDED`.
// `TransportConnectJob` should not attempt routes after receiving this error.
@@ -667,7 +672,8 @@ TEST_F(TransportConnectJobTest, NoAlpnProtocols) {
endpoints[1].metadata.supported_protocol_alpns = {"baz"};
endpoints[2].ip_endpoints = {IPEndPoint(ParseIP("3::"), 80),
IPEndPoint(ParseIP("3.3.3.3"), 80)};
- host_resolver_.rules()->AddRule(kHostName, endpoints);
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(endpoints));
// `endpoints[2]`'s first address succeeds.
MockTransportClientSocketFactory::Rule rule(
@@ -705,7 +711,8 @@ TEST_F(TransportConnectJobTest, MultipleRoutesAllFailed) {
endpoints[1].metadata.supported_protocol_alpns = {"h3"};
endpoints[2].ip_endpoints = {IPEndPoint(ParseIP("3::"), 443),
IPEndPoint(ParseIP("3.3.3.3"), 443)};
- host_resolver_.rules()->AddRule(kHostName, endpoints);
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(endpoints));
MockTransportClientSocketFactory::Rule rules[] = {
// `endpoints[0]`'s addresses each fail.
@@ -758,7 +765,8 @@ TEST_F(TransportConnectJobTest, NoUsableRoutes) {
endpoints[1].ip_endpoints = {IPEndPoint(ParseIP("2::"), 8442),
IPEndPoint(ParseIP("2.2.2.2"), 8442)};
endpoints[1].metadata.supported_protocol_alpns = {"unrecognized-protocol"};
- host_resolver_.rules()->AddRule(kHostName, endpoints);
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(endpoints));
// `TransportConnectJob` should not create any sockets.
client_socket_factory_.set_default_client_socket_type(
@@ -783,7 +791,8 @@ TEST_F(TransportConnectJobTest, LastRouteUnusable) {
endpoints[1].ip_endpoints = {IPEndPoint(ParseIP("2::"), 8442),
IPEndPoint(ParseIP("2.2.2.2"), 8442)};
endpoints[1].metadata.supported_protocol_alpns = {"h3"};
- host_resolver_.rules()->AddRule(kHostName, endpoints);
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(endpoints));
MockTransportClientSocketFactory::Rule rules[] = {
// `endpoints[0]`'s addresses each fail.
@@ -836,7 +845,8 @@ TEST_F(TransportConnectJobTest, GetHostResolverEndpointResult) {
endpoints[3].ip_endpoints = {IPEndPoint(ParseIP("4::"), 8444)};
endpoints[3].metadata.supported_protocol_alpns = {"http/1.1"};
endpoints[3].metadata.ech_config_list = {13, 14, 15, 16};
- host_resolver_.rules()->AddRule(kHostName, endpoints);
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(endpoints));
MockTransportClientSocketFactory::Rule rules[] = {
MockTransportClientSocketFactory::Rule(
@@ -874,8 +884,9 @@ TEST_F(TransportConnectJobTest, SvcbReliantIfEch) {
endpoint2.metadata.ech_config_list = {1, 2, 3, 4};
endpoint3.ip_endpoints = {IPEndPoint(ParseIP("3::"), 443)};
// `endpoint3` has no `supported_protocol_alpns` and is thus a fallback route.
- host_resolver_.rules()->AddRule(kHostName,
- std::vector{endpoint1, endpoint2, endpoint3});
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(
+ std::vector{endpoint1, endpoint2, endpoint3}));
// `TransportConnectJob` should not try `endpoint3`.
MockTransportClientSocketFactory::Rule rules[] = {
@@ -918,8 +929,9 @@ TEST_F(TransportConnectJobTest, SvcbOptionalIfEchDisabled) {
endpoint2.metadata.ech_config_list = {1, 2, 3, 4};
endpoint3.ip_endpoints = {IPEndPoint(ParseIP("3::"), 443)};
// `endpoint3` has no `supported_protocol_alpns` and is thus a fallback route.
- host_resolver_.rules()->AddRule(kHostName,
- std::vector{endpoint1, endpoint2, endpoint3});
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(
+ std::vector{endpoint1, endpoint2, endpoint3}));
// `TransportConnectJob` should try `endpoint3`.
MockTransportClientSocketFactory::Rule rules[] = {
@@ -958,8 +970,9 @@ TEST_F(TransportConnectJobTest, SvcbOptionalIfEchInconsistent) {
endpoint2.metadata.ech_config_list = {};
endpoint3.ip_endpoints = {IPEndPoint(ParseIP("3::"), 443)};
// `endpoint3` has no `supported_protocol_alpns` and is thus a fallback route.
- host_resolver_.rules()->AddRule(kHostName,
- std::vector{endpoint1, endpoint2, endpoint3});
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(
+ std::vector{endpoint1, endpoint2, endpoint3}));
// `TransportConnectJob` should try `endpoint3`.
MockTransportClientSocketFactory::Rule rules[] = {
@@ -1046,7 +1059,8 @@ TEST_F(TransportConnectJobTest, DedupIPEndPoints) {
IPEndPoint(ParseIP("1::"), 444),
IPEndPoint(ParseIP("2.2.2.2"), 443)};
endpoints[3].metadata.supported_protocol_alpns = {"h2", "http/1.1"};
- host_resolver_.rules()->AddRule(kHostName, endpoints);
+ host_resolver_.rules()->AddRule(
+ kHostName, MockHostResolverBase::RuleResolver::RuleResult(endpoints));
MockTransportClientSocketFactory::Rule rules[] = {
// First, try `endpoints[0]`'s addresses.
diff --git a/chromium/net/socket/udp_client_socket.cc b/chromium/net/socket/udp_client_socket.cc
index a28d08b4189..9bb4f198bb8 100644
--- a/chromium/net/socket/udp_client_socket.cc
+++ b/chromium/net/socket/udp_client_socket.cc
@@ -6,6 +6,7 @@
#include "build/build_config.h"
#include "net/base/net_errors.h"
+#include "net/base/network_change_notifier.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
namespace net {
@@ -13,13 +14,13 @@ namespace net {
UDPClientSocket::UDPClientSocket(DatagramSocket::BindType bind_type,
net::NetLog* net_log,
const net::NetLogSource& source,
- NetworkChangeNotifier::NetworkHandle network)
+ handles::NetworkHandle network)
: socket_(bind_type, net_log, source), connect_using_network_(network) {}
UDPClientSocket::~UDPClientSocket() = default;
int UDPClientSocket::Connect(const IPEndPoint& address) {
- if (connect_using_network_ != NetworkChangeNotifier::kInvalidNetworkHandle)
+ if (connect_using_network_ != handles::kInvalidNetworkHandle)
return ConnectUsingNetwork(connect_using_network_, address);
int rv = socket_.Open(address.GetFamily());
@@ -28,9 +29,8 @@ int UDPClientSocket::Connect(const IPEndPoint& address) {
return socket_.Connect(address);
}
-int UDPClientSocket::ConnectUsingNetwork(
- NetworkChangeNotifier::NetworkHandle network,
- const IPEndPoint& address) {
+int UDPClientSocket::ConnectUsingNetwork(handles::NetworkHandle network,
+ const IPEndPoint& address) {
if (!NetworkChangeNotifier::AreNetworkHandlesSupported())
return ERR_NOT_IMPLEMENTED;
int rv = socket_.Open(address.GetFamily());
@@ -57,10 +57,10 @@ int UDPClientSocket::ConnectUsingDefaultNetwork(const IPEndPoint& address) {
// can change in between when we query it and when we bind to it. This is
// rare but should be accounted for. Since changes of the default network
// should not come in quick succession, we can simply try again.
- NetworkChangeNotifier::NetworkHandle network;
+ handles::NetworkHandle network;
for (int attempt = 0; attempt < 2; attempt++) {
network = NetworkChangeNotifier::GetDefaultNetwork();
- if (network == NetworkChangeNotifier::kInvalidNetworkHandle)
+ if (network == handles::kInvalidNetworkHandle)
return ERR_INTERNET_DISCONNECTED;
rv = socket_.BindToNetwork(network);
// |network| may have disconnected between the call to GetDefaultNetwork()
@@ -75,7 +75,7 @@ int UDPClientSocket::ConnectUsingDefaultNetwork(const IPEndPoint& address) {
return socket_.Connect(address);
}
-NetworkChangeNotifier::NetworkHandle UDPClientSocket::GetBoundNetwork() const {
+handles::NetworkHandle UDPClientSocket::GetBoundNetwork() const {
return network_;
}
@@ -97,29 +97,6 @@ int UDPClientSocket::Write(
return socket_.Write(buf, buf_len, std::move(callback), traffic_annotation);
}
-int UDPClientSocket::WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) {
- DCHECK(WriteAsyncEnabled());
- return socket_.WriteAsync(buffer, buf_len, std::move(callback),
- traffic_annotation);
-}
-
-int UDPClientSocket::WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) {
- DCHECK(WriteAsyncEnabled());
- return socket_.WriteAsync(std::move(buffers), std::move(callback),
- traffic_annotation);
-}
-
-DatagramBuffers UDPClientSocket::GetUnwrittenBuffers() {
- return socket_.GetUnwrittenBuffers();
-}
-
void UDPClientSocket::Close() {
socket_.Close();
}
@@ -158,30 +135,6 @@ void UDPClientSocket::UseNonBlockingIO() {
#endif
}
-void UDPClientSocket::SetWriteAsyncEnabled(bool enabled) {
- socket_.SetWriteAsyncEnabled(enabled);
-}
-
-void UDPClientSocket::SetMaxPacketSize(size_t max_packet_size) {
- socket_.SetMaxPacketSize(max_packet_size);
-}
-
-bool UDPClientSocket::WriteAsyncEnabled() {
- return socket_.WriteAsyncEnabled();
-}
-
-void UDPClientSocket::SetWriteMultiCoreEnabled(bool enabled) {
- socket_.SetWriteMultiCoreEnabled(enabled);
-}
-
-void UDPClientSocket::SetSendmmsgEnabled(bool enabled) {
- socket_.SetSendmmsgEnabled(enabled);
-}
-
-void UDPClientSocket::SetWriteBatchingActive(bool active) {
- socket_.SetWriteBatchingActive(active);
-}
-
int UDPClientSocket::SetMulticastInterface(uint32_t interface_index) {
return socket_.SetMulticastInterface(interface_index);
}
diff --git a/chromium/net/socket/udp_client_socket.h b/chromium/net/socket/udp_client_socket.h
index dbe879fea9e..c55150dc2a2 100644
--- a/chromium/net/socket/udp_client_socket.h
+++ b/chromium/net/socket/udp_client_socket.h
@@ -23,11 +23,11 @@ class NET_EXPORT_PRIVATE UDPClientSocket : public DatagramClientSocket {
// If `network` is specified, the socket will be bound to it. All data traffic
// on the socket will be sent and received via `network`. Communication using
// this socket will fail if `network` disconnects.
- UDPClientSocket(DatagramSocket::BindType bind_type,
- net::NetLog* net_log,
- const net::NetLogSource& source,
- NetworkChangeNotifier::NetworkHandle network =
- NetworkChangeNotifier::kInvalidNetworkHandle);
+ UDPClientSocket(
+ DatagramSocket::BindType bind_type,
+ net::NetLog* net_log,
+ const net::NetLogSource& source,
+ handles::NetworkHandle network = handles::kInvalidNetworkHandle);
UDPClientSocket(const UDPClientSocket&) = delete;
UDPClientSocket& operator=(const UDPClientSocket&) = delete;
@@ -36,10 +36,10 @@ class NET_EXPORT_PRIVATE UDPClientSocket : public DatagramClientSocket {
// DatagramClientSocket implementation.
int Connect(const IPEndPoint& address) override;
- int ConnectUsingNetwork(NetworkChangeNotifier::NetworkHandle network,
+ int ConnectUsingNetwork(handles::NetworkHandle network,
const IPEndPoint& address) override;
int ConnectUsingDefaultNetwork(const IPEndPoint& address) override;
- NetworkChangeNotifier::NetworkHandle GetBoundNetwork() const override;
+ handles::NetworkHandle GetBoundNetwork() const override;
void ApplySocketTag(const SocketTag& tag) override;
int Read(IOBuffer* buf,
int buf_len,
@@ -49,18 +49,6 @@ class NET_EXPORT_PRIVATE UDPClientSocket : public DatagramClientSocket {
CompletionOnceCallback callback,
const NetworkTrafficAnnotationTag& traffic_annotation) override;
- int WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) override;
- int WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) override;
-
- DatagramBuffers GetUnwrittenBuffers() override;
-
void Close() override;
int GetPeerAddress(IPEndPoint* address) const override;
int GetLocalAddress(IPEndPoint* address) const override;
@@ -74,20 +62,14 @@ class NET_EXPORT_PRIVATE UDPClientSocket : public DatagramClientSocket {
const NetLogWithSource& NetLog() const override;
void EnableRecvOptimization() override;
- void SetWriteAsyncEnabled(bool enabled) override;
- bool WriteAsyncEnabled() override;
- void SetMaxPacketSize(size_t max_packet_size) override;
- void SetWriteMultiCoreEnabled(bool enabled) override;
- void SetSendmmsgEnabled(bool enabled) override;
- void SetWriteBatchingActive(bool active) override;
int SetMulticastInterface(uint32_t interface_index) override;
void SetIOSNetworkServiceType(int ios_network_service_type) override;
private:
UDPSocket socket_;
// The network the socket is currently bound to.
- NetworkChangeNotifier::NetworkHandle network_;
- NetworkChangeNotifier::NetworkHandle connect_using_network_;
+ handles::NetworkHandle network_;
+ handles::NetworkHandle connect_using_network_;
};
} // namespace net
diff --git a/chromium/net/socket/udp_net_log_parameters.cc b/chromium/net/socket/udp_net_log_parameters.cc
index fa82284db33..b58ab71b2ed 100644
--- a/chromium/net/socket/udp_net_log_parameters.cc
+++ b/chromium/net/socket/udp_net_log_parameters.cc
@@ -28,12 +28,11 @@ base::Value NetLogUDPDataTransferParams(int byte_count,
return base::Value(std::move(dict));
}
-base::Value NetLogUDPConnectParams(
- const IPEndPoint& address,
- NetworkChangeNotifier::NetworkHandle network) {
+base::Value NetLogUDPConnectParams(const IPEndPoint& address,
+ handles::NetworkHandle network) {
base::Value::Dict dict;
dict.Set("address", address.ToString());
- if (network != NetworkChangeNotifier::kInvalidNetworkHandle)
+ if (network != handles::kInvalidNetworkHandle)
dict.Set("bound_to_network", static_cast<int>(network));
return base::Value(std::move(dict));
}
@@ -52,9 +51,8 @@ void NetLogUDPDataTransfer(const NetLogWithSource& net_log,
});
}
-base::Value CreateNetLogUDPConnectParams(
- const IPEndPoint& address,
- NetworkChangeNotifier::NetworkHandle network) {
+base::Value CreateNetLogUDPConnectParams(const IPEndPoint& address,
+ handles::NetworkHandle network) {
return NetLogUDPConnectParams(address, network);
}
diff --git a/chromium/net/socket/udp_net_log_parameters.h b/chromium/net/socket/udp_net_log_parameters.h
index 0ba1240d69b..310361e90f3 100644
--- a/chromium/net/socket/udp_net_log_parameters.h
+++ b/chromium/net/socket/udp_net_log_parameters.h
@@ -5,7 +5,7 @@
#ifndef NET_SOCKET_UDP_NET_LOG_PARAMETERS_H_
#define NET_SOCKET_UDP_NET_LOG_PARAMETERS_H_
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/log/net_log_event_type.h"
namespace base {
@@ -27,9 +27,8 @@ void NetLogUDPDataTransfer(const NetLogWithSource& net_log,
const IPEndPoint* address);
// Creates NetLog parameters describing a UDP connect event.
-base::Value CreateNetLogUDPConnectParams(
- const IPEndPoint& address,
- NetworkChangeNotifier::NetworkHandle network);
+base::Value CreateNetLogUDPConnectParams(const IPEndPoint& address,
+ handles::NetworkHandle network);
} // namespace net
diff --git a/chromium/net/socket/udp_socket_perftest.cc b/chromium/net/socket/udp_socket_perftest.cc
index 7ad78a9e8da..2a878e3025f 100644
--- a/chromium/net/socket/udp_socket_perftest.cc
+++ b/chromium/net/socket/udp_socket_perftest.cc
@@ -112,8 +112,7 @@ void UDPSocketPerfTest::WriteBenchmark(bool use_nonblocking_io) {
// Setup the server to listen.
IPEndPoint bind_address;
CreateUDPAddress("127.0.0.1", kPort, &bind_address);
- std::unique_ptr<UDPServerSocket> server(
- new UDPServerSocket(nullptr, NetLogSource()));
+ auto server = std::make_unique<UDPServerSocket>(nullptr, NetLogSource());
if (use_nonblocking_io)
server->UseNonBlockingIO();
int rv = server->Listen(bind_address);
@@ -122,8 +121,8 @@ void UDPSocketPerfTest::WriteBenchmark(bool use_nonblocking_io) {
// Setup the client.
IPEndPoint server_address;
CreateUDPAddress("127.0.0.1", kPort, &server_address);
- std::unique_ptr<UDPClientSocket> client(new UDPClientSocket(
- DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource()));
+ auto client = std::make_unique<UDPClientSocket>(DatagramSocket::DEFAULT_BIND,
+ nullptr, NetLogSource());
if (use_nonblocking_io)
client->UseNonBlockingIO();
rv = client->Connect(server_address);
diff --git a/chromium/net/socket/udp_socket_posix.cc b/chromium/net/socket/udp_socket_posix.cc
index 01fe429d8b8..65356fcf974 100644
--- a/chromium/net/socket/udp_socket_posix.cc
+++ b/chromium/net/socket/udp_socket_posix.cc
@@ -25,7 +25,6 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/callback_helpers.h"
-#include "base/containers/stack_container.h"
#include "base/debug/alias.h"
#include "base/feature_list.h"
#include "base/files/file_util.h"
@@ -130,16 +129,14 @@ int GetSocketFDHash(int fd) {
UDPSocketPosix::UDPSocketPosix(DatagramSocket::BindType bind_type,
net::NetLog* net_log,
const net::NetLogSource& source)
- : write_async_watcher_(std::make_unique<WriteAsyncWatcher>(this)),
- sender_(new UDPSocketPosixSender()),
- socket_(kInvalidSocket),
+ : socket_(kInvalidSocket),
bind_type_(bind_type),
read_socket_watcher_(FROM_HERE),
write_socket_watcher_(FROM_HERE),
read_watcher_(this),
write_watcher_(this),
net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::UDP_SOCKET)),
- bound_network_(NetworkChangeNotifier::kInvalidNetworkHandle),
+ bound_network_(handles::kInvalidNetworkHandle),
always_update_bytes_received_(base::FeatureList::IsEnabled(
features::kUdpSocketPosixAlwaysUpdateBytesReceived)) {
net_log_.BeginEventReferencingSource(NetLogEventType::SOCKET_ALIVE, source);
@@ -285,7 +282,6 @@ void UDPSocketPosix::Close() {
is_connected_ = false;
tag_ = SocketTag();
- write_async_timer_.Stop();
received_activity_monitor_.OnClose();
}
@@ -299,10 +295,10 @@ int UDPSocketPosix::GetPeerAddress(IPEndPoint* address) const {
SockaddrStorage storage;
if (getpeername(socket_, storage.addr, &storage.addr_len))
return MapSystemError(errno);
- std::unique_ptr<IPEndPoint> address(new IPEndPoint());
- if (!address->FromSockAddr(storage.addr, storage.addr_len))
+ auto endpoint = std::make_unique<IPEndPoint>();
+ if (!endpoint->FromSockAddr(storage.addr, storage.addr_len))
return ERR_ADDRESS_INVALID;
- remote_address_ = std::move(address);
+ remote_address_ = std::move(endpoint);
}
*address = *remote_address_;
@@ -319,10 +315,10 @@ int UDPSocketPosix::GetLocalAddress(IPEndPoint* address) const {
SockaddrStorage storage;
if (getsockname(socket_, storage.addr, &storage.addr_len))
return MapSystemError(errno);
- std::unique_ptr<IPEndPoint> address(new IPEndPoint());
- if (!address->FromSockAddr(storage.addr, storage.addr_len))
+ auto endpoint = std::make_unique<IPEndPoint>();
+ if (!endpoint->FromSockAddr(storage.addr, storage.addr_len))
return ERR_ADDRESS_INVALID;
- local_address_ = std::move(address);
+ local_address_ = std::move(endpoint);
net_log_.AddEvent(NetLogEventType::UDP_LOCAL_ADDRESS, [&] {
return CreateNetLogUDPConnectParams(*local_address_, bound_network_);
});
@@ -397,9 +393,10 @@ int UDPSocketPosix::SendToOrWrite(IOBuffer* buf,
DCHECK(!callback.is_null()); // Synchronous operation not supported
DCHECK_GT(buf_len, 0);
- int result = InternalSendTo(buf, buf_len, address);
- if (result != ERR_IO_PENDING)
+ if (int result = InternalSendTo(buf, buf_len, address);
+ result != ERR_IO_PENDING) {
return result;
+ }
if (!base::CurrentIOThread::Get()->WatchFileDescriptor(
socket_, true, base::MessagePumpForIO::WATCH_WRITE,
@@ -487,8 +484,7 @@ int UDPSocketPosix::Bind(const IPEndPoint& address) {
return rv;
}
-int UDPSocketPosix::BindToNetwork(
- NetworkChangeNotifier::NetworkHandle network) {
+int UDPSocketPosix::BindToNetwork(handles::NetworkHandle network) {
DCHECK_NE(socket_, kInvalidSocket);
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!is_connected());
@@ -1063,340 +1059,6 @@ void UDPSocketPosix::ApplySocketTag(const SocketTag& tag) {
tag_ = tag;
}
-UDPSocketPosixSender::UDPSocketPosixSender() = default;
-UDPSocketPosixSender::~UDPSocketPosixSender() = default;
-
-SendResult::SendResult() : rv(0), write_count(0) {}
-SendResult::~SendResult() = default;
-SendResult::SendResult(int _rv, int _write_count, DatagramBuffers _buffers)
- : rv(_rv), write_count(_write_count), buffers(std::move(_buffers)) {}
-SendResult::SendResult(SendResult&& other) = default;
-
-SendResult UDPSocketPosixSender::InternalSendBuffers(
- int fd,
- DatagramBuffers buffers) const {
- int rv = 0;
- int write_count = 0;
- for (auto& buffer : buffers) {
- int result = HANDLE_EINTR(Send(fd, buffer->data(), buffer->length(), 0));
- if (result < 0) {
- rv = MapSystemError(errno);
- break;
- }
- write_count++;
- }
- return SendResult(rv, write_count, std::move(buffers));
-}
-
-#if HAVE_SENDMMSG
-SendResult UDPSocketPosixSender::InternalSendmmsgBuffers(
- int fd,
- DatagramBuffers buffers) const {
- base::StackVector<struct iovec, kWriteAsyncMaxBuffersThreshold + 1> msg_iov;
- base::StackVector<struct mmsghdr, kWriteAsyncMaxBuffersThreshold + 1> msgvec;
- msg_iov->reserve(buffers.size());
- for (auto& buffer : buffers)
- msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
- msgvec->reserve(buffers.size());
- for (size_t j = 0; j < buffers.size(); j++)
- msgvec->push_back({{nullptr, 0, &msg_iov[j], 1, nullptr, 0, 0}, 0});
- int result = HANDLE_EINTR(Sendmmsg(fd, &msgvec[0], buffers.size(), 0));
- SendResult send_result(0, 0, std::move(buffers));
- if (result < 0) {
- send_result.rv = MapSystemError(errno);
- } else {
- send_result.write_count = result;
- }
- return send_result;
-}
-#endif
-
-SendResult UDPSocketPosixSender::SendBuffers(int fd, DatagramBuffers buffers) {
-#if HAVE_SENDMMSG
- if (sendmmsg_enabled_) {
- auto result = InternalSendmmsgBuffers(fd, std::move(buffers));
- if (LIKELY(result.rv != ERR_NOT_IMPLEMENTED)) {
- return result;
- }
- DLOG(WARNING) << "senddmsg() not implemented, falling back to send()";
- sendmmsg_enabled_ = false;
- buffers = std::move(result.buffers);
- }
-#endif
- return InternalSendBuffers(fd, std::move(buffers));
-}
-
-ssize_t UDPSocketPosixSender::Send(int sockfd,
- const void* buf,
- size_t len,
- int flags) const {
- return send(sockfd, buf, len, flags);
-}
-
-#if HAVE_SENDMMSG
-int UDPSocketPosixSender::Sendmmsg(int sockfd,
- struct mmsghdr* msgvec,
- unsigned int vlen,
- unsigned int flags) const {
- return sendmmsg(sockfd, msgvec, vlen, flags);
-}
-#endif
-
-int UDPSocketPosix::WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) {
- DCHECK(datagram_buffer_pool_ != nullptr);
- IncreaseWriteAsyncOutstanding(1);
- datagram_buffer_pool_->Enqueue(buffer, buf_len, &pending_writes_);
- return InternalWriteAsync(std::move(callback), traffic_annotation);
-}
-
-int UDPSocketPosix::WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) {
- IncreaseWriteAsyncOutstanding(buffers.size());
- pending_writes_.splice(pending_writes_.end(), std::move(buffers));
- return InternalWriteAsync(std::move(callback), traffic_annotation);
-}
-
-int UDPSocketPosix::InternalWriteAsync(
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) {
- CHECK(write_callback_.is_null());
-
- // Surface error immediately if one is pending.
- if (last_async_result_ < 0) {
- return ResetLastAsyncResult();
- }
-
- size_t flush_threshold =
- write_batching_active_ ? kWriteAsyncPostBuffersThreshold : 1;
- if (pending_writes_.size() >= flush_threshold) {
- FlushPending();
- // Surface error immediately if one is pending.
- if (last_async_result_ < 0) {
- return ResetLastAsyncResult();
- }
- }
-
- if (!write_async_timer_running_) {
- write_async_timer_running_ = true;
- write_async_timer_.Start(FROM_HERE, kWriteAsyncMsThreshold, this,
- &UDPSocketPosix::OnWriteAsyncTimerFired);
- }
-
- int blocking_threshold =
- write_batching_active_ ? kWriteAsyncMaxBuffersThreshold : 1;
- if (write_async_outstanding_ >= blocking_threshold) {
- write_callback_ = std::move(callback);
- return ERR_IO_PENDING;
- }
-
- DVLOG(2) << __func__ << " pending " << pending_writes_.size()
- << " outstanding " << write_async_outstanding_;
- return ResetWrittenBytes();
-}
-
-DatagramBuffers UDPSocketPosix::GetUnwrittenBuffers() {
- write_async_outstanding_ -= pending_writes_.size();
- return std::move(pending_writes_);
-}
-
-void UDPSocketPosix::FlushPending() {
- // Nothing to do if socket is blocked.
- if (write_async_watcher_->watching())
- return;
-
- if (pending_writes_.empty())
- return;
-
- if (write_async_timer_running_)
- write_async_timer_.Reset();
-
- int num_pending_writes = static_cast<int>(pending_writes_.size());
- if (!write_multi_core_enabled_ ||
- // Don't bother with post if not enough buffers
- (num_pending_writes <= kWriteAsyncMinBuffersThreshold &&
- // but not if there is a previous post
- // outstanding, to prevent out of order transmission.
- (num_pending_writes == write_async_outstanding_))) {
- LocalSendBuffers();
- } else {
- PostSendBuffers();
- }
-}
-
-// TODO(ckrasic) Sad face. Do this lazily because many tests exploded
-// otherwise. |threading_and_tasks.md| advises to instantiate a
-// |base::test::TaskEnvironment| in the test, implementing that
-// for all tests that might exercise QUIC is too daunting. Also, in
-// some tests it seemed like following the advice just broke in other
-// ways.
-base::SequencedTaskRunner* UDPSocketPosix::GetTaskRunner() {
- if (task_runner_ == nullptr)
- task_runner_ = base::ThreadPool::CreateSequencedTaskRunner({});
- return task_runner_.get();
-}
-
-void UDPSocketPosix::OnWriteAsyncTimerFired() {
- DVLOG(2) << __func__ << " pending writes " << pending_writes_.size();
- if (pending_writes_.empty()) {
- write_async_timer_.Stop();
- write_async_timer_running_ = false;
- return;
- }
- if (last_async_result_ < 0) {
- DVLOG(1) << __func__ << " socket not writeable";
- return;
- }
- FlushPending();
-}
-
-void UDPSocketPosix::LocalSendBuffers() {
- DVLOG(1) << __func__ << " queue " << pending_writes_.size() << " out of "
- << write_async_outstanding_ << " total";
- DidSendBuffers(sender_->SendBuffers(socket_, std::move(pending_writes_)));
-}
-
-void UDPSocketPosix::PostSendBuffers() {
- DVLOG(1) << __func__ << " queue " << pending_writes_.size() << " out of "
- << write_async_outstanding_ << " total";
- base::PostTaskAndReplyWithResult(
- GetTaskRunner(), FROM_HERE,
- base::BindOnce(&UDPSocketPosixSender::SendBuffers, sender_, socket_,
- std::move(pending_writes_)),
- base::BindOnce(&UDPSocketPosix::DidSendBuffers,
- weak_factory_.GetWeakPtr()));
-}
-
-void UDPSocketPosix::DidSendBuffers(SendResult send_result) {
- DVLOG(3) << __func__;
- int write_count = send_result.write_count;
- DatagramBuffers& buffers = send_result.buffers;
-
- DCHECK(!buffers.empty());
- int num_buffers = buffers.size();
-
- // Dequeue buffers that have been written.
- if (write_count > 0) {
- write_async_outstanding_ -= write_count;
-
- DatagramBuffers::const_iterator it;
- // Generate logs for written buffers
- it = buffers.cbegin();
- for (int i = 0; i < write_count; i++, it++) {
- auto& buffer = *it;
- LogWrite(buffer->length(), buffer->data(), nullptr);
- written_bytes_ += buffer->length();
- }
- // Return written buffers to pool
- DatagramBuffers written_buffers;
- if (write_count == num_buffers) {
- it = buffers.cend();
- } else {
- it = buffers.cbegin();
- for (int i = 0; i < write_count; i++) {
- it++;
- }
- }
- written_buffers.splice(written_buffers.cend(), buffers, buffers.cbegin(),
- it);
- DCHECK(datagram_buffer_pool_ != nullptr);
- datagram_buffer_pool_->Dequeue(&written_buffers);
- }
-
- // Requeue left-over (unwritten) buffers.
- if (!buffers.empty()) {
- DVLOG(2) << __func__ << " requeue " << buffers.size() << " buffers";
- pending_writes_.splice(pending_writes_.begin(), std::move(buffers));
- }
-
- last_async_result_ = send_result.rv;
- if (last_async_result_ == ERR_IO_PENDING) {
- DVLOG(2) << __func__ << " WatchFileDescriptor start";
- if (!WatchFileDescriptor()) {
- DVPLOG(1) << "WatchFileDescriptor failed on write";
- last_async_result_ = MapSystemError(errno);
- LogWrite(last_async_result_, nullptr, nullptr);
- } else {
- last_async_result_ = 0;
- }
- } else if (last_async_result_ < 0 || pending_writes_.empty()) {
- DVLOG(2) << __func__ << " WatchFileDescriptor stop: result "
- << ErrorToShortString(last_async_result_) << " pending_writes "
- << pending_writes_.size();
- StopWatchingFileDescriptor();
- }
- DCHECK(last_async_result_ != ERR_IO_PENDING);
-
- if (write_callback_.is_null())
- return;
-
- if (last_async_result_ < 0) {
- DVLOG(1) << last_async_result_;
- // Update the writer with the latest result.
- DoWriteCallback(ResetLastAsyncResult());
- } else if (write_async_outstanding_ < kWriteAsyncCallbackBuffersThreshold) {
- DVLOG(1) << write_async_outstanding_ << " < "
- << kWriteAsyncCallbackBuffersThreshold;
- DoWriteCallback(ResetWrittenBytes());
- }
-}
-
-void UDPSocketPosix::WriteAsyncWatcher::OnFileCanWriteWithoutBlocking(int) {
- DVLOG(1) << __func__ << " queue " << socket_->pending_writes_.size()
- << " out of " << socket_->write_async_outstanding_ << " total";
- socket_->StopWatchingFileDescriptor();
- socket_->FlushPending();
-}
-
-bool UDPSocketPosix::WatchFileDescriptor() {
- if (write_async_watcher_->watching())
- return true;
- bool result = InternalWatchFileDescriptor();
- if (result) {
- write_async_watcher_->set_watching(true);
- }
- return result;
-}
-
-void UDPSocketPosix::StopWatchingFileDescriptor() {
- if (!write_async_watcher_->watching())
- return;
- InternalStopWatchingFileDescriptor();
- write_async_watcher_->set_watching(false);
-}
-
-bool UDPSocketPosix::InternalWatchFileDescriptor() {
- return base::CurrentIOThread::Get()->WatchFileDescriptor(
- socket_, true, base::MessagePumpForIO::WATCH_WRITE,
- &write_socket_watcher_, write_async_watcher_.get());
-}
-
-void UDPSocketPosix::InternalStopWatchingFileDescriptor() {
- bool ok = write_socket_watcher_.StopWatchingFileDescriptor();
- DCHECK(ok);
-}
-
-void UDPSocketPosix::SetMaxPacketSize(size_t max_packet_size) {
- datagram_buffer_pool_ = std::make_unique<DatagramBufferPool>(max_packet_size);
-}
-
-int UDPSocketPosix::ResetLastAsyncResult() {
- int result = last_async_result_;
- last_async_result_ = 0;
- return result;
-}
-
-int UDPSocketPosix::ResetWrittenBytes() {
- int bytes = written_bytes_;
- written_bytes_ = 0;
- return bytes;
-}
-
int UDPSocketPosix::SetIOSNetworkServiceType(int ios_network_service_type) {
if (ios_network_service_type == 0) {
return OK;
diff --git a/chromium/net/socket/udp_socket_posix.h b/chromium/net/socket/udp_socket_posix.h
index a19e30460c1..770acb3e0e4 100644
--- a/chromium/net/socket/udp_socket_posix.h
+++ b/chromium/net/socket/udp_socket_posix.h
@@ -17,14 +17,12 @@
#include "base/message_loop/message_pump_for_io.h"
#include "base/threading/thread_checker.h"
#include "base/timer/timer.h"
-#include "build/build_config.h"
#include "net/base/address_family.h"
#include "net/base/completion_once_callback.h"
-#include "net/base/datagram_buffer.h"
#include "net/base/io_buffer.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/log/net_log_with_source.h"
#include "net/socket/datagram_socket.h"
#include "net/socket/diff_serv_code_point.h"
@@ -33,14 +31,6 @@
#include "net/socket/udp_socket_global_limits.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
-#if defined(__ANDROID__) && defined(__aarch64__)
-#define HAVE_SENDMMSG 1
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
-#define HAVE_SENDMMSG 1
-#else
-#define HAVE_SENDMMSG 0
-#endif
-
namespace net {
class IPAddress;
@@ -48,77 +38,6 @@ class NetLog;
struct NetLogSource;
class SocketTag;
-// Sendresult is inspired by sendmmsg, but unlike sendmmsg it is not
-// convenient to require that a positive |write_count| and a negative
-// error code are mutually exclusive.
-struct NET_EXPORT SendResult {
- explicit SendResult();
- ~SendResult();
- SendResult(int rv, int write_count, DatagramBuffers buffers);
- SendResult(SendResult& other) = delete;
- SendResult& operator=(SendResult& other) = delete;
- SendResult(SendResult&& other);
- SendResult& operator=(SendResult&& other) = default;
- int rv;
- // number of successful writes.
- int write_count;
- DatagramBuffers buffers;
-};
-
-// Don't delay writes more than this.
-const base::TimeDelta kWriteAsyncMsThreshold = base::Milliseconds(1);
-// Prefer local if number of writes is not more than this.
-const int kWriteAsyncMinBuffersThreshold = 2;
-// Don't allow more than this many outstanding async writes.
-const int kWriteAsyncMaxBuffersThreshold = 16;
-// PostTask immediately when unwritten buffers reaches this.
-const int kWriteAsyncPostBuffersThreshold = kWriteAsyncMaxBuffersThreshold / 2;
-// Don't unblock writer unless pending async writes are less than this.
-const int kWriteAsyncCallbackBuffersThreshold = kWriteAsyncMaxBuffersThreshold;
-
-// To allow mock |Send|/|Sendmsg| in testing. This has to be
-// reference counted thread safe because |SendBuffers| and
-// |SendmmsgBuffers| may be invoked in another thread via PostTask*.
-class NET_EXPORT UDPSocketPosixSender
- : public base::RefCountedThreadSafe<UDPSocketPosixSender> {
- public:
- UDPSocketPosixSender();
-
- UDPSocketPosixSender(const UDPSocketPosixSender&) = delete;
- UDPSocketPosixSender& operator=(const UDPSocketPosixSender&) = delete;
-
- SendResult SendBuffers(int fd, DatagramBuffers buffers);
-
- void SetSendmmsgEnabled(bool enabled) {
-#if HAVE_SENDMMSG
- sendmmsg_enabled_ = enabled;
-#endif
- }
-
- protected:
- friend class base::RefCountedThreadSafe<UDPSocketPosixSender>;
-
- virtual ~UDPSocketPosixSender();
- virtual ssize_t Send(int sockfd,
- const void* buf,
- size_t len,
- int flags) const;
-#if HAVE_SENDMMSG
- virtual int Sendmmsg(int sockfd,
- struct mmsghdr* msgvec,
- unsigned int vlen,
- unsigned int flags) const;
-#endif
-
- SendResult InternalSendBuffers(int fd, DatagramBuffers buffers) const;
-#if HAVE_SENDMMSG
- SendResult InternalSendmmsgBuffers(int fd, DatagramBuffers buffers) const;
-#endif
-
- private:
- bool sendmmsg_enabled_ = false;
-};
-
class NET_EXPORT UDPSocketPosix {
public:
// Performance helper for net::activity_monitor, it batches
@@ -167,7 +86,7 @@ class NET_EXPORT UDPSocketPosix {
// fail if |network| has disconnected. Communication using this socket will
// fail if |network| disconnects.
// Returns a net error code.
- int BindToNetwork(NetworkChangeNotifier::NetworkHandle network);
+ int BindToNetwork(handles::NetworkHandle network);
// Connects the socket to connect with a certain |address|.
// Should be called after Open().
@@ -207,17 +126,6 @@ class NET_EXPORT UDPSocketPosix {
CompletionOnceCallback callback,
const NetworkTrafficAnnotationTag& traffic_annotation);
- // Refer to datagram_client_socket.h
- int WriteAsync(DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation);
- int WriteAsync(const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation);
-
- DatagramBuffers GetUnwrittenBuffers();
-
// Reads from a socket and receive sender address information.
// |buf| is the buffer to read data into.
// |buf_len| is the maximum amount of data to read.
@@ -354,27 +262,6 @@ class NET_EXPORT UDPSocketPosix {
// Apply |tag| to this socket.
void ApplySocketTag(const SocketTag& tag);
- void SetWriteAsyncEnabled(bool enabled) { write_async_enabled_ = enabled; }
- bool WriteAsyncEnabled() { return write_async_enabled_; }
-
- void SetMaxPacketSize(size_t max_packet_size);
-
- void SetWriteMultiCoreEnabled(bool enabled) {
- write_multi_core_enabled_ = enabled;
- }
-
- void SetSendmmsgEnabled(bool enabled) {
- DCHECK(sender_ != nullptr);
- sender_->SetSendmmsgEnabled(enabled);
- }
-
- void SetWriteBatchingActive(bool active) { write_batching_active_ = active; }
-
- void SetWriteAsyncMaxBuffers(int value) {
- LOG(INFO) << "SetWriteAsyncMaxBuffers: " << value;
- write_async_max_buffers_ = value;
- }
-
// Enables experimental optimization. This method should be called
// before the socket is used to read data for the first time.
void enable_experimental_recv_optimization() {
@@ -385,54 +272,6 @@ class NET_EXPORT UDPSocketPosix {
// Sets iOS Network Service Type for option SO_NET_SERVICE_TYPE.
int SetIOSNetworkServiceType(int ios_network_service_type);
- protected:
- // WriteAsync batching etc. are to improve throughput of large high
- // bandwidth uploads.
-
- // Watcher for WriteAsync paths.
- class WriteAsyncWatcher : public base::MessagePumpForIO::FdWatcher {
- public:
- explicit WriteAsyncWatcher(UDPSocketPosix* socket) : socket_(socket) {}
-
- WriteAsyncWatcher(const WriteAsyncWatcher&) = delete;
- WriteAsyncWatcher& operator=(const WriteAsyncWatcher&) = delete;
-
- // MessagePumpForIO::FdWatcher methods
-
- void OnFileCanReadWithoutBlocking(int /* fd */) override {}
-
- void OnFileCanWriteWithoutBlocking(int /* fd */) override;
-
- void set_watching(bool watching) { watching_ = watching; }
-
- bool watching() { return watching_; }
-
- private:
- const raw_ptr<UDPSocketPosix> socket_;
- bool watching_ = false;
- };
-
- void IncreaseWriteAsyncOutstanding(int increment) {
- write_async_outstanding_ += increment;
- }
-
- virtual bool InternalWatchFileDescriptor();
- virtual void InternalStopWatchingFileDescriptor();
-
- void SetWriteCallback(CompletionOnceCallback callback) {
- write_callback_ = std::move(callback);
- }
-
- void DidSendBuffers(SendResult buffers);
- void FlushPending();
-
- std::unique_ptr<WriteAsyncWatcher> write_async_watcher_;
- scoped_refptr<UDPSocketPosixSender> sender_;
- std::unique_ptr<DatagramBufferPool> datagram_buffer_pool_;
- // |WriteAsync| pending writes, does not include buffers that have
- // been |PostTask*|'d.
- DatagramBuffers pending_writes_;
-
private:
enum SocketOptions {
SOCKET_OPTION_MULTICAST_LOOP = 1 << 0
@@ -472,11 +311,6 @@ class NET_EXPORT UDPSocketPosix {
const raw_ptr<UDPSocketPosix> socket_;
};
- int InternalWriteAsync(CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation);
- bool WatchFileDescriptor();
- void StopWatchingFileDescriptor();
-
void DoReadCallback(int rv);
void DoWriteCallback(int rv);
void DidCompleteRead();
@@ -531,14 +365,6 @@ class NET_EXPORT UDPSocketPosix {
// Binds to a random port on |address|.
int RandomBind(const IPAddress& address);
- // Helpers for |WriteAsync|
- base::SequencedTaskRunner* GetTaskRunner();
- void OnWriteAsyncTimerFired();
- void LocalSendBuffers();
- void PostSendBuffers();
- int ResetLastAsyncResult();
- int ResetWrittenBytes();
-
int socket_;
// Hash of |socket_| to verify that it is not corrupted when calling close().
@@ -580,21 +406,6 @@ class NET_EXPORT UDPSocketPosix {
ReadWatcher read_watcher_;
WriteWatcher write_watcher_;
- // Various bits to support |WriteAsync()|.
- bool write_async_enabled_ = false;
- bool write_batching_active_ = false;
- bool write_multi_core_enabled_ = false;
- int write_async_max_buffers_ = 16;
- int written_bytes_ = 0;
-
- int last_async_result_ = 0;
- base::RepeatingTimer write_async_timer_;
- bool write_async_timer_running_ = false;
- // Total writes in flight, including those |PostTask*|'d.
- int write_async_outstanding_ = 0;
-
- scoped_refptr<base::SequencedTaskRunner> task_runner_;
-
// The buffer used by InternalRead() to retry Read requests
scoped_refptr<IOBuffer> read_buf_;
int read_buf_len_ = 0;
@@ -614,7 +425,7 @@ class NET_EXPORT UDPSocketPosix {
NetLogWithSource net_log_;
// Network that this socket is bound to via BindToNetwork().
- NetworkChangeNotifier::NetworkHandle bound_network_;
+ handles::NetworkHandle bound_network_;
// Whether net::activity_monitor should be updated every time bytes are
// received, without batching through |received_activity_monitor_|. This is
@@ -641,9 +452,6 @@ class NET_EXPORT UDPSocketPosix {
OwnedUDPSocketCount owned_socket_count_;
THREAD_CHECKER(thread_checker_);
-
- // Used for alternate writes that are posted for concurrent execution.
- base::WeakPtrFactory<UDPSocketPosix> weak_factory_{this};
};
} // namespace net
diff --git a/chromium/net/socket/udp_socket_posix_unittest.cc b/chromium/net/socket/udp_socket_posix_unittest.cc
deleted file mode 100644
index fc306356f59..00000000000
--- a/chromium/net/socket/udp_socket_posix_unittest.cc
+++ /dev/null
@@ -1,726 +0,0 @@
-// Copyright 2018 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.
-
-#include "net/socket/udp_socket_posix.h"
-
-#include "base/bind.h"
-#include "build/build_config.h"
-#include "net/base/completion_repeating_callback.h"
-#include "net/base/net_errors.h"
-#include "net/log/net_log.h"
-#include "net/log/test_net_log.h"
-#include "net/log/test_net_log_util.h"
-#include "net/socket/datagram_socket.h"
-#include "net/test/test_with_task_environment.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::InSequence;
-using ::testing::Invoke;
-using ::testing::InvokeWithoutArgs;
-using ::testing::Return;
-
-namespace net {
-
-namespace test {
-
-namespace {
-
-const size_t kMaxPacketSize = 1500;
-const size_t kNumMsgs = 3;
-const std::string kHelloMsg = "Hello world";
-const std::string kSecondMsg = "Second buffer";
-const std::string kThirdMsg = "Third buffer";
-
-int SetWouldBlock() {
- errno = EWOULDBLOCK;
- return -1;
-}
-
-#if HAVE_SENDMMSG
-int SetNotImplemented() {
- errno = ENOSYS;
- return -1;
-}
-#endif
-
-bool WatcherSetInvalidHandle() {
- errno = EBADF;
- return false;
-}
-
-int SetInvalidHandle() {
- errno = EBADF;
- return -1;
-}
-
-} // namespace
-
-class MockUDPSocketPosixSender : public UDPSocketPosixSender {
- public:
- MOCK_CONST_METHOD4(
- Send,
- ssize_t(int sockfd, const void* buf, size_t len, int flags));
- MOCK_CONST_METHOD4(Sendmmsg,
- int(int sockfd,
- struct mmsghdr* msgvec,
- unsigned int vlen,
- unsigned int flags));
-
- public:
- SendResult InternalSendBuffers(int fd, DatagramBuffers buffers) const {
- return UDPSocketPosixSender::InternalSendBuffers(fd, std::move(buffers));
- }
-#if HAVE_SENDMMSG
- SendResult InternalSendmmsgBuffers(int fd, DatagramBuffers buffers) const {
- return UDPSocketPosixSender::InternalSendmmsgBuffers(fd,
- std::move(buffers));
- }
-#endif
-
- private:
- ~MockUDPSocketPosixSender() override {}
-};
-
-class MockUDPSocketPosix : public UDPSocketPosix {
- public:
- MockUDPSocketPosix(DatagramSocket::BindType bind_type,
- net::NetLog* net_log,
- const net::NetLogSource& source)
- : UDPSocketPosix(bind_type, net_log, source) {
- sender_ = new MockUDPSocketPosixSender();
- }
-
- MockUDPSocketPosixSender* sender() {
- return static_cast<MockUDPSocketPosixSender*>(sender_.get());
- }
-
- MOCK_METHOD0(InternalWatchFileDescriptor, bool());
- MOCK_METHOD0(InternalStopWatchingFileDescriptor, void());
-
- void FlushPending() { UDPSocketPosix::FlushPending(); }
-
- void DidSendBuffers(SendResult buffers) {
- UDPSocketPosix::DidSendBuffers(std::move(buffers));
- }
-
- void Enqueue(const std::string& msg, DatagramBuffers* buffers) {
- datagram_buffer_pool_->Enqueue(msg.data(), msg.length(), buffers);
- }
-
- void SetWriteCallback(CompletionOnceCallback callback) {
- UDPSocketPosix::SetWriteCallback(std::move(callback));
- }
-
- void IncreaseWriteAsyncOutstanding(int increment) {
- UDPSocketPosix::IncreaseWriteAsyncOutstanding(increment);
- }
-
- void SetPendingWrites(DatagramBuffers buffers) {
- pending_writes_ = std::move(buffers);
- }
-
- void OnFileCanWriteWithoutBlocking() {
- write_async_watcher_->OnFileCanWriteWithoutBlocking(1);
- }
-};
-
-class UDPSocketPosixTest : public TestWithTaskEnvironment {
- public:
- UDPSocketPosixTest()
- : TestWithTaskEnvironment(
- base::test::TaskEnvironment::TimeSource::MOCK_TIME),
- socket_(DatagramSocket::DEFAULT_BIND, NetLog::Get(), NetLogSource()) {
- write_callback_ = base::BindRepeating(&UDPSocketPosixTest::OnWriteComplete,
- weak_factory_.GetWeakPtr());
- }
-
- void SetUp() override {
- socket_.SetWriteAsyncEnabled(true);
- socket_.SetMaxPacketSize(kMaxPacketSize);
- }
-
- void AddBuffer(const std::string& msg) {
- socket_.IncreaseWriteAsyncOutstanding(1);
- socket_.Enqueue(msg, &buffers_);
- }
-
- void AddBuffers() {
- for (size_t i = 0; i < kNumMsgs; i++) {
- AddBuffer(msgs_[i]);
- }
- }
-
- void SaveBufferPtrs() {
- int i = 0;
- for (auto it = buffers_.cbegin(); it != buffers_.cend(); it++) {
- buffer_ptrs_[i] = it->get();
- i++;
- }
- }
-
- void VerifyBufferPtrs() {
- int i = 0;
- for (auto it = buffers_.cbegin(); it != buffers_.cend(); it++) {
- EXPECT_EQ(buffer_ptrs_[i], it->get());
- i++;
- }
- }
-
- void VerifyBuffersDequeued() {
- AddBuffers();
- VerifyBufferPtrs();
- buffers_.clear();
- }
-
- void ResetWriteCallback() {
- callback_fired_ = false;
- rv_ = 0;
- }
-
- void OnWriteComplete(int rv) {
- callback_fired_ = true;
- rv_ = rv;
- }
-
- int WriteAsync(int i) {
- return socket_.WriteAsync(msgs_[i].data(), lengths_[i], write_callback_,
- TRAFFIC_ANNOTATION_FOR_TESTS);
- }
-
- void ExpectSend(int i) {
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[i], _))
- .WillOnce(Return(lengths_[i]));
- }
-
- void ExpectSendWillBlock(int i) {
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[i], _))
- .WillOnce(InvokeWithoutArgs(SetWouldBlock));
- EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true));
- }
-
- void ExpectSendWillError(int i) {
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[i], _))
- .WillOnce(InvokeWithoutArgs(SetInvalidHandle));
- }
-
- void ExpectSends() {
- InSequence dummy;
- for (size_t i = 0; i < kNumMsgs; i++) {
- ExpectSend(static_cast<int>(i));
- }
- }
-
- void ExpectSendmmsg() {
- EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _))
- .WillOnce(Return(kNumMsgs));
- }
-
- RecordingNetLogObserver net_log_observer_;
- MockUDPSocketPosix socket_;
- DatagramBuffers buffers_;
- bool callback_fired_ = false;
- int rv_;
- std::string msgs_[kNumMsgs] = {kHelloMsg, kSecondMsg, kThirdMsg};
- int lengths_[kNumMsgs] = {static_cast<int>(kHelloMsg.length()),
- static_cast<int>(kSecondMsg.length()),
- static_cast<int>(kThirdMsg.length())};
- int total_lengths_ =
- kHelloMsg.length() + kSecondMsg.length() + kThirdMsg.length();
- DatagramBuffer* buffer_ptrs_[kNumMsgs];
- CompletionRepeatingCallback write_callback_;
-#if HAVE_SENDMMSG
- struct iovec msg_iov_[kNumMsgs];
- struct mmsghdr msgvec_[kNumMsgs];
-#endif
- base::WeakPtrFactory<UDPSocketPosixTest> weak_factory_{this};
-};
-
-TEST_F(UDPSocketPosixTest, InternalSendBuffers) {
- AddBuffers();
- ExpectSends();
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, InternalSendBuffersWriteError) {
- AddBuffers();
- {
- InSequence dummy;
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _))
- .WillOnce(Return(lengths_[0]));
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[1], _))
- .WillOnce(InvokeWithoutArgs(SetWouldBlock));
- }
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(ERR_IO_PENDING, result.rv);
- EXPECT_EQ(1, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-#if HAVE_SENDMMSG
-
-TEST_F(UDPSocketPosixTest, InternalSendmmsgBuffers) {
- AddBuffers();
- ExpectSendmmsg();
- SendResult result =
- socket_.sender()->InternalSendmmsgBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, InternalSendmmsgBuffersWriteShort) {
- AddBuffers();
- EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _))
- .WillOnce(Return(1));
- SendResult result =
- socket_.sender()->InternalSendmmsgBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(1, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, InternalSendmmsgBuffersWriteError) {
- AddBuffers();
- EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _))
- .WillOnce(InvokeWithoutArgs(SetWouldBlock));
- SendResult result =
- socket_.sender()->InternalSendmmsgBuffers(1, std::move(buffers_));
- DatagramBuffers& buffers = result.buffers;
- EXPECT_EQ(ERR_IO_PENDING, result.rv);
- EXPECT_EQ(0, result.write_count);
- EXPECT_EQ(kNumMsgs, buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, SendInternalSend) {
- AddBuffers();
- ExpectSends();
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, result.buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, SendInternalSendmmsg) {
- socket_.sender()->SetSendmmsgEnabled(true);
- AddBuffers();
- ExpectSendmmsg();
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, result.buffers.size());
-}
-
-TEST_F(UDPSocketPosixTest, SendInternalSendmmsgFallback) {
- socket_.sender()->SetSendmmsgEnabled(true);
- AddBuffers();
- {
- InSequence dummy;
- EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _))
- .WillOnce(InvokeWithoutArgs(SetNotImplemented));
- ExpectSends();
- }
- SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_));
- EXPECT_EQ(0, result.rv);
- EXPECT_EQ(3, result.write_count);
- EXPECT_EQ(kNumMsgs, result.buffers.size());
-}
-
-#endif // HAVE_SENDMMSG
-
-TEST_F(UDPSocketPosixTest, DidSendBuffers) {
- AddBuffers();
- SaveBufferPtrs();
- SendResult send_result(0, kNumMsgs, std::move(buffers_));
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(0u, socket_.GetUnwrittenBuffers().size());
- VerifyBuffersDequeued();
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(4u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 3,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_FALSE(callback_fired_);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersAsync) {
- AddBuffers();
- SendResult send_result(0, kNumMsgs, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(0u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(4u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 3,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, total_lengths_);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersError) {
- AddBuffers();
- SendResult send_result(ERR_INVALID_HANDLE, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, ERR_INVALID_HANDLE);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersShort) {
- AddBuffers();
- SendResult send_result(0, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[0]);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersPending) {
- AddBuffers();
- SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true));
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[0]);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersWatchError) {
- AddBuffers();
- SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalWatchFileDescriptor())
- .WillOnce(InvokeWithoutArgs(WatcherSetInvalidHandle));
- socket_.DidSendBuffers(std::move(send_result));
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(3u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_SEND_ERROR,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, ERR_INVALID_HANDLE);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersStopWatch) {
- AddBuffers();
- SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true));
- socket_.DidSendBuffers(std::move(send_result));
- buffers_ = socket_.GetUnwrittenBuffers();
- EXPECT_EQ(2u, buffers_.size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[0]);
-
- SendResult send_result2(0, 2, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalStopWatchingFileDescriptor());
-
- socket_.DidSendBuffers(std::move(send_result2));
-
- EXPECT_EQ(0u, socket_.GetUnwrittenBuffers().size());
- client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(4u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 3,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[1] + lengths_[2]);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersErrorStopWatch) {
- AddBuffers();
- SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true));
- socket_.DidSendBuffers(std::move(send_result));
- buffers_ = socket_.GetUnwrittenBuffers();
- EXPECT_EQ(2u, buffers_.size());
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[0]);
-
- SendResult send_result2(ERR_INVALID_HANDLE, 0, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- EXPECT_CALL(socket_, InternalStopWatchingFileDescriptor());
-
- socket_.DidSendBuffers(std::move(send_result2));
-
- EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size());
- client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(2u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, ERR_INVALID_HANDLE);
-}
-
-TEST_F(UDPSocketPosixTest, DidSendBuffersDelayCallbackWhileTooManyBuffers) {
- for (int i = 0; i < kWriteAsyncCallbackBuffersThreshold + 2; i++) {
- AddBuffer(msgs_[0]);
- }
- SendResult send_result(0, 2, std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result));
- auto client_entries = net_log_observer_.GetEntries();
- EXPECT_EQ(3u, client_entries.size());
- EXPECT_TRUE(
- LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 1,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- EXPECT_TRUE(LogContainsEvent(client_entries, 2,
- NetLogEventType::UDP_BYTES_SENT,
- NetLogEventPhase::NONE));
- // bytes written but no callback because socket_.pending_writes_ is full.
- EXPECT_FALSE(callback_fired_);
-
- // now the rest
- buffers_ = socket_.GetUnwrittenBuffers();
- EXPECT_EQ(kWriteAsyncCallbackBuffersThreshold,
- static_cast<int>(buffers_.size()));
- SendResult send_result2(0, buffers_.size(), std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.DidSendBuffers(std::move(send_result2));
- EXPECT_TRUE(callback_fired_);
- // rv includes bytes from previous invocation.
- EXPECT_EQ(rv_, (kWriteAsyncCallbackBuffersThreshold + 2) * lengths_[0]);
-}
-
-TEST_F(UDPSocketPosixTest, FlushPendingLocal) {
- socket_.SetWriteMultiCoreEnabled(false);
- AddBuffers();
- ExpectSends();
- socket_.SetPendingWrites(std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.FlushPending();
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, total_lengths_);
-}
-
-TEST_F(UDPSocketPosixTest, FlushPendingMultiCore) {
- socket_.SetWriteMultiCoreEnabled(true);
- AddBuffers();
- ExpectSends();
- socket_.SetPendingWrites(std::move(buffers_));
- ResetWriteCallback();
- socket_.SetWriteCallback(write_callback_);
- socket_.FlushPending();
- EXPECT_FALSE(callback_fired_);
- RunUntilIdle();
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, total_lengths_);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncNoBatching) {
- socket_.SetWriteBatchingActive(false);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- ExpectSend(0);
- int rv = WriteAsync(0);
- EXPECT_EQ(lengths_[0], rv);
- ExpectSend(1);
- rv = WriteAsync(1);
- EXPECT_EQ(lengths_[1], rv);
- ExpectSend(2);
- rv = WriteAsync(2);
- EXPECT_EQ(lengths_[2], rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncNoBatchingErrIOPending) {
- socket_.SetWriteBatchingActive(false);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- ExpectSend(0);
- int rv = WriteAsync(0);
- EXPECT_EQ(lengths_[0], rv);
- ExpectSendWillBlock(1);
- rv = WriteAsync(1);
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_CALL(socket_, InternalStopWatchingFileDescriptor());
- ExpectSend(1);
- socket_.OnFileCanWriteWithoutBlocking();
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, lengths_[1]);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncNoBatchingError) {
- socket_.SetWriteBatchingActive(false);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- ExpectSend(0);
- int rv = WriteAsync(0);
- EXPECT_EQ(lengths_[0], rv);
- ExpectSendWillError(1);
- rv = WriteAsync(1);
- EXPECT_EQ(ERR_INVALID_HANDLE, rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncBasicDelay) {
- socket_.SetWriteBatchingActive(true);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- ASSERT_LT(kWriteAsyncMinBuffersThreshold, 3);
- ASSERT_GT(kWriteAsyncPostBuffersThreshold, 3);
- int rv = WriteAsync(0);
- EXPECT_EQ(0, rv);
- rv = WriteAsync(1);
- EXPECT_EQ(0, rv);
- rv = WriteAsync(2);
- EXPECT_EQ(0, rv);
- // Cause the write async timer to fire and above writes to flush.
- ExpectSends();
- FastForwardBy(kWriteAsyncMsThreshold);
- RunUntilIdle();
- rv = WriteAsync(0);
- EXPECT_EQ(total_lengths_, rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncPostBuffersThresholdLocal) {
- socket_.SetWriteBatchingActive(true);
- socket_.SetWriteMultiCoreEnabled(false);
- DatagramBuffers buffers;
- int rv = 0;
- for (int i = 0; i < kWriteAsyncPostBuffersThreshold - 1; i++) {
- WriteAsync(0);
- EXPECT_EQ(0, rv);
- }
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _))
- .Times(kWriteAsyncPostBuffersThreshold)
- .WillRepeatedly(Return(lengths_[0]));
- rv = WriteAsync(0);
- EXPECT_EQ(kWriteAsyncPostBuffersThreshold * lengths_[0], rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncPostBuffersThresholdRemote) {
- socket_.SetWriteBatchingActive(true);
- socket_.SetWriteMultiCoreEnabled(true);
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _))
- .Times(kWriteAsyncPostBuffersThreshold)
- .WillRepeatedly(Return(lengths_[0]));
- DatagramBuffers buffers;
- int rv = 0;
- for (int i = 0; i < kWriteAsyncPostBuffersThreshold; i++) {
- WriteAsync(0);
- EXPECT_EQ(0, rv);
- }
- RunUntilIdle();
- rv = WriteAsync(0);
- EXPECT_EQ(kWriteAsyncPostBuffersThreshold * lengths_[0], rv);
-}
-
-TEST_F(UDPSocketPosixTest, WriteAsyncPostBlocks) {
- socket_.SetWriteBatchingActive(true);
- socket_.SetWriteMultiCoreEnabled(true);
- DatagramBuffers buffers;
- for (int i = 0; i < kWriteAsyncMaxBuffersThreshold; i++) {
- socket_.Enqueue(msgs_[0], &buffers_);
- }
- EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _))
- .Times(kWriteAsyncMaxBuffersThreshold)
- .WillRepeatedly(Return(lengths_[0]));
- int rv = socket_.WriteAsync(std::move(buffers_), write_callback_,
- TRAFFIC_ANNOTATION_FOR_TESTS);
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_FALSE(callback_fired_);
- RunUntilIdle();
- EXPECT_TRUE(callback_fired_);
- EXPECT_EQ(rv_, kWriteAsyncMaxBuffersThreshold * lengths_[0]);
-}
-
-} // namespace test
-
-} // namespace net
diff --git a/chromium/net/socket/udp_socket_unittest.cc b/chromium/net/socket/udp_socket_unittest.cc
index 00fd243a573..854b4763d22 100644
--- a/chromium/net/socket/udp_socket_unittest.cc
+++ b/chromium/net/socket/udp_socket_unittest.cc
@@ -145,7 +145,7 @@ class UDPSocketTest : public PlatformTest, public WithTaskEnvironment {
int SendToSocket(UDPSocket* socket,
std::string msg,
const IPEndPoint& address) {
- scoped_refptr<StringIOBuffer> io_buffer = new StringIOBuffer(msg);
+ auto io_buffer = base::MakeRefCounted<StringIOBuffer>(msg);
TestCompletionCallback callback;
int rv = socket->SendTo(io_buffer.get(), io_buffer->size(), address,
callback.callback());
@@ -177,8 +177,8 @@ void UDPSocketTest::ConnectTest(bool use_nonblocking_io) {
RecordingNetLogObserver net_log_observer;
// Setup the server to listen.
IPEndPoint server_address(IPAddress::IPv4Localhost(), 0 /* port */);
- std::unique_ptr<UDPServerSocket> server(
- new UDPServerSocket(NetLog::Get(), NetLogSource()));
+ auto server =
+ std::make_unique<UDPServerSocket>(NetLog::Get(), NetLogSource());
if (use_nonblocking_io)
server->UseNonBlockingIO();
server->AllowAddressReuse();
@@ -343,10 +343,10 @@ TEST_F(UDPSocketTest, MAYBE_LocalBroadcast) {
IPEndPoint listen_address;
ASSERT_TRUE(CreateUDPAddress("0.0.0.0", 0 /* port */, &listen_address));
- std::unique_ptr<UDPServerSocket> server1(
- new UDPServerSocket(NetLog::Get(), NetLogSource()));
- std::unique_ptr<UDPServerSocket> server2(
- new UDPServerSocket(NetLog::Get(), NetLogSource()));
+ auto server1 =
+ std::make_unique<UDPServerSocket>(NetLog::Get(), NetLogSource());
+ auto server2 =
+ std::make_unique<UDPServerSocket>(NetLog::Get(), NetLogSource());
server1->AllowAddressReuse();
server1->AllowBroadcast();
server2->AllowAddressReuse();
@@ -509,20 +509,20 @@ TEST_F(UDPSocketTest, ClientGetLocalPeerAddresses) {
{"2001:db8:0::42", "::1", true},
#endif
};
- for (size_t i = 0; i < std::size(tests); i++) {
- SCOPED_TRACE(std::string("Connecting from ") + tests[i].local_address +
- std::string(" to ") + tests[i].remote_address);
+ for (const auto& test : tests) {
+ SCOPED_TRACE(std::string("Connecting from ") + test.local_address +
+ std::string(" to ") + test.remote_address);
IPAddress ip_address;
- EXPECT_TRUE(ip_address.AssignFromIPLiteral(tests[i].remote_address));
+ EXPECT_TRUE(ip_address.AssignFromIPLiteral(test.remote_address));
IPEndPoint remote_address(ip_address, 80);
- EXPECT_TRUE(ip_address.AssignFromIPLiteral(tests[i].local_address));
+ EXPECT_TRUE(ip_address.AssignFromIPLiteral(test.local_address));
IPEndPoint local_address(ip_address, 80);
UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr,
NetLogSource());
int rv = client.Connect(remote_address);
- if (tests[i].may_fail && rv == ERR_ADDRESS_UNREACHABLE) {
+ if (test.may_fail && rv == ERR_ADDRESS_UNREACHABLE) {
// Connect() may return ERR_ADDRESS_UNREACHABLE for IPv6
// addresses if IPv6 is not configured.
continue;
@@ -805,7 +805,7 @@ TEST_F(UDPSocketTest, ConnectUsingNetwork) {
// server needs to be running here. The test only needs to call
// ConnectUsingNetwork() and won't send any datagrams.
const IPEndPoint fake_server_address(IPAddress::IPv4Localhost(), 8080);
- const NetworkChangeNotifier::NetworkHandle wrong_network_handle = 65536;
+ const handles::NetworkHandle wrong_network_handle = 65536;
#if BUILDFLAG(IS_ANDROID)
NetworkChangeNotifierFactoryAndroid ncn_factory;
NetworkChangeNotifier::DisableForTest ncn_disable_for_test;
@@ -830,9 +830,9 @@ TEST_F(UDPSocketTest, ConnectUsingNetwork) {
// NetworkChangeNotifier returns a valid default network.
UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr,
NetLogSource());
- const NetworkChangeNotifier::NetworkHandle network_handle =
+ const handles::NetworkHandle network_handle =
NetworkChangeNotifier::GetDefaultNetwork();
- if (network_handle != NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (network_handle != handles::kInvalidNetworkHandle) {
EXPECT_EQ(
OK, socket.ConnectUsingNetwork(network_handle, fake_server_address));
EXPECT_EQ(network_handle, socket.GetBoundNetwork());
@@ -1437,7 +1437,7 @@ TEST_F(UDPSocketTest, BindToNetwork) {
GTEST_SKIP() << "Network handles are required to test BindToNetwork.";
// Binding the socket to a not existing network should fail at connect time.
- const NetworkChangeNotifier::NetworkHandle wrong_network_handle = 65536;
+ const handles::NetworkHandle wrong_network_handle = 65536;
UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr, NetLogSource(),
wrong_network_handle);
// Different Android versions might report different errors. Hence, just check
@@ -1448,9 +1448,9 @@ TEST_F(UDPSocketTest, BindToNetwork) {
EXPECT_NE(wrong_network_handle, socket.GetBoundNetwork());
// Binding the socket to an existing network should succeed.
- const NetworkChangeNotifier::NetworkHandle network_handle =
+ const handles::NetworkHandle network_handle =
NetworkChangeNotifier::GetDefaultNetwork();
- if (network_handle != NetworkChangeNotifier::kInvalidNetworkHandle) {
+ if (network_handle != handles::kInvalidNetworkHandle) {
UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr, NetLogSource(),
network_handle);
EXPECT_EQ(OK, socket.Connect(fake_server_address));
diff --git a/chromium/net/socket/udp_socket_win.cc b/chromium/net/socket/udp_socket_win.cc
index dec07ce847e..df4cf61eda4 100644
--- a/chromium/net/socket/udp_socket_win.cc
+++ b/chromium/net/socket/udp_socket_win.cc
@@ -76,7 +76,7 @@ class UDPSocketWin::Core : public base::RefCounted<Core> {
class ReadDelegate : public base::win::ObjectWatcher::Delegate {
public:
explicit ReadDelegate(Core* core) : core_(core) {}
- ~ReadDelegate() override {}
+ ~ReadDelegate() override = default;
// base::ObjectWatcher::Delegate methods:
void OnObjectSignaled(HANDLE object) override;
@@ -88,7 +88,7 @@ class UDPSocketWin::Core : public base::RefCounted<Core> {
class WriteDelegate : public base::win::ObjectWatcher::Delegate {
public:
explicit WriteDelegate(Core* core) : core_(core) {}
- ~WriteDelegate() override {}
+ ~WriteDelegate() override = default;
// base::ObjectWatcher::Delegate methods:
void OnObjectSignaled(HANDLE object) override;
@@ -268,7 +268,7 @@ int UDPSocketWin::Open(AddressFamily address_family) {
if (socket_ == INVALID_SOCKET)
return MapSystemError(WSAGetLastError());
if (!use_non_blocking_io_) {
- core_ = new Core(this);
+ core_ = base::MakeRefCounted<Core>(this);
} else {
read_write_event_.Set(WSACreateEvent());
WSAEventSelect(socket_, read_write_event_.Get(), FD_READ | FD_WRITE);
@@ -330,7 +330,7 @@ int UDPSocketWin::GetPeerAddress(IPEndPoint* address) const {
SockaddrStorage storage;
if (getpeername(socket_, storage.addr, &storage.addr_len))
return MapSystemError(WSAGetLastError());
- std::unique_ptr<IPEndPoint> remote_address(new IPEndPoint());
+ auto remote_address = std::make_unique<IPEndPoint>();
if (!remote_address->FromSockAddr(storage.addr, storage.addr_len))
return ERR_ADDRESS_INVALID;
remote_address_ = std::move(remote_address);
@@ -351,13 +351,13 @@ int UDPSocketWin::GetLocalAddress(IPEndPoint* address) const {
SockaddrStorage storage;
if (getsockname(socket_, storage.addr, &storage.addr_len))
return MapSystemError(WSAGetLastError());
- std::unique_ptr<IPEndPoint> local_address(new IPEndPoint());
+ auto local_address = std::make_unique<IPEndPoint>();
if (!local_address->FromSockAddr(storage.addr, storage.addr_len))
return ERR_ADDRESS_INVALID;
local_address_ = std::move(local_address);
net_log_.AddEvent(NetLogEventType::UDP_LOCAL_ADDRESS, [&] {
- return CreateNetLogUDPConnectParams(
- *local_address_, NetworkChangeNotifier::kInvalidNetworkHandle);
+ return CreateNetLogUDPConnectParams(*local_address_,
+ handles::kInvalidNetworkHandle);
});
}
@@ -440,8 +440,8 @@ int UDPSocketWin::SendToOrWrite(IOBuffer* buf,
int UDPSocketWin::Connect(const IPEndPoint& address) {
DCHECK_NE(socket_, INVALID_SOCKET);
net_log_.BeginEvent(NetLogEventType::UDP_CONNECT, [&] {
- return CreateNetLogUDPConnectParams(
- address, NetworkChangeNotifier::kInvalidNetworkHandle);
+ return CreateNetLogUDPConnectParams(address,
+ handles::kInvalidNetworkHandle);
});
int rv = SetMulticastOptions();
if (rv != OK)
@@ -499,7 +499,7 @@ int UDPSocketWin::Bind(const IPEndPoint& address) {
return rv;
}
-int UDPSocketWin::BindToNetwork(NetworkChangeNotifier::NetworkHandle network) {
+int UDPSocketWin::BindToNetwork(handles::NetworkHandle network) {
NOTIMPLEMENTED();
return ERR_NOT_IMPLEMENTED;
}
@@ -1182,37 +1182,6 @@ void UDPSocketWin::ApplySocketTag(const SocketTag& tag) {
CHECK(tag == SocketTag());
}
-void UDPSocketWin::SetWriteAsyncEnabled(bool enabled) {}
-bool UDPSocketWin::WriteAsyncEnabled() {
- return false;
-}
-void UDPSocketWin::SetMaxPacketSize(size_t max_packet_size) {}
-void UDPSocketWin::SetWriteMultiCoreEnabled(bool enabled) {}
-void UDPSocketWin::SetSendmmsgEnabled(bool enabled) {}
-void UDPSocketWin::SetWriteBatchingActive(bool active) {}
-
-int UDPSocketWin::WriteAsync(
- DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) {
- NOTIMPLEMENTED();
- return ERR_NOT_IMPLEMENTED;
-}
-
-int UDPSocketWin::WriteAsync(
- const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation) {
- NOTIMPLEMENTED();
- return ERR_NOT_IMPLEMENTED;
-}
-
-DatagramBuffers UDPSocketWin::GetUnwrittenBuffers() {
- DatagramBuffers result;
- NOTIMPLEMENTED();
- return result;
-}
DscpManager::DscpManager(QwaveApi* api, SOCKET socket)
: api_(api), socket_(socket) {
RequestHandle();
diff --git a/chromium/net/socket/udp_socket_win.h b/chromium/net/socket/udp_socket_win.h
index 880f7102a1f..99d2982c1d6 100644
--- a/chromium/net/socket/udp_socket_win.h
+++ b/chromium/net/socket/udp_socket_win.h
@@ -22,11 +22,10 @@
#include "base/win/scoped_handle.h"
#include "net/base/address_family.h"
#include "net/base/completion_once_callback.h"
-#include "net/base/datagram_buffer.h"
#include "net/base/io_buffer.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/log/net_log_with_source.h"
#include "net/socket/datagram_socket.h"
#include "net/socket/diff_serv_code_point.h"
@@ -176,7 +175,7 @@ class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate {
int Open(AddressFamily address_family);
// Not implemented. Returns ERR_NOT_IMPLEMENTED.
- int BindToNetwork(NetworkChangeNotifier::NetworkHandle network);
+ int BindToNetwork(handles::NetworkHandle network);
// Connects the socket to connect with a certain |address|.
// Should be called after Open().
@@ -348,23 +347,6 @@ class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate {
// to switch to non-blocking IO.
void UseNonBlockingIO();
- void SetWriteAsyncEnabled(bool enabled);
- bool WriteAsyncEnabled();
- void SetMaxPacketSize(size_t max_packet_size);
- void SetWriteMultiCoreEnabled(bool enabled);
- void SetSendmmsgEnabled(bool enabled);
- void SetWriteBatchingActive(bool active);
-
- int WriteAsync(DatagramBuffers buffers,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation);
- int WriteAsync(const char* buffer,
- size_t buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation);
-
- DatagramBuffers GetUnwrittenBuffers();
-
// Apply |tag| to this socket.
void ApplySocketTag(const SocketTag& tag);
diff --git a/chromium/net/socket/unix_domain_client_socket_posix_unittest.cc b/chromium/net/socket/unix_domain_client_socket_posix_unittest.cc
index 5d17b7a438e..756fa048ed6 100644
--- a/chromium/net/socket/unix_domain_client_socket_posix_unittest.cc
+++ b/chromium/net/socket/unix_domain_client_socket_posix_unittest.cc
@@ -194,7 +194,7 @@ TEST_F(UnixDomainClientSocketTest, ConnectWithSocketDescriptor) {
// to be sure it hasn't gotten accidentally closed.
SockaddrStorage addr;
ASSERT_TRUE(FillUnixAddress(socket_path_, false, &addr));
- std::unique_ptr<SocketPosix> adopter(new SocketPosix);
+ auto adopter = std::make_unique<SocketPosix>();
adopter->AdoptConnectedSocket(client_socket_fd, addr);
UnixDomainClientSocket rewrapped_socket(std::move(adopter));
EXPECT_TRUE(rewrapped_socket.IsConnected());
diff --git a/chromium/net/socket/unix_domain_server_socket_posix.cc b/chromium/net/socket/unix_domain_server_socket_posix.cc
index c579b4678d0..9e69fa922a8 100644
--- a/chromium/net/socket/unix_domain_server_socket_posix.cc
+++ b/chromium/net/socket/unix_domain_server_socket_posix.cc
@@ -72,7 +72,7 @@ int UnixDomainServerSocket::BindAndListen(const std::string& socket_path,
return ERR_ADDRESS_INVALID;
}
- std::unique_ptr<SocketPosix> socket(new SocketPosix);
+ auto socket = std::make_unique<SocketPosix>();
int rv = socket->Open(AF_UNIX);
DCHECK_NE(ERR_IO_PENDING, rv);
if (rv != OK)
diff --git a/chromium/net/socket/websocket_transport_client_socket_pool.cc b/chromium/net/socket/websocket_transport_client_socket_pool.cc
index b1f7cd260e3..78ee11d3293 100644
--- a/chromium/net/socket/websocket_transport_client_socket_pool.cc
+++ b/chromium/net/socket/websocket_transport_client_socket_pool.cc
@@ -196,9 +196,9 @@ void WebSocketTransportClientSocketPool::FlushWithError(
net_log_reason_utf8);
it = pending_connects_.erase(it);
}
- for (auto it = stalled_request_queue_.begin();
- it != stalled_request_queue_.end(); ++it) {
- InvokeUserCallbackLater(it->handle, std::move(it->callback), error);
+ for (auto& stalled_request : stalled_request_queue_) {
+ InvokeUserCallbackLater(stalled_request.handle,
+ std::move(stalled_request.callback), error);
}
stalled_request_map_.clear();
stalled_request_queue_.clear();
@@ -250,6 +250,13 @@ base::Value WebSocketTransportClientSocketPool::GetInfoAsValue(
return base::Value(std::move(dict));
}
+bool WebSocketTransportClientSocketPool::HasActiveSocket(
+ const GroupId& group_id) const {
+ // This method is not supported for WebSocket.
+ NOTREACHED();
+ return false;
+}
+
bool WebSocketTransportClientSocketPool::IsStalled() const {
return !stalled_request_queue_.empty();
}
diff --git a/chromium/net/socket/websocket_transport_client_socket_pool.h b/chromium/net/socket/websocket_transport_client_socket_pool.h
index 2f88e43fffa..64d2cc5c3d5 100644
--- a/chromium/net/socket/websocket_transport_client_socket_pool.h
+++ b/chromium/net/socket/websocket_transport_client_socket_pool.h
@@ -92,6 +92,7 @@ class NET_EXPORT_PRIVATE WebSocketTransportClientSocketPool
const ClientSocketHandle* handle) const override;
base::Value GetInfoAsValue(const std::string& name,
const std::string& type) const override;
+ bool HasActiveSocket(const GroupId& group_id) const override;
// HigherLayeredPool implementation.
bool IsStalled() const override;
diff --git a/chromium/net/socket/websocket_transport_client_socket_pool_unittest.cc b/chromium/net/socket/websocket_transport_client_socket_pool_unittest.cc
index 679e5d3cef4..2ec79710e30 100644
--- a/chromium/net/socket/websocket_transport_client_socket_pool_unittest.cc
+++ b/chromium/net/socket/websocket_transport_client_socket_pool_unittest.cc
@@ -546,7 +546,7 @@ TEST_F(WebSocketTransportClientSocketPoolTest, LockReleasedOnHandleReset) {
// The lock on the endpoint is released when a ClientSocketHandle is deleted.
TEST_F(WebSocketTransportClientSocketPoolTest, LockReleasedOnHandleDelete) {
TestCompletionCallback callback;
- std::unique_ptr<ClientSocketHandle> handle(new ClientSocketHandle);
+ auto handle = std::make_unique<ClientSocketHandle>();
int rv =
handle->Init(group_id_, params_, absl::nullopt /* proxy_annotation_tag */,
LOW, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
diff --git a/chromium/net/spdy/bidirectional_stream_spdy_impl.cc b/chromium/net/spdy/bidirectional_stream_spdy_impl.cc
index bb16279ecfa..c95eede92cc 100644
--- a/chromium/net/spdy/bidirectional_stream_spdy_impl.cc
+++ b/chromium/net/spdy/bidirectional_stream_spdy_impl.cc
@@ -16,7 +16,7 @@
#include "net/spdy/spdy_buffer.h"
#include "net/spdy/spdy_http_utils.h"
#include "net/spdy/spdy_stream.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
namespace net {
diff --git a/chromium/net/spdy/bidirectional_stream_spdy_impl.h b/chromium/net/spdy/bidirectional_stream_spdy_impl.h
index a5e2dcc26c0..f99fb1842ac 100644
--- a/chromium/net/spdy/bidirectional_stream_spdy_impl.h
+++ b/chromium/net/spdy/bidirectional_stream_spdy_impl.h
@@ -22,7 +22,7 @@
#include "net/spdy/spdy_read_queue.h"
#include "net/spdy/spdy_session.h"
#include "net/spdy/spdy_stream.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
namespace base {
class OneShotTimer;
diff --git a/chromium/net/spdy/buffered_spdy_framer.cc b/chromium/net/spdy/buffered_spdy_framer.cc
index d0502c2cd6c..27b94efd0e9 100644
--- a/chromium/net/spdy/buffered_spdy_framer.cc
+++ b/chromium/net/spdy/buffered_spdy_framer.cc
@@ -264,8 +264,8 @@ std::unique_ptr<spdy::SpdySerializedFrame> BufferedSpdyFramer::CreateRstStream(
std::unique_ptr<spdy::SpdySerializedFrame> BufferedSpdyFramer::CreateSettings(
const spdy::SettingsMap& values) const {
spdy::SpdySettingsIR settings_ir;
- for (auto it = values.begin(); it != values.end(); ++it) {
- settings_ir.AddSetting(it->first, it->second);
+ for (const auto& it : values) {
+ settings_ir.AddSetting(it.first, it.second);
}
return std::make_unique<spdy::SpdySerializedFrame>(
spdy_framer_.SerializeSettings(settings_ir));
diff --git a/chromium/net/spdy/buffered_spdy_framer.h b/chromium/net/spdy/buffered_spdy_framer.h
index 08ca82b4262..52469fac537 100644
--- a/chromium/net/spdy/buffered_spdy_framer.h
+++ b/chromium/net/spdy/buffered_spdy_framer.h
@@ -18,16 +18,16 @@
#include "net/log/net_log_source.h"
#include "net/spdy/header_coalescer.h"
#include "net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_alt_svc_wire_format.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h"
namespace net {
class NET_EXPORT_PRIVATE BufferedSpdyFramerVisitorInterface {
public:
- BufferedSpdyFramerVisitorInterface() {}
+ BufferedSpdyFramerVisitorInterface() = default;
BufferedSpdyFramerVisitorInterface(
const BufferedSpdyFramerVisitorInterface&) = delete;
@@ -123,13 +123,13 @@ class NET_EXPORT_PRIVATE BufferedSpdyFramerVisitorInterface {
uint8_t frame_type) = 0;
protected:
- virtual ~BufferedSpdyFramerVisitorInterface() {}
+ virtual ~BufferedSpdyFramerVisitorInterface() = default;
};
class NET_EXPORT_PRIVATE BufferedSpdyFramer
: public spdy::SpdyFramerVisitorInterface {
public:
- using TimeFunc = base::TimeTicks (*)(void);
+ using TimeFunc = base::TimeTicks (*)();
BufferedSpdyFramer(uint32_t max_header_list_size,
const NetLogWithSource& net_log,
@@ -205,6 +205,12 @@ class NET_EXPORT_PRIVATE BufferedSpdyFramer
absl::string_view priority_field_value) override {}
bool OnUnknownFrame(spdy::SpdyStreamId stream_id,
uint8_t frame_type) override;
+ void OnUnknownFrameStart(spdy::SpdyStreamId stream_id,
+ size_t length,
+ uint8_t type,
+ uint8_t flags) override {}
+ void OnUnknownFramePayload(spdy::SpdyStreamId stream_id,
+ absl::string_view payload) override {}
// spdy::SpdyFramer methods.
size_t ProcessInput(const char* data, size_t len);
diff --git a/chromium/net/spdy/buffered_spdy_framer_unittest.cc b/chromium/net/spdy/buffered_spdy_framer_unittest.cc
index 1e0d4f6e834..55615f4aa06 100644
--- a/chromium/net/spdy/buffered_spdy_framer_unittest.cc
+++ b/chromium/net/spdy/buffered_spdy_framer_unittest.cc
@@ -276,7 +276,7 @@ TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) {
}
TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) {
- spdy::SpdyGoAwayIR go_ir(/*last_accepted_stream_id=*/2,
+ spdy::SpdyGoAwayIR go_ir(/*last_good_stream_id=*/2,
spdy::ERROR_CODE_FRAME_SIZE_ERROR, "foo");
NetLogWithSource net_log;
BufferedSpdyFramer framer(kMaxHeaderListSizeForTest, net_log);
diff --git a/chromium/net/spdy/header_coalescer.h b/chromium/net/spdy/header_coalescer.h
index d2b72cb73d1..a6334e45c6d 100644
--- a/chromium/net/spdy/header_coalescer.h
+++ b/chromium/net/spdy/header_coalescer.h
@@ -8,7 +8,7 @@
#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
#include "net/log/net_log_with_source.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_headers_handler_interface.h"
namespace net {
diff --git a/chromium/net/spdy/header_coalescer_test.cc b/chromium/net/spdy/header_coalescer_test.cc
index 5edd92c419a..129e98b44af 100644
--- a/chromium/net/spdy/header_coalescer_test.cc
+++ b/chromium/net/spdy/header_coalescer_test.cc
@@ -17,8 +17,7 @@
using ::testing::ElementsAre;
using ::testing::Pair;
-namespace net {
-namespace test {
+namespace net::test {
class HeaderCoalescerTest : public ::testing::Test {
public:
@@ -157,6 +156,4 @@ TEST_F(HeaderCoalescerTest, HeaderValueContains0x7f) {
ExpectEntry("foo", "bar\x7F baz", "Invalid character 0x7F in header value.");
}
-} // namespace test
-
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/spdy/http2_push_promise_index.h b/chromium/net/spdy/http2_push_promise_index.h
index a44a7f87db0..1b92274622f 100644
--- a/chromium/net/spdy/http2_push_promise_index.h
+++ b/chromium/net/spdy/http2_push_promise_index.h
@@ -40,12 +40,12 @@ class NET_EXPORT Http2PushPromiseIndex {
// claimed, and generating SpdySession weak pointer.
class NET_EXPORT Delegate {
public:
- Delegate() {}
+ Delegate() = default;
Delegate(const Delegate&) = delete;
Delegate& operator=(const Delegate&) = delete;
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
// Return true if a pushed stream with |url| can be used for a request with
// |key|.
diff --git a/chromium/net/spdy/http2_push_promise_index_test.cc b/chromium/net/spdy/http2_push_promise_index_test.cc
index 7c8ef813bd6..7525584b20a 100644
--- a/chromium/net/spdy/http2_push_promise_index_test.cc
+++ b/chromium/net/spdy/http2_push_promise_index_test.cc
@@ -19,8 +19,7 @@
using ::testing::Return;
using ::testing::_;
-namespace net {
-namespace test {
+namespace net::test {
namespace {
// Delegate implementation for tests that requires exact match of SpdySessionKey
@@ -30,7 +29,7 @@ class TestDelegate : public Http2PushPromiseIndex::Delegate {
public:
TestDelegate() = delete;
explicit TestDelegate(const SpdySessionKey& key) : key_(key) {}
- ~TestDelegate() override {}
+ ~TestDelegate() override = default;
bool ValidatePushedStream(spdy::SpdyStreamId stream_id,
const GURL& url,
@@ -470,5 +469,4 @@ TEST(Http2PushPromiseIndexCompareByUrlTest, LookupByURL) {
url2, nullptr, kNoPushedStreamFound}) == entries.find(entry2));
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/spdy/multiplexed_http_stream.cc b/chromium/net/spdy/multiplexed_http_stream.cc
index b4e47bcf1f0..9a48e45bc81 100644
--- a/chromium/net/spdy/multiplexed_http_stream.cc
+++ b/chromium/net/spdy/multiplexed_http_stream.cc
@@ -9,7 +9,7 @@
#include "base/notreached.h"
#include "base/strings/abseil_string_conversions.h"
#include "net/http/http_raw_request_headers.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
namespace net {
@@ -44,7 +44,7 @@ void MultiplexedHttpStream::Drain(HttpNetworkSession* session) {
delete this;
}
-HttpStream* MultiplexedHttpStream::RenewStreamForAuth() {
+std::unique_ptr<HttpStream> MultiplexedHttpStream::RenewStreamForAuth() {
return nullptr;
}
diff --git a/chromium/net/spdy/multiplexed_http_stream.h b/chromium/net/spdy/multiplexed_http_stream.h
index 56e1cd0473f..5e0700501a0 100644
--- a/chromium/net/spdy/multiplexed_http_stream.h
+++ b/chromium/net/spdy/multiplexed_http_stream.h
@@ -10,7 +10,7 @@
#include "net/http/http_stream.h"
#include "net/spdy/multiplexed_session.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
namespace net {
@@ -25,7 +25,7 @@ class NET_EXPORT_PRIVATE MultiplexedHttpStream : public HttpStream {
void GetSSLInfo(SSLInfo* ssl_info) override;
void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override;
void Drain(HttpNetworkSession* session) override;
- HttpStream* RenewStreamForAuth() override;
+ std::unique_ptr<HttpStream> RenewStreamForAuth() override;
void SetConnectionReused() override;
bool CanReuseConnection() const override;
diff --git a/chromium/net/spdy/multiplexed_session.h b/chromium/net/spdy/multiplexed_session.h
index 0aaa26690b7..86de0ced627 100644
--- a/chromium/net/spdy/multiplexed_session.h
+++ b/chromium/net/spdy/multiplexed_session.h
@@ -20,7 +20,7 @@ namespace net {
// Base class for SPDY and QUIC sessions.
class NET_EXPORT_PRIVATE MultiplexedSession {
public:
- virtual ~MultiplexedSession() {}
+ virtual ~MultiplexedSession() = default;
// Fills SSL info in |ssl_info| and returns true when SSL is in use.
virtual bool GetSSLInfo(SSLInfo* ssl_info) const = 0;
diff --git a/chromium/net/spdy/server_push_delegate.h b/chromium/net/spdy/server_push_delegate.h
index 6f95735c312..16341091374 100644
--- a/chromium/net/spdy/server_push_delegate.h
+++ b/chromium/net/spdy/server_push_delegate.h
@@ -20,7 +20,7 @@ class NET_EXPORT_PRIVATE ServerPushDelegate {
// An interface to a class that reflects information on the pushed request.
class NET_EXPORT ServerPushHelper {
public:
- virtual ~ServerPushHelper() {}
+ virtual ~ServerPushHelper() = default;
// Cancels the push if it is not claimed yet.
virtual void Cancel() = 0;
@@ -32,7 +32,7 @@ class NET_EXPORT_PRIVATE ServerPushDelegate {
virtual NetworkIsolationKey GetNetworkIsolationKey() const = 0;
};
- virtual ~ServerPushDelegate() {}
+ virtual ~ServerPushDelegate() = default;
// Invoked by session when a push promise has been received.
virtual void OnPush(std::unique_ptr<ServerPushHelper> push_helper,
diff --git a/chromium/net/spdy/spdy_buffer.cc b/chromium/net/spdy/spdy_buffer.cc
index aaf447e24f0..319a8bca260 100644
--- a/chromium/net/spdy/spdy_buffer.cc
+++ b/chromium/net/spdy/spdy_buffer.cc
@@ -60,12 +60,12 @@ class SpdyBuffer::SharedFrameIOBuffer : public IOBuffer {
};
SpdyBuffer::SpdyBuffer(std::unique_ptr<spdy::SpdySerializedFrame> frame)
- : shared_frame_(new SharedFrame(std::move(frame))) {}
+ : shared_frame_(base::MakeRefCounted<SharedFrame>(std::move(frame))) {}
// The given data may not be strictly a SPDY frame; we (ab)use
// |frame_| just as a container.
SpdyBuffer::SpdyBuffer(const char* data, size_t size)
- : shared_frame_(new SharedFrame()) {
+ : shared_frame_(base::MakeRefCounted<SharedFrame>()) {
CHECK_GT(size, 0u);
CHECK_LE(size, kMaxSpdyFrameSize);
shared_frame_->data = MakeSpdySerializedFrame(data, size);
diff --git a/chromium/net/spdy/spdy_http_stream.cc b/chromium/net/spdy/spdy_http_stream.cc
index be3c2d75e2d..a58e9666035 100644
--- a/chromium/net/spdy/spdy_http_stream.cc
+++ b/chromium/net/spdy/spdy_http_stream.cc
@@ -27,7 +27,7 @@
#include "net/spdy/spdy_http_utils.h"
#include "net/spdy/spdy_log_util.h"
#include "net/spdy/spdy_session.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h"
#include "url/scheme_host_port.h"
@@ -435,8 +435,6 @@ void SpdyHttpStream::OnHeadersReceived(
response_info_->connection_info = HttpResponseInfo::CONNECTION_INFO_HTTP2;
response_info_->alpn_negotiated_protocol =
HttpResponseInfo::ConnectionInfoToString(response_info_->connection_info);
- response_info_->vary_data
- .Init(*request_info_, *response_info_->headers.get());
// Invalidate HttpRequestInfo pointer. This is to allow |this| to be
// shared across multiple consumers at the cache layer which might require
diff --git a/chromium/net/spdy/spdy_http_stream_unittest.cc b/chromium/net/spdy/spdy_http_stream_unittest.cc
index 6a4fcc6ed52..46f61ac2820 100644
--- a/chromium/net/spdy/spdy_http_stream_unittest.cc
+++ b/chromium/net/spdy/spdy_http_stream_unittest.cc
@@ -38,9 +38,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace test {
+namespace net::test {
namespace {
@@ -1265,6 +1263,4 @@ TEST_F(SpdyHttpStreamTest, DownloadWithEmptyDataFrame) {
// TODO(willchan): Write a longer test for SpdyStream that exercises all
// methods.
-} // namespace test
-
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/spdy/spdy_http_utils.cc b/chromium/net/spdy/spdy_http_utils.cc
index 30e0be4d57a..147d9fc85c4 100644
--- a/chromium/net/spdy/spdy_http_utils.cc
+++ b/chromium/net/spdy/spdy_http_utils.cc
@@ -83,7 +83,7 @@ int SpdyHeadersToHttpResponse(const spdy::Http2HeaderBlock& headers,
} while (end != value.npos);
}
- response->headers = new HttpResponseHeaders(raw_headers);
+ response->headers = base::MakeRefCounted<HttpResponseHeaders>(raw_headers);
// When there are multiple location headers the response is a potential
// response smuggling attack.
diff --git a/chromium/net/spdy/spdy_http_utils.h b/chromium/net/spdy/spdy_http_utils.h
index c82768dd507..2a3a4b66994 100644
--- a/chromium/net/spdy/spdy_http_utils.h
+++ b/chromium/net/spdy/spdy_http_utils.h
@@ -7,8 +7,8 @@
#include "net/base/net_export.h"
#include "net/base/request_priority.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h"
#include "url/gurl.h"
diff --git a/chromium/net/spdy/spdy_log_util.h b/chromium/net/spdy/spdy_log_util.h
index 16ad6be9e4d..2fd7d480d44 100644
--- a/chromium/net/spdy/spdy_log_util.h
+++ b/chromium/net/spdy/spdy_log_util.h
@@ -11,7 +11,7 @@
#include "net/http/http_log_util.h"
#include "net/log/net_log.h"
#include "net/log/net_log_capture_mode.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
namespace net {
diff --git a/chromium/net/spdy/spdy_network_transaction_unittest.cc b/chromium/net/spdy/spdy_network_transaction_unittest.cc
index acf28bf5fc8..78deefbad8c 100644
--- a/chromium/net/spdy/spdy_network_transaction_unittest.cc
+++ b/chromium/net/spdy/spdy_network_transaction_unittest.cc
@@ -442,8 +442,11 @@ class SpdyNetworkTransactionTest : public TestWithTaskEnvironment {
HttpResponseInfo* response,
HttpResponseInfo* push_response,
const std::string& expected) {
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
- nullptr);
+ std::move(session_deps));
+
helper.RunPreTestSetup();
helper.AddData(data);
@@ -504,8 +507,11 @@ class SpdyNetworkTransactionTest : public TestWithTaskEnvironment {
}
void RunBrokenPushTest(SequencedSocketData* data, int expected_rv) {
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
- nullptr);
+ std::move(session_deps));
+
helper.RunPreTestSetup();
helper.AddData(data);
@@ -1610,8 +1616,8 @@ namespace {
// invoked.
class KillerCallback : public TestCompletionCallbackBase {
public:
- explicit KillerCallback(HttpNetworkTransaction* transaction)
- : transaction_(transaction) {}
+ explicit KillerCallback(std::unique_ptr<HttpNetworkTransaction> transaction)
+ : transaction_(std::move(transaction)) {}
~KillerCallback() override = default;
@@ -1622,12 +1628,12 @@ class KillerCallback : public TestCompletionCallbackBase {
private:
void OnComplete(int result) {
if (result < 0)
- delete transaction_;
+ transaction_.reset();
SetResult(result);
}
- raw_ptr<HttpNetworkTransaction> transaction_;
+ std::unique_ptr<HttpNetworkTransaction> transaction_;
};
} // namespace
@@ -1692,12 +1698,13 @@ TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) {
helper.AddData(&data_placeholder);
HttpNetworkTransaction trans1(HIGHEST, helper.session());
HttpNetworkTransaction trans2(MEDIUM, helper.session());
- HttpNetworkTransaction* trans3(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session()));
+ auto trans3 = std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY,
+ helper.session());
+ auto* trans3_ptr = trans3.get();
TestCompletionCallback callback1;
TestCompletionCallback callback2;
- KillerCallback callback3(trans3);
+ KillerCallback callback3(std::move(trans3));
out.rv = trans1.Start(&request_, callback1.callback(), log_);
ASSERT_EQ(out.rv, ERR_IO_PENDING);
@@ -1707,7 +1714,7 @@ TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) {
out.rv = trans2.Start(&request_, callback2.callback(), log_);
ASSERT_EQ(out.rv, ERR_IO_PENDING);
- out.rv = trans3->Start(&request_, callback3.callback(), log_);
+ out.rv = trans3_ptr->Start(&request_, callback3.callback(), log_);
ASSERT_EQ(out.rv, ERR_IO_PENDING);
// Run until both transactions are in the SpdySession's queue, waiting for the
@@ -2252,7 +2259,10 @@ TEST_F(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) {
};
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunToCompletion(&data);
TransactionHelperResult out = helper.output();
EXPECT_THAT(out.rv, IsOk());
@@ -2535,6 +2545,9 @@ TEST_F(SpdyNetworkTransactionTest, RedirectServerPush) {
MockClientSocketFactory socket_factory;
auto context_builder =
CreateSpdyTestURLRequestContextBuilder(&socket_factory);
+ HttpNetworkSessionParams test_params;
+ test_params.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ context_builder->set_http_network_session_params(test_params);
auto spdy_url_request_context = context_builder->Build();
SpdySessionPoolPeer pool_peer(
spdy_url_request_context->http_transaction_factory()
@@ -2795,7 +2808,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushHeadMethod) {
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -2866,7 +2882,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushHeadDoesNotMatchGetRequest) {
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -3013,7 +3032,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushUpdatesPriority) {
SequencedSocketData data_placeholder2;
SequencedSocketData data_placeholder3;
- NormalSpdyTransactionHelper helper(request_, LOWEST, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, LOWEST, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
helper.AddData(&data_placeholder1); // other requests reuse the same socket
@@ -3079,7 +3101,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushServerAborted) {
};
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -3428,7 +3453,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) {
};
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunToCompletion(&data);
histogram_tester.ExpectBucketCount(
@@ -3462,7 +3490,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedStream) {
};
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -3524,7 +3555,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) {
MockRead(ASYNC, ERR_IO_PENDING, 6), CreateMockRead(stream3_syn, 7)};
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -3594,7 +3628,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerCancelsPush) {
SequencedSocketData data(reads1, writes1);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -3669,6 +3706,8 @@ TEST_F(SpdyNetworkTransactionTest, ServerCancelsCrossOriginPush) {
auto session_deps = std::make_unique<SpdySessionDependencies>();
session_deps->host_resolver = std::move(resolver);
+
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
std::move(session_deps));
@@ -3796,7 +3835,7 @@ TEST_F(SpdyNetworkTransactionTest, NoConnectionPoolingOverTunnel) {
const char kPacString[] = "PROXY myproxy:443";
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
kPacString, TRAFFIC_ANNOTATION_FOR_TESTS));
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
std::move(session_deps));
@@ -4558,7 +4597,10 @@ TEST_F(SpdyNetworkTransactionTest, RejectServerPushWithNoMethod) {
MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5)};
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunToCompletion(&data);
histogram_tester.ExpectBucketCount(
@@ -4592,7 +4634,10 @@ TEST_F(SpdyNetworkTransactionTest, RejectServerPushWithInvalidMethod) {
MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5)};
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunToCompletion(&data);
histogram_tester.ExpectBucketCount(
@@ -5703,7 +5748,7 @@ TEST_F(SpdyNetworkTransactionTest, HTTP11RequiredRetryWithNetworkIsolationKey) {
TEST_F(SpdyNetworkTransactionTest, HTTP11RequiredProxyRetry) {
request_.method = "GET";
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
// Do not force SPDY so that second socket can negotiate HTTP/1.1.
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
@@ -5813,7 +5858,7 @@ TEST_F(SpdyNetworkTransactionTest,
request_.method = "GET";
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
// Do not force SPDY so that second socket can negotiate HTTP/1.1.
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
@@ -5927,7 +5972,7 @@ TEST_F(SpdyNetworkTransactionTest,
// Test to make sure we can correctly connect through a proxy.
TEST_F(SpdyNetworkTransactionTest, ProxyConnect) {
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
std::move(session_deps));
@@ -5986,7 +6031,7 @@ TEST_F(SpdyNetworkTransactionTest, DirectConnectProxyReconnect) {
// to simply DIRECT. The reason for appending the second proxy is to verify
// that the session pool key used does is just "DIRECT".
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"DIRECT; PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
// When setting up the first transaction, we store the SpdySessionPool so that
// we can use the same pool in the second transaction.
@@ -6076,7 +6121,7 @@ TEST_F(SpdyNetworkTransactionTest, DirectConnectProxyReconnect) {
request_.method = "GET";
request_.url = GURL(kPushedUrl);
auto session_deps_proxy = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"PROXY myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
NormalSpdyTransactionHelper helper_proxy(request_, DEFAULT_PRIORITY, log_,
std::move(session_deps_proxy));
@@ -6364,7 +6409,7 @@ class SpdyNetworkTransactionPushHeaderTest
spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
writes.push_back(CreateMockWrite(priority, seq++));
- reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, seq++));
+ reads.emplace_back(ASYNC, ERR_IO_PENDING, seq++);
spdy::Http2HeaderBlock pushed_response_headers;
pushed_response_headers[spdy::kHttp2StatusHeader] =
@@ -6413,14 +6458,16 @@ class SpdyNetworkTransactionPushHeaderTest
reads.push_back(CreateMockRead(body2, seq++));
}
- reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, seq++));
+ reads.emplace_back(ASYNC, ERR_IO_PENDING, seq++);
- reads.push_back(MockRead(ASYNC, 0, seq++));
+ reads.emplace_back(ASYNC, 0, seq++);
SequencedSocketData data(reads, writes);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
- nullptr);
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -6677,7 +6724,7 @@ class SpdyNetworkTransactionPushUrlTest
"mail.example.org", base::Time::Now() + base::Days(1) /* expiry */,
true, GURL(), request_.network_isolation_key);
}
-
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
std::move(session_deps));
@@ -6773,7 +6820,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOrigin) {
request_.url = GURL(url_to_fetch);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -6878,7 +6928,10 @@ TEST_F(SpdyNetworkTransactionTest,
request_.url = GURL(url_to_fetch);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -6979,7 +7032,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushWithClientCert) {
ssl_provider->ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddDataWithSSLSocketDataProvider(&data, std::move(ssl_provider));
@@ -7069,7 +7125,10 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOriginWithOpenSession) {
// Request |url_to_fetch0| to open connection to mail.example.org.
request_.url = GURL(url_to_fetch0);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
// "spdy_pooling.pem" is valid for www.example.org, but not for
@@ -7470,6 +7529,7 @@ TEST_F(SpdyNetworkTransactionTest, WindowUpdateSent) {
stream_max_recv_window_size;
initial_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] =
kSpdyMaxHeaderListSize;
+ initial_settings[spdy::SETTINGS_ENABLE_PUSH] = 0;
spdy::SpdySerializedFrame initial_settings_frame(
spdy_util_.ConstructSpdySettings(initial_settings));
@@ -7504,8 +7564,7 @@ TEST_F(SpdyNetworkTransactionTest, WindowUpdateSent) {
remaining -= frame_size;
}
// Yield.
- reads.push_back(
- MockRead(SYNCHRONOUS, ERR_IO_PENDING, writes.size() + reads.size()));
+ reads.emplace_back(SYNCHRONOUS, ERR_IO_PENDING, writes.size() + reads.size());
spdy::SpdySerializedFrame session_window_update(
spdy_util_.ConstructSpdyWindowUpdate(0, session_window_update_delta));
@@ -7699,7 +7758,7 @@ TEST_F(SpdyNetworkTransactionTest, SessionMaxQueuedCappedFramesExceeded) {
CreateMockWrite(ping_frames.back(), writes.size() + reads.size()));
}
// Stop reading.
- reads.push_back(MockRead(ASYNC, 0, writes.size() + reads.size()));
+ reads.emplace_back(ASYNC, 0, writes.size() + reads.size());
SequencedSocketData data(reads, writes);
auto session_deps = std::make_unique<SpdySessionDependencies>();
@@ -7798,7 +7857,7 @@ TEST_F(SpdyNetworkTransactionTest, FlowControlStallResume) {
// Fill in mock reads.
std::vector<MockRead> reads;
// Force a pause.
- reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, i++));
+ reads.emplace_back(ASYNC, ERR_IO_PENDING, i++);
// Construct read frame for window updates that gives enough space to upload
// the rest of the data.
spdy::SpdySerializedFrame session_window_update(
@@ -7820,7 +7879,7 @@ TEST_F(SpdyNetworkTransactionTest, FlowControlStallResume) {
reads.push_back(CreateMockRead(reply, i++));
reads.push_back(CreateMockRead(body2, i++));
reads.push_back(CreateMockRead(body5, i++));
- reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
+ reads.emplace_back(ASYNC, 0, i++); // EOF
SequencedSocketData data(reads, writes);
@@ -7947,7 +8006,7 @@ TEST_F(SpdyNetworkTransactionTest, FlowControlStallResumeAfterSettings) {
// Fill in mock reads.
std::vector<MockRead> reads;
// Force a pause.
- reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, i++));
+ reads.emplace_back(ASYNC, ERR_IO_PENDING, i++);
// Construct read frame for SETTINGS that gives enough space to upload the
// rest of the data.
@@ -7976,7 +8035,7 @@ TEST_F(SpdyNetworkTransactionTest, FlowControlStallResumeAfterSettings) {
reads.push_back(CreateMockRead(reply, i++));
reads.push_back(CreateMockRead(body2, i++));
reads.push_back(CreateMockRead(body5, i++));
- reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
+ reads.emplace_back(ASYNC, 0, i++); // EOF
// Force all writes to happen before any read, last write will not
// actually queue a frame, due to window size being 0.
@@ -8108,7 +8167,7 @@ TEST_F(SpdyNetworkTransactionTest, FlowControlNegativeSendWindowSize) {
// Fill in mock reads.
std::vector<MockRead> reads;
// Force a pause.
- reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, i++));
+ reads.emplace_back(ASYNC, ERR_IO_PENDING, i++);
// Construct read frame for SETTINGS that makes the send_window_size
// negative.
spdy::SettingsMap new_settings;
@@ -8139,7 +8198,7 @@ TEST_F(SpdyNetworkTransactionTest, FlowControlNegativeSendWindowSize) {
reads.push_back(CreateMockRead(reply, i++));
reads.push_back(CreateMockRead(body2, i++));
reads.push_back(CreateMockRead(body5, i++));
- reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
+ reads.emplace_back(ASYNC, 0, i++); // EOF
// Force all writes to happen before any read, last write will not
// actually queue a frame, due to window size being 0.
@@ -8211,7 +8270,11 @@ TEST_F(SpdyNetworkTransactionTest, GoAwayOnOddPushStreamId) {
};
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunToCompletion(&data);
TransactionHelperResult out = helper.output();
EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
@@ -8250,7 +8313,10 @@ TEST_F(SpdyNetworkTransactionTest,
};
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunToCompletion(&data);
TransactionHelperResult out = helper.output();
EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
@@ -8578,7 +8644,7 @@ TEST_F(SpdyNetworkTransactionTest, InsecureUrlCreatesSecureSpdySession) {
// Need secure proxy so that insecure URL can use HTTP/2.
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
std::move(session_deps));
@@ -8658,7 +8724,10 @@ TEST_F(SpdyNetworkTransactionTest, PushCanceledByServerAfterClaimed) {
SequencedSocketData data(reads, writes);
- NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
+ auto session_deps = std::make_unique<SpdySessionDependencies>();
+ session_deps->http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+ std::move(session_deps));
helper.RunPreTestSetup();
helper.AddData(&data);
@@ -9093,7 +9162,7 @@ TEST_F(SpdyNetworkTransactionTest, WebSocketOverHTTP2) {
TEST_F(SpdyNetworkTransactionTest,
WebSocketDoesNotUseNewH2SessionWithoutWebSocketSupportOverHttpsProxy) {
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
NormalSpdyTransactionHelper helper(request_, HIGHEST, log_,
@@ -9727,7 +9796,7 @@ TEST_F(SpdyNetworkTransactionTest, PlaintextWebSocketOverHttp2Proxy) {
request_.extra_headers.SetHeader("Origin", "http://www.example.org");
request_.extra_headers.SetHeader("Sec-WebSocket-Version", "13");
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
std::move(session_deps));
@@ -9787,7 +9856,7 @@ TEST_F(SpdyNetworkTransactionTest, SecureWebSocketOverHttp2Proxy) {
request_.extra_headers.SetHeader("Origin", "http://www.example.org");
request_.extra_headers.SetHeader("Sec-WebSocket-Version", "13");
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
std::move(session_deps));
@@ -9847,7 +9916,7 @@ TEST_F(SpdyNetworkTransactionTest,
request_.extra_headers.SetHeader("Origin", "http://www.example.org");
request_.extra_headers.SetHeader("Sec-WebSocket-Version", "13");
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
"https://proxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
std::move(session_deps));
@@ -10754,7 +10823,7 @@ TEST_F(SpdyNetworkTransactionTest,
// streams.
TEST_F(SpdyNetworkTransactionTest, DoNotGreaseFrameTypeWithConnect) {
auto session_deps = std::make_unique<SpdySessionDependencies>(
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
"HTTPS myproxy:70", TRAFFIC_ANNOTATION_FOR_TESTS));
const uint8_t type = 0x0b;
diff --git a/chromium/net/spdy/spdy_proxy_client_socket.cc b/chromium/net/spdy/spdy_proxy_client_socket.cc
index 273b456159c..a915d31a00f 100644
--- a/chromium/net/spdy/spdy_proxy_client_socket.cc
+++ b/chromium/net/spdy/spdy_proxy_client_socket.cc
@@ -38,11 +38,11 @@ SpdyProxyClientSocket::SpdyProxyClientSocket(
const std::string& user_agent,
const HostPortPair& endpoint,
const NetLogWithSource& source_net_log,
- HttpAuthController* auth_controller,
+ scoped_refptr<HttpAuthController> auth_controller,
ProxyDelegate* proxy_delegate)
: spdy_stream_(spdy_stream),
endpoint_(endpoint),
- auth_(auth_controller),
+ auth_(std::move(auth_controller)),
proxy_server_(proxy_server),
proxy_delegate_(proxy_delegate),
user_agent_(user_agent),
diff --git a/chromium/net/spdy/spdy_proxy_client_socket.h b/chromium/net/spdy/spdy_proxy_client_socket.h
index b2a2e4a9f59..5b5852511ef 100644
--- a/chromium/net/spdy/spdy_proxy_client_socket.h
+++ b/chromium/net/spdy/spdy_proxy_client_socket.h
@@ -51,7 +51,7 @@ class NET_EXPORT_PRIVATE SpdyProxyClientSocket : public ProxyClientSocket,
const std::string& user_agent,
const HostPortPair& endpoint,
const NetLogWithSource& source_net_log,
- HttpAuthController* auth_controller,
+ scoped_refptr<HttpAuthController> auth_controller,
ProxyDelegate* proxy_delegate);
SpdyProxyClientSocket(const SpdyProxyClientSocket&) = delete;
diff --git a/chromium/net/spdy/spdy_proxy_client_socket_unittest.cc b/chromium/net/spdy/spdy_proxy_client_socket_unittest.cc
index 9aa415b7941..001b79c2312 100644
--- a/chromium/net/spdy/spdy_proxy_client_socket_unittest.cc
+++ b/chromium/net/spdy/spdy_proxy_client_socket_unittest.cc
@@ -282,7 +282,7 @@ void SpdyProxyClientSocketTest::Initialize(base::span<const MockRead> reads,
sock_ = std::make_unique<SpdyProxyClientSocket>(
spdy_stream, ProxyServer(ProxyServer::SCHEME_HTTPS, proxy_host_port_),
user_agent_, endpoint_host_port_pair_, net_log_with_source_,
- new HttpAuthController(
+ base::MakeRefCounted<HttpAuthController>(
HttpAuth::AUTH_PROXY, GURL("https://" + proxy_host_port_.ToString()),
NetworkIsolationKey(), session_->http_auth_cache(),
session_->http_auth_handler_factory(), session_->host_resolver()),
diff --git a/chromium/net/spdy/spdy_read_queue_unittest.cc b/chromium/net/spdy/spdy_read_queue_unittest.cc
index eeee4c2f36c..aac9c792a2f 100644
--- a/chromium/net/spdy/spdy_read_queue_unittest.cc
+++ b/chromium/net/spdy/spdy_read_queue_unittest.cc
@@ -15,8 +15,7 @@
#include "net/spdy/spdy_buffer.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
namespace {
const char kData[] = "SPDY read queue test data.\0Some more data.";
@@ -134,5 +133,4 @@ TEST_F(SpdyReadQueueTest, Clear) {
EXPECT_TRUE(read_queue.IsEmpty());
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/spdy/spdy_session.cc b/chromium/net/spdy/spdy_session.cc
index 05ff79b1238..1466f53afdd 100644
--- a/chromium/net/spdy/spdy_session.cc
+++ b/chromium/net/spdy/spdy_session.cc
@@ -302,15 +302,15 @@ base::Value NetLogSpdyInitializedParams(NetLogSource source) {
base::Value NetLogSpdySendSettingsParams(const spdy::SettingsMap* settings) {
base::Value::Dict dict;
- std::vector<base::Value> settings_list;
- for (auto it = settings->begin(); it != settings->end(); ++it) {
- const spdy::SpdySettingsId id = it->first;
- const uint32_t value = it->second;
- settings_list.emplace_back(
+ base::Value::List settings_list;
+ for (const auto& setting : *settings) {
+ const spdy::SpdySettingsId id = setting.first;
+ const uint32_t value = setting.second;
+ settings_list.Append(
base::StringPrintf("[id:%u (%s) value:%u]", id,
spdy::SettingsIdToString(id).c_str(), value));
}
- dict.Set("settings", base::Value(std::move(settings_list)));
+ dict.Set("settings", std::move(settings_list));
return base::Value(std::move(dict));
}
diff --git a/chromium/net/spdy/spdy_session.h b/chromium/net/spdy/spdy_session.h
index 8bd21fe18f2..e52a7b918c7 100644
--- a/chromium/net/spdy/spdy_session.h
+++ b/chromium/net/spdy/spdy_session.h
@@ -47,9 +47,9 @@
#include "net/spdy/spdy_stream.h"
#include "net/spdy/spdy_write_queue.h"
#include "net/ssl/ssl_config_service.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_alt_svc_wire_format.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -335,7 +335,7 @@ class NET_EXPORT SpdySession
public Http2PushPromiseIndex::Delegate {
public:
// TODO(akalin): Use base::TickClock when it becomes available.
- typedef base::TimeTicks (*TimeFunc)(void);
+ typedef base::TimeTicks (*TimeFunc)();
// Returns true if |new_hostname| can be pooled into an existing connection to
// |old_hostname| associated with |ssl_info|.
diff --git a/chromium/net/spdy/spdy_session_pool.cc b/chromium/net/spdy/spdy_session_pool.cc
index d2a243c4a2e..57be3158529 100644
--- a/chromium/net/spdy/spdy_session_pool.cc
+++ b/chromium/net/spdy/spdy_session_pool.cc
@@ -432,9 +432,9 @@ void SpdySessionPool::MakeSessionUnavailable(
UnmapKey(available_session->spdy_session_key());
RemoveAliases(available_session->spdy_session_key());
const std::set<SpdySessionKey>& aliases = available_session->pooled_aliases();
- for (auto it = aliases.begin(); it != aliases.end(); ++it) {
- UnmapKey(*it);
- RemoveAliases(*it);
+ for (const auto& alias : aliases) {
+ UnmapKey(alias);
+ RemoveAliases(alias);
}
DCHECK(!IsSessionAvailable(available_session));
}
@@ -479,14 +479,14 @@ std::unique_ptr<base::Value> SpdySessionPool::SpdySessionPoolInfoToValue()
const {
base::Value::List list;
- for (auto it = available_sessions_.begin(); it != available_sessions_.end();
- ++it) {
+ for (const auto& available_session : available_sessions_) {
// Only add the session if the key in the map matches the main
// host_port_proxy_pair (not an alias).
- const SpdySessionKey& key = it->first;
- const SpdySessionKey& session_key = it->second->spdy_session_key();
+ const SpdySessionKey& key = available_session.first;
+ const SpdySessionKey& session_key =
+ available_session.second->spdy_session_key();
if (key == session_key)
- list.Append(it->second->GetInfoAsValue());
+ list.Append(available_session.second->GetInfoAsValue());
}
return std::make_unique<base::Value>(std::move(list));
}
@@ -574,9 +574,8 @@ SpdySessionPool::RequestInfoForKey::~RequestInfoForKey() = default;
bool SpdySessionPool::IsSessionAvailable(
const base::WeakPtr<SpdySession>& session) const {
- for (auto it = available_sessions_.begin(); it != available_sessions_.end();
- ++it) {
- if (it->second.get() == session.get())
+ for (const auto& available_session : available_sessions_) {
+ if (available_session.second.get() == session.get())
return true;
}
return false;
@@ -623,8 +622,8 @@ void SpdySessionPool::RemoveAliases(const SpdySessionKey& key) {
SpdySessionPool::WeakSessionList SpdySessionPool::GetCurrentSessions() const {
WeakSessionList current_sessions;
- for (auto it = sessions_.begin(); it != sessions_.end(); ++it) {
- current_sessions.push_back((*it)->GetWeakPtr());
+ for (auto* session : sessions_) {
+ current_sessions.push_back(session->GetWeakPtr());
}
return current_sessions;
}
diff --git a/chromium/net/spdy/spdy_session_pool.h b/chromium/net/spdy/spdy_session_pool.h
index 177826120b9..dd45acded8b 100644
--- a/chromium/net/spdy/spdy_session_pool.h
+++ b/chromium/net/spdy/spdy_session_pool.h
@@ -52,7 +52,7 @@ class NET_EXPORT SpdySessionPool
: public NetworkChangeNotifier::IPAddressObserver,
public SSLClientContext::Observer {
public:
- typedef base::TimeTicks (*TimeFunc)(void);
+ typedef base::TimeTicks (*TimeFunc)();
// Struct to hold randomly generated frame parameters to be used for sending
// frames on the wire to "grease" frame type. Frame type has to be one of
diff --git a/chromium/net/spdy/spdy_session_pool_unittest.cc b/chromium/net/spdy/spdy_session_pool_unittest.cc
index 6c039ecc895..0716a16c397 100644
--- a/chromium/net/spdy/spdy_session_pool_unittest.cc
+++ b/chromium/net/spdy/spdy_session_pool_unittest.cc
@@ -148,9 +148,8 @@ bool TryCreateAliasedSpdySession(SpdySessionPool* pool,
EXPECT_TRUE(is_blocking_request_for_session);
AddressList address_list;
- EXPECT_THAT(
- ParseAddressList(ip_address_list, /* dns_aliases = */ {}, &address_list),
- IsOk());
+ EXPECT_THAT(ParseAddressList(ip_address_list, &address_list.endpoints()),
+ IsOk());
address_list = AddressList::CopyWithPort(address_list, 443);
// Simulate a host resolution completing.
@@ -536,12 +535,12 @@ void SpdySessionPoolTest::RunIPPoolingTest(
"192.168.0.4,192.168.0.3"},
};
- for (size_t i = 0; i < std::size(test_hosts); i++) {
+ for (auto& test_host : test_hosts) {
session_deps_.host_resolver->rules()->AddIPLiteralRule(
- test_hosts[i].name, test_hosts[i].iplist, std::string());
+ test_host.name, test_host.iplist, std::string());
- test_hosts[i].key = SpdySessionKey(
- HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(),
+ test_host.key = SpdySessionKey(
+ HostPortPair(test_host.name, kTestPort), ProxyServer::Direct(),
PRIVACY_MODE_DISABLED, SpdySessionKey::IsProxySession::kFalse,
SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow);
}
@@ -719,13 +718,13 @@ void SpdySessionPoolTest::RunIPPoolingDisabledTest(SSLSocketDataProvider* ssl) {
};
session_deps_.host_resolver->set_synchronous_mode(true);
- for (size_t i = 0; i < std::size(test_hosts); i++) {
+ for (auto& test_host : test_hosts) {
session_deps_.host_resolver->rules()->AddIPLiteralRule(
- test_hosts[i].name, test_hosts[i].iplist, std::string());
+ test_host.name, test_host.iplist, std::string());
// Setup a SpdySessionKey
- test_hosts[i].key = SpdySessionKey(
- HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(),
+ test_host.key = SpdySessionKey(
+ HostPortPair(test_host.name, kTestPort), ProxyServer::Direct(),
PRIVACY_MODE_DISABLED, SpdySessionKey::IsProxySession::kFalse,
SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow);
}
@@ -776,12 +775,12 @@ TEST_F(SpdySessionPoolTest, IPPoolingNetLog) {
// Populate the HostResolver cache.
session_deps_.host_resolver->set_synchronous_mode(true);
- for (size_t i = 0; i < std::size(test_hosts); i++) {
+ for (auto& test_host : test_hosts) {
session_deps_.host_resolver->rules()->AddIPLiteralRule(
- test_hosts[i].name, test_hosts[i].iplist, std::string());
+ test_host.name, test_host.iplist, std::string());
- test_hosts[i].key = SpdySessionKey(
- HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(),
+ test_host.key = SpdySessionKey(
+ HostPortPair(test_host.name, kTestPort), ProxyServer::Direct(),
PRIVACY_MODE_DISABLED, SpdySessionKey::IsProxySession::kFalse,
SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow);
}
@@ -843,12 +842,12 @@ TEST_F(SpdySessionPoolTest, IPPoolingDisabled) {
// Populate the HostResolver cache.
session_deps_.host_resolver->set_synchronous_mode(true);
- for (size_t i = 0; i < std::size(test_hosts); i++) {
+ for (auto& test_host : test_hosts) {
session_deps_.host_resolver->rules()->AddIPLiteralRule(
- test_hosts[i].name, test_hosts[i].iplist, std::string());
+ test_host.name, test_host.iplist, std::string());
- test_hosts[i].key = SpdySessionKey(
- HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(),
+ test_host.key = SpdySessionKey(
+ HostPortPair(test_host.name, kTestPort), ProxyServer::Direct(),
PRIVACY_MODE_DISABLED, SpdySessionKey::IsProxySession::kFalse,
SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow);
}
@@ -1264,12 +1263,12 @@ TEST_F(SpdySessionPoolTest, IPConnectionPoolingWithWebSockets) {
// Populate the HostResolver cache.
session_deps_.host_resolver->set_synchronous_mode(true);
- for (size_t i = 0; i < std::size(test_hosts); i++) {
+ for (auto& test_host : test_hosts) {
session_deps_.host_resolver->rules()->AddIPLiteralRule(
- test_hosts[i].name, test_hosts[i].iplist, std::string());
+ test_host.name, test_host.iplist, std::string());
- test_hosts[i].key = SpdySessionKey(
- HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(),
+ test_host.key = SpdySessionKey(
+ HostPortPair(test_host.name, kTestPort), ProxyServer::Direct(),
PRIVACY_MODE_DISABLED, SpdySessionKey::IsProxySession::kFalse,
SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow);
}
diff --git a/chromium/net/spdy/spdy_session_unittest.cc b/chromium/net/spdy/spdy_session_unittest.cc
index 47e91154f09..33654439dfd 100644
--- a/chromium/net/spdy/spdy_session_unittest.cc
+++ b/chromium/net/spdy/spdy_session_unittest.cc
@@ -931,6 +931,8 @@ TEST_F(SpdySessionTest, CreateStreamAfterGoAway) {
TEST_F(SpdySessionTest, HeadersAfterGoAway) {
base::HistogramTester histogram_tester;
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+
spdy::SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(1));
spdy::SpdySerializedFrame push(
spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kDefaultUrl));
@@ -992,6 +994,8 @@ TEST_F(SpdySessionTest, HeadersAfterGoAway) {
TEST_F(SpdySessionTest, UnsupportedPushedStatusCode) {
base::HistogramTester histogram_tester;
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+
spdy::Http2HeaderBlock push_promise_header_block;
push_promise_header_block[spdy::kHttp2MethodHeader] = "GET";
spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_promise_header_block);
@@ -1647,6 +1651,8 @@ TEST_F(SpdySessionTest, UnstallRacesWithStreamCreation) {
TEST_F(SpdySessionTest, CancelPushAfterSessionGoesAway) {
base::HistogramTester histogram_tester;
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+
spdy::SpdySerializedFrame req(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM));
spdy::SpdySerializedFrame priority(
@@ -1707,7 +1713,7 @@ TEST_F(SpdySessionTest, CancelPushAfterSessionGoesAway) {
TEST_F(SpdySessionTestWithMockTime, CancelPushAfterExpired) {
base::HistogramTester histogram_tester;
-
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
spdy::SpdySerializedFrame req(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM));
spdy::SpdySerializedFrame priority(
@@ -1792,6 +1798,7 @@ TEST_F(SpdySessionTestWithMockTime, CancelPushAfterExpired) {
TEST_F(SpdySessionTestWithMockTime, ClaimPushedStreamBeforeExpires) {
base::HistogramTester histogram_tester;
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
spdy::SpdySerializedFrame req(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM));
@@ -1881,6 +1888,8 @@ TEST_F(SpdySessionTestWithMockTime, ClaimPushedStreamBeforeExpires) {
TEST_F(SpdySessionTest, CancelPushBeforeClaimed) {
base::HistogramTester histogram_tester;
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+
spdy::SpdySerializedFrame req(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM));
spdy::SpdySerializedFrame priority(
@@ -5653,6 +5662,8 @@ TEST_F(SpdySessionTest, GoAwayOnSessionFlowControlError) {
// Regression. Sorta. Push streams and client streams were sharing a single
// limit for a long time.
TEST_F(SpdySessionTest, PushedStreamShouldNotCountToClientConcurrencyLimit) {
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+
spdy::SettingsMap new_settings;
new_settings[spdy::SETTINGS_MAX_CONCURRENT_STREAMS] = 2;
spdy::SpdySerializedFrame settings_frame(
@@ -5742,6 +5753,7 @@ TEST_F(SpdySessionTest, PushedStreamShouldNotCountToClientConcurrencyLimit) {
TEST_F(SpdySessionTest, RejectPushedStreamExceedingConcurrencyLimit) {
base::HistogramTester histogram_tester;
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
spdy::SpdySerializedFrame push_a(
spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kPushedUrl));
@@ -5833,6 +5845,8 @@ TEST_F(SpdySessionTest, RejectPushedStreamExceedingConcurrencyLimit) {
TEST_F(SpdySessionTest, StreamsAdvertisingDifferentOriginAreRefused) {
base::HistogramTester histogram_tester;
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+
// Origin of kDefaultUrl should be different from the origin of
// kHttpURLFromAnotherOrigin.
ASSERT_NE(GURL(kDefaultUrl).host(), GURL(kHttpURLFromAnotherOrigin).host());
@@ -5902,6 +5916,8 @@ TEST_F(SpdySessionTest, StreamsAdvertisingDifferentOriginAreRefused) {
TEST_F(SpdySessionTest, IgnoreReservedRemoteStreamsCount) {
base::HistogramTester histogram_tester;
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+
spdy::SpdySerializedFrame push_a(
spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kPushedUrl));
spdy::Http2HeaderBlock push_headers;
@@ -6004,6 +6020,8 @@ TEST_F(SpdySessionTest, IgnoreReservedRemoteStreamsCount) {
}
TEST_F(SpdySessionTest, CancelReservedStreamOnHeadersReceived) {
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+
spdy::Http2HeaderBlock push_headers;
push_headers[":method"] = "GET";
spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_headers);
@@ -6112,6 +6130,7 @@ TEST_F(SpdySessionTest, CancelReservedStreamOnHeadersReceived) {
}
TEST_F(SpdySessionTest, GetPushedStream) {
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
spdy::Http2HeaderBlock push_headers;
push_headers[":method"] = "GET";
spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_headers);
@@ -6398,6 +6417,7 @@ TEST_F(SpdySessionTest, GreaseFrameTypeAfterSettings) {
kSpdyMaxConcurrentPushedStreams;
expected_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] =
kSpdyMaxHeaderListSize;
+ expected_settings[spdy::SETTINGS_ENABLE_PUSH] = 0;
spdy::SpdySerializedFrame settings_frame(
spdy_util_.ConstructSpdySettings(expected_settings));
@@ -6545,6 +6565,7 @@ TEST_F(SendInitialSettingsOnNewSpdySessionTest, Empty) {
kSpdyMaxConcurrentPushedStreams;
expected_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] =
kSpdyMaxHeaderListSize;
+ expected_settings[spdy::SETTINGS_ENABLE_PUSH] = 0;
RunInitialSettingsTest(expected_settings);
}
@@ -6595,6 +6616,7 @@ TEST_F(SendInitialSettingsOnNewSpdySessionTest, UnknownSettings) {
kSpdyMaxConcurrentPushedStreams;
expected_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] =
kSpdyMaxHeaderListSize;
+ expected_settings[spdy::SETTINGS_ENABLE_PUSH] = 0;
expected_settings[7] = 1234;
expected_settings[25] = 5678;
RunInitialSettingsTest(expected_settings);
@@ -6617,7 +6639,7 @@ class AltSvcFrameTest : public SpdySessionTest {
void AddSocketData(const spdy::SpdyAltSvcIR& altsvc_ir) {
altsvc_frame_ = spdy_util_.SerializeFrame(altsvc_ir);
reads_.push_back(CreateMockRead(altsvc_frame_, 0));
- reads_.push_back(MockRead(ASYNC, 0, 1));
+ reads_.emplace_back(ASYNC, 0, 1);
data_ =
std::make_unique<SequencedSocketData>(reads_, base::span<MockWrite>());
@@ -7141,7 +7163,7 @@ namespace {
class TestSSLConfigService : public SSLConfigService {
public:
- TestSSLConfigService() {}
+ TestSSLConfigService() = default;
~TestSSLConfigService() override = default;
SSLContextConfig GetSSLContextConfig() override { return config_; }
@@ -7467,23 +7489,23 @@ TEST(RecordPushedStreamHistogramTest, VaryResponseHeader) {
{1, {"vary", "fooaccept-encoding"}, 5},
{1, {"vary", "foo, accept-encodingbar"}, 5}};
- for (size_t i = 0; i < std::size(test_cases); ++i) {
+ for (const auto& test_case : test_cases) {
spdy::Http2HeaderBlock headers;
- for (size_t j = 0; j < test_cases[i].num_headers; ++j) {
- headers[test_cases[i].headers[2 * j]] = test_cases[i].headers[2 * j + 1];
+ for (size_t j = 0; j < test_case.num_headers; ++j) {
+ headers[test_case.headers[2 * j]] = test_case.headers[2 * j + 1];
}
base::HistogramTester histograms;
histograms.ExpectTotalCount("Net.PushedStreamVaryResponseHeader", 0);
SpdySession::RecordPushedStreamVaryResponseHeaderHistogram(headers);
histograms.ExpectTotalCount("Net.PushedStreamVaryResponseHeader", 1);
histograms.ExpectBucketCount("Net.PushedStreamVaryResponseHeader",
- test_cases[i].expected_bucket, 1);
+ test_case.expected_bucket, 1);
// Adding an unrelated header field should not change how Vary is parsed.
headers["foo"] = "bar";
SpdySession::RecordPushedStreamVaryResponseHeaderHistogram(headers);
histograms.ExpectTotalCount("Net.PushedStreamVaryResponseHeader", 2);
histograms.ExpectBucketCount("Net.PushedStreamVaryResponseHeader",
- test_cases[i].expected_bucket, 2);
+ test_case.expected_bucket, 2);
}
}
diff --git a/chromium/net/spdy/spdy_stream.h b/chromium/net/spdy/spdy_stream.h
index fb69c4b9f20..7b453723e23 100644
--- a/chromium/net/spdy/spdy_stream.h
+++ b/chromium/net/spdy/spdy_stream.h
@@ -25,8 +25,8 @@
#include "net/socket/ssl_client_socket.h"
#include "net/spdy/spdy_buffer.h"
#include "net/ssl/ssl_client_cert_type.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
#include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "url/gurl.h"
@@ -73,7 +73,7 @@ class NET_EXPORT_PRIVATE SpdyStream {
// Delegate handles protocol specific behavior of spdy stream.
class NET_EXPORT_PRIVATE Delegate {
public:
- Delegate() {}
+ Delegate() = default;
Delegate(const Delegate&) = delete;
Delegate& operator=(const Delegate&) = delete;
@@ -127,7 +127,7 @@ class NET_EXPORT_PRIVATE SpdyStream {
virtual NetLogSource source_dependency() const = 0;
protected:
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
};
// SpdyStream constructor
diff --git a/chromium/net/spdy/spdy_stream_test_util.cc b/chromium/net/spdy/spdy_stream_test_util.cc
index 160f385747d..2f63970fbb2 100644
--- a/chromium/net/spdy/spdy_stream_test_util.cc
+++ b/chromium/net/spdy/spdy_stream_test_util.cc
@@ -11,9 +11,7 @@
#include "net/spdy/spdy_stream.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace test {
+namespace net::test {
ClosingDelegate::ClosingDelegate(
const base::WeakPtr<SpdyStream>& stream) : stream_(stream) {
@@ -202,6 +200,4 @@ void StreamDelegateDetectEOF::OnDataReceived(
eof_detected_ = true;
}
-} // namespace test
-
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/spdy/spdy_stream_test_util.h b/chromium/net/spdy/spdy_stream_test_util.h
index c560c3d5d8e..70b2c5c9f58 100644
--- a/chromium/net/spdy/spdy_stream_test_util.h
+++ b/chromium/net/spdy/spdy_stream_test_util.h
@@ -18,9 +18,7 @@
#include "net/spdy/spdy_read_queue.h"
#include "net/spdy/spdy_stream.h"
-namespace net {
-
-namespace test {
+namespace net::test {
// Delegate that calls Close() on |stream_| on OnClose. Used by tests
// to make sure that such an action is harmless.
@@ -181,8 +179,6 @@ class StreamDelegateDetectEOF : public StreamDelegateBase {
bool eof_detected_ = false;
};
-} // namespace test
-
-} // namespace net
+} // namespace net::test
#endif // NET_SPDY_SPDY_STREAM_TEST_UTIL_H_
diff --git a/chromium/net/spdy/spdy_stream_unittest.cc b/chromium/net/spdy/spdy_stream_unittest.cc
index 59f4da8fab6..ebbeae913ff 100644
--- a/chromium/net/spdy/spdy_stream_unittest.cc
+++ b/chromium/net/spdy/spdy_stream_unittest.cc
@@ -44,9 +44,7 @@
// TODO(ukai): factor out common part with spdy_http_stream_unittest.cc
//
-namespace net {
-
-namespace test {
+namespace net::test {
namespace {
@@ -122,17 +120,13 @@ class SpdyStreamTest : public ::testing::Test, public WithTaskEnvironment {
reads_.push_back(std::move(read));
}
- void AddReadEOF() {
- reads_.push_back(MockRead(ASYNC, 0, offset_++));
- }
+ void AddReadEOF() { reads_.emplace_back(ASYNC, 0, offset_++); }
void AddWritePause() {
- writes_.push_back(MockWrite(ASYNC, ERR_IO_PENDING, offset_++));
+ writes_.emplace_back(ASYNC, ERR_IO_PENDING, offset_++);
}
- void AddReadPause() {
- reads_.push_back(MockRead(ASYNC, ERR_IO_PENDING, offset_++));
- }
+ void AddReadPause() { reads_.emplace_back(ASYNC, ERR_IO_PENDING, offset_++); }
base::span<const MockRead> GetReads() { return reads_; }
base::span<const MockWrite> GetWrites() { return writes_; }
@@ -179,6 +173,24 @@ class SpdyStreamTest : public ::testing::Test, public WithTaskEnvironment {
SSLSocketDataProvider ssl_;
};
+class SpdyStreamPushTest : public SpdyStreamTest {
+ protected:
+ // A function that takes a SpdyStream and the number of bytes which
+ // will unstall the next frame completely.
+ typedef base::OnceCallback<void(const base::WeakPtr<SpdyStream>&, int32_t)>
+ UnstallFunction;
+
+ explicit SpdyStreamPushTest(
+ base::test::TaskEnvironment::TimeSource time_source =
+ base::test::TaskEnvironment::TimeSource::DEFAULT)
+ : SpdyStreamTest(time_source) {
+ session_deps_.http2_settings[spdy::SETTINGS_ENABLE_PUSH] = 1;
+ session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
+ }
+
+ ~SpdyStreamPushTest() override = default;
+};
+
TEST_F(SpdyStreamTest, SendDataAfterOpen) {
spdy::SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0));
@@ -356,7 +368,7 @@ TEST_F(SpdyStreamTest, Trailers) {
EXPECT_TRUE(data.AllWriteDataConsumed());
}
-TEST_F(SpdyStreamTest, PushedStream) {
+TEST_F(SpdyStreamPushTest, PushedStream) {
spdy::SpdySerializedFrame req(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST));
AddWrite(req);
@@ -688,7 +700,7 @@ TEST_F(SpdyStreamTest, UpperCaseHeaders) {
// Receiving a header with uppercase ASCII should result in a protocol error
// even for a push stream.
-TEST_F(SpdyStreamTest, UpperCaseHeadersOnPush) {
+TEST_F(SpdyStreamPushTest, UpperCaseHeadersOnPush) {
spdy::SpdySerializedFrame req(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST));
AddWrite(req);
@@ -801,7 +813,7 @@ TEST_F(SpdyStreamTest, HeadersMustHaveStatus) {
EXPECT_TRUE(data.AllReadDataConsumed());
}
-TEST_F(SpdyStreamTest, HeadersMustHaveStatusOnPushedStream) {
+TEST_F(SpdyStreamPushTest, HeadersMustHaveStatusOnPushedStream) {
spdy::SpdySerializedFrame req(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST));
AddWrite(req);
@@ -873,7 +885,7 @@ TEST_F(SpdyStreamTest, HeadersMustHaveStatusOnPushedStream) {
EXPECT_TRUE(data.AllReadDataConsumed());
}
-TEST_F(SpdyStreamTest, HeadersMustPreceedData) {
+TEST_F(SpdyStreamPushTest, HeadersMustPreceedData) {
spdy::SpdySerializedFrame req(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST));
AddWrite(req);
@@ -914,7 +926,7 @@ TEST_F(SpdyStreamTest, HeadersMustPreceedData) {
EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
}
-TEST_F(SpdyStreamTest, HeadersMustPreceedDataOnPushedStream) {
+TEST_F(SpdyStreamPushTest, HeadersMustPreceedDataOnPushedStream) {
spdy::SpdySerializedFrame req(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST));
AddWrite(req);
@@ -2076,6 +2088,4 @@ TEST_F(SpdyStreamTestWithMockClock, FlowControlSlowReads) {
EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED));
}
-} // namespace test
-
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/spdy/spdy_test_util_common.cc b/chromium/net/spdy/spdy_test_util_common.cc
index 578ebbf89fa..365ae00e4ef 100644
--- a/chromium/net/spdy/spdy_test_util_common.cc
+++ b/chromium/net/spdy/spdy_test_util_common.cc
@@ -658,8 +658,8 @@ std::string SpdyTestUtil::ConstructSpdyReplyString(
spdy::SpdySerializedFrame SpdyTestUtil::ConstructSpdySettings(
const spdy::SettingsMap& settings) {
spdy::SpdySettingsIR settings_ir;
- for (auto it = settings.begin(); it != settings.end(); ++it) {
- settings_ir.AddSetting(it->first, it->second);
+ for (const auto& setting : settings) {
+ settings_ir.AddSetting(setting.first, setting.second);
}
return spdy::SpdySerializedFrame(
headerless_spdy_framer_.SerializeFrame(settings_ir));
@@ -985,12 +985,11 @@ spdy::SpdySerializedFrame SpdyTestUtil::SerializeFrame(
}
void SpdyTestUtil::UpdateWithStreamDestruction(int stream_id) {
- for (auto priority_it = priority_to_stream_id_list_.begin();
- priority_it != priority_to_stream_id_list_.end(); ++priority_it) {
- for (auto stream_it = priority_it->second.begin();
- stream_it != priority_it->second.end(); ++stream_it) {
+ for (auto& priority_it : priority_to_stream_id_list_) {
+ for (auto stream_it = priority_it.second.begin();
+ stream_it != priority_it.second.end(); ++stream_it) {
if (*stream_it == stream_id) {
- priority_it->second.erase(stream_it);
+ priority_it.second.erase(stream_it);
return;
}
}
diff --git a/chromium/net/spdy/spdy_write_queue.cc b/chromium/net/spdy/spdy_write_queue.cc
index cc9517d5307..30ec66aefac 100644
--- a/chromium/net/spdy/spdy_write_queue.cc
+++ b/chromium/net/spdy/spdy_write_queue.cc
@@ -211,8 +211,9 @@ void SpdyWriteQueue::Clear() {
std::vector<std::unique_ptr<SpdyBufferProducer>> erased_buffer_producers;
for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) {
- for (auto it = queue_[i].begin(); it != queue_[i].end(); ++it) {
- erased_buffer_producers.push_back(std::move(it->frame_producer));
+ for (auto& pending_write : queue_[i]) {
+ erased_buffer_producers.push_back(
+ std::move(pending_write.frame_producer));
}
queue_[i].clear();
}
diff --git a/chromium/net/ssl/client_cert_store.h b/chromium/net/ssl/client_cert_store.h
index 9f7b0192fed..1e49f2ff708 100644
--- a/chromium/net/ssl/client_cert_store.h
+++ b/chromium/net/ssl/client_cert_store.h
@@ -23,7 +23,7 @@ class NET_EXPORT ClientCertStore {
ClientCertStore(const ClientCertStore&) = delete;
ClientCertStore& operator=(const ClientCertStore&) = delete;
- virtual ~ClientCertStore() {}
+ virtual ~ClientCertStore() = default;
using ClientCertListCallback =
base::OnceCallback<void(ClientCertIdentityList)>;
@@ -36,7 +36,7 @@ class NET_EXPORT ClientCertStore {
ClientCertListCallback callback) = 0;
protected:
- ClientCertStore() {}
+ ClientCertStore() = default;
};
} // namespace net
diff --git a/chromium/net/ssl/client_cert_store_mac.cc b/chromium/net/ssl/client_cert_store_mac.cc
index c8293d7c485..ec6134c55f1 100644
--- a/chromium/net/ssl/client_cert_store_mac.cc
+++ b/chromium/net/ssl/client_cert_store_mac.cc
@@ -28,8 +28,8 @@
#include "base/task/task_runner_util.h"
#include "crypto/mac_security_services_lock.h"
#include "net/base/host_port_pair.h"
-#include "net/cert/internal/extended_key_usage.h"
-#include "net/cert/internal/parse_certificate.h"
+#include "net/cert/pki/extended_key_usage.h"
+#include "net/cert/pki/parse_certificate.h"
#include "net/cert/x509_util.h"
#include "net/cert/x509_util_apple.h"
#include "net/ssl/client_cert_identity_mac.h"
@@ -39,11 +39,6 @@ using base::ScopedCFTypeRef;
namespace net {
-// CSSM functions are deprecated as of OSX 10.7, but have no replacement.
-// https://bugs.chromium.org/p/chromium/issues/detail?id=590914#c1
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-
namespace {
using ClientCertIdentityMacList =
@@ -53,9 +48,8 @@ using ClientCertIdentityMacList =
// including the intermediate and finally root certificates (if any).
// This function calls SecTrust but doesn't actually pay attention to the trust
// result: it shouldn't be used to determine trust, just to traverse the chain.
-// Caller is responsible for releasing the value stored into *out_cert_chain.
OSStatus CopyCertChain(SecCertificateRef cert_handle,
- CFArrayRef* out_cert_chain) {
+ base::ScopedCFTypeRef<CFArrayRef>* out_cert_chain) {
DCHECK(cert_handle);
DCHECK(out_cert_chain);
@@ -67,10 +61,10 @@ OSStatus CopyCertChain(SecCertificateRef cert_handle,
// Create a SecTrustRef.
ScopedCFTypeRef<CFArrayRef> input_certs(CFArrayCreate(
- NULL, const_cast<const void**>(reinterpret_cast<void**>(&cert_handle)),
+ nullptr, const_cast<const void**>(reinterpret_cast<void**>(&cert_handle)),
1, &kCFTypeArrayCallBacks));
OSStatus result;
- SecTrustRef trust_ref = NULL;
+ SecTrustRef trust_ref = nullptr;
{
base::AutoLock lock(crypto::GetMacSecurityServicesLock());
result = SecTrustCreateWithCertificates(input_certs, ssl_policy,
@@ -82,16 +76,12 @@ OSStatus CopyCertChain(SecCertificateRef cert_handle,
// Evaluate trust, which creates the cert chain.
SecTrustResultType status;
- CSSM_TP_APPLE_EVIDENCE_INFO* status_chain;
{
base::AutoLock lock(crypto::GetMacSecurityServicesLock());
result = SecTrustEvaluate(trust, &status);
- }
- if (result)
- return result;
- {
- base::AutoLock lock(crypto::GetMacSecurityServicesLock());
- result = SecTrustGetResult(trust, &status, out_cert_chain, &status_chain);
+ if (result)
+ return result;
+ *out_cert_chain = x509_util::CertificateChainFromSecTrust(trust);
}
return result;
}
@@ -109,7 +99,7 @@ bool IsIssuedByInKeychain(const std::vector<std::string>& valid_issuers,
os_cert.InitializeInto());
if (err != noErr)
return false;
- CFArrayRef cert_chain = NULL;
+ base::ScopedCFTypeRef<CFArrayRef> cert_chain;
OSStatus result = CopyCertChain(os_cert.get(), &cert_chain);
if (result) {
OSSTATUS_LOG(ERROR, result) << "CopyCertChain error";
@@ -134,7 +124,6 @@ bool IsIssuedByInKeychain(const std::vector<std::string>& valid_issuers,
scoped_refptr<X509Certificate> new_cert(
x509_util::CreateX509CertificateFromSecCertificate(os_cert, intermediates,
options));
- CFRelease(cert_chain); // Also frees |intermediates|.
if (!new_cert || !new_cert->IsIssuedByEncoded(valid_issuers))
return false;
@@ -316,17 +305,15 @@ ClientCertIdentityList GetClientCertsOnBackgroundThread(
// See if there's an identity preference for this domain:
ScopedCFTypeRef<CFStringRef> domain_str(
base::SysUTF8ToCFStringRef("https://" + server_domain));
- SecIdentityRef sec_identity = NULL;
- // While SecIdentityCopyPreferences appears to take a list of CA issuers
+ // While SecIdentityCopyPreferred appears to take a list of CA issuers
// to restrict the identity search to, within Security.framework the
- // argument is ignored and filtering unimplemented. See
- // SecIdentity.cpp in libsecurity_keychain, specifically
+ // argument is ignored and filtering unimplemented. See SecIdentity.cpp in
+ // libsecurity_keychain, specifically
// _SecIdentityCopyPreferenceMatchingName().
{
base::AutoLock lock(crypto::GetMacSecurityServicesLock());
- if (SecIdentityCopyPreference(domain_str, 0, NULL, &sec_identity) ==
- noErr)
- preferred_sec_identity.reset(sec_identity);
+ preferred_sec_identity.reset(
+ SecIdentityCopyPreferred(domain_str, nullptr, nullptr));
}
}
@@ -334,11 +321,17 @@ ClientCertIdentityList GetClientCertsOnBackgroundThread(
std::unique_ptr<ClientCertIdentityMac> preferred_identity;
ClientCertIdentityMacList regular_identities;
- SecIdentitySearchRef search = NULL;
+// TODO(https://crbug.com/1348251): Is it still true, as claimed below, that
+// SecIdentitySearchCopyNext sometimes returns identities missed by
+// SecItemCopyMatching? Add some histograms to test this and, if none are
+// missing, remove this code.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SecIdentitySearchRef search = nullptr;
OSStatus err;
{
base::AutoLock lock(crypto::GetMacSecurityServicesLock());
- err = SecIdentitySearchCreate(NULL, CSSM_KEYUSE_SIGN, &search);
+ err = SecIdentitySearchCreate(nullptr, CSSM_KEYUSE_SIGN, &search);
}
if (err)
return ClientCertIdentityList();
@@ -359,6 +352,7 @@ ClientCertIdentityList GetClientCertsOnBackgroundThread(
OSSTATUS_LOG(ERROR, err) << "SecIdentitySearch error";
return ClientCertIdentityList();
}
+#pragma clang diagnostic pop // "-Wdeprecated-declarations"
// macOS provides two ways to search for identities. SecIdentitySearchCreate()
// is deprecated, as it relies on CSSM_KEYUSE_SIGN (part of the deprecated
@@ -402,9 +396,9 @@ ClientCertIdentityList GetClientCertsOnBackgroundThread(
} // namespace
-ClientCertStoreMac::ClientCertStoreMac() {}
+ClientCertStoreMac::ClientCertStoreMac() = default;
-ClientCertStoreMac::~ClientCertStoreMac() {}
+ClientCertStoreMac::~ClientCertStoreMac() = default;
void ClientCertStoreMac::GetClientCerts(const SSLCertRequestInfo& request,
ClientCertListCallback callback) {
@@ -420,7 +414,7 @@ bool ClientCertStoreMac::SelectClientCertsForTesting(
ClientCertIdentityMacList input_identities,
const SSLCertRequestInfo& request,
ClientCertIdentityList* selected_identities) {
- GetClientCertsImpl(NULL, std::move(input_identities), request, false,
+ GetClientCertsImpl(nullptr, std::move(input_identities), request, false,
selected_identities);
return true;
}
@@ -436,6 +430,4 @@ bool ClientCertStoreMac::SelectClientCertsGivenPreferredForTesting(
return true;
}
-#pragma clang diagnostic pop // "-Wdeprecated-declarations"
-
} // namespace net
diff --git a/chromium/net/ssl/client_cert_store_mac_unittest.cc b/chromium/net/ssl/client_cert_store_mac_unittest.cc
index 9b87c634cbe..bd3d860e12c 100644
--- a/chromium/net/ssl/client_cert_store_mac_unittest.cc
+++ b/chromium/net/ssl/client_cert_store_mac_unittest.cc
@@ -7,8 +7,8 @@
#include <memory>
#include "base/strings/string_number_conversions.h"
-#include "net/cert/internal/extended_key_usage.h"
-#include "net/cert/internal/parse_certificate.h"
+#include "net/cert/pki/extended_key_usage.h"
+#include "net/cert/pki/parse_certificate.h"
#include "net/cert/x509_util_apple.h"
#include "net/ssl/client_cert_identity_mac.h"
#include "net/ssl/client_cert_identity_test_util.h"
diff --git a/chromium/net/ssl/client_cert_store_nss.h b/chromium/net/ssl/client_cert_store_nss.h
index c31124385e8..edafebfae5c 100644
--- a/chromium/net/ssl/client_cert_store_nss.h
+++ b/chromium/net/ssl/client_cert_store_nss.h
@@ -22,10 +22,9 @@ class SSLCertRequestInfo;
class NET_EXPORT ClientCertStoreNSS : public ClientCertStore {
public:
- typedef base::RepeatingCallback<crypto::CryptoModuleBlockingPasswordDelegate*(
- const HostPortPair& /* server */)>
- PasswordDelegateFactory;
-
+ using PasswordDelegateFactory =
+ base::RepeatingCallback<crypto::CryptoModuleBlockingPasswordDelegate*(
+ const HostPortPair& /* server */)>;
using CertFilter = base::RepeatingCallback<bool(CERTCertificate*)>;
explicit ClientCertStoreNSS(
diff --git a/chromium/net/ssl/client_cert_store_nss_unittest.cc b/chromium/net/ssl/client_cert_store_nss_unittest.cc
index afe71620b81..54d13f0684f 100644
--- a/chromium/net/ssl/client_cert_store_nss_unittest.cc
+++ b/chromium/net/ssl/client_cert_store_nss_unittest.cc
@@ -91,8 +91,8 @@ TEST(ClientCertStoreNSSTest, BuildsCertificateChain) {
ASSERT_TRUE(base::ReadFileToString(
GetTestCertsDirectory().AppendASCII("client_1.pk8"), &pkcs8_key));
- std::unique_ptr<ClientCertStoreNSS> store(
- new ClientCertStoreNSS(ClientCertStoreNSS::PasswordDelegateFactory()));
+ auto store = std::make_unique<ClientCertStoreNSS>(
+ ClientCertStoreNSS::PasswordDelegateFactory());
// These test keys are RSA keys.
std::vector<uint16_t> expected = SSLPrivateKey::DefaultAlgorithmPreferences(
@@ -101,8 +101,8 @@ TEST(ClientCertStoreNSSTest, BuildsCertificateChain) {
{
// Request certificates matching B CA, |client_1|'s issuer.
auto request = base::MakeRefCounted<SSLCertRequestInfo>();
- request->cert_authorities.push_back(std::string(
- reinterpret_cast<const char*>(kAuthority1DN), sizeof(kAuthority1DN)));
+ request->cert_authorities.emplace_back(
+ reinterpret_cast<const char*>(kAuthority1DN), sizeof(kAuthority1DN));
ClientCertIdentityList selected_identities;
base::RunLoop loop;
@@ -135,9 +135,9 @@ TEST(ClientCertStoreNSSTest, BuildsCertificateChain) {
{
// Request certificates matching C Root CA, |client_1_ca|'s issuer.
auto request = base::MakeRefCounted<SSLCertRequestInfo>();
- request->cert_authorities.push_back(
- std::string(reinterpret_cast<const char*>(kAuthorityRootDN),
- sizeof(kAuthorityRootDN)));
+ request->cert_authorities.emplace_back(
+ reinterpret_cast<const char*>(kAuthorityRootDN),
+ sizeof(kAuthorityRootDN));
ClientCertIdentityList selected_identities;
base::RunLoop loop;
@@ -200,8 +200,8 @@ TEST(ClientCertStoreNSSTest, SubjectPrintableStringContainingUTF8) {
ASSERT_TRUE(ImportClientCertToSlot(cert.get(), test_db.slot()));
- std::unique_ptr<ClientCertStoreNSS> store(
- new ClientCertStoreNSS(ClientCertStoreNSS::PasswordDelegateFactory()));
+ auto store = std::make_unique<ClientCertStoreNSS>(
+ ClientCertStoreNSS::PasswordDelegateFactory());
// These test keys are RSA keys.
std::vector<uint16_t> expected = SSLPrivateKey::DefaultAlgorithmPreferences(
@@ -215,8 +215,8 @@ TEST(ClientCertStoreNSSTest, SubjectPrintableStringContainingUTF8) {
0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67,
0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64};
auto request = base::MakeRefCounted<SSLCertRequestInfo>();
- request->cert_authorities.push_back(std::string(
- reinterpret_cast<const char*>(kAuthorityDN), sizeof(kAuthorityDN)));
+ request->cert_authorities.emplace_back(
+ reinterpret_cast<const char*>(kAuthorityDN), sizeof(kAuthorityDN));
ClientCertIdentityList selected_identities;
base::RunLoop loop;
diff --git a/chromium/net/ssl/ssl_cipher_suite_names_unittest.cc b/chromium/net/ssl/ssl_cipher_suite_names_unittest.cc
index bde9d36e033..5e190846f6c 100644
--- a/chromium/net/ssl/ssl_cipher_suite_names_unittest.cc
+++ b/chromium/net/ssl/ssl_cipher_suite_names_unittest.cc
@@ -124,9 +124,9 @@ TEST(CipherSuiteNamesTest, ParseSSLCipherStringFails) {
"0xBEEFY",
};
- for (size_t i = 0; i < std::size(cipher_strings); ++i) {
+ for (const auto* cipher_string : cipher_strings) {
uint16_t cipher_suite = 0;
- EXPECT_FALSE(ParseSSLCipherString(cipher_strings[i], &cipher_suite));
+ EXPECT_FALSE(ParseSSLCipherString(cipher_string, &cipher_suite));
}
}
diff --git a/chromium/net/ssl/ssl_client_auth_cache.cc b/chromium/net/ssl/ssl_client_auth_cache.cc
index 13fd956c6e1..60ade55d9a0 100644
--- a/chromium/net/ssl/ssl_client_auth_cache.cc
+++ b/chromium/net/ssl/ssl_client_auth_cache.cc
@@ -10,9 +10,9 @@
namespace net {
-SSLClientAuthCache::SSLClientAuthCache() {}
+SSLClientAuthCache::SSLClientAuthCache() = default;
-SSLClientAuthCache::~SSLClientAuthCache() {}
+SSLClientAuthCache::~SSLClientAuthCache() = default;
bool SSLClientAuthCache::Lookup(const HostPortPair& server,
scoped_refptr<X509Certificate>* certificate,
diff --git a/chromium/net/ssl/ssl_config_service.cc b/chromium/net/ssl/ssl_config_service.cc
index aab8453e630..7fbe9d64746 100644
--- a/chromium/net/ssl/ssl_config_service.cc
+++ b/chromium/net/ssl/ssl_config_service.cc
@@ -18,9 +18,11 @@ namespace {
bool SSLContextConfigsAreEqual(const net::SSLContextConfig& config1,
const net::SSLContextConfig& config2) {
return std::tie(config1.version_min, config1.version_max,
- config1.disabled_cipher_suites, config1.cecpq2_enabled) ==
+ config1.disabled_cipher_suites, config1.cecpq2_enabled,
+ config1.ech_enabled) ==
std::tie(config2.version_min, config2.version_max,
- config2.disabled_cipher_suites, config2.cecpq2_enabled);
+ config2.disabled_cipher_suites, config2.cecpq2_enabled,
+ config2.ech_enabled);
}
} // namespace
diff --git a/chromium/net/ssl/ssl_config_service.h b/chromium/net/ssl/ssl_config_service.h
index 9d1e97d2ffc..723d8ec50c7 100644
--- a/chromium/net/ssl/ssl_config_service.h
+++ b/chromium/net/ssl/ssl_config_service.h
@@ -42,6 +42,10 @@ struct NET_EXPORT SSLContextConfig {
// If false, disables post-quantum key agreement in TLS connections.
bool cecpq2_enabled = true;
+ // If false, disables TLS Encrypted ClientHello (ECH). If true, the feature
+ // may be enabled or disabled, depending on feature flags.
+ bool ech_enabled = true;
+
// ADDING MORE HERE? Don't forget to update |SSLContextConfigsAreEqual|.
};
@@ -58,7 +62,7 @@ class NET_EXPORT SSLConfigService {
virtual void OnSSLContextConfigChanged() = 0;
protected:
- virtual ~Observer() {}
+ virtual ~Observer() = default;
};
SSLConfigService();
diff --git a/chromium/net/ssl/ssl_info.h b/chromium/net/ssl/ssl_info.h
index dc15992a594..a5d8540a6b4 100644
--- a/chromium/net/ssl/ssl_info.h
+++ b/chromium/net/ssl/ssl_info.h
@@ -88,9 +88,6 @@ class NET_EXPORT SSLInfo {
bool early_data_received = false;
// True if the connection negotiated the Encrypted ClientHello extension.
- //
- // TODO(crbug.com/1091403): Serialize this field in net_ipc_param_traits.cc
- // and expose in DevTools Security Panel.
bool encrypted_client_hello = false;
HandshakeType handshake_type = HANDSHAKE_UNKNOWN;
diff --git a/chromium/net/ssl/ssl_key_logger.h b/chromium/net/ssl/ssl_key_logger.h
index 07903d12d2c..a1c808b8e0e 100644
--- a/chromium/net/ssl/ssl_key_logger.h
+++ b/chromium/net/ssl/ssl_key_logger.h
@@ -20,7 +20,7 @@ namespace net {
// https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format.
class NET_EXPORT SSLKeyLogger {
public:
- virtual ~SSLKeyLogger() {}
+ virtual ~SSLKeyLogger() = default;
// Writes |line| followed by a newline. This may be called by multiple threads
// simultaneously. If two calls race, the order of the lines is undefined, but
diff --git a/chromium/net/ssl/ssl_legacy_crypto_fallback.h b/chromium/net/ssl/ssl_legacy_crypto_fallback.h
index 820e149f76d..485238b90ae 100644
--- a/chromium/net/ssl/ssl_legacy_crypto_fallback.h
+++ b/chromium/net/ssl/ssl_legacy_crypto_fallback.h
@@ -23,12 +23,13 @@ enum class SSLLegacyCryptoFallback {
// kUsed3DES = 1,
// The connection used the fallback and negotiated SHA-1.
kUsedSHA1 = 2,
- // The connection used the fallback and sent a SHA-1 certificate.
+ // The connection used the fallback and sent a certificate signed with
+ // RSASSA-PKCS1-v1_5-SHA-1.
kSentSHA1Cert = 3,
// No longer used.
// kSentSHA1CertAndUsed3DES = 4,
- // The connection used the fallback, negotiated SHA-1, and sent a SHA-1
- // certificate.
+ // The connection used the fallback, negotiated SHA-1, and sent a certificate
+ // signed with RSASSA-PKCS1-v1_5-SHA-1.
kSentSHA1CertAndUsedSHA1 = 5,
// The connection used the fallback for an unknown reason, likely a
// transient network error.
diff --git a/chromium/net/ssl/ssl_platform_key_android.cc b/chromium/net/ssl/ssl_platform_key_android.cc
index 266612e59ea..aaa9c95e3f9 100644
--- a/chromium/net/ssl/ssl_platform_key_android.cc
+++ b/chromium/net/ssl/ssl_platform_key_android.cc
@@ -97,7 +97,7 @@ class SSLPlatformKeyAndroid : public ThreadedSSLPrivateKey::Delegate {
SSLPlatformKeyAndroid(const SSLPlatformKeyAndroid&) = delete;
SSLPlatformKeyAndroid& operator=(const SSLPlatformKeyAndroid&) = delete;
- ~SSLPlatformKeyAndroid() override {}
+ ~SSLPlatformKeyAndroid() override = default;
std::string GetProviderName() override { return provider_name_; }
diff --git a/chromium/net/ssl/ssl_platform_key_mac.cc b/chromium/net/ssl/ssl_platform_key_mac.cc
index 06f6e737315..baf30bdf0d1 100644
--- a/chromium/net/ssl/ssl_platform_key_mac.cc
+++ b/chromium/net/ssl/ssl_platform_key_mac.cc
@@ -89,7 +89,7 @@ class SSLPlatformKeySecKey : public ThreadedSSLPrivateKey::Delegate {
SSLPlatformKeySecKey(const SSLPlatformKeySecKey&) = delete;
SSLPlatformKeySecKey& operator=(const SSLPlatformKeySecKey&) = delete;
- ~SSLPlatformKeySecKey() override {}
+ ~SSLPlatformKeySecKey() override = default;
std::string GetProviderName() override {
// TODO(https://crbug.com/900721): Is there a more descriptive name to
diff --git a/chromium/net/ssl/ssl_platform_key_nss.cc b/chromium/net/ssl/ssl_platform_key_nss.cc
index b1c52c5b2e3..622515a4311 100644
--- a/chromium/net/ssl/ssl_platform_key_nss.cc
+++ b/chromium/net/ssl/ssl_platform_key_nss.cc
@@ -130,23 +130,25 @@ class SSLPlatformKeyNSS : public ThreadedSSLPrivateKey::Delegate {
free_digest_info.reset(digest_item.data);
}
- int len = PK11_SignatureLen(key_.get());
- if (len <= 0) {
- LogPRError("PK11_SignatureLen failed");
- return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
- }
- signature->resize(len);
- SECItem signature_item;
- signature_item.data = signature->data();
- signature_item.len = signature->size();
-
- SECStatus rv = PK11_SignWithMechanism(key_.get(), mechanism, &param,
- &signature_item, &digest_item);
- if (rv != SECSuccess) {
- LogPRError("PK11_SignWithMechanism failed");
- return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
+ {
+ const int len = PK11_SignatureLen(key_.get());
+ if (len <= 0) {
+ LogPRError("PK11_SignatureLen failed");
+ return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
+ }
+ signature->resize(len);
+ SECItem signature_item;
+ signature_item.data = signature->data();
+ signature_item.len = signature->size();
+
+ SECStatus rv = PK11_SignWithMechanism(key_.get(), mechanism, &param,
+ &signature_item, &digest_item);
+ if (rv != SECSuccess) {
+ LogPRError("PK11_SignWithMechanism failed");
+ return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
+ }
+ signature->resize(signature_item.len);
}
- signature->resize(signature_item.len);
// NSS emits raw ECDSA signatures, but BoringSSL expects a DER-encoded
// ECDSA-Sig-Value.
@@ -164,15 +166,20 @@ class SSLPlatformKeyNSS : public ThreadedSSLPrivateKey::Delegate {
return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
}
- int len = i2d_ECDSA_SIG(sig.get(), nullptr);
- if (len <= 0)
- return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
- signature->resize(len);
- uint8_t* ptr = signature->data();
- len = i2d_ECDSA_SIG(sig.get(), &ptr);
- if (len <= 0)
- return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
- signature->resize(len);
+ {
+ const int len = i2d_ECDSA_SIG(sig.get(), nullptr);
+ if (len <= 0)
+ return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
+ signature->resize(len);
+ }
+
+ {
+ uint8_t* ptr = signature->data();
+ const int len = i2d_ECDSA_SIG(sig.get(), &ptr);
+ if (len <= 0)
+ return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
+ signature->resize(len);
+ }
}
return OK;
diff --git a/chromium/net/ssl/ssl_platform_key_win_unittest.cc b/chromium/net/ssl/ssl_platform_key_win_unittest.cc
index bd943cfe743..2a92a090c86 100644
--- a/chromium/net/ssl/ssl_platform_key_win_unittest.cc
+++ b/chromium/net/ssl/ssl_platform_key_win_unittest.cc
@@ -86,8 +86,8 @@ bool PKCS8ToBLOBForCAPI(const std::string& pkcs8, std::vector<uint8_t>* blob) {
RSAPUBKEY rsapubkey = {0};
rsapubkey.magic = 0x32415352;
- rsapubkey.bitlen = BN_num_bits(rsa->n);
- rsapubkey.pubexp = BN_get_word(rsa->e);
+ rsapubkey.bitlen = RSA_bits(rsa);
+ rsapubkey.pubexp = BN_get_word(RSA_get0_e(rsa));
uint8_t* blob_data;
size_t blob_len;
@@ -97,13 +97,20 @@ bool PKCS8ToBLOBForCAPI(const std::string& pkcs8, std::vector<uint8_t>* blob) {
sizeof(header)) ||
!CBB_add_bytes(cbb.get(), reinterpret_cast<const uint8_t*>(&rsapubkey),
sizeof(rsapubkey)) ||
- !AddBIGNUMLittleEndian(cbb.get(), rsa->n, rsapubkey.bitlen / 8) ||
- !AddBIGNUMLittleEndian(cbb.get(), rsa->p, rsapubkey.bitlen / 16) ||
- !AddBIGNUMLittleEndian(cbb.get(), rsa->q, rsapubkey.bitlen / 16) ||
- !AddBIGNUMLittleEndian(cbb.get(), rsa->dmp1, rsapubkey.bitlen / 16) ||
- !AddBIGNUMLittleEndian(cbb.get(), rsa->dmq1, rsapubkey.bitlen / 16) ||
- !AddBIGNUMLittleEndian(cbb.get(), rsa->iqmp, rsapubkey.bitlen / 16) ||
- !AddBIGNUMLittleEndian(cbb.get(), rsa->d, rsapubkey.bitlen / 8) ||
+ !AddBIGNUMLittleEndian(cbb.get(), RSA_get0_n(rsa),
+ rsapubkey.bitlen / 8) ||
+ !AddBIGNUMLittleEndian(cbb.get(), RSA_get0_p(rsa),
+ rsapubkey.bitlen / 16) ||
+ !AddBIGNUMLittleEndian(cbb.get(), RSA_get0_q(rsa),
+ rsapubkey.bitlen / 16) ||
+ !AddBIGNUMLittleEndian(cbb.get(), RSA_get0_dmp1(rsa),
+ rsapubkey.bitlen / 16) ||
+ !AddBIGNUMLittleEndian(cbb.get(), RSA_get0_dmq1(rsa),
+ rsapubkey.bitlen / 16) ||
+ !AddBIGNUMLittleEndian(cbb.get(), RSA_get0_iqmp(rsa),
+ rsapubkey.bitlen / 16) ||
+ !AddBIGNUMLittleEndian(cbb.get(), RSA_get0_d(rsa),
+ rsapubkey.bitlen / 8) ||
!CBB_finish(cbb.get(), &blob_data, &blob_len)) {
return false;
}
@@ -139,11 +146,11 @@ bool PKCS8ToBLOBForCNG(const std::string& pkcs8,
const RSA* rsa = EVP_PKEY_get0_RSA(key.get());
BCRYPT_RSAKEY_BLOB header = {0};
header.Magic = BCRYPT_RSAFULLPRIVATE_MAGIC;
- header.BitLength = BN_num_bits(rsa->n);
- header.cbPublicExp = BN_num_bytes(rsa->e);
- header.cbModulus = BN_num_bytes(rsa->n);
- header.cbPrime1 = BN_num_bytes(rsa->p);
- header.cbPrime2 = BN_num_bytes(rsa->q);
+ header.BitLength = RSA_bits(rsa);
+ header.cbPublicExp = BN_num_bytes(RSA_get0_e(rsa));
+ header.cbModulus = BN_num_bytes(RSA_get0_n(rsa));
+ header.cbPrime1 = BN_num_bytes(RSA_get0_p(rsa));
+ header.cbPrime2 = BN_num_bytes(RSA_get0_q(rsa));
uint8_t* blob_data;
size_t blob_len;
@@ -151,14 +158,14 @@ bool PKCS8ToBLOBForCNG(const std::string& pkcs8,
if (!CBB_init(cbb.get(), sizeof(header) + pkcs8.size()) ||
!CBB_add_bytes(cbb.get(), reinterpret_cast<const uint8_t*>(&header),
sizeof(header)) ||
- !AddBIGNUMBigEndian(cbb.get(), rsa->e, header.cbPublicExp) ||
- !AddBIGNUMBigEndian(cbb.get(), rsa->n, header.cbModulus) ||
- !AddBIGNUMBigEndian(cbb.get(), rsa->p, header.cbPrime1) ||
- !AddBIGNUMBigEndian(cbb.get(), rsa->q, header.cbPrime2) ||
- !AddBIGNUMBigEndian(cbb.get(), rsa->dmp1, header.cbPrime1) ||
- !AddBIGNUMBigEndian(cbb.get(), rsa->dmq1, header.cbPrime2) ||
- !AddBIGNUMBigEndian(cbb.get(), rsa->iqmp, header.cbPrime1) ||
- !AddBIGNUMBigEndian(cbb.get(), rsa->d, header.cbModulus) ||
+ !AddBIGNUMBigEndian(cbb.get(), RSA_get0_e(rsa), header.cbPublicExp) ||
+ !AddBIGNUMBigEndian(cbb.get(), RSA_get0_n(rsa), header.cbModulus) ||
+ !AddBIGNUMBigEndian(cbb.get(), RSA_get0_p(rsa), header.cbPrime1) ||
+ !AddBIGNUMBigEndian(cbb.get(), RSA_get0_q(rsa), header.cbPrime2) ||
+ !AddBIGNUMBigEndian(cbb.get(), RSA_get0_dmp1(rsa), header.cbPrime1) ||
+ !AddBIGNUMBigEndian(cbb.get(), RSA_get0_dmq1(rsa), header.cbPrime2) ||
+ !AddBIGNUMBigEndian(cbb.get(), RSA_get0_iqmp(rsa), header.cbPrime1) ||
+ !AddBIGNUMBigEndian(cbb.get(), RSA_get0_d(rsa), header.cbModulus) ||
!CBB_finish(cbb.get(), &blob_data, &blob_len)) {
return false;
}
diff --git a/chromium/net/ssl/ssl_private_key.h b/chromium/net/ssl/ssl_private_key.h
index 8dc08ee4602..7a34b46e964 100644
--- a/chromium/net/ssl/ssl_private_key.h
+++ b/chromium/net/ssl/ssl_private_key.h
@@ -32,7 +32,7 @@ class NET_EXPORT SSLPrivateKey
using SignCallback =
base::OnceCallback<void(Error, const std::vector<uint8_t>&)>;
- SSLPrivateKey() {}
+ SSLPrivateKey() = default;
SSLPrivateKey(const SSLPrivateKey&) = delete;
SSLPrivateKey& operator=(const SSLPrivateKey&) = delete;
@@ -67,7 +67,7 @@ class NET_EXPORT SSLPrivateKey
bool supports_pss);
protected:
- virtual ~SSLPrivateKey() {}
+ virtual ~SSLPrivateKey() = default;
private:
friend class base::RefCountedThreadSafe<SSLPrivateKey>;
diff --git a/chromium/net/ssl/ssl_server_config.h b/chromium/net/ssl/ssl_server_config.h
index 8ffc9d956bf..f47269176d9 100644
--- a/chromium/net/ssl/ssl_server_config.h
+++ b/chromium/net/ssl/ssl_server_config.h
@@ -135,7 +135,8 @@ struct NET_EXPORT SSLServerConfig {
public:
ECHKeysContainer();
// Intentionally allow implicit conversion from bssl::UniquePtr.
- ECHKeysContainer(bssl::UniquePtr<SSL_ECH_KEYS> keys);
+ ECHKeysContainer( // NOLINT(google-explicit-constructor)
+ bssl::UniquePtr<SSL_ECH_KEYS> keys);
~ECHKeysContainer();
ECHKeysContainer(const ECHKeysContainer& other);
diff --git a/chromium/net/ssl/threaded_ssl_private_key.cc b/chromium/net/ssl/threaded_ssl_private_key.cc
index ed5ac2b5379..55c82c4231a 100644
--- a/chromium/net/ssl/threaded_ssl_private_key.cc
+++ b/chromium/net/ssl/threaded_ssl_private_key.cc
@@ -5,6 +5,7 @@
#include "net/ssl/threaded_ssl_private_key.h"
#include <string>
+#include <tuple>
#include <utility>
#include "base/bind.h"
@@ -17,10 +18,11 @@ namespace net {
namespace {
-void DoCallback(const base::WeakPtr<ThreadedSSLPrivateKey>& key,
- SSLPrivateKey::SignCallback callback,
- std::vector<uint8_t>* signature,
- Error error) {
+void DoCallback(
+ const base::WeakPtr<ThreadedSSLPrivateKey>& key,
+ SSLPrivateKey::SignCallback callback,
+ std::tuple<Error, std::unique_ptr<std::vector<uint8_t>>> result) {
+ auto [error, signature] = std::move(result);
if (!key)
return;
std::move(callback).Run(error, *signature);
@@ -31,15 +33,17 @@ void DoCallback(const base::WeakPtr<ThreadedSSLPrivateKey>& key,
class ThreadedSSLPrivateKey::Core
: public base::RefCountedThreadSafe<ThreadedSSLPrivateKey::Core> {
public:
- Core(std::unique_ptr<ThreadedSSLPrivateKey::Delegate> delegate)
+ explicit Core(std::unique_ptr<ThreadedSSLPrivateKey::Delegate> delegate)
: delegate_(std::move(delegate)) {}
ThreadedSSLPrivateKey::Delegate* delegate() { return delegate_.get(); }
- Error Sign(uint16_t algorithm,
- base::span<const uint8_t> input,
- std::vector<uint8_t>* signature) {
- return delegate_->Sign(algorithm, input, signature);
+ std::tuple<Error, std::unique_ptr<std::vector<uint8_t>>> Sign(
+ uint16_t algorithm,
+ base::span<const uint8_t> input) {
+ auto signature = std::make_unique<std::vector<uint8_t>>();
+ auto error = delegate_->Sign(algorithm, input, signature.get());
+ return std::make_tuple(error, std::move(signature));
}
private:
@@ -52,7 +56,7 @@ class ThreadedSSLPrivateKey::Core
ThreadedSSLPrivateKey::ThreadedSSLPrivateKey(
std::unique_ptr<ThreadedSSLPrivateKey::Delegate> delegate,
scoped_refptr<base::SingleThreadTaskRunner> task_runner)
- : core_(new Core(std::move(delegate))),
+ : core_(base::MakeRefCounted<Core>(std::move(delegate))),
task_runner_(std::move(task_runner)) {}
std::string ThreadedSSLPrivateKey::GetProviderName() {
@@ -66,14 +70,12 @@ std::vector<uint16_t> ThreadedSSLPrivateKey::GetAlgorithmPreferences() {
void ThreadedSSLPrivateKey::Sign(uint16_t algorithm,
base::span<const uint8_t> input,
SSLPrivateKey::SignCallback callback) {
- std::vector<uint8_t>* signature = new std::vector<uint8_t>;
base::PostTaskAndReplyWithResult(
task_runner_.get(), FROM_HERE,
base::BindOnce(&ThreadedSSLPrivateKey::Core::Sign, core_, algorithm,
- std::vector<uint8_t>(input.begin(), input.end()),
- base::Unretained(signature)),
+ std::vector<uint8_t>(input.begin(), input.end())),
base::BindOnce(&DoCallback, weak_factory_.GetWeakPtr(),
- std::move(callback), base::Owned(signature)));
+ std::move(callback)));
}
ThreadedSSLPrivateKey::~ThreadedSSLPrivateKey() = default;
diff --git a/chromium/net/ssl/threaded_ssl_private_key.h b/chromium/net/ssl/threaded_ssl_private_key.h
index dd13b8be267..8306b833b5b 100644
--- a/chromium/net/ssl/threaded_ssl_private_key.h
+++ b/chromium/net/ssl/threaded_ssl_private_key.h
@@ -31,12 +31,12 @@ class NET_EXPORT ThreadedSSLPrivateKey : public SSLPrivateKey {
// operation.
class Delegate {
public:
- Delegate() {}
+ Delegate() = default;
Delegate(const Delegate&) = delete;
Delegate& operator=(const Delegate&) = delete;
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
// Returns a human-readable name of the provider that backs this
// SSLPrivateKey, for debugging. If not applicable or available, return the
diff --git a/chromium/net/test/android/javatests/src/org/chromium/net/AndroidNetworkLibraryTestUtil.java b/chromium/net/test/android/javatests/src/org/chromium/net/AndroidNetworkLibraryTestUtil.java
index 55233733888..77f5b4ac647 100644
--- a/chromium/net/test/android/javatests/src/org/chromium/net/AndroidNetworkLibraryTestUtil.java
+++ b/chromium/net/test/android/javatests/src/org/chromium/net/AndroidNetworkLibraryTestUtil.java
@@ -4,7 +4,7 @@
package org.chromium.net;
-import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.CalledByNativeForTesting;
/**
* Utility functions for testing features implemented in AndroidNetworkLibrary.
@@ -15,7 +15,7 @@ public class AndroidNetworkLibraryTestUtil {
/**
* Helper for tests that simulates an app controlling cleartext traffic on M and newer.
*/
- @CalledByNative
+ @CalledByNativeForTesting
public static void setUpSecurityPolicyForTesting(boolean cleartextPermitted) {
sDefaultCleartextCheckCount = 0;
sPerHostCleartextCheckCount = 0;
@@ -37,12 +37,12 @@ public class AndroidNetworkLibraryTestUtil {
});
}
- @CalledByNative
+ @CalledByNativeForTesting
private static int getPerHostCleartextCheckCount() {
return sPerHostCleartextCheckCount;
}
- @CalledByNative
+ @CalledByNativeForTesting
private static int getDefaultCleartextCheckCount() {
return sDefaultCleartextCheckCount;
}
diff --git a/chromium/net/test/android/net_test_jni_onload.cc b/chromium/net/test/android/net_test_jni_onload.cc
index 73739190643..c9b45485ccf 100644
--- a/chromium/net/test/android/net_test_jni_onload.cc
+++ b/chromium/net/test/android/net_test_jni_onload.cc
@@ -9,12 +9,10 @@
#include "base/bind.h"
#include "net/test/embedded_test_server/android/embedded_test_server_android.h"
-namespace net {
-namespace test {
+namespace net::test {
bool OnJNIOnLoadInit() {
return base::android::OnJNIOnLoadInit();
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/test/android/net_test_jni_onload.h b/chromium/net/test/android/net_test_jni_onload.h
index 35c734b8061..e16d2f924ab 100644
--- a/chromium/net/test/android/net_test_jni_onload.h
+++ b/chromium/net/test/android/net_test_jni_onload.h
@@ -7,12 +7,10 @@
#include <jni.h>
-namespace net {
-namespace test {
+namespace net::test {
bool OnJNIOnLoadInit();
-} // namespace test
-} // namespace net
+} // namespace net::test
#endif // NET_TEST_ANDROID_NET_TEST_JNI_ONLOAD_H_
diff --git a/chromium/net/test/cert_builder.cc b/chromium/net/test/cert_builder.cc
index b282bbc1ded..c1ec29e1d5b 100644
--- a/chromium/net/test/cert_builder.cc
+++ b/chromium/net/test/cert_builder.cc
@@ -7,9 +7,11 @@
#include "base/files/file_path.h"
#include "base/memory/ptr_util.h"
#include "base/strings/string_number_conversions.h"
+#include "crypto/ec_private_key.h"
#include "crypto/openssl_util.h"
#include "crypto/rsa_private_key.h"
#include "net/cert/asn1_util.h"
+#include "net/cert/pki/verify_signed_data.h"
#include "net/cert/x509_util.h"
#include "net/der/encode_values.h"
#include "net/der/input.h"
@@ -51,6 +53,26 @@ std::string Sha1WithRSAEncryption() {
std::end(kSha1WithRSAEncryption));
}
+std::string Md5WithRSAEncryption() {
+ const uint8_t kMd5WithRSAEncryption[] = {0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x04, 0x05, 0x00};
+ return std::string(std::begin(kMd5WithRSAEncryption),
+ std::end(kMd5WithRSAEncryption));
+}
+
+std::string EcdsaWithSha256() {
+ const uint8_t kDer[] = {0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86,
+ 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02};
+ return std::string(std::begin(kDer), std::end(kDer));
+}
+
+std::string EcdsaWithSha1() {
+ const uint8_t kDer[] = {0x30, 0x09, 0x06, 0x07, 0x2a, 0x86,
+ 0x48, 0xce, 0x3d, 0x04, 0x01};
+ return std::string(std::begin(kDer), std::end(kDer));
+}
+
// Adds bytes (specified as a StringPiece) to the given CBB.
// The argument ordering follows the boringssl CBB_* api style.
bool CBBAddBytes(CBB* cbb, base::StringPiece bytes) {
@@ -171,17 +193,26 @@ void CertBuilder::CreateSimpleChain(
// Build slightly modified variants of |orig_certs|.
*out_root =
std::make_unique<CertBuilder>(orig_certs[2]->cert_buffer(), nullptr);
+ (*out_root)->SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ (*out_root)->GenerateECKey();
+
*out_intermediate = std::make_unique<CertBuilder>(
orig_certs[1]->cert_buffer(), out_root->get());
(*out_intermediate)->EraseExtension(der::Input(kCrlDistributionPointsOid));
(*out_intermediate)->EraseExtension(der::Input(kAuthorityInfoAccessOid));
+ (*out_intermediate)->SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ (*out_intermediate)->GenerateECKey();
+
*out_leaf = std::make_unique<CertBuilder>(orig_certs[0]->cert_buffer(),
out_intermediate->get());
(*out_leaf)->SetSubjectAltName(kHostname);
(*out_leaf)->EraseExtension(der::Input(kCrlDistributionPointsOid));
(*out_leaf)->EraseExtension(der::Input(kAuthorityInfoAccessOid));
+ (*out_leaf)->SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ (*out_leaf)->GenerateECKey();
}
+// static
void CertBuilder::CreateSimpleChain(std::unique_ptr<CertBuilder>* out_leaf,
std::unique_ptr<CertBuilder>* out_root) {
const char kHostname[] = "www.example.com";
@@ -194,10 +225,120 @@ void CertBuilder::CreateSimpleChain(std::unique_ptr<CertBuilder>* out_leaf,
// Build slightly modified variants of |orig_certs|.
*out_root = std::make_unique<CertBuilder>(orig_root->cert_buffer(), nullptr);
+ (*out_root)->SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ (*out_root)->GenerateECKey();
*out_leaf =
std::make_unique<CertBuilder>(orig_leaf->cert_buffer(), out_root->get());
(*out_leaf)->SetSubjectAltName(kHostname);
+ (*out_leaf)->SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ (*out_leaf)->GenerateECKey();
+}
+
+// static
+absl::optional<SignatureAlgorithm> CertBuilder::DefaultSignatureAlgorithmForKey(
+ EVP_PKEY* key) {
+ if (EVP_PKEY_id(key) == EVP_PKEY_RSA)
+ return SignatureAlgorithm::kRsaPkcs1Sha256;
+ if (EVP_PKEY_id(key) == EVP_PKEY_EC)
+ return SignatureAlgorithm::kEcdsaSha256;
+ return absl::nullopt;
+}
+
+// static
+bool CertBuilder::SignData(SignatureAlgorithm signature_algorithm,
+ base::StringPiece tbs_data,
+ EVP_PKEY* key,
+ CBB* out_signature) {
+ if (!key)
+ return false;
+
+ int expected_pkey_id = 1;
+ const EVP_MD* digest;
+
+ switch (signature_algorithm) {
+ case SignatureAlgorithm::kRsaPkcs1Md5:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_md5();
+ break;
+ case SignatureAlgorithm::kRsaPkcs1Sha1:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha1();
+ break;
+ case SignatureAlgorithm::kRsaPkcs1Sha256:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha256();
+ break;
+ case SignatureAlgorithm::kRsaPkcs1Sha384:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha384();
+ break;
+ case SignatureAlgorithm::kRsaPkcs1Sha512:
+ expected_pkey_id = EVP_PKEY_RSA;
+ digest = EVP_sha512();
+ break;
+
+ case SignatureAlgorithm::kEcdsaSha1:
+ expected_pkey_id = EVP_PKEY_EC;
+ digest = EVP_sha1();
+ break;
+ case SignatureAlgorithm::kEcdsaSha256:
+ expected_pkey_id = EVP_PKEY_EC;
+ digest = EVP_sha256();
+ break;
+ case SignatureAlgorithm::kEcdsaSha384:
+ expected_pkey_id = EVP_PKEY_EC;
+ digest = EVP_sha384();
+ break;
+ case SignatureAlgorithm::kEcdsaSha512:
+ expected_pkey_id = EVP_PKEY_EC;
+ digest = EVP_sha512();
+ break;
+
+ case SignatureAlgorithm::kRsaPssSha256:
+ case SignatureAlgorithm::kRsaPssSha384:
+ case SignatureAlgorithm::kRsaPssSha512:
+ case SignatureAlgorithm::kRsaPkcs1Md2:
+ case SignatureAlgorithm::kRsaPkcs1Md4:
+ case SignatureAlgorithm::kDsaSha1:
+ case SignatureAlgorithm::kDsaSha256:
+ // Unsupported algorithms.
+ return false;
+ }
+
+ const uint8_t* tbs_bytes = reinterpret_cast<const uint8_t*>(tbs_data.data());
+ bssl::ScopedEVP_MD_CTX ctx;
+ uint8_t* sig_out;
+ size_t sig_len;
+
+ return expected_pkey_id == EVP_PKEY_id(key) &&
+ EVP_DigestSignInit(ctx.get(), nullptr, digest, nullptr, key) &&
+ EVP_DigestSign(ctx.get(), nullptr, &sig_len, tbs_bytes,
+ tbs_data.size()) &&
+ CBB_reserve(out_signature, &sig_out, sig_len) &&
+ EVP_DigestSign(ctx.get(), sig_out, &sig_len, tbs_bytes,
+ tbs_data.size()) &&
+ CBB_did_write(out_signature, sig_len);
+}
+
+// static
+std::string CertBuilder::SignatureAlgorithmToDer(
+ SignatureAlgorithm signature_algorithm) {
+ switch (signature_algorithm) {
+ case SignatureAlgorithm::kRsaPkcs1Md5:
+ return Md5WithRSAEncryption();
+ case SignatureAlgorithm::kRsaPkcs1Sha1:
+ return Sha1WithRSAEncryption();
+ case SignatureAlgorithm::kRsaPkcs1Sha256:
+ return Sha256WithRSAEncryption();
+ case SignatureAlgorithm::kEcdsaSha1:
+ return EcdsaWithSha1();
+ case SignatureAlgorithm::kEcdsaSha256:
+ return EcdsaWithSha256();
+ default:
+ ADD_FAILURE();
+ return std::string();
+ }
}
void CertBuilder::SetExtension(const der::Input& oid,
@@ -544,25 +685,27 @@ void CertBuilder::SetAuthorityKeyIdentifier(
SetExtension(der::Input(kAuthorityKeyIdentifierOid), FinishCBB(cbb.get()));
}
-void CertBuilder::SetSignatureAlgorithmRsaPkca1(DigestAlgorithm digest) {
- switch (digest) {
- case DigestAlgorithm::Sha256: {
- SetSignatureAlgorithm(Sha256WithRSAEncryption());
- break;
- }
+void CertBuilder::SetSignatureAlgorithm(
+ SignatureAlgorithm signature_algorithm) {
+ signature_algorithm_ = signature_algorithm;
+ Invalidate();
+}
- case DigestAlgorithm::Sha1: {
- SetSignatureAlgorithm(Sha1WithRSAEncryption());
- break;
- }
+void CertBuilder::SetSignatureAlgorithmTLV(
+ base::StringPiece signature_algorithm_tlv) {
+ SetOuterSignatureAlgorithmTLV(signature_algorithm_tlv);
+ SetTBSSignatureAlgorithmTLV(signature_algorithm_tlv);
+}
- default:
- ASSERT_TRUE(false);
- }
+void CertBuilder::SetOuterSignatureAlgorithmTLV(
+ base::StringPiece signature_algorithm_tlv) {
+ outer_signature_algorithm_tlv_ = std::string(signature_algorithm_tlv);
+ Invalidate();
}
-void CertBuilder::SetSignatureAlgorithm(std::string algorithm_tlv) {
- signature_algorithm_tlv_ = std::move(algorithm_tlv);
+void CertBuilder::SetTBSSignatureAlgorithmTLV(
+ base::StringPiece signature_algorithm_tlv) {
+ tbs_signature_algorithm_tlv_ = std::string(signature_algorithm_tlv);
Invalidate();
}
@@ -625,8 +768,16 @@ bool CertBuilder::GetValidity(base::Time* not_before,
}
EVP_PKEY* CertBuilder::GetKey() {
- if (!key_)
- GenerateKey();
+ if (!key_) {
+ switch (default_pkey_id_) {
+ case EVP_PKEY_RSA:
+ GenerateRSAKey();
+ break;
+ case EVP_PKEY_EC:
+ GenerateECKey();
+ break;
+ }
+ }
return key_.get();
}
@@ -670,11 +821,16 @@ void CertBuilder::Invalidate() {
cert_.reset();
}
-void CertBuilder::GenerateKey() {
- ASSERT_FALSE(key_);
+void CertBuilder::GenerateECKey() {
+ auto private_key = crypto::ECPrivateKey::Create();
+ key_ = bssl::UpRef(private_key->key());
+ Invalidate();
+}
+void CertBuilder::GenerateRSAKey() {
auto private_key = crypto::RSAPrivateKey::Create(2048);
key_ = bssl::UpRef(private_key->key());
+ Invalidate();
}
void CertBuilder::GenerateSubjectKeyIdentifier() {
@@ -736,7 +892,10 @@ void CertBuilder::InitFromCert(const der::Input& cert) {
// signature
der::Input signature_algorithm_tlv;
ASSERT_TRUE(tbs_certificate.ReadRawTLV(&signature_algorithm_tlv));
- signature_algorithm_tlv_ = signature_algorithm_tlv.AsString();
+ auto signature_algorithm =
+ ParseSignatureAlgorithm(signature_algorithm_tlv, nullptr);
+ ASSERT_TRUE(signature_algorithm);
+ signature_algorithm_ = *signature_algorithm;
// issuer
ASSERT_TRUE(tbs_certificate.SkipTag(der::kSequence));
@@ -748,8 +907,14 @@ void CertBuilder::InitFromCert(const der::Input& cert) {
// subject
ASSERT_TRUE(tbs_certificate.SkipTag(der::kSequence));
+
// subjectPublicKeyInfo
- ASSERT_TRUE(tbs_certificate.SkipTag(der::kSequence));
+ der::Input spki_tlv;
+ ASSERT_TRUE(tbs_certificate.ReadRawTLV(&spki_tlv));
+ bssl::UniquePtr<EVP_PKEY> public_key;
+ ASSERT_TRUE(ParsePublicKey(spki_tlv, &public_key));
+ default_pkey_id_ = EVP_PKEY_id(public_key.get());
+
// issuerUniqueID
ASSERT_TRUE(tbs_certificate.SkipOptionalTag(der::ContextSpecificPrimitive(1),
&unused));
@@ -773,7 +938,8 @@ void CertBuilder::InitFromCert(const der::Input& cert) {
}
}
-void CertBuilder::BuildTBSCertificate(std::string* out) {
+void CertBuilder::BuildTBSCertificate(base::StringPiece signature_algorithm_tlv,
+ std::string* out) {
bssl::ScopedCBB cbb;
CBB tbs_cert, version, extensions_context, extensions;
@@ -785,10 +951,11 @@ void CertBuilder::BuildTBSCertificate(std::string* out) {
// Always use v3 certificates.
ASSERT_TRUE(CBB_add_asn1_uint64(&version, 2));
ASSERT_TRUE(CBB_add_asn1_uint64(&tbs_cert, GetSerialNumber()));
- ASSERT_TRUE(AddSignatureAlgorithm(&tbs_cert));
+ ASSERT_TRUE(CBBAddBytes(&tbs_cert, signature_algorithm_tlv));
ASSERT_TRUE(CBBAddBytes(&tbs_cert, issuer_->GetSubject()));
ASSERT_TRUE(CBBAddBytes(&tbs_cert, validity_tlv_));
ASSERT_TRUE(CBBAddBytes(&tbs_cert, GetSubject()));
+ ASSERT_TRUE(GetKey());
ASSERT_TRUE(EVP_marshal_public_key(&tbs_cert, GetKey()));
// Serialize all the extensions.
@@ -826,62 +993,41 @@ void CertBuilder::BuildTBSCertificate(std::string* out) {
*out = FinishCBB(cbb.get());
}
-bool CertBuilder::AddSignatureAlgorithm(CBB* cbb) {
- return CBBAddBytes(cbb, signature_algorithm_tlv_);
-}
-
void CertBuilder::GenerateCertificate() {
ASSERT_FALSE(cert_);
- std::string tbs_cert;
- BuildTBSCertificate(&tbs_cert);
- const uint8_t* tbs_cert_bytes =
- reinterpret_cast<const uint8_t*>(tbs_cert.data());
-
- // Determine the correct digest algorithm to use (assumes RSA PKCS#1
- // signatures).
- auto signature_algorithm = SignatureAlgorithm::Create(
- der::Input(&signature_algorithm_tlv_), nullptr);
- ASSERT_TRUE(signature_algorithm);
- ASSERT_EQ(SignatureAlgorithmId::RsaPkcs1, signature_algorithm->algorithm());
- const EVP_MD* md = nullptr;
+ absl::optional<SignatureAlgorithm> signature_algorithm = signature_algorithm_;
+ if (!signature_algorithm)
+ signature_algorithm = DefaultSignatureAlgorithmForKey(issuer_->GetKey());
+ ASSERT_TRUE(signature_algorithm.has_value());
- switch (signature_algorithm->digest()) {
- case DigestAlgorithm::Sha256:
- md = EVP_sha256();
- break;
+ std::string signature_algorithm_tlv =
+ !outer_signature_algorithm_tlv_.empty()
+ ? outer_signature_algorithm_tlv_
+ : SignatureAlgorithmToDer(*signature_algorithm);
+ ASSERT_FALSE(signature_algorithm_tlv.empty());
- case DigestAlgorithm::Sha1:
- md = EVP_sha1();
- break;
+ std::string tbs_signature_algorithm_tlv =
+ !tbs_signature_algorithm_tlv_.empty()
+ ? tbs_signature_algorithm_tlv_
+ : SignatureAlgorithmToDer(*signature_algorithm);
+ ASSERT_FALSE(tbs_signature_algorithm_tlv.empty());
- default:
- ASSERT_TRUE(false) << "Only rsaEncryptionWithSha256 or "
- "rsaEnryptionWithSha1 are supported";
- break;
- }
+ std::string tbs_cert;
+ BuildTBSCertificate(tbs_signature_algorithm_tlv, &tbs_cert);
// Sign the TBSCertificate and write the entire certificate.
bssl::ScopedCBB cbb;
CBB cert, signature;
- bssl::ScopedEVP_MD_CTX ctx;
- uint8_t* sig_out;
- size_t sig_len;
ASSERT_TRUE(CBB_init(cbb.get(), tbs_cert.size()));
ASSERT_TRUE(CBB_add_asn1(cbb.get(), &cert, CBS_ASN1_SEQUENCE));
ASSERT_TRUE(CBBAddBytes(&cert, tbs_cert));
- ASSERT_TRUE(AddSignatureAlgorithm(&cert));
+ ASSERT_TRUE(CBBAddBytes(&cert, signature_algorithm_tlv));
ASSERT_TRUE(CBB_add_asn1(&cert, &signature, CBS_ASN1_BITSTRING));
ASSERT_TRUE(CBB_add_u8(&signature, 0 /* no unused bits */));
ASSERT_TRUE(
- EVP_DigestSignInit(ctx.get(), nullptr, md, nullptr, issuer_->GetKey()));
- ASSERT_TRUE(EVP_DigestSign(ctx.get(), nullptr, &sig_len, tbs_cert_bytes,
- tbs_cert.size()));
- ASSERT_TRUE(CBB_reserve(&signature, &sig_out, sig_len));
- ASSERT_TRUE(EVP_DigestSign(ctx.get(), sig_out, &sig_len, tbs_cert_bytes,
- tbs_cert.size()));
- ASSERT_TRUE(CBB_did_write(&signature, sig_len));
+ SignData(*signature_algorithm, tbs_cert, issuer_->GetKey(), &signature));
auto cert_der = FinishCBB(cbb.get());
cert_ =
diff --git a/chromium/net/test/cert_builder.h b/chromium/net/test/cert_builder.h
index 56fe5fe04c2..abd94577f46 100644
--- a/chromium/net/test/cert_builder.h
+++ b/chromium/net/test/cert_builder.h
@@ -10,13 +10,14 @@
#include "base/memory/raw_ptr.h"
#include "base/rand_util.h"
-#include "base/strings/string_piece.h"
+#include "base/strings/string_piece_forward.h"
#include "net/base/ip_address.h"
-#include "net/cert/internal/parse_certificate.h"
-#include "net/cert/internal/signature_algorithm.h"
+#include "net/cert/pki/parse_certificate.h"
+#include "net/cert/pki/signature_algorithm.h"
#include "net/cert/x509_certificate.h"
#include "third_party/boringssl/src/include/openssl/base.h"
#include "third_party/boringssl/src/include/openssl/bytestring.h"
+#include "third_party/boringssl/src/include/openssl/evp.h"
#include "third_party/boringssl/src/include/openssl/pool.h"
class GURL;
@@ -87,6 +88,22 @@ class CertBuilder {
static void CreateSimpleChain(std::unique_ptr<CertBuilder>* out_leaf,
std::unique_ptr<CertBuilder>* out_root);
+ // Returns a compatible signature algorithm for |key|.
+ static absl::optional<SignatureAlgorithm> DefaultSignatureAlgorithmForKey(
+ EVP_PKEY* key);
+
+ // Signs |tbs_data| with |key| using |signature_algorithm| appending the
+ // signature onto |out_signature| and returns true if successful.
+ static bool SignData(SignatureAlgorithm signature_algorithm,
+ base::StringPiece tbs_data,
+ EVP_PKEY* key,
+ CBB* out_signature);
+
+ // Returns a DER encoded AlgorithmIdentifier TLV for |signature_algorithm|
+ // empty string on error.
+ static std::string SignatureAlgorithmToDer(
+ SignatureAlgorithm signature_algorithm);
+
// Sets a value for the indicated X.509 (v3) extension.
void SetExtension(const der::Input& oid,
std::string value,
@@ -163,14 +180,43 @@ class CertBuilder {
// introducing AKI/SKI chain building issues.
void SetAuthorityKeyIdentifier(const std::string& authority_key_identifier);
- // Sets the signature algorithm for the certificate to either
- // sha256WithRSAEncryption or sha1WithRSAEncryption.
- void SetSignatureAlgorithmRsaPkca1(DigestAlgorithm digest);
-
- void SetSignatureAlgorithm(std::string algorithm_tlv);
+ // Sets the signature algorithm to use in generating the certificate's
+ // signature. The signature algorithm should be compatible with
+ // the type of |issuer_->GetKey()|. If this method is not called, and the
+ // CertBuilder was initialized from a template cert, the signature algorithm
+ // of that cert will be used, or if there was no template cert, a default
+ // algorithm will be used base on the signing key type.
+ void SetSignatureAlgorithm(SignatureAlgorithm signature_algorithm);
+
+ // Sets both signature AlgorithmIdentifier TLVs to encode in the generated
+ // certificate.
+ // This only affects the bytes written to the output - it does not affect what
+ // algorithm is actually used to perform the signature. To set the signature
+ // algorithm used to generate the certificate's signature, use
+ // |SetSignatureAlgorithm|. If this method is not called, the signature
+ // algorithm written to the output will be chosen to match the signature
+ // algorithm used to sign the certificate.
+ void SetSignatureAlgorithmTLV(base::StringPiece signature_algorithm_tlv);
+
+ // Set only the outer Certificate signatureAlgorithm TLV. See
+ // SetSignatureAlgorithmTLV comment for general notes.
+ void SetOuterSignatureAlgorithmTLV(base::StringPiece signature_algorithm_tlv);
+
+ // Set only the tbsCertificate signature TLV. See SetSignatureAlgorithmTLV
+ // comment for general notes.
+ void SetTBSSignatureAlgorithmTLV(base::StringPiece signature_algorithm_tlv);
void SetRandomSerialNumber();
+ // Sets the private key for the generated certificate to an EC key. If a key
+ // was already set, it will be replaced.
+ void GenerateECKey();
+
+ // Sets the private key for the generated certificate to a 2048-bit RSA key.
+ // RSA key generation is expensive, so this should not be used unless an RSA
+ // key is specifically needed. If a key was already set, it will be replaced.
+ void GenerateRSAKey();
+
// Returns the CertBuilder that issues this certificate. (Will be |this| if
// certificate is self-signed.)
CertBuilder* issuer() { return issuer_; }
@@ -197,7 +243,7 @@ class CertBuilder {
// |not_before| and |not_after|, returning true on success.
bool GetValidity(base::Time* not_before, base::Time* not_after) const;
- // Returns the (RSA) key for the generated certificate.
+ // Returns the key for the generated certificate.
EVP_PKEY* GetKey();
// Returns an X509Certificate for the generated certificate.
@@ -230,9 +276,6 @@ class CertBuilder {
// be re-generated next time the DER is accessed.
void Invalidate();
- // Sets the |key_| to a 2048-bit RSA key.
- void GenerateKey();
-
// Generates a random Subject Key Identifier for the certificate. This is
// necessary for Windows, which otherwises uses SKI/AKI matching for lookups
// with greater precedence than subject/issuer name matching, and on newer
@@ -252,9 +295,8 @@ class CertBuilder {
void InitFromCert(const der::Input& cert);
// Assembles the CertBuilder into a TBSCertificate.
- void BuildTBSCertificate(std::string* out);
-
- bool AddSignatureAlgorithm(CBB* cbb);
+ void BuildTBSCertificate(base::StringPiece signature_algorithm_tlv,
+ std::string* out);
void GenerateCertificate();
@@ -265,8 +307,11 @@ class CertBuilder {
std::string validity_tlv_;
std::string subject_tlv_;
- std::string signature_algorithm_tlv_;
+ absl::optional<SignatureAlgorithm> signature_algorithm_;
+ std::string outer_signature_algorithm_tlv_;
+ std::string tbs_signature_algorithm_tlv_;
uint64_t serial_number_ = 0;
+ int default_pkey_id_ = EVP_PKEY_EC;
std::map<std::string, ExtensionValue> extensions_;
diff --git a/chromium/net/test/ct_test_util.cc b/chromium/net/test/ct_test_util.cc
index a9fffe83362..ea6da8a1147 100644
--- a/chromium/net/test/ct_test_util.cc
+++ b/chromium/net/test/ct_test_util.cc
@@ -19,9 +19,7 @@
#include "net/cert/signed_tree_head.h"
#include "net/cert/x509_certificate.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
namespace {
@@ -211,7 +209,7 @@ std::string GetTestPublicKeyId() {
void GetX509CertSCT(scoped_refptr<SignedCertificateTimestamp>* sct_ref) {
CHECK(sct_ref != nullptr);
- *sct_ref = new SignedCertificateTimestamp();
+ *sct_ref = base::MakeRefCounted<SignedCertificateTimestamp>();
SignedCertificateTimestamp *const sct(sct_ref->get());
sct->version = ct::SignedCertificateTimestamp::V1;
sct->log_id = HexDecode(kTestKeyId);
@@ -228,7 +226,7 @@ void GetX509CertSCT(scoped_refptr<SignedCertificateTimestamp>* sct_ref) {
void GetPrecertSCT(scoped_refptr<SignedCertificateTimestamp>* sct_ref) {
CHECK(sct_ref != nullptr);
- *sct_ref = new SignedCertificateTimestamp();
+ *sct_ref = base::MakeRefCounted<SignedCertificateTimestamp>();
SignedCertificateTimestamp *const sct(sct_ref->get());
sct->version = ct::SignedCertificateTimestamp::V1;
sct->log_id = HexDecode(kTestKeyId);
@@ -407,6 +405,4 @@ bool CheckForSCTOrigin(const SignedCertificateTimestampAndStatusList& scts,
return false;
}
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
diff --git a/chromium/net/test/ct_test_util.h b/chromium/net/test/ct_test_util.h
index a784ca2badc..cad3fee90fb 100644
--- a/chromium/net/test/ct_test_util.h
+++ b/chromium/net/test/ct_test_util.h
@@ -15,9 +15,7 @@
#include "net/cert/signed_certificate_timestamp.h"
#include "net/cert/signed_certificate_timestamp_and_status.h"
-namespace net {
-
-namespace ct {
+namespace net::ct {
struct DigitallySigned;
struct MerkleTreeLeaf;
@@ -128,8 +126,6 @@ bool CheckForSingleVerifiedSCTInResult(
bool CheckForSCTOrigin(const SignedCertificateTimestampAndStatusList& scts,
SignedCertificateTimestamp::Origin origin);
-} // namespace ct
-
-} // namespace net
+} // namespace net::ct
#endif // NET_TEST_CT_TEST_UTIL_H_
diff --git a/chromium/net/test/embedded_test_server/DEPS b/chromium/net/test/embedded_test_server/DEPS
index b307e7de6f9..f2b76e93385 100644
--- a/chromium/net/test/embedded_test_server/DEPS
+++ b/chromium/net/test/embedded_test_server/DEPS
@@ -1,3 +1,3 @@
include_rules = [
- "+absl"
-] \ No newline at end of file
+ "+third_party/abseil-cpp/absl/strings/escaping.h"
+]
diff --git a/chromium/net/test/embedded_test_server/android/embedded_test_server_android.cc b/chromium/net/test/embedded_test_server/android/embedded_test_server_android.cc
index 02a8911f5a7..97085e3c4e6 100644
--- a/chromium/net/test/embedded_test_server/android/embedded_test_server_android.cc
+++ b/chromium/net/test/embedded_test_server/android/embedded_test_server_android.cc
@@ -17,8 +17,7 @@ using base::android::JavaParamRef;
using base::android::JavaRef;
using base::android::ScopedJavaLocalRef;
-namespace net {
-namespace test_server {
+namespace net::test_server {
EmbeddedTestServerAndroid::ConnectionListener::ConnectionListener(
EmbeddedTestServerAndroid* test_server_android)
@@ -168,5 +167,4 @@ static void JNI_EmbeddedTestServerImpl_Init(
new EmbeddedTestServerAndroid(env, jobj, jhttps);
}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/android/embedded_test_server_android.h b/chromium/net/test/embedded_test_server/android/embedded_test_server_android.h
index d0473b60374..edb819f16da 100644
--- a/chromium/net/test/embedded_test_server/android/embedded_test_server_android.h
+++ b/chromium/net/test/embedded_test_server/android/embedded_test_server_android.h
@@ -15,8 +15,7 @@
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
// The C++ side of the Java EmbeddedTestServer.
class EmbeddedTestServerAndroid {
@@ -78,7 +77,7 @@ class EmbeddedTestServerAndroid {
// Connection listener forwarding notifications to EmbeddedTestServerAndroid.
class ConnectionListener : public EmbeddedTestServerConnectionListener {
public:
- ConnectionListener(EmbeddedTestServerAndroid* test_server_android);
+ explicit ConnectionListener(EmbeddedTestServerAndroid* test_server_android);
~ConnectionListener() override;
std::unique_ptr<StreamSocket> AcceptedSocket(
@@ -101,7 +100,6 @@ class EmbeddedTestServerAndroid {
ConnectionListener connection_listener_;
};
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
#endif // NET_TEST_EMBEDDED_TEST_SERVER_ANDROID_EMBEDDED_TEST_SERVER_ANDROID_H_
diff --git a/chromium/net/test/embedded_test_server/connection_tracker.cc b/chromium/net/test/embedded_test_server/connection_tracker.cc
index 9f87ef1fa41..09f1a059baa 100644
--- a/chromium/net/test/embedded_test_server/connection_tracker.cc
+++ b/chromium/net/test/embedded_test_server/connection_tracker.cc
@@ -30,8 +30,7 @@ bool GetPort(const net::StreamSocket& connection, uint16_t* port) {
} // namespace
-namespace net {
-namespace test_server {
+namespace net::test_server {
ConnectionTracker::ConnectionTracker(EmbeddedTestServer* test_server)
: connection_listener_(this) {
@@ -152,5 +151,4 @@ void ConnectionTracker::ConnectionListener::ReadFromSocket(
}
}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/connection_tracker.h b/chromium/net/test/embedded_test_server/connection_tracker.h
index fb42f2f4d64..7131d21cc7b 100644
--- a/chromium/net/test/embedded_test_server/connection_tracker.h
+++ b/chromium/net/test/embedded_test_server/connection_tracker.h
@@ -17,8 +17,7 @@
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/embedded_test_server_connection_listener.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
// Keeps track of incoming connections being accepted or read from and exposes
// that info to the tests.
@@ -110,7 +109,6 @@ class ConnectionTracker {
raw_ptr<base::RunLoop> num_accepted_connections_loop_ = nullptr;
};
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
#endif // NET_TEST_EMBEDDED_TEST_SERVER_SIMPLE_CONNECTION_TRACKER_H_
diff --git a/chromium/net/test/embedded_test_server/controllable_http_response.cc b/chromium/net/test/embedded_test_server/controllable_http_response.cc
index 3b918891c33..06eec7020c0 100644
--- a/chromium/net/test/embedded_test_server/controllable_http_response.cc
+++ b/chromium/net/test/embedded_test_server/controllable_http_response.cc
@@ -11,9 +11,7 @@
#include "base/trace_event/typed_macros.h"
#include "net/test/embedded_test_server/http_response.h"
-namespace net {
-
-namespace test_server {
+namespace net::test_server {
class ControllableHttpResponse::Interceptor : public HttpResponse {
public:
@@ -28,7 +26,7 @@ class ControllableHttpResponse::Interceptor : public HttpResponse {
Interceptor(const Interceptor&) = delete;
Interceptor& operator=(const Interceptor&) = delete;
- ~Interceptor() override {}
+ ~Interceptor() override = default;
private:
void SendResponse(base::WeakPtr<HttpResponseDelegate> delegate) override {
@@ -56,7 +54,7 @@ ControllableHttpResponse::ControllableHttpResponse(
relative_url, relative_url_is_prefix));
}
-ControllableHttpResponse::~ControllableHttpResponse() {}
+ControllableHttpResponse::~ControllableHttpResponse() = default;
void ControllableHttpResponse::WaitForRequest() {
TRACE_EVENT("test", "ControllableHttpResponse::WaitForRequest");
@@ -155,6 +153,4 @@ std::unique_ptr<HttpResponse> ControllableHttpResponse::RequestHandler(
return nullptr;
}
-} // namespace test_server
-
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/controllable_http_response.h b/chromium/net/test/embedded_test_server/controllable_http_response.h
index 77894e34250..f9db7c89847 100644
--- a/chromium/net/test/embedded_test_server/controllable_http_response.h
+++ b/chromium/net/test/embedded_test_server/controllable_http_response.h
@@ -19,9 +19,7 @@
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
-namespace net {
-
-namespace test_server {
+namespace net::test_server {
// A response that can be manually controlled on the current test thread. It is
// used for waiting for a connection, sending data and closing it. It will
@@ -96,8 +94,6 @@ class ControllableHttpResponse {
base::WeakPtrFactory<ControllableHttpResponse> weak_ptr_factory_{this};
};
-} // namespace test_server
-
-} // namespace net
+} // namespace net::test_server
#endif // NET_TEST_EMBEDDED_TEST_SERVER_CONTROLLABLE_HTTP_RESPONSE_H_
diff --git a/chromium/net/test/embedded_test_server/default_handlers.cc b/chromium/net/test/embedded_test_server/default_handlers.cc
index f7d30c9d6c9..76150efe828 100644
--- a/chromium/net/test/embedded_test_server/default_handlers.cc
+++ b/chromium/net/test/embedded_test_server/default_handlers.cc
@@ -38,8 +38,7 @@
#include "net/test/embedded_test_server/http_response.h"
#include "net/test/embedded_test_server/request_handler_util.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
namespace {
const char kDefaultRealm[] = "testrealm";
@@ -734,7 +733,7 @@ std::unique_ptr<HttpResponse> HandleHungAfterHeadersResponse(
// A HttpResponse that is almost never ending (with an Exabyte content-length).
class ExabyteResponse : public BasicHttpResponse {
public:
- ExabyteResponse() {}
+ ExabyteResponse() = default;
ExabyteResponse(const ExabyteResponse&) = delete;
ExabyteResponse& operator=(const ExabyteResponse&) = delete;
@@ -794,6 +793,7 @@ std::unique_ptr<HttpResponse> HandleGzipBody(const HttpRequest& request) {
http_response->set_content(
std::string(compressed_body.data(), compressed_size));
http_response->AddCustomHeader("Content-Encoding", "gzip");
+ http_response->AddCustomHeader("Cache-Control", "max-age=60");
return http_response;
}
@@ -1031,5 +1031,4 @@ void RegisterDefaultHandlers(EmbeddedTestServer* server) {
#undef PREFIXED_HANDLER
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/default_handlers.h b/chromium/net/test/embedded_test_server/default_handlers.h
index 90e6f1e8a5d..76b7d3e82b3 100644
--- a/chromium/net/test/embedded_test_server/default_handlers.h
+++ b/chromium/net/test/embedded_test_server/default_handlers.h
@@ -7,8 +7,7 @@
#include "net/test/embedded_test_server/embedded_test_server.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
// This file is only meant for compatibility with testserver.py. No
// additional handlers should be added here that don't affect multiple
@@ -17,7 +16,6 @@ namespace test_server {
// Registers default handlers for use in tests.
void RegisterDefaultHandlers(EmbeddedTestServer* server);
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
#endif // NET_TEST_EMBEDDED_TEST_SERVER_DEFAULT_HANDLERS_H_
diff --git a/chromium/net/test/embedded_test_server/embedded_test_server.cc b/chromium/net/test/embedded_test_server/embedded_test_server.cc
index 9a278a84072..ed5b06c6f56 100644
--- a/chromium/net/test/embedded_test_server/embedded_test_server.cc
+++ b/chromium/net/test/embedded_test_server/embedded_test_server.cc
@@ -34,8 +34,7 @@
#include "net/base/ip_endpoint.h"
#include "net/base/net_errors.h"
#include "net/base/port_util.h"
-#include "net/cert/internal/extended_key_usage.h"
-#include "net/cert/test_root_certs.h"
+#include "net/cert/pki/extended_key_usage.h"
#include "net/log/net_log_source.h"
#include "net/socket/next_proto.h"
#include "net/socket/ssl_server_socket.h"
@@ -284,7 +283,7 @@ EmbeddedTestServer::EmbeddedTestServer(Type type,
if (!is_using_ssl_)
return;
- RegisterTestCerts();
+ scoped_test_root_ = RegisterTestCerts();
}
EmbeddedTestServer::~EmbeddedTestServer() {
@@ -299,12 +298,12 @@ EmbeddedTestServer::~EmbeddedTestServer() {
}
}
-void EmbeddedTestServer::RegisterTestCerts() {
+ScopedTestRoot EmbeddedTestServer::RegisterTestCerts() {
base::ScopedAllowBlockingForTesting allow_blocking;
- TestRootCerts* root_certs = TestRootCerts::GetInstance();
- bool added_root_certs = root_certs->AddFromFile(GetRootCertPemPath());
- DCHECK(added_root_certs)
- << "Failed to install root cert from EmbeddedTestServer";
+ auto root = ImportCertFromFile(GetRootCertPemPath());
+ if (!root)
+ return ScopedTestRoot();
+ return ScopedTestRoot(root.get());
}
void EmbeddedTestServer::SetConnectionListener(
@@ -428,6 +427,16 @@ bool EmbeddedTestServer::GenerateCertAndKey() {
leaf = CertBuilder::FromFile(certs_dir.AppendASCII("ok_cert.pem"),
intermediate.get());
+ // Workaround for weird CertVerifyProcWin issue where if too many
+ // intermediates with the same key are fetched by AIA any further
+ // verifications using that key will fail. See
+ // https://crbug.com/1328060. Since generating ECDSA keys is cheap, just do
+ // this on all configurations rather than restricting to Windows, though
+ // this hack can be removed once we delete CertVerifyProcWin.
+ if (cert_config_.intermediate == IntermediateType::kByAIA) {
+ intermediate->GenerateECKey();
+ leaf->SetSignatureAlgorithm(SignatureAlgorithm::kEcdsaSha256);
+ }
} else {
leaf = CertBuilder::FromFile(certs_dir.AppendASCII("ok_cert.pem"),
static_root.get());
diff --git a/chromium/net/test/embedded_test_server/embedded_test_server.h b/chromium/net/test/embedded_test_server/embedded_test_server.h
index 711d0e94a08..218eb6859f1 100644
--- a/chromium/net/test/embedded_test_server/embedded_test_server.h
+++ b/chromium/net/test/embedded_test_server/embedded_test_server.h
@@ -24,6 +24,7 @@
#include "net/base/host_port_pair.h"
#include "net/base/ip_endpoint.h"
#include "net/cert/ocsp_revocation_status.h"
+#include "net/cert/test_root_certs.h"
#include "net/cert/x509_certificate.h"
#include "net/socket/ssl_server_socket.h"
#include "net/socket/stream_socket.h"
@@ -347,7 +348,7 @@ class EmbeddedTestServer {
// Registers the EmbeddedTestServer's certs for the current process. See
// constructor documentation for more information.
- static void RegisterTestCerts();
+ [[nodiscard]] static ScopedTestRoot RegisterTestCerts();
// Sets a connection listener, that would be notified when various connection
// events happen. May only be called before the server is started. Caller
@@ -571,7 +572,8 @@ class EmbeddedTestServer {
std::unique_ptr<TCPServerSocket> listen_socket_;
std::unique_ptr<StreamSocket> accepted_socket_;
- raw_ptr<EmbeddedTestServerConnectionListener> connection_listener_ = nullptr;
+ raw_ptr<EmbeddedTestServerConnectionListener, DanglingUntriaged>
+ connection_listener_ = nullptr;
uint16_t port_ = 0;
GURL base_url_;
IPEndPoint local_endpoint_;
@@ -585,6 +587,7 @@ class EmbeddedTestServer {
base::ThreadChecker thread_checker_;
+ ScopedTestRoot scoped_test_root_;
net::SSLServerConfig ssl_config_;
ServerCertificate cert_ = CERT_OK;
ServerCertificateConfig cert_config_;
diff --git a/chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.cc b/chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.cc
index 54322be9fc6..d6d13e25478 100644
--- a/chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.cc
+++ b/chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.cc
@@ -6,11 +6,9 @@
#include "net/socket/stream_socket.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
void EmbeddedTestServerConnectionListener::OnResponseCompletedSuccessfully(
std::unique_ptr<StreamSocket> socket) {}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.h b/chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.h
index 2d06813328c..541ae50882f 100644
--- a/chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.h
+++ b/chromium/net/test/embedded_test_server/embedded_test_server_connection_listener.h
@@ -37,9 +37,9 @@ class EmbeddedTestServerConnectionListener {
std::unique_ptr<StreamSocket> socket);
protected:
- EmbeddedTestServerConnectionListener() {}
+ EmbeddedTestServerConnectionListener() = default;
- virtual ~EmbeddedTestServerConnectionListener() {}
+ virtual ~EmbeddedTestServerConnectionListener() = default;
};
} // namespace test_server
diff --git a/chromium/net/test/embedded_test_server/embedded_test_server_unittest.cc b/chromium/net/test/embedded_test_server/embedded_test_server_unittest.cc
index bd61f6aadbc..ea10a5df987 100644
--- a/chromium/net/test/embedded_test_server/embedded_test_server_unittest.cc
+++ b/chromium/net/test/embedded_test_server/embedded_test_server_unittest.cc
@@ -41,8 +41,7 @@
using net::test::IsOk;
-namespace net {
-namespace test_server {
+namespace net::test_server {
// Gets notified by the EmbeddedTestServer on incoming connections being
// accepted, read from, or closed.
@@ -718,5 +717,4 @@ INSTANTIATE_TEST_SUITE_P(
testing::Bool(),
testing::ValuesIn(EmbeddedTestServerConfigs())));
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/http1_connection.cc b/chromium/net/test/embedded_test_server/http1_connection.cc
index 40304625770..a75d8764664 100644
--- a/chromium/net/test/embedded_test_server/http1_connection.cc
+++ b/chromium/net/test/embedded_test_server/http1_connection.cc
@@ -18,8 +18,7 @@
#include "net/test/embedded_test_server/http_response.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
Http1Connection::Http1Connection(
std::unique_ptr<StreamSocket> socket,
@@ -186,5 +185,4 @@ void Http1Connection::OnSendInternalDone(base::OnceClosure callback,
SendInternal(std::move(callback), buf);
}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/http2_connection.cc b/chromium/net/test/embedded_test_server/http2_connection.cc
index 6622b962b39..6c26af3271e 100644
--- a/chromium/net/test/embedded_test_server/http2_connection.cc
+++ b/chromium/net/test/embedded_test_server/http2_connection.cc
@@ -6,7 +6,6 @@
#include <memory>
-#include "absl/strings/escaping.h"
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/debug/stack_trace.h"
@@ -20,6 +19,7 @@
#include "net/ssl/ssl_info.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "third_party/abseil-cpp/absl/strings/escaping.h"
namespace net {
@@ -373,7 +373,7 @@ Http2Connection::OnHeaderForStream(http2::adapter::Http2StreamId stream_id,
bool Http2Connection::OnEndHeadersForStream(
http2::adapter::Http2StreamId stream_id) {
HttpRequest::HeaderMap header_map = header_map_[stream_id];
- std::unique_ptr<HttpRequest> request(new HttpRequest());
+ auto request = std::make_unique<HttpRequest>();
request->relative_url = header_map[":path"];
request->base_url = GURL(header_map[":authority"]);
request->method_string = header_map[":method"];
diff --git a/chromium/net/test/embedded_test_server/http2_connection.h b/chromium/net/test/embedded_test_server/http2_connection.h
index fed5cb9db1d..a24ead03d31 100644
--- a/chromium/net/test/embedded_test_server/http2_connection.h
+++ b/chromium/net/test/embedded_test_server/http2_connection.h
@@ -21,8 +21,7 @@
#include "net/third_party/quiche/src/quiche/http2/adapter/http2_visitor_interface.h"
#include "net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
using StreamId = http2::adapter::Http2StreamId;
template <class T>
@@ -141,7 +140,6 @@ class Http2Connection : public HttpConnection,
base::WeakPtrFactory<Http2Connection> weak_factory_{this};
};
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
#endif // NET_TEST_EMBEDDED_TEST_SERVER_HTTP2_CONNECTION_H_
diff --git a/chromium/net/test/embedded_test_server/http_connection.cc b/chromium/net/test/embedded_test_server/http_connection.cc
index e31b5454224..851f5cf8fe8 100644
--- a/chromium/net/test/embedded_test_server/http_connection.cc
+++ b/chromium/net/test/embedded_test_server/http_connection.cc
@@ -8,8 +8,7 @@
#include "net/test/embedded_test_server/http1_connection.h"
#include "net/test/embedded_test_server/http2_connection.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
std::unique_ptr<HttpConnection> HttpConnection::Create(
std::unique_ptr<StreamSocket> socket,
@@ -26,5 +25,4 @@ std::unique_ptr<HttpConnection> HttpConnection::Create(
}
}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/http_request.cc b/chromium/net/test/embedded_test_server/http_request.cc
index 691a4b497f2..1d51e873999 100644
--- a/chromium/net/test/embedded_test_server/http_request.cc
+++ b/chromium/net/test/embedded_test_server/http_request.cc
@@ -14,8 +14,7 @@
#include "net/http/http_chunked_decoder.h"
#include "url/gurl.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
namespace {
@@ -247,5 +246,4 @@ HttpMethod HttpRequestParser::GetMethodType(const std::string& token) {
return METHOD_GET;
}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/http_request_unittest.cc b/chromium/net/test/embedded_test_server/http_request_unittest.cc
index d0e534f4e0a..73ba6d0c845 100644
--- a/chromium/net/test/embedded_test_server/http_request_unittest.cc
+++ b/chromium/net/test/embedded_test_server/http_request_unittest.cc
@@ -8,8 +8,7 @@
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
TEST(HttpRequestTest, ParseRequest) {
HttpRequestParser parser;
@@ -159,5 +158,4 @@ TEST(HttpRequestTest, GetURLFallback) {
EXPECT_EQ("http://localhost/foobar.html?q=foo", request.GetURL().spec());
}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/http_response.cc b/chromium/net/test/embedded_test_server/http_response.cc
index cc3840836ed..d88555d562b 100644
--- a/chromium/net/test/embedded_test_server/http_response.cc
+++ b/chromium/net/test/embedded_test_server/http_response.cc
@@ -24,8 +24,7 @@
#include "net/http/http_status_code.h"
#include "net/test/embedded_test_server/http_request.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
HttpResponseDelegate::HttpResponseDelegate() = default;
HttpResponseDelegate::~HttpResponseDelegate() = default;
@@ -125,5 +124,4 @@ void HungAfterHeadersHttpResponse::SendResponse(
delegate->SendResponseHeaders(HTTP_OK, "OK", headers_);
}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/http_response.h b/chromium/net/test/embedded_test_server/http_response.h
index de2ffe07170..1d3f762198a 100644
--- a/chromium/net/test/embedded_test_server/http_response.h
+++ b/chromium/net/test/embedded_test_server/http_response.h
@@ -7,7 +7,6 @@
#include <string>
-#include "absl/types/optional.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/callback_helpers.h"
@@ -18,9 +17,9 @@
#include "base/strings/string_split.h"
#include "base/time/time.h"
#include "net/http/http_status_code.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
class HttpResponse;
@@ -136,7 +135,7 @@ class BasicHttpResponse : public HttpResponse {
class DelayedHttpResponse : public BasicHttpResponse {
public:
- DelayedHttpResponse(const base::TimeDelta delay);
+ explicit DelayedHttpResponse(const base::TimeDelta delay);
DelayedHttpResponse(const DelayedHttpResponse&) = delete;
DelayedHttpResponse& operator=(const DelayedHttpResponse&) = delete;
@@ -173,12 +172,12 @@ class RawHttpResponse : public HttpResponse {
// destroyed.
class HungResponse : public HttpResponse {
public:
- HungResponse() {}
+ HungResponse() = default;
HungResponse(const HungResponse&) = delete;
HungResponse& operator=(const HungResponse&) = delete;
- ~HungResponse() override {}
+ ~HungResponse() override = default;
void SendResponse(base::WeakPtr<HttpResponseDelegate> delegate) override;
};
@@ -195,7 +194,6 @@ class HungAfterHeadersHttpResponse : public HttpResponse {
base::StringPairs headers_;
};
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
#endif // NET_TEST_EMBEDDED_TEST_SERVER_HTTP_RESPONSE_H_
diff --git a/chromium/net/test/embedded_test_server/http_response_unittest.cc b/chromium/net/test/embedded_test_server/http_response_unittest.cc
index 83b767f5fa8..e79a7494d03 100644
--- a/chromium/net/test/embedded_test_server/http_response_unittest.cc
+++ b/chromium/net/test/embedded_test_server/http_response_unittest.cc
@@ -6,8 +6,7 @@
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
TEST(HttpResponseTest, GenerateResponse) {
BasicHttpResponse response;
@@ -27,5 +26,4 @@ TEST(HttpResponseTest, GenerateResponse) {
EXPECT_EQ(kExpectedResponseString, response.ToResponseString());
}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/request_handler_util.cc b/chromium/net/test/embedded_test_server/request_handler_util.cc
index bac217f7737..f5a8e2e799d 100644
--- a/chromium/net/test/embedded_test_server/request_handler_util.cc
+++ b/chromium/net/test/embedded_test_server/request_handler_util.cc
@@ -26,8 +26,7 @@
#include "net/test/embedded_test_server/http_request.h"
#include "url/gurl.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
constexpr base::FilePath::CharType kMockHttpHeadersExtension[] =
FILE_PATH_LITERAL("mock-http-headers");
@@ -254,5 +253,4 @@ std::unique_ptr<HttpResponse> HandleFileRequest(
return http_response;
}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/embedded_test_server/request_handler_util.h b/chromium/net/test/embedded_test_server/request_handler_util.h
index a8843edb02f..7ce988059c1 100644
--- a/chromium/net/test/embedded_test_server/request_handler_util.h
+++ b/chromium/net/test/embedded_test_server/request_handler_util.h
@@ -19,8 +19,7 @@ namespace url {
class GURL;
}
-namespace net {
-namespace test_server {
+namespace net::test_server {
struct HttpRequest;
// The extension that is used to find a file containing mock headers to use
@@ -66,7 +65,6 @@ std::unique_ptr<HttpResponse> HandleFileRequest(
const base::FilePath& server_root,
const HttpRequest& request);
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
#endif // NET_TEST_EMBEDDED_TEST_SERVER_REQUEST_HANDLER_UTIL_H_
diff --git a/chromium/net/test/embedded_test_server/simple_connection_listener.cc b/chromium/net/test/embedded_test_server/simple_connection_listener.cc
index 13f1c68f998..8191439e1db 100644
--- a/chromium/net/test/embedded_test_server/simple_connection_listener.cc
+++ b/chromium/net/test/embedded_test_server/simple_connection_listener.cc
@@ -8,8 +8,7 @@
#include "net/socket/stream_socket.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test_server {
+namespace net::test_server {
SimpleConnectionListener::SimpleConnectionListener(
int expected_connections,
@@ -39,5 +38,4 @@ void SimpleConnectionListener::WaitForConnections() {
void SimpleConnectionListener::OnResponseCompletedSuccessfully(
std::unique_ptr<StreamSocket> socket) {}
-} // namespace test_server
-} // namespace net
+} // namespace net::test_server
diff --git a/chromium/net/test/gtest_util.h b/chromium/net/test/gtest_util.h
index 89cb987a9a0..7f474bfa48b 100644
--- a/chromium/net/test/gtest_util.h
+++ b/chromium/net/test/gtest_util.h
@@ -17,8 +17,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
// A GMock matcher that checks whether the argument is the expected net::Error.
// On failure, the expected and actual net::Error names will be printed.
@@ -167,7 +166,6 @@ class StringPieceHasSubstrMatcher {
#endif // DCHECK_IS_ON()
-} // namespace test
-} // namespace net
+} // namespace net::test
#endif // NET_TEST_GTEST_UTIL_H_
diff --git a/chromium/net/test/key_util.cc b/chromium/net/test/key_util.cc
index be701a9d8ab..49dbc696e80 100644
--- a/chromium/net/test/key_util.cc
+++ b/chromium/net/test/key_util.cc
@@ -15,9 +15,7 @@
#include "third_party/boringssl/src/include/openssl/evp.h"
#include "third_party/boringssl/src/include/openssl/pem.h"
-namespace net {
-
-namespace key_util {
+namespace net::key_util {
bssl::UniquePtr<EVP_PKEY> LoadEVP_PKEYFromPEM(const base::FilePath& filepath) {
std::string data;
@@ -48,6 +46,4 @@ scoped_refptr<SSLPrivateKey> LoadPrivateKeyOpenSSL(
return WrapOpenSSLPrivateKey(std::move(key));
}
-} // namespace key_util
-
-} // namespace net
+} // namespace net::key_util
diff --git a/chromium/net/test/keychain_test_util_mac.cc b/chromium/net/test/keychain_test_util_mac.cc
index 4a297004e1b..c43d6461b37 100644
--- a/chromium/net/test/keychain_test_util_mac.cc
+++ b/chromium/net/test/keychain_test_util_mac.cc
@@ -38,6 +38,12 @@ base::ScopedCFTypeRef<SecIdentityRef> GetSecIdentityRefForCertificate(
ScopedTestKeychain::ScopedTestKeychain() = default;
ScopedTestKeychain::~ScopedTestKeychain() = default;
+// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
+// Removal of its use is tracked in https://crbug.com/1348251 but deprecation
+// warnings are disabled in the meanwhile.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
bool ScopedTestKeychain::Initialize() {
if (!keychain_dir_.CreateUniqueTempDir())
return false;
@@ -47,6 +53,8 @@ bool ScopedTestKeychain::Initialize() {
keychain_.InitializeInto()) == noErr;
}
+#pragma clang diagnostic pop
+
base::ScopedCFTypeRef<SecIdentityRef> ImportCertAndKeyToKeychain(
const X509Certificate* cert,
const std::string pkcs8,
diff --git a/chromium/net/test/net_test_suite.cc b/chromium/net/test/net_test_suite.cc
index e702a2662cf..b27889acb84 100644
--- a/chromium/net/test/net_test_suite.cc
+++ b/chromium/net/test/net_test_suite.cc
@@ -67,7 +67,8 @@ void NetTestSuite::InitializeTestThread() {
}
void NetTestSuite::InitializeTestThreadNoNetworkChangeNotifier() {
- host_resolver_proc_ = new net::RuleBasedHostResolverProc(nullptr);
+ host_resolver_proc_ =
+ base::MakeRefCounted<net::RuleBasedHostResolverProc>(nullptr);
scoped_host_resolver_proc_.Init(host_resolver_proc_.get());
// In case any attempts are made to resolve host names, force them all to
// be mapped to localhost. This prevents DNS queries from being sent in
diff --git a/chromium/net/test/quic_simple_test_server.cc b/chromium/net/test/quic_simple_test_server.cc
index 9cf1c13aa14..e18c59e22f8 100644
--- a/chromium/net/test/quic_simple_test_server.cc
+++ b/chromium/net/test/quic_simple_test_server.cc
@@ -167,7 +167,7 @@ void StartQuicServerOnServerThread(const base::FilePath& test_files_root,
// Set up server certs.
base::FilePath directory;
directory = test_files_root;
- std::unique_ptr<ProofSourceChromium> proof_source(new ProofSourceChromium());
+ auto proof_source = std::make_unique<ProofSourceChromium>();
CHECK(proof_source->Initialize(directory.AppendASCII("quic-chain.pem"),
directory.AppendASCII("quic-leaf-cert.key"),
base::FilePath()));
diff --git a/chromium/net/test/quic_simple_test_server.h b/chromium/net/test/quic_simple_test_server.h
index 9259c0f2adf..5e78d8b2f27 100644
--- a/chromium/net/test/quic_simple_test_server.h
+++ b/chromium/net/test/quic_simple_test_server.h
@@ -9,7 +9,7 @@
#include <vector>
#include "net/base/host_port_pair.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "url/gurl.h"
namespace net {
diff --git a/chromium/net/test/revocation_builder.cc b/chromium/net/test/revocation_builder.cc
index 090ea564be9..01f9d3adeba 100644
--- a/chromium/net/test/revocation_builder.cc
+++ b/chromium/net/test/revocation_builder.cc
@@ -11,6 +11,7 @@
#include "net/cert/x509_util.h"
#include "net/der/encode_values.h"
#include "net/der/input.h"
+#include "net/test/cert_builder.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/boringssl/src/include/openssl/bytestring.h"
#include "third_party/boringssl/src/include/openssl/mem.h"
@@ -19,30 +20,6 @@ namespace net {
namespace {
-std::string Sha256WithRSAEncryption() {
- const uint8_t kSha256WithRSAEncryption[] = {0x30, 0x0D, 0x06, 0x09, 0x2a,
- 0x86, 0x48, 0x86, 0xf7, 0x0d,
- 0x01, 0x01, 0x0b, 0x05, 0x00};
- return std::string(std::begin(kSha256WithRSAEncryption),
- std::end(kSha256WithRSAEncryption));
-}
-
-std::string Sha1WithRSAEncryption() {
- const uint8_t kSha1WithRSAEncryption[] = {0x30, 0x0D, 0x06, 0x09, 0x2a,
- 0x86, 0x48, 0x86, 0xf7, 0x0d,
- 0x01, 0x01, 0x05, 0x05, 0x00};
- return std::string(std::begin(kSha1WithRSAEncryption),
- std::end(kSha1WithRSAEncryption));
-}
-
-std::string Md5WithRSAEncryption() {
- const uint8_t kMd5WithRSAEncryption[] = {0x30, 0x0d, 0x06, 0x09, 0x2a,
- 0x86, 0x48, 0x86, 0xf7, 0x0d,
- 0x01, 0x01, 0x04, 0x05, 0x00};
- return std::string(std::begin(kMd5WithRSAEncryption),
- std::end(kMd5WithRSAEncryption));
-}
-
std::string Sha1() {
// SEQUENCE { OBJECT_IDENTIFIER { 1.3.14.3.2.26 } }
const uint8_t kSHA1[] = {0x30, 0x07, 0x06, 0x05, 0x2b,
@@ -343,7 +320,8 @@ std::string BuildOCSPResponse(
std::string BuildOCSPResponseWithResponseData(
EVP_PKEY* responder_key,
- const std::string& tbs_response_data) {
+ const std::string& tbs_response_data,
+ absl::optional<SignatureAlgorithm> signature_algorithm) {
// For a basic OCSP responder, responseType will be id-pkix-ocsp-basic.
//
// id-pkix-ocsp OBJECT IDENTIFIER ::= { id-ad-ocsp }
@@ -366,28 +344,29 @@ std::string BuildOCSPResponseWithResponseData(
//
bssl::ScopedCBB basic_ocsp_response_cbb;
CBB basic_ocsp_response, signature;
- bssl::ScopedEVP_MD_CTX ctx;
- uint8_t* sig_out;
- size_t sig_len;
- if (!CBB_init(basic_ocsp_response_cbb.get(), 64 + tbs_response_data.size()) ||
+ if (!responder_key) {
+ ADD_FAILURE();
+ return std::string();
+ }
+ if (!signature_algorithm)
+ signature_algorithm =
+ CertBuilder::DefaultSignatureAlgorithmForKey(responder_key);
+ if (!signature_algorithm) {
+ ADD_FAILURE();
+ return std::string();
+ }
+ std::string signature_algorithm_tlv =
+ CertBuilder::SignatureAlgorithmToDer(*signature_algorithm);
+ if (signature_algorithm_tlv.empty() ||
+ !CBB_init(basic_ocsp_response_cbb.get(), 64 + tbs_response_data.size()) ||
!CBB_add_asn1(basic_ocsp_response_cbb.get(), &basic_ocsp_response,
CBS_ASN1_SEQUENCE) ||
!CBBAddBytes(&basic_ocsp_response, tbs_response_data) ||
- !CBBAddBytes(&basic_ocsp_response, Sha256WithRSAEncryption()) ||
+ !CBBAddBytes(&basic_ocsp_response, signature_algorithm_tlv) ||
!CBB_add_asn1(&basic_ocsp_response, &signature, CBS_ASN1_BITSTRING) ||
!CBB_add_u8(&signature, 0 /* no unused bits */) ||
- !EVP_DigestSignInit(ctx.get(), nullptr, EVP_sha256(), nullptr,
- responder_key) ||
- !EVP_DigestSign(
- ctx.get(), nullptr, &sig_len,
- reinterpret_cast<const uint8_t*>(tbs_response_data.data()),
- tbs_response_data.size()) ||
- !CBB_reserve(&signature, &sig_out, sig_len) ||
- !EVP_DigestSign(
- ctx.get(), sig_out, &sig_len,
- reinterpret_cast<const uint8_t*>(tbs_response_data.data()),
- tbs_response_data.size()) ||
- !CBB_did_write(&signature, sig_len)) {
+ !CertBuilder::SignData(*signature_algorithm, tbs_response_data,
+ responder_key, &signature)) {
ADD_FAILURE();
return std::string();
}
@@ -402,31 +381,23 @@ std::string BuildOCSPResponseWithResponseData(
std::string BuildCrl(const std::string& crl_issuer_subject,
EVP_PKEY* crl_issuer_key,
const std::vector<uint64_t>& revoked_serials,
- DigestAlgorithm digest) {
- std::string signature_algorithm;
- const EVP_MD* md = nullptr;
- switch (digest) {
- case DigestAlgorithm::Sha256: {
- signature_algorithm = Sha256WithRSAEncryption();
- md = EVP_sha256();
- break;
- }
-
- case DigestAlgorithm::Sha1: {
- signature_algorithm = Sha1WithRSAEncryption();
- md = EVP_sha1();
- break;
- }
-
- case DigestAlgorithm::Md5: {
- signature_algorithm = Md5WithRSAEncryption();
- md = EVP_md5();
- break;
- }
-
- default:
- ADD_FAILURE();
- return std::string();
+ absl::optional<SignatureAlgorithm> signature_algorithm) {
+ if (!crl_issuer_key) {
+ ADD_FAILURE();
+ return std::string();
+ }
+ if (!signature_algorithm)
+ signature_algorithm =
+ CertBuilder::DefaultSignatureAlgorithmForKey(crl_issuer_key);
+ if (!signature_algorithm) {
+ ADD_FAILURE();
+ return std::string();
+ }
+ std::string signature_algorithm_tlv =
+ CertBuilder::SignatureAlgorithmToDer(*signature_algorithm);
+ if (signature_algorithm_tlv.empty()) {
+ ADD_FAILURE();
+ return std::string();
}
// TBSCertList ::= SEQUENCE {
// version Version OPTIONAL,
@@ -449,7 +420,7 @@ std::string BuildCrl(const std::string& crl_issuer_subject,
if (!CBB_init(tbs_cbb.get(), 10) ||
!CBB_add_asn1(tbs_cbb.get(), &tbs_cert_list, CBS_ASN1_SEQUENCE) ||
!CBB_add_asn1_uint64(&tbs_cert_list, 1 /* V2 */) ||
- !CBBAddBytes(&tbs_cert_list, signature_algorithm) ||
+ !CBBAddBytes(&tbs_cert_list, signature_algorithm_tlv) ||
!CBBAddBytes(&tbs_cert_list, crl_issuer_subject) ||
!x509_util::CBBAddTime(&tbs_cert_list,
base::Time::Now() - base::Days(1)) ||
@@ -486,24 +457,14 @@ std::string BuildCrl(const std::string& crl_issuer_subject,
// signatureValue BIT STRING }
bssl::ScopedCBB crl_cbb;
CBB cert_list, signature;
- bssl::ScopedEVP_MD_CTX ctx;
- uint8_t* sig_out;
- size_t sig_len;
if (!CBB_init(crl_cbb.get(), 10) ||
!CBB_add_asn1(crl_cbb.get(), &cert_list, CBS_ASN1_SEQUENCE) ||
!CBBAddBytes(&cert_list, tbs_tlv) ||
- !CBBAddBytes(&cert_list, signature_algorithm) ||
+ !CBBAddBytes(&cert_list, signature_algorithm_tlv) ||
!CBB_add_asn1(&cert_list, &signature, CBS_ASN1_BITSTRING) ||
!CBB_add_u8(&signature, 0 /* no unused bits */) ||
- !EVP_DigestSignInit(ctx.get(), nullptr, md, nullptr, crl_issuer_key) ||
- !EVP_DigestSign(ctx.get(), nullptr, &sig_len,
- reinterpret_cast<const uint8_t*>(tbs_tlv.data()),
- tbs_tlv.size()) ||
- !CBB_reserve(&signature, &sig_out, sig_len) ||
- !EVP_DigestSign(ctx.get(), sig_out, &sig_len,
- reinterpret_cast<const uint8_t*>(tbs_tlv.data()),
- tbs_tlv.size()) ||
- !CBB_did_write(&signature, sig_len)) {
+ !CertBuilder::SignData(*signature_algorithm, tbs_tlv, crl_issuer_key,
+ &signature)) {
ADD_FAILURE();
return std::string();
}
diff --git a/chromium/net/test/revocation_builder.h b/chromium/net/test/revocation_builder.h
index 6f0b7c8d0ed..e98d47572b7 100644
--- a/chromium/net/test/revocation_builder.h
+++ b/chromium/net/test/revocation_builder.h
@@ -9,8 +9,10 @@
#include <vector>
#include "base/time/time.h"
-#include "net/cert/internal/ocsp.h"
#include "net/cert/ocsp_revocation_status.h"
+#include "net/cert/pki/ocsp.h"
+#include "net/cert/pki/signature_algorithm.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/boringssl/src/include/openssl/evp.h"
namespace net {
@@ -45,18 +47,23 @@ std::string BuildOCSPResponse(
base::Time produced_at,
const std::vector<OCSPBuilderSingleResponse>& responses);
-// Creates an OCSPResponse signed by |responder_key| with |tbs_response_data| as
-// the to-be-signed ResponseData.
-std::string BuildOCSPResponseWithResponseData(EVP_PKEY* responder_key,
- const std::string& response_data);
+// Creates an OCSPResponse signed by |responder_key| with |tbs_response_data|
+// as the to-be-signed ResponseData. If |signature_algorithm| is nullopt, a
+// default algorithm will be chosen based on the key type.
+std::string BuildOCSPResponseWithResponseData(
+ EVP_PKEY* responder_key,
+ const std::string& response_data,
+ absl::optional<SignatureAlgorithm> signature_algorithm = absl::nullopt);
// Creates a CRL issued by |crl_issuer_subject| and signed by |crl_issuer_key|,
-// marking |revoked_serials| as revoked.
+// marking |revoked_serials| as revoked. If |signature_algorithm| is nullopt, a
+// default algorithm will be chosen based on the key type.
// Returns the DER-encoded CRL.
-std::string BuildCrl(const std::string& crl_issuer_subject,
- EVP_PKEY* crl_issuer_key,
- const std::vector<uint64_t>& revoked_serials,
- DigestAlgorithm digest);
+std::string BuildCrl(
+ const std::string& crl_issuer_subject,
+ EVP_PKEY* crl_issuer_key,
+ const std::vector<uint64_t>& revoked_serials,
+ absl::optional<SignatureAlgorithm> signature_algorithm = absl::nullopt);
} // namespace net
diff --git a/chromium/net/test/scoped_disable_exit_on_dfatal.cc b/chromium/net/test/scoped_disable_exit_on_dfatal.cc
index 7c1c5488669..6e81cab2187 100644
--- a/chromium/net/test/scoped_disable_exit_on_dfatal.cc
+++ b/chromium/net/test/scoped_disable_exit_on_dfatal.cc
@@ -8,8 +8,7 @@
#include "base/callback.h"
#include "base/strings/string_piece.h"
-namespace net {
-namespace test {
+namespace net::test {
ScopedDisableExitOnDFatal::ScopedDisableExitOnDFatal()
: assert_handler_(base::BindRepeating(LogAssertHandler)) {}
@@ -25,5 +24,4 @@ void ScopedDisableExitOnDFatal::LogAssertHandler(
// Simply swallow the assert.
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/test/scoped_disable_exit_on_dfatal.h b/chromium/net/test/scoped_disable_exit_on_dfatal.h
index 824d2e5a174..5e8712b3a7d 100644
--- a/chromium/net/test/scoped_disable_exit_on_dfatal.h
+++ b/chromium/net/test/scoped_disable_exit_on_dfatal.h
@@ -9,8 +9,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
// The ScopedDisableExitOnDFatal class is used to disable exiting the
// program when we encounter a LOG(DFATAL) within the current block.
@@ -37,7 +36,6 @@ class ScopedDisableExitOnDFatal {
logging::ScopedLogAssertHandler assert_handler_;
};
-} // namespace test
-} // namespace net
+} // namespace net::test
#endif // NET_TEST_SCOPED_DISABLE_EXIT_ON_DFATAL_H_
diff --git a/chromium/net/test/spawned_test_server/base_test_server.cc b/chromium/net/test/spawned_test_server/base_test_server.cc
index baf5812562c..83a35eda450 100644
--- a/chromium/net/test/spawned_test_server/base_test_server.cc
+++ b/chromium/net/test/spawned_test_server/base_test_server.cc
@@ -24,10 +24,10 @@
#include "net/base/net_errors.h"
#include "net/base/network_isolation_key.h"
#include "net/base/port_util.h"
-#include "net/cert/test_root_certs.h"
#include "net/cert/x509_certificate.h"
#include "net/dns/public/dns_query_type.h"
#include "net/log/net_log_with_source.h"
+#include "net/test/cert_test_util.h"
#include "net/test/test_data_directory.h"
#include "url/gurl.h"
@@ -68,12 +68,6 @@ bool GetLocalCertificatesDir(const base::FilePath& certificates_dir,
return true;
}
-bool RegisterRootCertsInternal(const base::FilePath& file_path) {
- TestRootCerts* root_certs = TestRootCerts::GetInstance();
- return root_certs->AddFromFile(file_path.AppendASCII("ocsp-test-root.pem")) &&
- root_certs->AddFromFile(file_path.AppendASCII("root_ca_cert.pem"));
-}
-
} // namespace
BaseTestServer::SSLOptions::SSLOptions() = default;
@@ -230,30 +224,18 @@ bool BaseTestServer::GetFilePathWithReplacements(
return true;
}
-void BaseTestServer::RegisterTestCerts() {
- bool added_root_certs = RegisterRootCertsInternal(GetTestCertsDirectory());
- DCHECK(added_root_certs);
+ScopedTestRoot BaseTestServer::RegisterTestCerts() {
+ auto root1 =
+ ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem");
+ auto root2 = ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem");
+ if (!root1 || !root2)
+ return ScopedTestRoot();
+ return ScopedTestRoot(CertificateList{root1, root2});
}
-bool BaseTestServer::LoadTestRootCert() const {
- TestRootCerts* root_certs = TestRootCerts::GetInstance();
- DCHECK(root_certs);
-
- // Should always use absolute path to load the root certificate.
- base::FilePath root_certificate_path;
- if (!GetLocalCertificatesDir(certificates_dir_, &root_certificate_path)) {
- LOG(ERROR) << "Could not get local certificates directory from "
- << certificates_dir_ << ".";
- return false;
- }
-
- if (!RegisterRootCertsInternal(root_certificate_path)) {
- LOG(ERROR) << "Could not register root certificates from "
- << root_certificate_path << ".";
- return false;
- }
-
- return true;
+bool BaseTestServer::LoadTestRootCert() {
+ scoped_test_root_ = RegisterTestCerts();
+ return !scoped_test_root_.IsEmpty();
}
scoped_refptr<X509Certificate> BaseTestServer::GetCertificate() const {
@@ -300,14 +282,17 @@ void BaseTestServer::SetResourcePath(const base::FilePath& document_root,
bool BaseTestServer::SetAndParseServerData(const std::string& server_data,
int* port) {
VLOG(1) << "Server data: " << server_data;
- base::JSONReader::ValueWithError parsed_json =
- base::JSONReader::ReadAndReturnValueWithError(server_data);
- if (!parsed_json.value || !parsed_json.value->is_dict()) {
- LOG(ERROR) << "Could not parse server data: " << parsed_json.error_message;
+ auto parsed_json = base::JSONReader::ReadAndReturnValueWithError(server_data);
+ if (!parsed_json.has_value()) {
+ LOG(ERROR) << "Could not parse server data: "
+ << parsed_json.error().message;
+ return false;
+ } else if (!parsed_json->is_dict()) {
+ LOG(ERROR) << "Could not parse server data: expecting a dictionary";
return false;
}
- server_data_ = std::move(parsed_json.value);
+ server_data_ = std::move(*parsed_json);
absl::optional<int> port_value = server_data_->FindIntKey("port");
if (!port_value) {
@@ -339,9 +324,7 @@ bool BaseTestServer::SetupWhenServerStarted() {
}
void BaseTestServer::CleanUpWhenStoppingServer() {
- TestRootCerts* root_certs = TestRootCerts::GetInstance();
- root_certs->Clear();
-
+ scoped_test_root_.Reset({});
host_port_pair_.set_port(0);
allowed_port_.reset();
started_ = false;
diff --git a/chromium/net/test/spawned_test_server/base_test_server.h b/chromium/net/test/spawned_test_server/base_test_server.h
index 149f11a8d0b..3475e324c7c 100644
--- a/chromium/net/test/spawned_test_server/base_test_server.h
+++ b/chromium/net/test/spawned_test_server/base_test_server.h
@@ -19,6 +19,7 @@
#include "base/memory/ref_counted.h"
#include "base/values.h"
#include "net/base/host_port_pair.h"
+#include "net/cert/test_root_certs.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
class GURL;
@@ -27,6 +28,7 @@ namespace net {
class AddressList;
class ScopedPortException;
+class ScopedTestRoot;
class X509Certificate;
// The base class of Test server implementation.
@@ -176,11 +178,11 @@ class BaseTestServer {
}
// Registers the test server's certs for the current process.
- static void RegisterTestCerts();
+ [[nodiscard]] static ScopedTestRoot RegisterTestCerts();
// Marks the root certificate of an HTTPS test server as trusted for
// the duration of tests.
- [[nodiscard]] bool LoadTestRootCert() const;
+ [[nodiscard]] bool LoadTestRootCert();
// Returns the certificate that the server is using.
scoped_refptr<X509Certificate> GetCertificate() const;
@@ -233,6 +235,8 @@ class BaseTestServer {
// Directory that contains the SSL certificates.
base::FilePath certificates_dir_;
+ ScopedTestRoot scoped_test_root_;
+
// Address on which the tests should connect to the server. With
// RemoteTestServer it may be different from the address on which the server
// listens on.
diff --git a/chromium/net/test/spawned_test_server/local_test_server_posix.cc b/chromium/net/test/spawned_test_server/local_test_server_posix.cc
index 832e5daf6e8..3b1d1dccccd 100644
--- a/chromium/net/test/spawned_test_server/local_test_server_posix.cc
+++ b/chromium/net/test/spawned_test_server/local_test_server_posix.cc
@@ -42,11 +42,10 @@ class OrphanedTestServerFilter : public base::ProcessFilter {
return false;
bool found_path_string = false;
bool found_port_string = false;
- for (auto it = entry.cmd_line_args().begin();
- it != entry.cmd_line_args().end(); ++it) {
- if (it->find(path_string_) != std::string::npos)
+ for (const auto& cmd_line_arg : entry.cmd_line_args()) {
+ if (cmd_line_arg.find(path_string_) != std::string::npos)
found_path_string = true;
- if (it->find(port_string_) != std::string::npos)
+ if (cmd_line_arg.find(port_string_) != std::string::npos)
found_port_string = true;
}
return found_path_string && found_port_string;
diff --git a/chromium/net/test/spawned_test_server/remote_test_server.cc b/chromium/net/test/spawned_test_server/remote_test_server.cc
index fde47f94329..cdb39de7a74 100644
--- a/chromium/net/test/spawned_test_server/remote_test_server.cc
+++ b/chromium/net/test/spawned_test_server/remote_test_server.cc
@@ -10,6 +10,7 @@
#include <vector>
#include "base/base_paths.h"
+#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/json/json_reader.h"
@@ -45,6 +46,7 @@ std::string GetServerTypeString(BaseTestServer::Type type) {
return std::string();
}
+#if !BUILDFLAG(IS_FUCHSIA)
// Returns platform-specific path to the config file for the test server.
base::FilePath GetTestServerConfigFilePath() {
base::FilePath dir;
@@ -55,10 +57,19 @@ base::FilePath GetTestServerConfigFilePath() {
#endif
return dir.AppendASCII("net-test-server-config");
}
+#endif // !BUILDFLAG(IS_FUCHSIA)
// Reads base URL for the test server spawner. That URL is used to control the
// test server.
-std::string ReadSpawnerUrlFromConfig() {
+std::string GetSpawnerUrlBase() {
+#if BUILDFLAG(IS_FUCHSIA)
+ std::string spawner_url_base(
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ "remote-test-server-spawner-url-base"));
+ LOG_IF(FATAL, spawner_url_base.empty())
+ << "--remote-test-server-spawner-url-base missing from command line";
+ return spawner_url_base;
+#else // BUILDFLAG(IS_FUCHSIA)
base::ScopedAllowBlockingForTesting allow_blocking;
base::FilePath config_path = GetTestServerConfigFilePath();
@@ -79,6 +90,7 @@ std::string ReadSpawnerUrlFromConfig() {
LOG(FATAL) << "spawner_url_base is not specified in the config";
return *result;
+#endif // BUILDFLAG(IS_FUCHSIA)
}
} // namespace
@@ -185,7 +197,7 @@ bool RemoteTestServer::Init(const base::FilePath& document_root) {
if (document_root.IsAbsolute())
return false;
- spawner_url_base_ = ReadSpawnerUrlFromConfig();
+ spawner_url_base_ = GetSpawnerUrlBase();
bool thread_started = io_thread_.StartWithOptions(
base::Thread::Options(base::MessagePumpType::IO, 0));
diff --git a/chromium/net/test/spawned_test_server/remote_test_server.h b/chromium/net/test/spawned_test_server/remote_test_server.h
index ab5c1c5793f..e1a70f3cfa6 100644
--- a/chromium/net/test/spawned_test_server/remote_test_server.h
+++ b/chromium/net/test/spawned_test_server/remote_test_server.h
@@ -28,9 +28,11 @@ class RemoteTestServerSpawnerRequest;
// this spawner communicator. The spawner is implemented in
// build/util/lib/common/chrome_test_server_spawner.py .
//
-// URL for the spawner server is discovered by reading config file that's
-// expected to be written on the test device by the test scrips. Location of the
-// config dependends on platform:
+// On Fuchsia, the URL for the spawner server is passed to a test via the
+// --remote-test-server-spawner-url-base switch on the command line. On other
+// platforms, the URL is discovered by reading config file that's expected to be
+// written on the test device by the test scrips. Location of the config
+// dependends on platform:
// - Android: DIR_ANDROID_EXTERNAL_STORAGE/net-test-server-config
// - other: DIR_TEMP/net-test-server-config
//
diff --git a/chromium/net/test/spawned_test_server/remote_test_server_spawner_request.cc b/chromium/net/test/spawned_test_server/remote_test_server_spawner_request.cc
index 46651d8432a..f56dd4c4b12 100644
--- a/chromium/net/test/spawned_test_server/remote_test_server_spawner_request.cc
+++ b/chromium/net/test/spawned_test_server/remote_test_server_spawner_request.cc
@@ -97,7 +97,7 @@ void RemoteTestServerSpawnerRequest::Core::SendRequest(
ElementsUploadDataStream::CreateWithReader(std::move(reader), 0));
request_->SetExtraRequestHeaderByName(HttpRequestHeaders::kContentType,
"application/json",
- /*override=*/true);
+ /*overwrite=*/true);
}
request_->Start();
@@ -196,8 +196,9 @@ RemoteTestServerSpawnerRequest::RemoteTestServerSpawnerRequest(
const GURL& url,
const std::string& post_data)
: io_task_runner_(io_task_runner),
- core_(new Core()),
- allowed_port_(new ScopedPortException(url.EffectiveIntPort())) {
+ core_(std::make_unique<Core>()),
+ allowed_port_(
+ std::make_unique<ScopedPortException>(url.EffectiveIntPort())) {
io_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&Core::SendRequest,
base::Unretained(core_.get()), url, post_data));
diff --git a/chromium/net/test/ssl_test_util.cc b/chromium/net/test/ssl_test_util.cc
index 8fca00e8a2a..a02cdc94f1d 100644
--- a/chromium/net/test/ssl_test_util.cc
+++ b/chromium/net/test/ssl_test_util.cc
@@ -4,12 +4,14 @@
#include "net/test/ssl_test_util.h"
+#include <string>
+
#include "third_party/boringssl/src/include/openssl/hpke.h"
namespace net {
bssl::UniquePtr<SSL_ECH_KEYS> MakeTestEchKeys(
- const char* public_name,
+ base::StringPiece public_name,
size_t max_name_len,
std::vector<uint8_t>* ech_config_list) {
bssl::ScopedEVP_HPKE_KEY key;
@@ -20,8 +22,8 @@ bssl::UniquePtr<SSL_ECH_KEYS> MakeTestEchKeys(
uint8_t* ech_config;
size_t ech_config_len;
if (!SSL_marshal_ech_config(&ech_config, &ech_config_len,
- /*config_id=*/1, key.get(), public_name,
- max_name_len)) {
+ /*config_id=*/1, key.get(),
+ std::string(public_name).c_str(), max_name_len)) {
return nullptr;
}
bssl::UniquePtr<uint8_t> scoped_ech_config(ech_config);
diff --git a/chromium/net/test/ssl_test_util.h b/chromium/net/test/ssl_test_util.h
index 45225d62885..e983ad3c25b 100644
--- a/chromium/net/test/ssl_test_util.h
+++ b/chromium/net/test/ssl_test_util.h
@@ -9,7 +9,7 @@
#include <cstdint>
#include <vector>
-#include "net/base/net_export.h"
+#include "base/strings/string_piece.h"
#include "third_party/boringssl/src/include/openssl/ssl.h"
namespace net {
@@ -19,7 +19,7 @@ namespace net {
// `nullptr` on error. On success, sets `*ech_config_list` to an ECHConfigList
// containing the generated ECHConfig.
bssl::UniquePtr<SSL_ECH_KEYS> MakeTestEchKeys(
- const char* public_name,
+ base::StringPiece public_name,
size_t max_name_len,
std::vector<uint8_t>* ech_config_list);
diff --git a/chromium/net/test/url_request/ssl_certificate_error_job.cc b/chromium/net/test/url_request/ssl_certificate_error_job.cc
index 635c2371a0b..216eb9089ef 100644
--- a/chromium/net/test/url_request/ssl_certificate_error_job.cc
+++ b/chromium/net/test/url_request/ssl_certificate_error_job.cc
@@ -51,9 +51,8 @@ void SSLCertificateErrorJob::Start() {
void SSLCertificateErrorJob::AddUrlHandler() {
URLRequestFilter* filter = URLRequestFilter::GetInstance();
- filter->AddHostnameInterceptor(
- "https", kMockHostname,
- std::unique_ptr<URLRequestInterceptor>(new MockJobInterceptor()));
+ filter->AddHostnameInterceptor("https", kMockHostname,
+ std::make_unique<MockJobInterceptor>());
}
GURL SSLCertificateErrorJob::GetMockUrl() {
diff --git a/chromium/net/test/url_request/url_request_failed_job.cc b/chromium/net/test/url_request/url_request_failed_job.cc
index ec93428d42b..4bc5769bb6f 100644
--- a/chromium/net/test/url_request/url_request_failed_job.cc
+++ b/chromium/net/test/url_request/url_request_failed_job.cc
@@ -135,12 +135,10 @@ void URLRequestFailedJob::AddUrlHandlerForHostname(
const std::string& hostname) {
URLRequestFilter* filter = URLRequestFilter::GetInstance();
// Add |hostname| to URLRequestFilter for HTTP and HTTPS.
- filter->AddHostnameInterceptor(
- "http", hostname,
- std::unique_ptr<URLRequestInterceptor>(new MockJobInterceptor()));
- filter->AddHostnameInterceptor(
- "https", hostname,
- std::unique_ptr<URLRequestInterceptor>(new MockJobInterceptor()));
+ filter->AddHostnameInterceptor("http", hostname,
+ std::make_unique<MockJobInterceptor>());
+ filter->AddHostnameInterceptor("https", hostname,
+ std::make_unique<MockJobInterceptor>());
}
// static
@@ -182,7 +180,8 @@ void URLRequestFailedJob::StartAsync() {
return;
}
const std::string headers = "HTTP/1.1 200 OK";
- response_info_.headers = new net::HttpResponseHeaders(headers);
+ response_info_.headers =
+ base::MakeRefCounted<net::HttpResponseHeaders>(headers);
total_received_bytes_ = headers.size();
NotifyHeadersComplete();
}
diff --git a/chromium/net/test/url_request/url_request_mock_http_job.cc b/chromium/net/test/url_request/url_request_mock_http_job.cc
index 5fff646fce9..dd726cef871 100644
--- a/chromium/net/test/url_request/url_request_mock_http_job.cc
+++ b/chromium/net/test/url_request/url_request_mock_http_job.cc
@@ -112,16 +112,14 @@ GURL URLRequestMockHTTPJob::GetMockHttpsUrl(const std::string& path) {
// static
std::unique_ptr<URLRequestInterceptor> URLRequestMockHTTPJob::CreateInterceptor(
const base::FilePath& base_path) {
- return std::unique_ptr<URLRequestInterceptor>(
- new MockJobInterceptor(base_path, false));
+ return std::make_unique<MockJobInterceptor>(base_path, false);
}
// static
std::unique_ptr<URLRequestInterceptor>
URLRequestMockHTTPJob::CreateInterceptorForSingleFile(
const base::FilePath& file) {
- return std::unique_ptr<URLRequestInterceptor>(
- new MockJobInterceptor(file, true));
+ return std::make_unique<MockJobInterceptor>(file, true);
}
URLRequestMockHTTPJob::URLRequestMockHTTPJob(URLRequest* request,
@@ -175,7 +173,7 @@ void URLRequestMockHTTPJob::SetHeadersAndStart(const std::string& raw_headers) {
// Private const version.
void URLRequestMockHTTPJob::GetResponseInfoConst(HttpResponseInfo* info) const {
- info->headers = new HttpResponseHeaders(raw_headers_);
+ info->headers = base::MakeRefCounted<HttpResponseHeaders>(raw_headers_);
}
int64_t URLRequestMockHTTPJob::GetTotalReceivedBytes() const {
diff --git a/chromium/net/test/url_request/url_request_test_job_backed_by_file.cc b/chromium/net/test/url_request/url_request_test_job_backed_by_file.cc
index 8e906a1d616..fb8aef4faf2 100644
--- a/chromium/net/test/url_request/url_request_test_job_backed_by_file.cc
+++ b/chromium/net/test/url_request/url_request_test_job_backed_by_file.cc
@@ -53,17 +53,15 @@ URLRequestTestJobBackedByFile::URLRequestTestJobBackedByFile(
const scoped_refptr<base::TaskRunner>& file_task_runner)
: URLRequestJob(request),
file_path_(file_path),
- stream_(new FileStream(file_task_runner)),
+ stream_(std::make_unique<FileStream>(file_task_runner)),
file_task_runner_(file_task_runner) {}
void URLRequestTestJobBackedByFile::Start() {
- FileMetaInfo* meta_info = new FileMetaInfo();
- file_task_runner_->PostTaskAndReply(
+ file_task_runner_->PostTaskAndReplyWithResult(
FROM_HERE,
- base::BindOnce(&URLRequestTestJobBackedByFile::FetchMetaInfo, file_path_,
- base::Unretained(meta_info)),
+ base::BindOnce(&URLRequestTestJobBackedByFile::FetchMetaInfo, file_path_),
base::BindOnce(&URLRequestTestJobBackedByFile::DidFetchMetaInfo,
- weak_ptr_factory_.GetWeakPtr(), base::Owned(meta_info)));
+ weak_ptr_factory_.GetWeakPtr()));
}
void URLRequestTestJobBackedByFile::Kill() {
@@ -156,9 +154,9 @@ URLRequestTestJobBackedByFile::SetUpSourceStream() {
return GzipSourceStream::Create(std::move(source), SourceStream::TYPE_GZIP);
}
-void URLRequestTestJobBackedByFile::FetchMetaInfo(
- const base::FilePath& file_path,
- FileMetaInfo* meta_info) {
+std::unique_ptr<URLRequestTestJobBackedByFile::FileMetaInfo>
+URLRequestTestJobBackedByFile::FetchMetaInfo(const base::FilePath& file_path) {
+ auto meta_info = std::make_unique<FileMetaInfo>();
base::File::Info file_info;
meta_info->file_exists = base::GetFileInfo(file_path, &file_info);
if (meta_info->file_exists) {
@@ -170,10 +168,11 @@ void URLRequestTestJobBackedByFile::FetchMetaInfo(
meta_info->mime_type_result =
GetMimeTypeFromFile(file_path, &meta_info->mime_type);
meta_info->absolute_path = base::MakeAbsoluteFilePath(file_path);
+ return meta_info;
}
void URLRequestTestJobBackedByFile::DidFetchMetaInfo(
- const FileMetaInfo* meta_info) {
+ std::unique_ptr<FileMetaInfo> meta_info) {
meta_info_ = *meta_info;
if (!meta_info_.file_exists) {
diff --git a/chromium/net/test/url_request/url_request_test_job_backed_by_file.h b/chromium/net/test/url_request/url_request_test_job_backed_by_file.h
index a850f884960..e0b01b72733 100644
--- a/chromium/net/test/url_request/url_request_test_job_backed_by_file.h
+++ b/chromium/net/test/url_request/url_request_test_job_backed_by_file.h
@@ -104,11 +104,11 @@ class URLRequestTestJobBackedByFile : public URLRequestJob {
};
// Fetches file info on a background thread.
- static void FetchMetaInfo(const base::FilePath& file_path,
- FileMetaInfo* meta_info);
+ static std::unique_ptr<FileMetaInfo> FetchMetaInfo(
+ const base::FilePath& file_path);
// Callback after fetching file info on a background thread.
- void DidFetchMetaInfo(const FileMetaInfo* meta_info);
+ void DidFetchMetaInfo(std::unique_ptr<FileMetaInfo> meta_info);
// Callback after opening file on a background thread.
void DidOpen(int result);
diff --git a/chromium/net/third_party/nss/OWNERS b/chromium/net/third_party/nss/OWNERS
index 679ba5e9088..f02af8df732 100644
--- a/chromium/net/third_party/nss/OWNERS
+++ b/chromium/net/third_party/nss/OWNERS
@@ -1,3 +1,3 @@
agl@chromium.org
davidben@chromium.org
-wtc@chromium.org
+wtc@google.com
diff --git a/chromium/net/third_party/nss/ssl/cmpcert.cc b/chromium/net/third_party/nss/ssl/cmpcert.cc
index 27ceeb8fd17..57c85157a3c 100644
--- a/chromium/net/third_party/nss/ssl/cmpcert.cc
+++ b/chromium/net/third_party/nss/ssl/cmpcert.cc
@@ -11,7 +11,7 @@
#include <secitem.h>
#include "base/strings/string_piece.h"
-#include "net/cert/internal/parse_certificate.h"
+#include "net/cert/pki/parse_certificate.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "net/der/parser.h"
diff --git a/chromium/net/third_party/quiche/BUILD.gn b/chromium/net/third_party/quiche/BUILD.gn
index 75a6a642751..d88fb52de74 100644
--- a/chromium/net/third_party/quiche/BUILD.gn
+++ b/chromium/net/third_party/quiche/BUILD.gn
@@ -54,8 +54,6 @@ config("quiche_config") {
component("quiche") {
sources = [
- "overrides/quiche_platform_impl/quic_flags_impl.cc",
- "overrides/quiche_platform_impl/quic_flags_impl.h",
"overrides/quiche_platform_impl/quiche_bug_tracker_impl.h",
"overrides/quiche_platform_impl/quiche_client_stats_impl.h",
"overrides/quiche_platform_impl/quiche_containers_impl.h",
@@ -649,6 +647,7 @@ component("quiche") {
"src/quiche/quic/platform/api/quic_hostname_utils.h",
"src/quiche/quic/platform/api/quic_ip_address.cc",
"src/quiche/quic/platform/api/quic_ip_address.h",
+ "src/quiche/quic/platform/api/quic_ip_address_family.cc",
"src/quiche/quic/platform/api/quic_ip_address_family.h",
"src/quiche/quic/platform/api/quic_logging.h",
"src/quiche/quic/platform/api/quic_mutex.h",
@@ -676,6 +675,10 @@ component("quiche") {
"src/quiche/spdy/core/hpack/hpack_static_table.h",
"src/quiche/spdy/core/http2_frame_decoder_adapter.cc",
"src/quiche/spdy/core/http2_frame_decoder_adapter.h",
+ "src/quiche/spdy/core/http2_header_block.cc",
+ "src/quiche/spdy/core/http2_header_block.h",
+ "src/quiche/spdy/core/http2_header_storage.cc",
+ "src/quiche/spdy/core/http2_header_storage.h",
"src/quiche/spdy/core/recording_headers_handler.cc",
"src/quiche/spdy/core/recording_headers_handler.h",
"src/quiche/spdy/core/spdy_alt_svc_wire_format.cc",
@@ -685,10 +688,6 @@ component("quiche") {
"src/quiche/spdy/core/spdy_frame_builder.h",
"src/quiche/spdy/core/spdy_framer.cc",
"src/quiche/spdy/core/spdy_framer.h",
- "src/quiche/spdy/core/spdy_header_block.cc",
- "src/quiche/spdy/core/spdy_header_block.h",
- "src/quiche/spdy/core/spdy_header_storage.cc",
- "src/quiche/spdy/core/spdy_header_storage.h",
"src/quiche/spdy/core/spdy_headers_handler_interface.h",
"src/quiche/spdy/core/spdy_intrusive_list.h",
"src/quiche/spdy/core/spdy_no_op_visitor.cc",
@@ -777,6 +776,18 @@ if (build_epoll_based_tools) {
"src/quiche/epoll_server/platform/api/epoll_thread.h",
"src/quiche/epoll_server/simple_epoll_server.cc",
"src/quiche/epoll_server/simple_epoll_server.h",
+ "src/quiche/quic/core/io/event_loop_socket_factory.cc",
+ "src/quiche/quic/core/io/event_loop_socket_factory.h",
+ "src/quiche/quic/core/io/event_loop_tcp_client_socket.cc",
+ "src/quiche/quic/core/io/event_loop_tcp_client_socket.h",
+ "src/quiche/quic/core/io/quic_default_event_loop.cc",
+ "src/quiche/quic/core/io/quic_default_event_loop.h",
+ "src/quiche/quic/core/io/quic_poll_event_loop.cc",
+ "src/quiche/quic/core/io/quic_poll_event_loop.h",
+ "src/quiche/quic/core/io/socket.h",
+ "src/quiche/quic/core/io/socket_posix.cc",
+ "src/quiche/quic/core/quic_default_clock.cc",
+ "src/quiche/quic/core/quic_default_clock.h",
"src/quiche/quic/core/quic_default_packet_writer.cc",
"src/quiche/quic/core/quic_default_packet_writer.h",
"src/quiche/quic/core/quic_epoll_alarm_factory.cc",
@@ -810,11 +821,19 @@ if (build_epoll_based_tools) {
"src/quiche/quic/masque/masque_utils.cc",
"src/quiche/quic/masque/masque_utils.h",
"src/quiche/quic/platform/api/quic_epoll.h",
+ "src/quiche/quic/platform/api/quic_ip_address_family.cc",
+ "src/quiche/quic/platform/api/quic_ip_address_family.h",
"src/quiche/quic/platform/api/quic_udp_socket_platform_api.h",
+ "src/quiche/quic/tools/connect_tunnel.cc",
+ "src/quiche/quic/tools/connect_tunnel.h",
"src/quiche/quic/tools/quic_client.cc",
"src/quiche/quic/tools/quic_client.h",
+ "src/quiche/quic/tools/quic_client_default_network_helper.cc",
+ "src/quiche/quic/tools/quic_client_default_network_helper.h",
"src/quiche/quic/tools/quic_client_epoll_network_helper.cc",
"src/quiche/quic/tools/quic_client_epoll_network_helper.h",
+ "src/quiche/quic/tools/quic_default_client.cc",
+ "src/quiche/quic/tools/quic_default_client.h",
"src/quiche/quic/tools/quic_server.cc",
"src/quiche/quic/tools/quic_server.h",
]
@@ -854,9 +873,9 @@ if (build_epoll_based_tools) {
executable("epoll_quic_server") {
testonly = true
sources = [
- "src/quiche/quic/tools/quic_epoll_server_factory.cc",
- "src/quiche/quic/tools/quic_epoll_server_factory.h",
"src/quiche/quic/tools/quic_server_bin.cc",
+ "src/quiche/quic/tools/quic_server_factory.cc",
+ "src/quiche/quic/tools/quic_server_factory.h",
]
configs += [ ":quiche_internal_config" ]
@@ -1061,8 +1080,6 @@ static_library("quiche_test_support") {
"src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h",
"src/quiche/quic/test_tools/qpack/qpack_encoder_peer.cc",
"src/quiche/quic/test_tools/qpack/qpack_encoder_peer.h",
- "src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.cc",
- "src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h",
"src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc",
"src/quiche/quic/test_tools/qpack/qpack_offline_decoder.h",
"src/quiche/quic/test_tools/qpack/qpack_test_utils.cc",
@@ -1603,11 +1620,11 @@ source_set("quiche_tests") {
"src/quiche/spdy/core/hpack/hpack_output_stream_test.cc",
"src/quiche/spdy/core/hpack/hpack_round_trip_test.cc",
"src/quiche/spdy/core/hpack/hpack_static_table_test.cc",
+ "src/quiche/spdy/core/http2_header_block_test.cc",
+ "src/quiche/spdy/core/http2_header_storage_test.cc",
"src/quiche/spdy/core/spdy_alt_svc_wire_format_test.cc",
"src/quiche/spdy/core/spdy_frame_builder_test.cc",
"src/quiche/spdy/core/spdy_framer_test.cc",
- "src/quiche/spdy/core/spdy_header_block_test.cc",
- "src/quiche/spdy/core/spdy_header_storage_test.cc",
"src/quiche/spdy/core/spdy_intrusive_list_test.cc",
"src/quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc",
"src/quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc",
@@ -1646,6 +1663,7 @@ source_set("quiche_tests") {
"src/quiche/quic/core/quic_epoll_clock_test.cc",
"src/quiche/quic/core/quic_epoll_connection_helper_test.cc",
"src/quiche/quic/tools/quic_client_test.cc",
+ "src/quiche/quic/tools/quic_default_client_test.cc",
"src/quiche/quic/tools/quic_server_test.cc",
"src/quiche/quic/tools/quic_simple_server_session_test.cc",
"src/quiche/quic/tools/quic_simple_server_stream_test.cc",
diff --git a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quic_flags_impl.cc b/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quic_flags_impl.cc
deleted file mode 100644
index 74df54e149e..00000000000
--- a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quic_flags_impl.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 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.
-
-#include "net/third_party/quiche/overrides/quiche_platform_impl/quic_flags_impl.h"
-
-#define DEFINE_QUIC_PROTOCOL_FLAG_SINGLE_VALUE(type, flag, value, doc) \
- type FLAGS_##flag = value;
-
-#define DEFINE_QUIC_PROTOCOL_FLAG_TWO_VALUES(type, flag, internal_value, \
- external_value, doc) \
- type FLAGS_##flag = external_value;
-
-// Preprocessor macros can only have one definition.
-// Select the right macro based on the number of arguments.
-#define GET_6TH_ARG(arg1, arg2, arg3, arg4, arg5, arg6, ...) arg6
-#define QUIC_PROTOCOL_FLAG_MACRO_CHOOSER(...) \
- GET_6TH_ARG(__VA_ARGS__, DEFINE_QUIC_PROTOCOL_FLAG_TWO_VALUES, \
- DEFINE_QUIC_PROTOCOL_FLAG_SINGLE_VALUE)
-#define QUIC_PROTOCOL_FLAG(...) \
- QUIC_PROTOCOL_FLAG_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
-
-#include "net/third_party/quiche/src/quiche/quic/core/quic_protocol_flags_list.h"
-
-#undef QUIC_PROTOCOL_FLAG
-#undef QUIC_PROTOCOL_FLAG_MACRO_CHOOSER
-#undef GET_6TH_ARG
-#undef DEFINE_QUIC_PROTOCOL_FLAG_TWO_VALUES
-#undef DEFINE_QUIC_PROTOCOL_FLAG_SINGLE_VALUE
diff --git a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quic_flags_impl.h b/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quic_flags_impl.h
deleted file mode 100644
index 82e9c9393de..00000000000
--- a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quic_flags_impl.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 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.
-
-#ifndef NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUIC_FLAGS_IMPL_H_
-#define NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUIC_FLAGS_IMPL_H_
-
-#include <cstdint>
-
-#include "net/third_party/quiche/src/quiche/quic/platform/api/quic_export.h"
-
-#define QUIC_PROTOCOL_FLAG(type, flag, ...) \
- QUIC_EXPORT_PRIVATE extern type FLAGS_##flag;
-#include "net/third_party/quiche/src/quiche/quic/core/quic_protocol_flags_list.h"
-#undef QUIC_PROTOCOL_FLAG
-
-#endif // NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUIC_FLAGS_IMPL_H_
diff --git a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_helpers_impl.cc b/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_helpers_impl.cc
index 7a19ff21899..a4909c1185c 100644
--- a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_helpers_impl.cc
+++ b/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_helpers_impl.cc
@@ -4,8 +4,7 @@
#include "quiche_platform_impl/quiche_test_helpers_impl.h"
-namespace http2 {
-namespace test {
+namespace http2::test {
// This is a copy of the same named method in ::testing::internal.
// TODO(jamessynge): See about getting something like VERIFY_* adopted by
@@ -25,5 +24,4 @@ std::string GetBoolAssertionFailureMessage(
return msg.GetString();
}
-} // namespace test
-} // namespace http2
+} // namespace http2::test
diff --git a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.cc b/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.cc
index fe818b3277f..45f46c9d9ba 100644
--- a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.cc
+++ b/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.cc
@@ -10,8 +10,7 @@
#include "base/path_service.h"
#include "net/test/test_data_directory.h"
-namespace quiche {
-namespace test {
+namespace quiche::test {
std::string QuicheGetCommonSourcePathImpl() {
base::FilePath net_path = net::GetTestNetDirectory();
@@ -19,8 +18,7 @@ std::string QuicheGetCommonSourcePathImpl() {
.MaybeAsASCII();
}
-} // namespace test
-} // namespace quiche
+} // namespace quiche::test
std::string QuicheGetTestMemoryCachePathImpl() {
base::FilePath path;
diff --git a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.h b/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.h
index 46e97ba01fd..983109e2937 100644
--- a/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.h
+++ b/chromium/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.h
@@ -14,8 +14,7 @@
#include "testing/gtest/include/gtest/gtest-spi.h" // IWYU pragma: export
#include "testing/gtest/include/gtest/gtest.h" // IWYU pragma: export
-namespace quiche {
-namespace test {
+namespace quiche::test {
class QuicheTestImpl : public ::testing::Test {
private:
@@ -41,8 +40,7 @@ class ScopedEnvironmentForThreadsImpl {
std::string QuicheGetCommonSourcePathImpl();
-} // namespace test
-} // namespace quiche
+} // namespace quiche::test
#if GTEST_HAS_DEATH_TEST && !defined(NDEBUG)
#define EXPECT_QUICHE_DEBUG_DEATH_IMPL(condition, message) \
diff --git a/chromium/net/third_party/quiche/src/CONTRIBUTING.md b/chromium/net/third_party/quiche/src/CONTRIBUTING.md
index d8c6e48b7be..cb06def9e13 100644
--- a/chromium/net/third_party/quiche/src/CONTRIBUTING.md
+++ b/chromium/net/third_party/quiche/src/CONTRIBUTING.md
@@ -26,6 +26,9 @@ If you would like to make a contribution, please follow these steps:
3. Email a link to your pull request to <quiche-contribution@google.com>.
4. An engineer will review your pull request and merge it internally.
+Note: if you are a Google engineer with access to google3, please submit a CL to
+google3 directly.
+
## Community Guidelines
This project follows
diff --git a/chromium/net/third_party/quiche/src/build/source_list.bzl b/chromium/net/third_party/quiche/src/build/source_list.bzl
index 8b92c14733e..90dd052da5e 100644
--- a/chromium/net/third_party/quiche/src/build/source_list.bzl
+++ b/chromium/net/third_party/quiche/src/build/source_list.bzl
@@ -50,6 +50,7 @@ quiche_core_hdrs = [
"common/quiche_endian.h",
"common/quiche_linked_hash_map.h",
"common/quiche_mem_slice_storage.h",
+ "common/quiche_protocol_flags_list.h",
"common/quiche_text_utils.h",
"common/simple_buffer_allocator.h",
"common/structured_headers.h",
@@ -132,6 +133,7 @@ quiche_core_hdrs = [
"quic/core/congestion_control/tcp_cubic_sender_bytes.h",
"quic/core/congestion_control/uber_loss_algorithm.h",
"quic/core/congestion_control/windowed_filter.h",
+ "quic/core/connection_id_generator.h",
"quic/core/crypto/aead_base_decrypter.h",
"quic/core/crypto/aead_base_encrypter.h",
"quic/core/crypto/aes_128_gcm_12_decrypter.h",
@@ -184,6 +186,7 @@ quiche_core_hdrs = [
"quic/core/crypto/tls_server_connection.h",
"quic/core/crypto/transport_parameters.h",
"quic/core/crypto/web_transport_fingerprint_proof_verifier.h",
+ "quic/core/deterministic_connection_id_generator.h",
"quic/core/frames/quic_ack_frame.h",
"quic/core/frames/quic_ack_frequency_frame.h",
"quic/core/frames/quic_blocked_frame.h",
@@ -287,6 +290,8 @@ quiche_core_hdrs = [
"quic/core/quic_data_reader.h",
"quic/core/quic_data_writer.h",
"quic/core/quic_datagram_queue.h",
+ "quic/core/quic_default_clock.h",
+ "quic/core/quic_default_connection_helper.h",
"quic/core/quic_dispatcher.h",
"quic/core/quic_error_codes.h",
"quic/core/quic_flags_list.h",
@@ -369,7 +374,9 @@ quiche_core_hdrs = [
"spdy/core/hpack/hpack_output_stream.h",
"spdy/core/hpack/hpack_static_table.h",
"spdy/core/http2_frame_decoder_adapter.h",
+ "spdy/core/http2_header_block.h",
"spdy/core/http2_header_block_hpack_listener.h",
+ "spdy/core/http2_header_storage.h",
"spdy/core/metadata_extension.h",
"spdy/core/no_op_headers_handler.h",
"spdy/core/recording_headers_handler.h",
@@ -377,8 +384,6 @@ quiche_core_hdrs = [
"spdy/core/spdy_bitmasks.h",
"spdy/core/spdy_frame_builder.h",
"spdy/core/spdy_framer.h",
- "spdy/core/spdy_header_block.h",
- "spdy/core/spdy_header_storage.h",
"spdy/core/spdy_headers_handler_interface.h",
"spdy/core/spdy_intrusive_list.h",
"spdy/core/spdy_no_op_visitor.h",
@@ -523,6 +528,7 @@ quiche_core_srcs = [
"quic/core/crypto/tls_server_connection.cc",
"quic/core/crypto/transport_parameters.cc",
"quic/core/crypto/web_transport_fingerprint_proof_verifier.cc",
+ "quic/core/deterministic_connection_id_generator.cc",
"quic/core/frames/quic_ack_frame.cc",
"quic/core/frames/quic_ack_frequency_frame.cc",
"quic/core/frames/quic_blocked_frame.cc",
@@ -613,6 +619,7 @@ quiche_core_srcs = [
"quic/core/quic_data_reader.cc",
"quic/core/quic_data_writer.cc",
"quic/core/quic_datagram_queue.cc",
+ "quic/core/quic_default_clock.cc",
"quic/core/quic_dispatcher.cc",
"quic/core/quic_error_codes.cc",
"quic/core/quic_flow_controller.cc",
@@ -656,6 +663,7 @@ quiche_core_srcs = [
"quic/core/uber_quic_stream_id_manager.cc",
"quic/core/uber_received_packet_manager.cc",
"quic/platform/api/quic_ip_address.cc",
+ "quic/platform/api/quic_ip_address_family.cc",
"quic/platform/api/quic_socket_address.cc",
"spdy/core/array_output_buffer.cc",
"spdy/core/hpack/hpack_constants.cc",
@@ -666,13 +674,13 @@ quiche_core_srcs = [
"spdy/core/hpack/hpack_output_stream.cc",
"spdy/core/hpack/hpack_static_table.cc",
"spdy/core/http2_frame_decoder_adapter.cc",
+ "spdy/core/http2_header_block.cc",
+ "spdy/core/http2_header_storage.cc",
"spdy/core/metadata_extension.cc",
"spdy/core/recording_headers_handler.cc",
"spdy/core/spdy_alt_svc_wire_format.cc",
"spdy/core/spdy_frame_builder.cc",
"spdy/core/spdy_framer.cc",
- "spdy/core/spdy_header_block.cc",
- "spdy/core/spdy_header_storage.cc",
"spdy/core/spdy_no_op_visitor.cc",
"spdy/core/spdy_pinnable_buffer_piece.cc",
"spdy/core/spdy_prefixed_buffer_reader.cc",
@@ -685,10 +693,15 @@ quiche_tool_support_hdrs = [
"common/platform/api/quiche_file_utils.h",
"common/platform/api/quiche_system_event_loop.h",
"quic/platform/api/quic_default_proof_providers.h",
+ "quic/tools/connect_server_backend.h",
+ "quic/tools/connect_tunnel.h",
"quic/tools/fake_proof_verifier.h",
"quic/tools/quic_backend_response.h",
"quic/tools/quic_client_base.h",
+ "quic/tools/quic_client_default_network_helper.h",
+ "quic/tools/quic_default_client.h",
"quic/tools/quic_memory_cache_backend.h",
+ "quic/tools/quic_server_factory.h",
"quic/tools/quic_simple_client_session.h",
"quic/tools/quic_simple_client_stream.h",
"quic/tools/quic_simple_crypto_server_stream_helper.h",
@@ -705,9 +718,14 @@ quiche_tool_support_hdrs = [
]
quiche_tool_support_srcs = [
"common/platform/api/quiche_file_utils.cc",
+ "quic/tools/connect_server_backend.cc",
+ "quic/tools/connect_tunnel.cc",
"quic/tools/quic_backend_response.cc",
"quic/tools/quic_client_base.cc",
+ "quic/tools/quic_client_default_network_helper.cc",
+ "quic/tools/quic_default_client.cc",
"quic/tools/quic_memory_cache_backend.cc",
+ "quic/tools/quic_server_factory.cc",
"quic/tools/quic_simple_client_session.cc",
"quic/tools/quic_simple_client_stream.cc",
"quic/tools/quic_simple_crypto_server_stream_helper.cc",
@@ -770,7 +788,6 @@ quiche_test_support_hdrs = [
"quic/test_tools/packet_reordering_writer.h",
"quic/test_tools/qpack/qpack_decoder_test_utils.h",
"quic/test_tools/qpack/qpack_encoder_peer.h",
- "quic/test_tools/qpack/qpack_encoder_test_utils.h",
"quic/test_tools/qpack/qpack_offline_decoder.h",
"quic/test_tools/qpack/qpack_test_utils.h",
"quic/test_tools/quic_buffered_packet_store_peer.h",
@@ -818,6 +835,7 @@ quiche_test_support_hdrs = [
"quic/test_tools/simulator/quic_endpoint_base.h",
"quic/test_tools/simulator/simulator.h",
"quic/test_tools/simulator/switch.h",
+ "quic/test_tools/simulator/test_harness.h",
"quic/test_tools/simulator/traffic_policer.h",
"quic/test_tools/test_certificates.h",
"quic/test_tools/test_ticket_crypter.h",
@@ -868,7 +886,6 @@ quiche_test_support_srcs = [
"quic/test_tools/packet_reordering_writer.cc",
"quic/test_tools/qpack/qpack_decoder_test_utils.cc",
"quic/test_tools/qpack/qpack_encoder_peer.cc",
- "quic/test_tools/qpack/qpack_encoder_test_utils.cc",
"quic/test_tools/qpack/qpack_offline_decoder.cc",
"quic/test_tools/qpack/qpack_test_utils.cc",
"quic/test_tools/quic_buffered_packet_store_peer.cc",
@@ -912,6 +929,7 @@ quiche_test_support_srcs = [
"quic/test_tools/simulator/quic_endpoint_base.cc",
"quic/test_tools/simulator/simulator.cc",
"quic/test_tools/simulator/switch.cc",
+ "quic/test_tools/simulator/test_harness.cc",
"quic/test_tools/simulator/traffic_policer.cc",
"quic/test_tools/test_certificates.cc",
"quic/test_tools/test_ticket_crypter.cc",
@@ -921,6 +939,7 @@ quiche_test_support_srcs = [
]
epoll_tool_support_hdrs = [
"common/platform/api/quiche_epoll.h",
+ "common/platform/api/quiche_event_loop.h",
"common/platform/api/quiche_stream_buffer_allocator.h",
"common/platform/api/quiche_udp_socket_platform_api.h",
"epoll_server/platform/api/epoll_bug.h",
@@ -932,6 +951,14 @@ epoll_tool_support_hdrs = [
"quic/core/batch_writer/quic_batch_writer_test.h",
"quic/core/batch_writer/quic_gso_batch_writer.h",
"quic/core/batch_writer/quic_sendmmsg_batch_writer.h",
+ "quic/core/io/event_loop_socket_factory.h",
+ "quic/core/io/event_loop_tcp_client_socket.h",
+ "quic/core/io/quic_default_event_loop.h",
+ "quic/core/io/quic_event_loop.h",
+ "quic/core/io/quic_poll_event_loop.h",
+ "quic/core/io/socket.h",
+ "quic/core/io/socket_factory.h",
+ "quic/core/io/stream_client_socket.h",
"quic/core/quic_default_packet_writer.h",
"quic/core/quic_epoll_alarm_factory.h",
"quic/core/quic_epoll_clock.h",
@@ -962,6 +989,11 @@ epoll_tool_support_srcs = [
"quic/core/batch_writer/quic_batch_writer_buffer.cc",
"quic/core/batch_writer/quic_gso_batch_writer.cc",
"quic/core/batch_writer/quic_sendmmsg_batch_writer.cc",
+ "quic/core/io/event_loop_socket_factory.cc",
+ "quic/core/io/event_loop_tcp_client_socket.cc",
+ "quic/core/io/quic_default_event_loop.cc",
+ "quic/core/io/quic_poll_event_loop.cc",
+ "quic/core/io/socket_posix.cc",
"quic/core/quic_default_packet_writer.cc",
"quic/core/quic_epoll_alarm_factory.cc",
"quic/core/quic_epoll_clock.cc",
@@ -990,6 +1022,7 @@ epoll_test_support_hdrs = [
"epoll_server/platform/api/epoll_address_test_utils.h",
"epoll_server/platform/api/epoll_expect_bug.h",
"epoll_server/platform/api/epoll_test.h",
+ "quic/bindings/quic_libevent.h",
"quic/test_tools/quic_client_peer.h",
"quic/test_tools/quic_mock_syscall_wrapper.h",
"quic/test_tools/quic_server_peer.h",
@@ -999,6 +1032,7 @@ epoll_test_support_hdrs = [
]
epoll_test_support_srcs = [
"epoll_server/fake_simple_epoll_server.cc",
+ "quic/bindings/quic_libevent.cc",
"quic/test_tools/quic_client_peer.cc",
"quic/test_tools/quic_mock_syscall_wrapper.cc",
"quic/test_tools/quic_server_peer.cc",
@@ -1086,6 +1120,7 @@ quiche_tests_srcs = [
"http2/test_tools/http2_frame_builder_test.cc",
"http2/test_tools/http2_random_test.cc",
"http2/test_tools/random_decoder_test_base_test.cc",
+ "quic/bindings/quic_libevent_test.cc",
"quic/core/congestion_control/bandwidth_sampler_test.cc",
"quic/core/congestion_control/bbr2_simulator_test.cc",
"quic/core/congestion_control/bbr_sender_test.cc",
@@ -1132,6 +1167,7 @@ quiche_tests_srcs = [
"quic/core/crypto/quic_random_test.cc",
"quic/core/crypto/transport_parameters_test.cc",
"quic/core/crypto/web_transport_fingerprint_proof_verifier_test.cc",
+ "quic/core/deterministic_connection_id_generator_test.cc",
"quic/core/frames/quic_frames_test.cc",
"quic/core/http/capsule_test.cc",
"quic/core/http/http_decoder_test.cc",
@@ -1238,6 +1274,8 @@ quiche_tests_srcs = [
"quic/test_tools/simple_session_notifier_test.cc",
"quic/test_tools/simulator/quic_endpoint_test.cc",
"quic/test_tools/simulator/simulator_test.cc",
+ "quic/tools/connect_tunnel_test.cc",
+ "quic/tools/quic_default_client_test.cc",
"quic/tools/quic_memory_cache_backend_test.cc",
"quic/tools/quic_tcp_like_trace_converter_test.cc",
"quic/tools/simple_ticket_crypter_test.cc",
@@ -1249,12 +1287,12 @@ quiche_tests_srcs = [
"spdy/core/hpack/hpack_output_stream_test.cc",
"spdy/core/hpack/hpack_round_trip_test.cc",
"spdy/core/hpack/hpack_static_table_test.cc",
+ "spdy/core/http2_header_block_test.cc",
+ "spdy/core/http2_header_storage_test.cc",
"spdy/core/metadata_extension_test.cc",
"spdy/core/spdy_alt_svc_wire_format_test.cc",
"spdy/core/spdy_frame_builder_test.cc",
"spdy/core/spdy_framer_test.cc",
- "spdy/core/spdy_header_block_test.cc",
- "spdy/core/spdy_header_storage_test.cc",
"spdy/core/spdy_intrusive_list_test.cc",
"spdy/core/spdy_pinnable_buffer_piece_test.cc",
"spdy/core/spdy_prefixed_buffer_reader_test.cc",
@@ -1275,6 +1313,10 @@ epoll_tests_srcs = [
"quic/core/http/quic_spdy_client_session_test.cc",
"quic/core/http/quic_spdy_client_stream_test.cc",
"quic/core/http/quic_spdy_server_stream_base_test.cc",
+ "quic/core/io/event_loop_tcp_client_socket_test.cc",
+ "quic/core/io/quic_all_event_loops_test.cc",
+ "quic/core/io/quic_poll_event_loop_test.cc",
+ "quic/core/io/socket_test.cc",
"quic/core/quic_epoll_alarm_factory_test.cc",
"quic/core/quic_epoll_clock_test.cc",
"quic/core/quic_epoll_connection_helper_test.cc",
@@ -1303,7 +1345,6 @@ fuzzers_srcs = [
]
cli_tools_hdrs = [
"quic/tools/quic_epoll_client_factory.h",
- "quic/tools/quic_epoll_server_factory.h",
"quic/tools/quic_toy_client.h",
"quic/tools/quic_toy_server.h",
]
@@ -1315,7 +1356,6 @@ cli_tools_srcs = [
"quic/tools/quic_client_bin.cc",
"quic/tools/quic_client_interop_test_bin.cc",
"quic/tools/quic_epoll_client_factory.cc",
- "quic/tools/quic_epoll_server_factory.cc",
"quic/tools/quic_packet_printer_bin.cc",
"quic/tools/quic_reject_reason_decoder_bin.cc",
"quic/tools/quic_server_bin.cc",
@@ -1360,7 +1400,6 @@ nghttp2_tests_srcs = [
"http2/adapter/nghttp2_util_test.cc",
]
default_platform_impl_hdrs = [
- "common/platform/default/quiche_platform_impl/quic_flags_impl.h",
"common/platform/default/quiche_platform_impl/quiche_bug_tracker_impl.h",
"common/platform/default/quiche_platform_impl/quiche_client_stats_impl.h",
"common/platform/default/quiche_platform_impl/quiche_containers_impl.h",
@@ -1383,7 +1422,6 @@ default_platform_impl_hdrs = [
"common/platform/default/quiche_platform_impl/quiche_url_utils_impl.h",
]
default_platform_impl_srcs = [
- "common/platform/default/quiche_platform_impl/quic_flags_impl.cc",
"common/platform/default/quiche_platform_impl/quiche_flags_impl.cc",
"common/platform/default/quiche_platform_impl/quiche_mutex_impl.cc",
"common/platform/default/quiche_platform_impl/quiche_stack_trace_impl.cc",
@@ -1392,6 +1430,7 @@ default_platform_impl_srcs = [
]
default_platform_impl_tool_support_hdrs = [
"common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h",
+ "common/platform/default/quiche_platform_impl/quiche_event_loop_impl.h",
"common/platform/default/quiche_platform_impl/quiche_file_utils_impl.h",
"common/platform/default/quiche_platform_impl/quiche_stream_buffer_allocator_impl.h",
"common/platform/default/quiche_platform_impl/quiche_system_event_loop_impl.h",
diff --git a/chromium/net/third_party/quiche/src/build/source_list.gni b/chromium/net/third_party/quiche/src/build/source_list.gni
index 4b2f8f8c115..842512d49e6 100644
--- a/chromium/net/third_party/quiche/src/build/source_list.gni
+++ b/chromium/net/third_party/quiche/src/build/source_list.gni
@@ -50,6 +50,7 @@ quiche_core_hdrs = [
"src/quiche/common/quiche_endian.h",
"src/quiche/common/quiche_linked_hash_map.h",
"src/quiche/common/quiche_mem_slice_storage.h",
+ "src/quiche/common/quiche_protocol_flags_list.h",
"src/quiche/common/quiche_text_utils.h",
"src/quiche/common/simple_buffer_allocator.h",
"src/quiche/common/structured_headers.h",
@@ -132,6 +133,7 @@ quiche_core_hdrs = [
"src/quiche/quic/core/congestion_control/tcp_cubic_sender_bytes.h",
"src/quiche/quic/core/congestion_control/uber_loss_algorithm.h",
"src/quiche/quic/core/congestion_control/windowed_filter.h",
+ "src/quiche/quic/core/connection_id_generator.h",
"src/quiche/quic/core/crypto/aead_base_decrypter.h",
"src/quiche/quic/core/crypto/aead_base_encrypter.h",
"src/quiche/quic/core/crypto/aes_128_gcm_12_decrypter.h",
@@ -184,6 +186,7 @@ quiche_core_hdrs = [
"src/quiche/quic/core/crypto/tls_server_connection.h",
"src/quiche/quic/core/crypto/transport_parameters.h",
"src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.h",
+ "src/quiche/quic/core/deterministic_connection_id_generator.h",
"src/quiche/quic/core/frames/quic_ack_frame.h",
"src/quiche/quic/core/frames/quic_ack_frequency_frame.h",
"src/quiche/quic/core/frames/quic_blocked_frame.h",
@@ -287,6 +290,8 @@ quiche_core_hdrs = [
"src/quiche/quic/core/quic_data_reader.h",
"src/quiche/quic/core/quic_data_writer.h",
"src/quiche/quic/core/quic_datagram_queue.h",
+ "src/quiche/quic/core/quic_default_clock.h",
+ "src/quiche/quic/core/quic_default_connection_helper.h",
"src/quiche/quic/core/quic_dispatcher.h",
"src/quiche/quic/core/quic_error_codes.h",
"src/quiche/quic/core/quic_flags_list.h",
@@ -369,7 +374,9 @@ quiche_core_hdrs = [
"src/quiche/spdy/core/hpack/hpack_output_stream.h",
"src/quiche/spdy/core/hpack/hpack_static_table.h",
"src/quiche/spdy/core/http2_frame_decoder_adapter.h",
+ "src/quiche/spdy/core/http2_header_block.h",
"src/quiche/spdy/core/http2_header_block_hpack_listener.h",
+ "src/quiche/spdy/core/http2_header_storage.h",
"src/quiche/spdy/core/metadata_extension.h",
"src/quiche/spdy/core/no_op_headers_handler.h",
"src/quiche/spdy/core/recording_headers_handler.h",
@@ -377,8 +384,6 @@ quiche_core_hdrs = [
"src/quiche/spdy/core/spdy_bitmasks.h",
"src/quiche/spdy/core/spdy_frame_builder.h",
"src/quiche/spdy/core/spdy_framer.h",
- "src/quiche/spdy/core/spdy_header_block.h",
- "src/quiche/spdy/core/spdy_header_storage.h",
"src/quiche/spdy/core/spdy_headers_handler_interface.h",
"src/quiche/spdy/core/spdy_intrusive_list.h",
"src/quiche/spdy/core/spdy_no_op_visitor.h",
@@ -523,6 +528,7 @@ quiche_core_srcs = [
"src/quiche/quic/core/crypto/tls_server_connection.cc",
"src/quiche/quic/core/crypto/transport_parameters.cc",
"src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.cc",
+ "src/quiche/quic/core/deterministic_connection_id_generator.cc",
"src/quiche/quic/core/frames/quic_ack_frame.cc",
"src/quiche/quic/core/frames/quic_ack_frequency_frame.cc",
"src/quiche/quic/core/frames/quic_blocked_frame.cc",
@@ -613,6 +619,7 @@ quiche_core_srcs = [
"src/quiche/quic/core/quic_data_reader.cc",
"src/quiche/quic/core/quic_data_writer.cc",
"src/quiche/quic/core/quic_datagram_queue.cc",
+ "src/quiche/quic/core/quic_default_clock.cc",
"src/quiche/quic/core/quic_dispatcher.cc",
"src/quiche/quic/core/quic_error_codes.cc",
"src/quiche/quic/core/quic_flow_controller.cc",
@@ -656,6 +663,7 @@ quiche_core_srcs = [
"src/quiche/quic/core/uber_quic_stream_id_manager.cc",
"src/quiche/quic/core/uber_received_packet_manager.cc",
"src/quiche/quic/platform/api/quic_ip_address.cc",
+ "src/quiche/quic/platform/api/quic_ip_address_family.cc",
"src/quiche/quic/platform/api/quic_socket_address.cc",
"src/quiche/spdy/core/array_output_buffer.cc",
"src/quiche/spdy/core/hpack/hpack_constants.cc",
@@ -666,13 +674,13 @@ quiche_core_srcs = [
"src/quiche/spdy/core/hpack/hpack_output_stream.cc",
"src/quiche/spdy/core/hpack/hpack_static_table.cc",
"src/quiche/spdy/core/http2_frame_decoder_adapter.cc",
+ "src/quiche/spdy/core/http2_header_block.cc",
+ "src/quiche/spdy/core/http2_header_storage.cc",
"src/quiche/spdy/core/metadata_extension.cc",
"src/quiche/spdy/core/recording_headers_handler.cc",
"src/quiche/spdy/core/spdy_alt_svc_wire_format.cc",
"src/quiche/spdy/core/spdy_frame_builder.cc",
"src/quiche/spdy/core/spdy_framer.cc",
- "src/quiche/spdy/core/spdy_header_block.cc",
- "src/quiche/spdy/core/spdy_header_storage.cc",
"src/quiche/spdy/core/spdy_no_op_visitor.cc",
"src/quiche/spdy/core/spdy_pinnable_buffer_piece.cc",
"src/quiche/spdy/core/spdy_prefixed_buffer_reader.cc",
@@ -685,10 +693,15 @@ quiche_tool_support_hdrs = [
"src/quiche/common/platform/api/quiche_file_utils.h",
"src/quiche/common/platform/api/quiche_system_event_loop.h",
"src/quiche/quic/platform/api/quic_default_proof_providers.h",
+ "src/quiche/quic/tools/connect_server_backend.h",
+ "src/quiche/quic/tools/connect_tunnel.h",
"src/quiche/quic/tools/fake_proof_verifier.h",
"src/quiche/quic/tools/quic_backend_response.h",
"src/quiche/quic/tools/quic_client_base.h",
+ "src/quiche/quic/tools/quic_client_default_network_helper.h",
+ "src/quiche/quic/tools/quic_default_client.h",
"src/quiche/quic/tools/quic_memory_cache_backend.h",
+ "src/quiche/quic/tools/quic_server_factory.h",
"src/quiche/quic/tools/quic_simple_client_session.h",
"src/quiche/quic/tools/quic_simple_client_stream.h",
"src/quiche/quic/tools/quic_simple_crypto_server_stream_helper.h",
@@ -705,9 +718,14 @@ quiche_tool_support_hdrs = [
]
quiche_tool_support_srcs = [
"src/quiche/common/platform/api/quiche_file_utils.cc",
+ "src/quiche/quic/tools/connect_server_backend.cc",
+ "src/quiche/quic/tools/connect_tunnel.cc",
"src/quiche/quic/tools/quic_backend_response.cc",
"src/quiche/quic/tools/quic_client_base.cc",
+ "src/quiche/quic/tools/quic_client_default_network_helper.cc",
+ "src/quiche/quic/tools/quic_default_client.cc",
"src/quiche/quic/tools/quic_memory_cache_backend.cc",
+ "src/quiche/quic/tools/quic_server_factory.cc",
"src/quiche/quic/tools/quic_simple_client_session.cc",
"src/quiche/quic/tools/quic_simple_client_stream.cc",
"src/quiche/quic/tools/quic_simple_crypto_server_stream_helper.cc",
@@ -770,7 +788,6 @@ quiche_test_support_hdrs = [
"src/quiche/quic/test_tools/packet_reordering_writer.h",
"src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h",
"src/quiche/quic/test_tools/qpack/qpack_encoder_peer.h",
- "src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h",
"src/quiche/quic/test_tools/qpack/qpack_offline_decoder.h",
"src/quiche/quic/test_tools/qpack/qpack_test_utils.h",
"src/quiche/quic/test_tools/quic_buffered_packet_store_peer.h",
@@ -818,6 +835,7 @@ quiche_test_support_hdrs = [
"src/quiche/quic/test_tools/simulator/quic_endpoint_base.h",
"src/quiche/quic/test_tools/simulator/simulator.h",
"src/quiche/quic/test_tools/simulator/switch.h",
+ "src/quiche/quic/test_tools/simulator/test_harness.h",
"src/quiche/quic/test_tools/simulator/traffic_policer.h",
"src/quiche/quic/test_tools/test_certificates.h",
"src/quiche/quic/test_tools/test_ticket_crypter.h",
@@ -868,7 +886,6 @@ quiche_test_support_srcs = [
"src/quiche/quic/test_tools/packet_reordering_writer.cc",
"src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc",
"src/quiche/quic/test_tools/qpack/qpack_encoder_peer.cc",
- "src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.cc",
"src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc",
"src/quiche/quic/test_tools/qpack/qpack_test_utils.cc",
"src/quiche/quic/test_tools/quic_buffered_packet_store_peer.cc",
@@ -912,6 +929,7 @@ quiche_test_support_srcs = [
"src/quiche/quic/test_tools/simulator/quic_endpoint_base.cc",
"src/quiche/quic/test_tools/simulator/simulator.cc",
"src/quiche/quic/test_tools/simulator/switch.cc",
+ "src/quiche/quic/test_tools/simulator/test_harness.cc",
"src/quiche/quic/test_tools/simulator/traffic_policer.cc",
"src/quiche/quic/test_tools/test_certificates.cc",
"src/quiche/quic/test_tools/test_ticket_crypter.cc",
@@ -921,6 +939,7 @@ quiche_test_support_srcs = [
]
epoll_tool_support_hdrs = [
"src/quiche/common/platform/api/quiche_epoll.h",
+ "src/quiche/common/platform/api/quiche_event_loop.h",
"src/quiche/common/platform/api/quiche_stream_buffer_allocator.h",
"src/quiche/common/platform/api/quiche_udp_socket_platform_api.h",
"src/quiche/epoll_server/platform/api/epoll_bug.h",
@@ -932,6 +951,14 @@ epoll_tool_support_hdrs = [
"src/quiche/quic/core/batch_writer/quic_batch_writer_test.h",
"src/quiche/quic/core/batch_writer/quic_gso_batch_writer.h",
"src/quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.h",
+ "src/quiche/quic/core/io/event_loop_socket_factory.h",
+ "src/quiche/quic/core/io/event_loop_tcp_client_socket.h",
+ "src/quiche/quic/core/io/quic_default_event_loop.h",
+ "src/quiche/quic/core/io/quic_event_loop.h",
+ "src/quiche/quic/core/io/quic_poll_event_loop.h",
+ "src/quiche/quic/core/io/socket.h",
+ "src/quiche/quic/core/io/socket_factory.h",
+ "src/quiche/quic/core/io/stream_client_socket.h",
"src/quiche/quic/core/quic_default_packet_writer.h",
"src/quiche/quic/core/quic_epoll_alarm_factory.h",
"src/quiche/quic/core/quic_epoll_clock.h",
@@ -962,6 +989,11 @@ epoll_tool_support_srcs = [
"src/quiche/quic/core/batch_writer/quic_batch_writer_buffer.cc",
"src/quiche/quic/core/batch_writer/quic_gso_batch_writer.cc",
"src/quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.cc",
+ "src/quiche/quic/core/io/event_loop_socket_factory.cc",
+ "src/quiche/quic/core/io/event_loop_tcp_client_socket.cc",
+ "src/quiche/quic/core/io/quic_default_event_loop.cc",
+ "src/quiche/quic/core/io/quic_poll_event_loop.cc",
+ "src/quiche/quic/core/io/socket_posix.cc",
"src/quiche/quic/core/quic_default_packet_writer.cc",
"src/quiche/quic/core/quic_epoll_alarm_factory.cc",
"src/quiche/quic/core/quic_epoll_clock.cc",
@@ -990,6 +1022,7 @@ epoll_test_support_hdrs = [
"src/quiche/epoll_server/platform/api/epoll_address_test_utils.h",
"src/quiche/epoll_server/platform/api/epoll_expect_bug.h",
"src/quiche/epoll_server/platform/api/epoll_test.h",
+ "src/quiche/quic/bindings/quic_libevent.h",
"src/quiche/quic/test_tools/quic_client_peer.h",
"src/quiche/quic/test_tools/quic_mock_syscall_wrapper.h",
"src/quiche/quic/test_tools/quic_server_peer.h",
@@ -999,6 +1032,7 @@ epoll_test_support_hdrs = [
]
epoll_test_support_srcs = [
"src/quiche/epoll_server/fake_simple_epoll_server.cc",
+ "src/quiche/quic/bindings/quic_libevent.cc",
"src/quiche/quic/test_tools/quic_client_peer.cc",
"src/quiche/quic/test_tools/quic_mock_syscall_wrapper.cc",
"src/quiche/quic/test_tools/quic_server_peer.cc",
@@ -1086,6 +1120,7 @@ quiche_tests_srcs = [
"src/quiche/http2/test_tools/http2_frame_builder_test.cc",
"src/quiche/http2/test_tools/http2_random_test.cc",
"src/quiche/http2/test_tools/random_decoder_test_base_test.cc",
+ "src/quiche/quic/bindings/quic_libevent_test.cc",
"src/quiche/quic/core/congestion_control/bandwidth_sampler_test.cc",
"src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc",
"src/quiche/quic/core/congestion_control/bbr_sender_test.cc",
@@ -1132,6 +1167,7 @@ quiche_tests_srcs = [
"src/quiche/quic/core/crypto/quic_random_test.cc",
"src/quiche/quic/core/crypto/transport_parameters_test.cc",
"src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier_test.cc",
+ "src/quiche/quic/core/deterministic_connection_id_generator_test.cc",
"src/quiche/quic/core/frames/quic_frames_test.cc",
"src/quiche/quic/core/http/capsule_test.cc",
"src/quiche/quic/core/http/http_decoder_test.cc",
@@ -1238,6 +1274,8 @@ quiche_tests_srcs = [
"src/quiche/quic/test_tools/simple_session_notifier_test.cc",
"src/quiche/quic/test_tools/simulator/quic_endpoint_test.cc",
"src/quiche/quic/test_tools/simulator/simulator_test.cc",
+ "src/quiche/quic/tools/connect_tunnel_test.cc",
+ "src/quiche/quic/tools/quic_default_client_test.cc",
"src/quiche/quic/tools/quic_memory_cache_backend_test.cc",
"src/quiche/quic/tools/quic_tcp_like_trace_converter_test.cc",
"src/quiche/quic/tools/simple_ticket_crypter_test.cc",
@@ -1249,12 +1287,12 @@ quiche_tests_srcs = [
"src/quiche/spdy/core/hpack/hpack_output_stream_test.cc",
"src/quiche/spdy/core/hpack/hpack_round_trip_test.cc",
"src/quiche/spdy/core/hpack/hpack_static_table_test.cc",
+ "src/quiche/spdy/core/http2_header_block_test.cc",
+ "src/quiche/spdy/core/http2_header_storage_test.cc",
"src/quiche/spdy/core/metadata_extension_test.cc",
"src/quiche/spdy/core/spdy_alt_svc_wire_format_test.cc",
"src/quiche/spdy/core/spdy_frame_builder_test.cc",
"src/quiche/spdy/core/spdy_framer_test.cc",
- "src/quiche/spdy/core/spdy_header_block_test.cc",
- "src/quiche/spdy/core/spdy_header_storage_test.cc",
"src/quiche/spdy/core/spdy_intrusive_list_test.cc",
"src/quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc",
"src/quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc",
@@ -1275,6 +1313,10 @@ epoll_tests_srcs = [
"src/quiche/quic/core/http/quic_spdy_client_session_test.cc",
"src/quiche/quic/core/http/quic_spdy_client_stream_test.cc",
"src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc",
+ "src/quiche/quic/core/io/event_loop_tcp_client_socket_test.cc",
+ "src/quiche/quic/core/io/quic_all_event_loops_test.cc",
+ "src/quiche/quic/core/io/quic_poll_event_loop_test.cc",
+ "src/quiche/quic/core/io/socket_test.cc",
"src/quiche/quic/core/quic_epoll_alarm_factory_test.cc",
"src/quiche/quic/core/quic_epoll_clock_test.cc",
"src/quiche/quic/core/quic_epoll_connection_helper_test.cc",
@@ -1303,7 +1345,6 @@ fuzzers_srcs = [
]
cli_tools_hdrs = [
"src/quiche/quic/tools/quic_epoll_client_factory.h",
- "src/quiche/quic/tools/quic_epoll_server_factory.h",
"src/quiche/quic/tools/quic_toy_client.h",
"src/quiche/quic/tools/quic_toy_server.h",
]
@@ -1315,7 +1356,6 @@ cli_tools_srcs = [
"src/quiche/quic/tools/quic_client_bin.cc",
"src/quiche/quic/tools/quic_client_interop_test_bin.cc",
"src/quiche/quic/tools/quic_epoll_client_factory.cc",
- "src/quiche/quic/tools/quic_epoll_server_factory.cc",
"src/quiche/quic/tools/quic_packet_printer_bin.cc",
"src/quiche/quic/tools/quic_reject_reason_decoder_bin.cc",
"src/quiche/quic/tools/quic_server_bin.cc",
@@ -1360,7 +1400,6 @@ nghttp2_tests_srcs = [
"src/quiche/http2/adapter/nghttp2_util_test.cc",
]
default_platform_impl_hdrs = [
- "src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.h",
"src/quiche/common/platform/default/quiche_platform_impl/quiche_bug_tracker_impl.h",
"src/quiche/common/platform/default/quiche_platform_impl/quiche_client_stats_impl.h",
"src/quiche/common/platform/default/quiche_platform_impl/quiche_containers_impl.h",
@@ -1383,7 +1422,6 @@ default_platform_impl_hdrs = [
"src/quiche/common/platform/default/quiche_platform_impl/quiche_url_utils_impl.h",
]
default_platform_impl_srcs = [
- "src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.cc",
"src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.cc",
"src/quiche/common/platform/default/quiche_platform_impl/quiche_mutex_impl.cc",
"src/quiche/common/platform/default/quiche_platform_impl/quiche_stack_trace_impl.cc",
@@ -1392,6 +1430,7 @@ default_platform_impl_srcs = [
]
default_platform_impl_tool_support_hdrs = [
"src/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h",
+ "src/quiche/common/platform/default/quiche_platform_impl/quiche_event_loop_impl.h",
"src/quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.h",
"src/quiche/common/platform/default/quiche_platform_impl/quiche_stream_buffer_allocator_impl.h",
"src/quiche/common/platform/default/quiche_platform_impl/quiche_system_event_loop_impl.h",
diff --git a/chromium/net/third_party/quiche/src/build/source_list.json b/chromium/net/third_party/quiche/src/build/source_list.json
index 37a1d63c7e9..6d14856e77a 100644
--- a/chromium/net/third_party/quiche/src/build/source_list.json
+++ b/chromium/net/third_party/quiche/src/build/source_list.json
@@ -49,6 +49,7 @@
"quiche/common/quiche_endian.h",
"quiche/common/quiche_linked_hash_map.h",
"quiche/common/quiche_mem_slice_storage.h",
+ "quiche/common/quiche_protocol_flags_list.h",
"quiche/common/quiche_text_utils.h",
"quiche/common/simple_buffer_allocator.h",
"quiche/common/structured_headers.h",
@@ -131,6 +132,7 @@
"quiche/quic/core/congestion_control/tcp_cubic_sender_bytes.h",
"quiche/quic/core/congestion_control/uber_loss_algorithm.h",
"quiche/quic/core/congestion_control/windowed_filter.h",
+ "quiche/quic/core/connection_id_generator.h",
"quiche/quic/core/crypto/aead_base_decrypter.h",
"quiche/quic/core/crypto/aead_base_encrypter.h",
"quiche/quic/core/crypto/aes_128_gcm_12_decrypter.h",
@@ -183,6 +185,7 @@
"quiche/quic/core/crypto/tls_server_connection.h",
"quiche/quic/core/crypto/transport_parameters.h",
"quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.h",
+ "quiche/quic/core/deterministic_connection_id_generator.h",
"quiche/quic/core/frames/quic_ack_frame.h",
"quiche/quic/core/frames/quic_ack_frequency_frame.h",
"quiche/quic/core/frames/quic_blocked_frame.h",
@@ -286,6 +289,8 @@
"quiche/quic/core/quic_data_reader.h",
"quiche/quic/core/quic_data_writer.h",
"quiche/quic/core/quic_datagram_queue.h",
+ "quiche/quic/core/quic_default_clock.h",
+ "quiche/quic/core/quic_default_connection_helper.h",
"quiche/quic/core/quic_dispatcher.h",
"quiche/quic/core/quic_error_codes.h",
"quiche/quic/core/quic_flags_list.h",
@@ -368,7 +373,9 @@
"quiche/spdy/core/hpack/hpack_output_stream.h",
"quiche/spdy/core/hpack/hpack_static_table.h",
"quiche/spdy/core/http2_frame_decoder_adapter.h",
+ "quiche/spdy/core/http2_header_block.h",
"quiche/spdy/core/http2_header_block_hpack_listener.h",
+ "quiche/spdy/core/http2_header_storage.h",
"quiche/spdy/core/metadata_extension.h",
"quiche/spdy/core/no_op_headers_handler.h",
"quiche/spdy/core/recording_headers_handler.h",
@@ -376,8 +383,6 @@
"quiche/spdy/core/spdy_bitmasks.h",
"quiche/spdy/core/spdy_frame_builder.h",
"quiche/spdy/core/spdy_framer.h",
- "quiche/spdy/core/spdy_header_block.h",
- "quiche/spdy/core/spdy_header_storage.h",
"quiche/spdy/core/spdy_headers_handler_interface.h",
"quiche/spdy/core/spdy_intrusive_list.h",
"quiche/spdy/core/spdy_no_op_visitor.h",
@@ -522,6 +527,7 @@
"quiche/quic/core/crypto/tls_server_connection.cc",
"quiche/quic/core/crypto/transport_parameters.cc",
"quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.cc",
+ "quiche/quic/core/deterministic_connection_id_generator.cc",
"quiche/quic/core/frames/quic_ack_frame.cc",
"quiche/quic/core/frames/quic_ack_frequency_frame.cc",
"quiche/quic/core/frames/quic_blocked_frame.cc",
@@ -612,6 +618,7 @@
"quiche/quic/core/quic_data_reader.cc",
"quiche/quic/core/quic_data_writer.cc",
"quiche/quic/core/quic_datagram_queue.cc",
+ "quiche/quic/core/quic_default_clock.cc",
"quiche/quic/core/quic_dispatcher.cc",
"quiche/quic/core/quic_error_codes.cc",
"quiche/quic/core/quic_flow_controller.cc",
@@ -655,6 +662,7 @@
"quiche/quic/core/uber_quic_stream_id_manager.cc",
"quiche/quic/core/uber_received_packet_manager.cc",
"quiche/quic/platform/api/quic_ip_address.cc",
+ "quiche/quic/platform/api/quic_ip_address_family.cc",
"quiche/quic/platform/api/quic_socket_address.cc",
"quiche/spdy/core/array_output_buffer.cc",
"quiche/spdy/core/hpack/hpack_constants.cc",
@@ -665,13 +673,13 @@
"quiche/spdy/core/hpack/hpack_output_stream.cc",
"quiche/spdy/core/hpack/hpack_static_table.cc",
"quiche/spdy/core/http2_frame_decoder_adapter.cc",
+ "quiche/spdy/core/http2_header_block.cc",
+ "quiche/spdy/core/http2_header_storage.cc",
"quiche/spdy/core/metadata_extension.cc",
"quiche/spdy/core/recording_headers_handler.cc",
"quiche/spdy/core/spdy_alt_svc_wire_format.cc",
"quiche/spdy/core/spdy_frame_builder.cc",
"quiche/spdy/core/spdy_framer.cc",
- "quiche/spdy/core/spdy_header_block.cc",
- "quiche/spdy/core/spdy_header_storage.cc",
"quiche/spdy/core/spdy_no_op_visitor.cc",
"quiche/spdy/core/spdy_pinnable_buffer_piece.cc",
"quiche/spdy/core/spdy_prefixed_buffer_reader.cc",
@@ -684,10 +692,15 @@
"quiche/common/platform/api/quiche_file_utils.h",
"quiche/common/platform/api/quiche_system_event_loop.h",
"quiche/quic/platform/api/quic_default_proof_providers.h",
+ "quiche/quic/tools/connect_server_backend.h",
+ "quiche/quic/tools/connect_tunnel.h",
"quiche/quic/tools/fake_proof_verifier.h",
"quiche/quic/tools/quic_backend_response.h",
"quiche/quic/tools/quic_client_base.h",
+ "quiche/quic/tools/quic_client_default_network_helper.h",
+ "quiche/quic/tools/quic_default_client.h",
"quiche/quic/tools/quic_memory_cache_backend.h",
+ "quiche/quic/tools/quic_server_factory.h",
"quiche/quic/tools/quic_simple_client_session.h",
"quiche/quic/tools/quic_simple_client_stream.h",
"quiche/quic/tools/quic_simple_crypto_server_stream_helper.h",
@@ -704,9 +717,14 @@
],
"quiche_tool_support_srcs": [
"quiche/common/platform/api/quiche_file_utils.cc",
+ "quiche/quic/tools/connect_server_backend.cc",
+ "quiche/quic/tools/connect_tunnel.cc",
"quiche/quic/tools/quic_backend_response.cc",
"quiche/quic/tools/quic_client_base.cc",
+ "quiche/quic/tools/quic_client_default_network_helper.cc",
+ "quiche/quic/tools/quic_default_client.cc",
"quiche/quic/tools/quic_memory_cache_backend.cc",
+ "quiche/quic/tools/quic_server_factory.cc",
"quiche/quic/tools/quic_simple_client_session.cc",
"quiche/quic/tools/quic_simple_client_stream.cc",
"quiche/quic/tools/quic_simple_crypto_server_stream_helper.cc",
@@ -769,7 +787,6 @@
"quiche/quic/test_tools/packet_reordering_writer.h",
"quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h",
"quiche/quic/test_tools/qpack/qpack_encoder_peer.h",
- "quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h",
"quiche/quic/test_tools/qpack/qpack_offline_decoder.h",
"quiche/quic/test_tools/qpack/qpack_test_utils.h",
"quiche/quic/test_tools/quic_buffered_packet_store_peer.h",
@@ -817,6 +834,7 @@
"quiche/quic/test_tools/simulator/quic_endpoint_base.h",
"quiche/quic/test_tools/simulator/simulator.h",
"quiche/quic/test_tools/simulator/switch.h",
+ "quiche/quic/test_tools/simulator/test_harness.h",
"quiche/quic/test_tools/simulator/traffic_policer.h",
"quiche/quic/test_tools/test_certificates.h",
"quiche/quic/test_tools/test_ticket_crypter.h",
@@ -867,7 +885,6 @@
"quiche/quic/test_tools/packet_reordering_writer.cc",
"quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc",
"quiche/quic/test_tools/qpack/qpack_encoder_peer.cc",
- "quiche/quic/test_tools/qpack/qpack_encoder_test_utils.cc",
"quiche/quic/test_tools/qpack/qpack_offline_decoder.cc",
"quiche/quic/test_tools/qpack/qpack_test_utils.cc",
"quiche/quic/test_tools/quic_buffered_packet_store_peer.cc",
@@ -911,6 +928,7 @@
"quiche/quic/test_tools/simulator/quic_endpoint_base.cc",
"quiche/quic/test_tools/simulator/simulator.cc",
"quiche/quic/test_tools/simulator/switch.cc",
+ "quiche/quic/test_tools/simulator/test_harness.cc",
"quiche/quic/test_tools/simulator/traffic_policer.cc",
"quiche/quic/test_tools/test_certificates.cc",
"quiche/quic/test_tools/test_ticket_crypter.cc",
@@ -920,6 +938,7 @@
],
"epoll_tool_support_hdrs": [
"quiche/common/platform/api/quiche_epoll.h",
+ "quiche/common/platform/api/quiche_event_loop.h",
"quiche/common/platform/api/quiche_stream_buffer_allocator.h",
"quiche/common/platform/api/quiche_udp_socket_platform_api.h",
"quiche/epoll_server/platform/api/epoll_bug.h",
@@ -931,6 +950,14 @@
"quiche/quic/core/batch_writer/quic_batch_writer_test.h",
"quiche/quic/core/batch_writer/quic_gso_batch_writer.h",
"quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.h",
+ "quiche/quic/core/io/event_loop_socket_factory.h",
+ "quiche/quic/core/io/event_loop_tcp_client_socket.h",
+ "quiche/quic/core/io/quic_default_event_loop.h",
+ "quiche/quic/core/io/quic_event_loop.h",
+ "quiche/quic/core/io/quic_poll_event_loop.h",
+ "quiche/quic/core/io/socket.h",
+ "quiche/quic/core/io/socket_factory.h",
+ "quiche/quic/core/io/stream_client_socket.h",
"quiche/quic/core/quic_default_packet_writer.h",
"quiche/quic/core/quic_epoll_alarm_factory.h",
"quiche/quic/core/quic_epoll_clock.h",
@@ -961,6 +988,11 @@
"quiche/quic/core/batch_writer/quic_batch_writer_buffer.cc",
"quiche/quic/core/batch_writer/quic_gso_batch_writer.cc",
"quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.cc",
+ "quiche/quic/core/io/event_loop_socket_factory.cc",
+ "quiche/quic/core/io/event_loop_tcp_client_socket.cc",
+ "quiche/quic/core/io/quic_default_event_loop.cc",
+ "quiche/quic/core/io/quic_poll_event_loop.cc",
+ "quiche/quic/core/io/socket_posix.cc",
"quiche/quic/core/quic_default_packet_writer.cc",
"quiche/quic/core/quic_epoll_alarm_factory.cc",
"quiche/quic/core/quic_epoll_clock.cc",
@@ -989,6 +1021,7 @@
"quiche/epoll_server/platform/api/epoll_address_test_utils.h",
"quiche/epoll_server/platform/api/epoll_expect_bug.h",
"quiche/epoll_server/platform/api/epoll_test.h",
+ "quiche/quic/bindings/quic_libevent.h",
"quiche/quic/test_tools/quic_client_peer.h",
"quiche/quic/test_tools/quic_mock_syscall_wrapper.h",
"quiche/quic/test_tools/quic_server_peer.h",
@@ -998,6 +1031,7 @@
],
"epoll_test_support_srcs": [
"quiche/epoll_server/fake_simple_epoll_server.cc",
+ "quiche/quic/bindings/quic_libevent.cc",
"quiche/quic/test_tools/quic_client_peer.cc",
"quiche/quic/test_tools/quic_mock_syscall_wrapper.cc",
"quiche/quic/test_tools/quic_server_peer.cc",
@@ -1085,6 +1119,7 @@
"quiche/http2/test_tools/http2_frame_builder_test.cc",
"quiche/http2/test_tools/http2_random_test.cc",
"quiche/http2/test_tools/random_decoder_test_base_test.cc",
+ "quiche/quic/bindings/quic_libevent_test.cc",
"quiche/quic/core/congestion_control/bandwidth_sampler_test.cc",
"quiche/quic/core/congestion_control/bbr2_simulator_test.cc",
"quiche/quic/core/congestion_control/bbr_sender_test.cc",
@@ -1131,6 +1166,7 @@
"quiche/quic/core/crypto/quic_random_test.cc",
"quiche/quic/core/crypto/transport_parameters_test.cc",
"quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier_test.cc",
+ "quiche/quic/core/deterministic_connection_id_generator_test.cc",
"quiche/quic/core/frames/quic_frames_test.cc",
"quiche/quic/core/http/capsule_test.cc",
"quiche/quic/core/http/http_decoder_test.cc",
@@ -1237,6 +1273,8 @@
"quiche/quic/test_tools/simple_session_notifier_test.cc",
"quiche/quic/test_tools/simulator/quic_endpoint_test.cc",
"quiche/quic/test_tools/simulator/simulator_test.cc",
+ "quiche/quic/tools/connect_tunnel_test.cc",
+ "quiche/quic/tools/quic_default_client_test.cc",
"quiche/quic/tools/quic_memory_cache_backend_test.cc",
"quiche/quic/tools/quic_tcp_like_trace_converter_test.cc",
"quiche/quic/tools/simple_ticket_crypter_test.cc",
@@ -1248,12 +1286,12 @@
"quiche/spdy/core/hpack/hpack_output_stream_test.cc",
"quiche/spdy/core/hpack/hpack_round_trip_test.cc",
"quiche/spdy/core/hpack/hpack_static_table_test.cc",
+ "quiche/spdy/core/http2_header_block_test.cc",
+ "quiche/spdy/core/http2_header_storage_test.cc",
"quiche/spdy/core/metadata_extension_test.cc",
"quiche/spdy/core/spdy_alt_svc_wire_format_test.cc",
"quiche/spdy/core/spdy_frame_builder_test.cc",
"quiche/spdy/core/spdy_framer_test.cc",
- "quiche/spdy/core/spdy_header_block_test.cc",
- "quiche/spdy/core/spdy_header_storage_test.cc",
"quiche/spdy/core/spdy_intrusive_list_test.cc",
"quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc",
"quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc",
@@ -1274,6 +1312,10 @@
"quiche/quic/core/http/quic_spdy_client_session_test.cc",
"quiche/quic/core/http/quic_spdy_client_stream_test.cc",
"quiche/quic/core/http/quic_spdy_server_stream_base_test.cc",
+ "quiche/quic/core/io/event_loop_tcp_client_socket_test.cc",
+ "quiche/quic/core/io/quic_all_event_loops_test.cc",
+ "quiche/quic/core/io/quic_poll_event_loop_test.cc",
+ "quiche/quic/core/io/socket_test.cc",
"quiche/quic/core/quic_epoll_alarm_factory_test.cc",
"quiche/quic/core/quic_epoll_clock_test.cc",
"quiche/quic/core/quic_epoll_connection_helper_test.cc",
@@ -1302,7 +1344,6 @@
],
"cli_tools_hdrs": [
"quiche/quic/tools/quic_epoll_client_factory.h",
- "quiche/quic/tools/quic_epoll_server_factory.h",
"quiche/quic/tools/quic_toy_client.h",
"quiche/quic/tools/quic_toy_server.h"
],
@@ -1314,7 +1355,6 @@
"quiche/quic/tools/quic_client_bin.cc",
"quiche/quic/tools/quic_client_interop_test_bin.cc",
"quiche/quic/tools/quic_epoll_client_factory.cc",
- "quiche/quic/tools/quic_epoll_server_factory.cc",
"quiche/quic/tools/quic_packet_printer_bin.cc",
"quiche/quic/tools/quic_reject_reason_decoder_bin.cc",
"quiche/quic/tools/quic_server_bin.cc",
@@ -1359,7 +1399,6 @@
"quiche/http2/adapter/nghttp2_util_test.cc"
],
"default_platform_impl_hdrs": [
- "quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.h",
"quiche/common/platform/default/quiche_platform_impl/quiche_bug_tracker_impl.h",
"quiche/common/platform/default/quiche_platform_impl/quiche_client_stats_impl.h",
"quiche/common/platform/default/quiche_platform_impl/quiche_containers_impl.h",
@@ -1382,7 +1421,6 @@
"quiche/common/platform/default/quiche_platform_impl/quiche_url_utils_impl.h"
],
"default_platform_impl_srcs": [
- "quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.cc",
"quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.cc",
"quiche/common/platform/default/quiche_platform_impl/quiche_mutex_impl.cc",
"quiche/common/platform/default/quiche_platform_impl/quiche_stack_trace_impl.cc",
@@ -1391,6 +1429,7 @@
],
"default_platform_impl_tool_support_hdrs": [
"quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h",
+ "quiche/common/platform/default/quiche_platform_impl/quiche_event_loop_impl.h",
"quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.h",
"quiche/common/platform/default/quiche_platform_impl/quiche_stream_buffer_allocator_impl.h",
"quiche/common/platform/default/quiche_platform_impl/quiche_system_event_loop_impl.h"
diff --git a/chromium/net/third_party/quiche/src/quiche/BUILD.bazel b/chromium/net/third_party/quiche/src/quiche/BUILD.bazel
index 6650f84a21a..f372de77d57 100644
--- a/chromium/net/third_party/quiche/src/quiche/BUILD.bazel
+++ b/chromium/net/third_party/quiche/src/quiche/BUILD.bazel
@@ -156,6 +156,7 @@ cc_library(
"@com_google_absl//absl/numeric:int128",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:str_format",
+ "@com_google_absl//absl/time",
"@com_google_absl//absl/types:optional",
"@com_google_absl//absl/types:span",
"@com_google_googleurl//url",
diff --git a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.cc b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.cc
index d80b4baf574..8e693cbfd07 100644
--- a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.cc
+++ b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.cc
@@ -447,6 +447,15 @@ bool BalsaFrame::FindColonsAndParseIntoKeyValue(const Lines& lines,
CleanUpKeyValueWhitespace(stream_begin, line_begin, current, line_end,
&current_header_line);
}
+
+ const absl::string_view key(
+ stream_begin + current_header_line.first_char_idx,
+ current_header_line.key_end_idx - current_header_line.first_char_idx);
+ const absl::string_view value(
+ stream_begin + current_header_line.value_begin_idx,
+ current_header_line.last_char_idx -
+ current_header_line.value_begin_idx);
+ visitor_->OnHeader(key, value);
}
return true;
diff --git a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.h b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.h
index 230bf66e17e..70d3aafcc08 100644
--- a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.h
+++ b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame.h
@@ -19,6 +19,7 @@
#include "quiche/balsa/noop_balsa_visitor.h"
#include "quiche/common/platform/api/quiche_bug_tracker.h"
#include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/platform/api/quiche_flag_utils.h"
namespace quiche {
@@ -104,15 +105,13 @@ class QUICHE_EXPORT_PRIVATE BalsaFrame : public FramerInterface {
}
}
- // The method set_balsa_trailer clears the trailer provided and attaches it
- // to the framer. This is a required step before the framer will process any
- // input message data.
- // To detach the trailer object from the framer, use
+ // The method set_balsa_trailer() clears `trailer` and attaches it to the
+ // framer. This is a required step before the framer will process any input
+ // message data. To detach the trailer object from the framer, use
// set_balsa_trailer(nullptr).
void set_balsa_trailer(BalsaHeaders* trailer) {
if (trailer != nullptr && is_request()) {
- QUICHE_BUG(bug_1317_1) << "Trailer in request is not allowed.";
- return;
+ QUICHE_CODE_COUNT(balsa_trailer_in_request);
}
if (trailer_ != trailer) {
diff --git a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc
index 1ce4c7b540f..4618bbcf3b2 100644
--- a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc
@@ -539,6 +539,8 @@ class BalsaVisitorMock : public BalsaVisitorInterface {
MOCK_METHOD(void, OnRawBodyInput, (absl::string_view input), (override));
MOCK_METHOD(void, OnBodyChunkInput, (absl::string_view input), (override));
MOCK_METHOD(void, OnHeaderInput, (absl::string_view input), (override));
+ MOCK_METHOD(void, OnHeader, (absl::string_view key, absl::string_view value),
+ (override));
MOCK_METHOD(void, OnTrailerInput, (absl::string_view input), (override));
MOCK_METHOD(void, ProcessHeaders, (const FakeHeaders& headers));
MOCK_METHOD(void, ProcessTrailers, (const FakeHeaders& headers));
@@ -577,8 +579,11 @@ class HTTPBalsaFrameTest : public QuicheTest {
balsa_frame_.set_http_validation_policy(
HttpValidationPolicy::CreateDefault());
balsa_frame_.set_balsa_headers(&headers_);
+ balsa_frame_.set_balsa_trailer(&trailer_);
balsa_frame_.set_balsa_visitor(&visitor_mock_);
balsa_frame_.set_is_request(true);
+
+ EXPECT_CALL(visitor_mock_, OnHeader).Times(AnyNumber());
}
void VerifyFirstLineParsing(const std::string& firstline,
@@ -1197,6 +1202,60 @@ TEST_F(HTTPBalsaFrameTest, NothingBadHappensWhenNoVisitorIsAssigned) {
balsa_frame_.ProcessInput(trailer.data(), trailer.size()));
EXPECT_TRUE(balsa_frame_.MessageFullyRead());
EXPECT_EQ(BalsaFrameEnums::BALSA_NO_ERROR, balsa_frame_.ErrorCode());
+ const absl::string_view crass = trailer_.GetHeader("crass");
+ EXPECT_EQ("monkeys", crass);
+ const absl::string_view funky = trailer_.GetHeader("funky");
+ EXPECT_EQ("monkeys", funky);
+}
+
+TEST_F(HTTPBalsaFrameTest, RequestWithTrailers) {
+ std::string headers =
+ "GET / HTTP/1.1\r\n"
+ "Connection: close\r\n"
+ "transfer-encoding: chunked\r\n"
+ "\r\n";
+
+ std::string chunks =
+ "3\r\n"
+ "123\r\n"
+ "0\r\n";
+ std::string trailer =
+ "crass: monkeys\r\n"
+ "funky: monkeys\r\n"
+ "\r\n";
+
+ InSequence s;
+
+ // OnHeader() visitor method is called as soon as headers are parsed.
+ EXPECT_CALL(visitor_mock_, OnHeader("Connection", "close"));
+ EXPECT_CALL(visitor_mock_, OnHeader("transfer-encoding", "chunked"));
+ ASSERT_EQ(headers.size(),
+ balsa_frame_.ProcessInput(headers.data(), headers.size()));
+ testing::Mock::VerifyAndClearExpectations(&visitor_mock_);
+
+ ASSERT_EQ(chunks.size(),
+ balsa_frame_.ProcessInput(chunks.data(), chunks.size()));
+
+ EXPECT_CALL(visitor_mock_, OnHeader("crass", "monkeys"));
+ EXPECT_CALL(visitor_mock_, OnHeader("funky", "monkeys"));
+
+ FakeHeaders fake_trailers;
+ fake_trailers.AddKeyValue("crass", "monkeys");
+ fake_trailers.AddKeyValue("funky", "monkeys");
+ EXPECT_CALL(visitor_mock_, ProcessTrailers(fake_trailers));
+
+ EXPECT_CALL(visitor_mock_, OnTrailerInput(_)).Times(AtLeast(1));
+
+ EXPECT_EQ(trailer.size(),
+ balsa_frame_.ProcessInput(trailer.data(), trailer.size()));
+
+ EXPECT_TRUE(balsa_frame_.MessageFullyRead());
+ EXPECT_EQ(BalsaFrameEnums::BALSA_NO_ERROR, balsa_frame_.ErrorCode());
+
+ const absl::string_view crass = trailer_.GetHeader("crass");
+ EXPECT_EQ("monkeys", crass);
+ const absl::string_view funky = trailer_.GetHeader("funky");
+ EXPECT_EQ("monkeys", funky);
}
TEST_F(HTTPBalsaFrameTest, NothingBadHappensWhenNoVisitorIsAssignedInResponse) {
@@ -1215,7 +1274,6 @@ TEST_F(HTTPBalsaFrameTest, NothingBadHappensWhenNoVisitorIsAssignedInResponse) {
"funky: monkeys\r\n"
"\r\n";
balsa_frame_.set_is_request(false);
- balsa_frame_.set_balsa_trailer(&trailer_);
balsa_frame_.set_balsa_visitor(nullptr);
ASSERT_EQ(headers.size(),
@@ -1297,7 +1355,6 @@ TEST_F(HTTPBalsaFrameTest,
"\n";
balsa_frame_.set_is_request(false);
- balsa_frame_.set_balsa_trailer(&trailer_);
ASSERT_EQ(headers.size(),
balsa_frame_.ProcessInput(headers.data(), headers.size()));
@@ -2128,7 +2185,6 @@ TEST_F(HTTPBalsaFrameTest,
fake_headers_in_trailer.AddKeyValue("a_trailer_key", "and a trailer value");
balsa_frame_.set_is_request(false);
- balsa_frame_.set_balsa_trailer(&trailer_);
{
InSequence s1;
@@ -2201,7 +2257,6 @@ TEST_F(
fake_headers_in_trailer.AddKeyValue("a_trailer_key", "and a trailer value");
balsa_frame_.set_is_request(false);
- balsa_frame_.set_balsa_trailer(&trailer_);
{
InSequence s1;
@@ -2296,8 +2351,10 @@ TEST(HTTPBalsaFrame,
EXPECT_CALL(visitor_mock, OnResponseFirstLineInput(
"HTTP/1.1 \t 200 Ok all is well",
"HTTP/1.1", "200", "Ok all is well"));
+ EXPECT_CALL(visitor_mock, OnHeader);
EXPECT_CALL(visitor_mock, ProcessHeaders(fake_headers));
EXPECT_CALL(visitor_mock, HeaderDone());
+ EXPECT_CALL(visitor_mock, OnHeader);
EXPECT_CALL(visitor_mock, ProcessTrailers(fake_headers_in_trailer));
EXPECT_CALL(visitor_mock, MessageDone());
}
@@ -2346,9 +2403,8 @@ TEST(HTTPBalsaFrame,
TEST_F(HTTPBalsaFrameTest,
AppropriateActionTakenWhenHeadersTooLongWithTooMuchInput) {
- std::string message =
- "GET /asflkasfdhjsafdkljhasfdlkjhasdflkjhsafdlkjhh HTTP/1.1\r\n"
- "\r\n";
+ const absl::string_view message =
+ "GET /asflkasfdhjsafdkljhasfdlkjhasdflkjhsafdlkjhh HTTP/1.1";
const size_t kAmountLessThanHeaderLen = 10;
ASSERT_LE(kAmountLessThanHeaderLen, message.size());
@@ -2420,6 +2476,7 @@ class BalsaFrameParsingTest : public QuicheTest {
EXPECT_CALL(visitor_mock_, OnRequestFirstLineInput("GET / HTTP/1.1", "GET",
"/", "HTTP/1.1"));
EXPECT_CALL(visitor_mock_, OnHeaderInput(_));
+ EXPECT_CALL(visitor_mock_, OnHeader).Times(AnyNumber());
EXPECT_CALL(visitor_mock_,
HandleError(BalsaFrameEnums::INVALID_HEADER_FORMAT));
@@ -2448,6 +2505,7 @@ class BalsaFrameParsingTest : public QuicheTest {
EXPECT_CALL(visitor_mock_, OnResponseFirstLineInput);
EXPECT_CALL(visitor_mock_, OnHeaderInput);
+ EXPECT_CALL(visitor_mock_, OnHeader).Times(AnyNumber());
EXPECT_CALL(visitor_mock_, ProcessHeaders);
EXPECT_CALL(visitor_mock_, HeaderDone);
EXPECT_CALL(visitor_mock_, OnChunkLength(3));
@@ -2458,6 +2516,7 @@ class BalsaFrameParsingTest : public QuicheTest {
EXPECT_CALL(visitor_mock_, OnChunkExtensionInput);
EXPECT_CALL(visitor_mock_, OnRawBodyInput);
EXPECT_CALL(visitor_mock_, OnRawBodyInput);
+ EXPECT_CALL(visitor_mock_, OnHeader).Times(AnyNumber());
const auto expected_error =
invalid_name_char ? BalsaFrameEnums::INVALID_TRAILER_NAME_CHARACTER
: BalsaFrameEnums::INVALID_TRAILER_FORMAT;
@@ -2525,6 +2584,8 @@ TEST_F(BalsaFrameParsingTest, AppropriateActionTakenWhenHeaderColonsAreFunny) {
EXPECT_CALL(visitor_mock_, OnRequestFirstLineInput("GET / HTTP/1.1", "GET",
"/", "HTTP/1.1"));
EXPECT_CALL(visitor_mock_, OnHeaderInput(_));
+ EXPECT_CALL(visitor_mock_, OnHeader("i", ""));
+ EXPECT_CALL(visitor_mock_, OnHeader("", "val"));
EXPECT_CALL(visitor_mock_,
HandleWarning(BalsaFrameEnums::HEADER_MISSING_COLON))
.Times(27);
@@ -3123,7 +3184,6 @@ TEST_F(HTTPBalsaFrameTest, TrailerMissingColon) {
"\r\n";
balsa_frame_.set_is_request(false);
- balsa_frame_.set_balsa_trailer(&trailer_);
EXPECT_CALL(visitor_mock_,
HandleWarning(BalsaFrameEnums::TRAILER_MISSING_COLON));
ASSERT_EQ(headers.size(),
@@ -3215,7 +3275,6 @@ TEST_F(HTTPBalsaFrameTest, MultipleHeadersInTrailer) {
EXPECT_CALL(visitor_mock_, OnBodyChunkInput("123"));
balsa_frame_.set_is_request(false);
- balsa_frame_.set_balsa_trailer(&trailer_);
ASSERT_EQ(headers.size(),
balsa_frame_.ProcessInput(headers.data(), headers.size()));
@@ -3282,7 +3341,6 @@ TEST_F(HTTPBalsaFrameTest, FrameAndResetAndFrameAgain) {
"\n";
balsa_frame_.set_is_request(false);
- balsa_frame_.set_balsa_trailer(&trailer_);
balsa_frame_.set_balsa_visitor(nullptr);
ASSERT_EQ(headers.size(),
@@ -3513,7 +3571,6 @@ TEST_F(HTTPBalsaFrameTest, GibberishInHeadersAndTrailer) {
std::string trailer = absl::StrCat("k: v\n", gibberish_headers, "\n");
balsa_frame_.set_is_request(false);
- balsa_frame_.set_balsa_trailer(&trailer_);
balsa_frame_.set_balsa_visitor(nullptr);
ASSERT_EQ(headers.size(),
@@ -3541,12 +3598,6 @@ TEST_F(HTTPBalsaFrameTest, GibberishInHeadersAndTrailer) {
EXPECT_EQ("bar : eeep : baz", field_value);
}
-// Test that trailer is not allowed for request.
-TEST_F(HTTPBalsaFrameTest, TrailerIsNotAllowedInRequest) {
- EXPECT_QUICHE_BUG(balsa_frame_.set_balsa_trailer(&trailer_),
- "Trailer in request is not allowed");
-}
-
// Note we reuse the header length limit because trailer is just multiple
// headers.
TEST_F(HTTPBalsaFrameTest, TrailerTooLong) {
@@ -3566,7 +3617,6 @@ TEST_F(HTTPBalsaFrameTest, TrailerTooLong) {
"\r\n";
balsa_frame_.set_is_request(false);
- balsa_frame_.set_balsa_trailer(&trailer_);
ASSERT_LT(headers.size(), trailer.size());
balsa_frame_.set_max_header_length(headers.size());
@@ -3584,8 +3634,8 @@ TEST_F(HTTPBalsaFrameTest, TrailerTooLong) {
EXPECT_EQ(BalsaFrameEnums::TRAILER_TOO_LONG, balsa_frame_.ErrorCode());
}
-// If the trailer_ object in the framer is not set, ProcessTrailers won't be
-// called.
+// If the `trailer_` object in the framer is set to `nullptr`,
+// ProcessTrailers() will not be called.
TEST_F(HTTPBalsaFrameTest,
NoProcessTrailersCallWhenFramerHasNullTrailerObject) {
std::string headers =
@@ -3602,6 +3652,7 @@ TEST_F(HTTPBalsaFrameTest,
"\r\n";
balsa_frame_.set_is_request(false);
+ balsa_frame_.set_balsa_trailer(nullptr);
EXPECT_CALL(visitor_mock_, ProcessTrailers(_)).Times(0);
ASSERT_EQ(headers.size(),
diff --git a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_headers.h b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_headers.h
index a730649618c..1420f4a0cc6 100644
--- a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_headers.h
+++ b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_headers.h
@@ -366,7 +366,43 @@ class QUICHE_EXPORT_PRIVATE BalsaHeaders : public HeaderApi {
public:
// Each header line is parsed into a HeaderLineDescription, which maintains
// pointers into the BalsaBuffer.
- struct HeaderLineDescription;
+ //
+ // Succinctly describes one header line as indices into a buffer.
+ struct QUICHE_EXPORT_PRIVATE HeaderLineDescription {
+ HeaderLineDescription(size_t first_character_index, size_t key_end_index,
+ size_t value_begin_index, size_t last_character_index,
+ size_t buffer_base_index)
+ : first_char_idx(first_character_index),
+ key_end_idx(key_end_index),
+ value_begin_idx(value_begin_index),
+ last_char_idx(last_character_index),
+ buffer_base_idx(buffer_base_index),
+ skip(false) {}
+
+ HeaderLineDescription()
+ : first_char_idx(0),
+ key_end_idx(0),
+ value_begin_idx(0),
+ last_char_idx(0),
+ buffer_base_idx(0),
+ skip(false) {}
+
+ size_t KeyLength() const {
+ QUICHE_DCHECK_GE(key_end_idx, first_char_idx);
+ return key_end_idx - first_char_idx;
+ }
+ size_t ValuesLength() const {
+ QUICHE_DCHECK_GE(last_char_idx, value_begin_idx);
+ return last_char_idx - value_begin_idx;
+ }
+
+ size_t first_char_idx;
+ size_t key_end_idx;
+ size_t value_begin_idx;
+ size_t last_char_idx;
+ BalsaBuffer::Blocks::size_type buffer_base_idx;
+ bool skip;
+ };
using HeaderTokenList = std::vector<absl::string_view>;
@@ -1142,43 +1178,6 @@ class QUICHE_EXPORT_PRIVATE BalsaHeaders : public HeaderApi {
HeaderLines header_lines_;
};
-// Succinctly describes one header line as indices into a buffer.
-struct QUICHE_EXPORT_PRIVATE BalsaHeaders::HeaderLineDescription {
- HeaderLineDescription(size_t first_character_index, size_t key_end_index,
- size_t value_begin_index, size_t last_character_index,
- size_t buffer_base_index)
- : first_char_idx(first_character_index),
- key_end_idx(key_end_index),
- value_begin_idx(value_begin_index),
- last_char_idx(last_character_index),
- buffer_base_idx(buffer_base_index),
- skip(false) {}
-
- HeaderLineDescription()
- : first_char_idx(0),
- key_end_idx(0),
- value_begin_idx(0),
- last_char_idx(0),
- buffer_base_idx(0),
- skip(false) {}
-
- size_t KeyLength() const {
- QUICHE_DCHECK_GE(key_end_idx, first_char_idx);
- return key_end_idx - first_char_idx;
- }
- size_t ValuesLength() const {
- QUICHE_DCHECK_GE(last_char_idx, value_begin_idx);
- return last_char_idx - value_begin_idx;
- }
-
- size_t first_char_idx;
- size_t key_end_idx;
- size_t value_begin_idx;
- size_t last_char_idx;
- BalsaBuffer::Blocks::size_type buffer_base_idx;
- bool skip;
-};
-
// Base class for iterating the headers in a BalsaHeaders object, returning a
// pair of string_view's for each header.
class QUICHE_EXPORT_PRIVATE BalsaHeaders::iterator_base
diff --git a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_visitor_interface.h b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_visitor_interface.h
index b05d7ad05c4..7dc9de7205d 100644
--- a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_visitor_interface.h
+++ b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_visitor_interface.h
@@ -51,6 +51,14 @@ class QUICHE_EXPORT_PRIVATE BalsaVisitorInterface {
virtual void OnHeaderInput(absl::string_view input) = 0;
// Summary:
+ // BalsaFrame passes each header through this function as soon as it is
+ // parsed.
+ // Argument:
+ // key - the header name.
+ // value - the associated header value.
+ virtual void OnHeader(absl::string_view key, absl::string_view value) = 0;
+
+ // Summary:
// BalsaFrame passes the raw trailer data through this function. This is not
// cleaned up in any way. Note that trailers only occur in a message if
// there was a chunked encoding, and not always then.
diff --git a/chromium/net/third_party/quiche/src/quiche/balsa/noop_balsa_visitor.h b/chromium/net/third_party/quiche/src/quiche/balsa/noop_balsa_visitor.h
index bedd948c6aa..4045cf86d25 100644
--- a/chromium/net/third_party/quiche/src/quiche/balsa/noop_balsa_visitor.h
+++ b/chromium/net/third_party/quiche/src/quiche/balsa/noop_balsa_visitor.h
@@ -30,6 +30,8 @@ class QUICHE_EXPORT_PRIVATE NoOpBalsaVisitor : public BalsaVisitorInterface {
void OnRawBodyInput(absl::string_view /*input*/) override {}
void OnBodyChunkInput(absl::string_view /*input*/) override {}
void OnHeaderInput(absl::string_view /*input*/) override {}
+ void OnHeader(absl::string_view /*key*/,
+ absl::string_view /*value*/) override {}
void OnTrailerInput(absl::string_view /*input*/) override {}
void ProcessHeaders(const BalsaHeaders& /*headers*/) override {}
void ProcessTrailers(const BalsaHeaders& /*trailer*/) override {}
diff --git a/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_event_loop.h b/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_event_loop.h
new file mode 100644
index 00000000000..fd5bde0f883
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_event_loop.h
@@ -0,0 +1,27 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_COMMON_PLATFORM_API_QUIC_EVENT_LOOP_H_
+#define QUICHE_COMMON_PLATFORM_API_QUIC_EVENT_LOOP_H_
+
+#include "quiche_platform_impl/quiche_event_loop_impl.h"
+
+namespace quic {
+class QuicEventLoopFactory;
+}
+
+namespace quiche {
+
+inline quic::QuicEventLoopFactory* GetOverrideForDefaultEventLoop() {
+ return GetOverrideForDefaultEventLoopImpl();
+}
+
+inline std::vector<quic::QuicEventLoopFactory*>
+GetExtraEventLoopImplementations() {
+ return GetExtraEventLoopImplementationsImpl();
+}
+
+} // namespace quiche
+
+#endif // QUICHE_COMMON_PLATFORM_API_QUIC_EVENT_LOOP_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_flags.h b/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_flags.h
index 26a933c78b3..5fb23bf709d 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_flags.h
+++ b/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_flags.h
@@ -5,7 +5,6 @@
#ifndef QUICHE_COMMON_PLATFORM_API_QUICHE_FLAGS_H_
#define QUICHE_COMMON_PLATFORM_API_QUICHE_FLAGS_H_
-#include "quiche_platform_impl/quic_flags_impl.h"
#include "quiche_platform_impl/quiche_flags_impl.h"
// Flags accessed via GetQuicheReloadableFlag/GetQuicheRestartFlag are temporary
diff --git a/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_mem_slice.h b/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_mem_slice.h
index bb703a453d7..42c3e582aec 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_mem_slice.h
+++ b/chromium/net/third_party/quiche/src/quiche/common/platform/api/quiche_mem_slice.h
@@ -31,9 +31,13 @@ class QUICHE_EXPORT_PRIVATE QuicheMemSlice {
QuicheMemSlice(std::unique_ptr<char[]> buffer, size_t length)
: impl_(std::move(buffer), length) {}
- // Constructs QuicheMemSlice from |impl|. It takes the reference away from
- // |impl|.
- explicit QuicheMemSlice(QuicheMemSliceImpl impl) : impl_(std::move(impl)) {}
+ // Ensures the use of the in-place constructor (below) is intentional.
+ struct InPlace {};
+
+ // Constructs a QuicheMemSlice by constructing |impl_| in-place.
+ template <typename... Args>
+ explicit QuicheMemSlice(InPlace, Args&&... args)
+ : impl_{std::forward<Args>(args)...} {}
QuicheMemSlice(const QuicheMemSlice& other) = delete;
QuicheMemSlice& operator=(const QuicheMemSlice& other) = delete;
diff --git a/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.cc b/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.cc
deleted file mode 100644
index df2c88e66d8..00000000000
--- a/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 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.
-
-#include "quiche_platform_impl/quic_flags_impl.h"
-
-#define DEFINE_QUIC_PROTOCOL_FLAG_SINGLE_VALUE(type, flag, value, doc) \
- type FLAGS_##flag = value;
-
-#define DEFINE_QUIC_PROTOCOL_FLAG_TWO_VALUES(type, flag, internal_value, \
- external_value, doc) \
- type FLAGS_##flag = external_value;
-
-// Preprocessor macros can only have one definition.
-// Select the right macro based on the number of arguments.
-#define GET_6TH_ARG(arg1, arg2, arg3, arg4, arg5, arg6, ...) arg6
-#define QUIC_PROTOCOL_FLAG_MACRO_CHOOSER(...) \
- GET_6TH_ARG(__VA_ARGS__, DEFINE_QUIC_PROTOCOL_FLAG_TWO_VALUES, \
- DEFINE_QUIC_PROTOCOL_FLAG_SINGLE_VALUE)
-#define QUIC_PROTOCOL_FLAG(...) \
- QUIC_PROTOCOL_FLAG_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
-
-#include "quiche/quic/core/quic_protocol_flags_list.h"
-
-#undef QUIC_PROTOCOL_FLAG
-#undef QUIC_PROTOCOL_FLAG_MACRO_CHOOSER
-#undef GET_6TH_ARG
-#undef DEFINE_QUIC_PROTOCOL_FLAG_TWO_VALUES
-#undef DEFINE_QUIC_PROTOCOL_FLAG_SINGLE_VALUE
diff --git a/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.h b/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.h
deleted file mode 100644
index 23758ca9ab3..00000000000
--- a/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 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.
-
-#ifndef QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUIC_FLAGS_IMPL_H_
-#define QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUIC_FLAGS_IMPL_H_
-
-#include <cstdint>
-
-#include "quiche/common/platform/api/quiche_export.h"
-
-#define QUIC_PROTOCOL_FLAG(type, flag, ...) \
- QUICHE_EXPORT_PRIVATE extern type FLAGS_##flag;
-#include "quiche/quic/core/quic_protocol_flags_list.h"
-#undef QUIC_PROTOCOL_FLAG
-
-#endif // QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUIC_FLAGS_IMPL_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_event_loop_impl.h b/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_event_loop_impl.h
new file mode 100644
index 00000000000..44613ce4648
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_event_loop_impl.h
@@ -0,0 +1,27 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_EVENT_LOOP_IMPL_H_
+#define QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_EVENT_LOOP_IMPL_H_
+
+#include <vector>
+
+namespace quic {
+class QuicEventLoopFactory;
+}
+
+namespace quiche {
+
+inline quic::QuicEventLoopFactory* GetOverrideForDefaultEventLoopImpl() {
+ return nullptr;
+}
+
+inline std::vector<quic::QuicEventLoopFactory*>
+GetExtraEventLoopImplementationsImpl() {
+ return {};
+}
+
+} // namespace quiche
+
+#endif // QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_EVENT_LOOP_IMPL_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.cc b/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.cc
index b6cebb12f49..eb609835fa9 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.cc
+++ b/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.cc
@@ -7,3 +7,31 @@
#define QUIC_FLAG(flag, value) bool FLAGS_##flag = value;
#include "quiche/quic/core/quic_flags_list.h"
#undef QUIC_FLAG
+
+#define DEFINE_QUIC_PROTOCOL_FLAG_SINGLE_VALUE(type, flag, value, doc) \
+ type FLAGS_##flag = value;
+
+#define DEFINE_QUIC_PROTOCOL_FLAG_TWO_VALUES(type, flag, internal_value, \
+ external_value, doc) \
+ type FLAGS_##flag = external_value;
+
+// Preprocessor macros can only have one definition.
+// Select the right macro based on the number of arguments.
+#define GET_6TH_ARG(arg1, arg2, arg3, arg4, arg5, arg6, ...) arg6
+#define QUIC_PROTOCOL_FLAG_MACRO_CHOOSER(...) \
+ GET_6TH_ARG(__VA_ARGS__, DEFINE_QUIC_PROTOCOL_FLAG_TWO_VALUES, \
+ DEFINE_QUIC_PROTOCOL_FLAG_SINGLE_VALUE)
+#define QUIC_PROTOCOL_FLAG(...) \
+ QUIC_PROTOCOL_FLAG_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
+
+#include "quiche/quic/core/quic_protocol_flags_list.h"
+
+#undef QUIC_PROTOCOL_FLAG
+#undef QUIC_PROTOCOL_FLAG_MACRO_CHOOSER
+#undef GET_6TH_ARG
+#undef DEFINE_QUIC_PROTOCOL_FLAG_TWO_VALUES
+#undef DEFINE_QUIC_PROTOCOL_FLAG_SINGLE_VALUE
+
+#define QUICHE_PROTOCOL_FLAG(type, flag, value, doc) type FLAGS_##flag = value;
+#include "quiche/common/quiche_protocol_flags_list.h"
+#undef QUICHE_PROTOCOL_FLAG
diff --git a/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.h b/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.h
index a926fb82e5b..df14e0f2cd5 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.h
+++ b/chromium/net/third_party/quiche/src/quiche/common/platform/default/quiche_platform_impl/quiche_flags_impl.h
@@ -17,6 +17,18 @@
#include "quiche/quic/core/quic_flags_list.h"
#undef QUIC_FLAG
+// Protocol flags. TODO(bnc): Move to quiche_protocol_flags_list.h.
+#define QUIC_PROTOCOL_FLAG(type, flag, ...) \
+ QUICHE_EXPORT_PRIVATE extern type FLAGS_##flag;
+#include "quiche/quic/core/quic_protocol_flags_list.h"
+#undef QUIC_PROTOCOL_FLAG
+
+// Protocol flags.
+#define QUICHE_PROTOCOL_FLAG(type, flag, ...) \
+ QUICHE_EXPORT_PRIVATE extern type FLAGS_##flag;
+#include "quiche/common/quiche_protocol_flags_list.h"
+#undef QUICHE_PROTOCOL_FLAG
+
inline bool GetQuicheFlagImpl(bool flag) { return flag; }
inline int32_t GetQuicheFlagImpl(int32_t flag) { return flag; }
inline int64_t GetQuicheFlagImpl(int64_t flag) { return flag; }
@@ -26,7 +38,7 @@ inline std::string GetQuicheFlagImpl(const std::string& flag) { return flag; }
#define SetQuicheFlagImpl(flag, value) ((flag) = (value))
// ------------------------------------------------------------------------
-// QUIC feature flags implementation.
+// QUICHE feature flags implementation.
// ------------------------------------------------------------------------
#define QUICHE_RELOADABLE_FLAG(flag) FLAGS_quic_reloadable_flag_##flag
#define QUICHE_RESTART_FLAG(flag) FLAGS_quic_restart_flag_##flag
diff --git a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.cc b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.cc
index 52b4af4aeae..080431c0b6b 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.cc
+++ b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.cc
@@ -143,6 +143,94 @@ bool QuicheDataReader::ReadDecimal64(size_t num_digits, uint64_t* result) {
return absl::SimpleAtoi(digits, result);
}
+QuicheVariableLengthIntegerLength QuicheDataReader::PeekVarInt62Length() {
+ QUICHE_DCHECK_EQ(endianness(), NETWORK_BYTE_ORDER);
+ const unsigned char* next =
+ reinterpret_cast<const unsigned char*>(data() + pos());
+ if (BytesRemaining() == 0) {
+ return VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ }
+ return static_cast<QuicheVariableLengthIntegerLength>(
+ 1 << ((*next & 0b11000000) >> 6));
+}
+
+// Read an RFC 9000 62-bit Variable Length Integer.
+//
+// Performance notes
+//
+// Measurements and experiments showed that unrolling the four cases
+// like this and dereferencing next_ as we do (*(next_+n) --- and then
+// doing a single pos_+=x at the end) gains about 10% over making a
+// loop and dereferencing next_ such as *(next_++)
+//
+// Using a register for pos_ was not helpful.
+//
+// Branches are ordered to increase the likelihood of the first being
+// taken.
+//
+// Low-level optimization is useful here because this function will be
+// called frequently, leading to outsize benefits.
+bool QuicheDataReader::ReadVarInt62(uint64_t* result) {
+ QUICHE_DCHECK_EQ(endianness(), quiche::NETWORK_BYTE_ORDER);
+
+ size_t remaining = BytesRemaining();
+ const unsigned char* next =
+ reinterpret_cast<const unsigned char*>(data() + pos());
+ if (remaining != 0) {
+ switch (*next & 0xc0) {
+ case 0xc0:
+ // Leading 0b11...... is 8 byte encoding
+ if (remaining >= 8) {
+ *result = (static_cast<uint64_t>((*(next)) & 0x3f) << 56) +
+ (static_cast<uint64_t>(*(next + 1)) << 48) +
+ (static_cast<uint64_t>(*(next + 2)) << 40) +
+ (static_cast<uint64_t>(*(next + 3)) << 32) +
+ (static_cast<uint64_t>(*(next + 4)) << 24) +
+ (static_cast<uint64_t>(*(next + 5)) << 16) +
+ (static_cast<uint64_t>(*(next + 6)) << 8) +
+ (static_cast<uint64_t>(*(next + 7)) << 0);
+ AdvancePos(8);
+ return true;
+ }
+ return false;
+
+ case 0x80:
+ // Leading 0b10...... is 4 byte encoding
+ if (remaining >= 4) {
+ *result = (((*(next)) & 0x3f) << 24) + (((*(next + 1)) << 16)) +
+ (((*(next + 2)) << 8)) + (((*(next + 3)) << 0));
+ AdvancePos(4);
+ return true;
+ }
+ return false;
+
+ case 0x40:
+ // Leading 0b01...... is 2 byte encoding
+ if (remaining >= 2) {
+ *result = (((*(next)) & 0x3f) << 8) + (*(next + 1));
+ AdvancePos(2);
+ return true;
+ }
+ return false;
+
+ case 0x00:
+ // Leading 0b00...... is 1 byte encoding
+ *result = (*next) & 0x3f;
+ AdvancePos(1);
+ return true;
+ }
+ }
+ return false;
+}
+
+bool QuicheDataReader::ReadStringPieceVarInt62(absl::string_view* result) {
+ uint64_t result_length;
+ if (!ReadVarInt62(&result_length)) {
+ return false;
+ }
+ return ReadStringPiece(result, result_length);
+}
+
absl::string_view QuicheDataReader::ReadRemainingPayload() {
absl::string_view payload = PeekRemainingPayload();
pos_ = len_;
diff --git a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.h b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.h
index bf336f910bc..ed05b692887 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.h
+++ b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_reader.h
@@ -92,6 +92,25 @@ class QUICHE_EXPORT_PRIVATE QuicheDataReader {
// iterator on success, may forward it even in case of failure.
bool ReadDecimal64(size_t num_digits, uint64_t* result);
+ // Returns the length in bytes of a variable length integer based on the next
+ // two bits available. Returns 1, 2, 4, or 8 on success, and 0 on failure.
+ QuicheVariableLengthIntegerLength PeekVarInt62Length();
+
+ // Read an RFC 9000 62-bit Variable Length Integer and place the result in
+ // |*result|. Returns false if there is not enough space in the buffer to read
+ // the number, true otherwise. If false is returned, |*result| is not altered.
+ bool ReadVarInt62(uint64_t* result);
+
+ // Reads a string prefixed with a RFC 9000 62-bit variable Length integer
+ // length into the given output parameter.
+ //
+ // NOTE: Does not copy but rather references strings in the underlying buffer.
+ // This should be kept in mind when handling memory management!
+ //
+ // Returns false if there is not enough space in the buffer to read
+ // the number and subsequent string, true otherwise.
+ bool ReadStringPieceVarInt62(absl::string_view* result);
+
// Returns the remaining payload as a absl::string_view.
//
// NOTE: Does not copy but rather references strings in the underlying buffer.
diff --git a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.cc b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.cc
index 5f83e1f9272..5e7943925d0 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.cc
+++ b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.cc
@@ -9,6 +9,7 @@
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
+#include "quiche/common/platform/api/quiche_bug_tracker.h"
#include "quiche/common/quiche_endian.h"
namespace quiche {
@@ -133,6 +134,158 @@ bool QuicheDataWriter::WriteTag(uint32_t tag) {
return WriteBytes(&tag, sizeof(tag));
}
+// Converts a uint64_t into a 62-bit RFC 9000 Variable Length Integer.
+//
+// Performance notes
+//
+// Measurements and experiments showed that unrolling the four cases
+// like this and dereferencing next_ as we do (*(next_+n)) gains about
+// 10% over making a loop and dereferencing it as *(next_++)
+//
+// Using a register for next didn't help.
+//
+// Branches are ordered to increase the likelihood of the first being
+// taken.
+//
+// Low-level optimization is useful here because this function will be
+// called frequently, leading to outsize benefits.
+bool QuicheDataWriter::WriteVarInt62(uint64_t value) {
+ QUICHE_DCHECK_EQ(endianness(), quiche::NETWORK_BYTE_ORDER);
+
+ size_t remaining_bytes = remaining();
+ char* next = buffer() + length();
+
+ if ((value & kVarInt62ErrorMask) == 0) {
+ // We know the high 2 bits are 0 so |value| is legal.
+ // We can do the encoding.
+ if ((value & kVarInt62Mask8Bytes) != 0) {
+ // Someplace in the high-4 bytes is a 1-bit. Do an 8-byte
+ // encoding.
+ if (remaining_bytes >= 8) {
+ *(next + 0) = ((value >> 56) & 0x3f) + 0xc0;
+ *(next + 1) = (value >> 48) & 0xff;
+ *(next + 2) = (value >> 40) & 0xff;
+ *(next + 3) = (value >> 32) & 0xff;
+ *(next + 4) = (value >> 24) & 0xff;
+ *(next + 5) = (value >> 16) & 0xff;
+ *(next + 6) = (value >> 8) & 0xff;
+ *(next + 7) = value & 0xff;
+ IncreaseLength(8);
+ return true;
+ }
+ return false;
+ }
+ // The high-order-4 bytes are all 0, check for a 1, 2, or 4-byte
+ // encoding
+ if ((value & kVarInt62Mask4Bytes) != 0) {
+ // The encoding will not fit into 2 bytes, Do a 4-byte
+ // encoding.
+ if (remaining_bytes >= 4) {
+ *(next + 0) = ((value >> 24) & 0x3f) + 0x80;
+ *(next + 1) = (value >> 16) & 0xff;
+ *(next + 2) = (value >> 8) & 0xff;
+ *(next + 3) = value & 0xff;
+ IncreaseLength(4);
+ return true;
+ }
+ return false;
+ }
+ // The high-order bits are all 0. Check to see if the number
+ // can be encoded as one or two bytes. One byte encoding has
+ // only 6 significant bits (bits 0xffffffff ffffffc0 are all 0).
+ // Two byte encoding has more than 6, but 14 or less significant
+ // bits (bits 0xffffffff ffffc000 are 0 and 0x00000000 00003fc0
+ // are not 0)
+ if ((value & kVarInt62Mask2Bytes) != 0) {
+ // Do 2-byte encoding
+ if (remaining_bytes >= 2) {
+ *(next + 0) = ((value >> 8) & 0x3f) + 0x40;
+ *(next + 1) = (value)&0xff;
+ IncreaseLength(2);
+ return true;
+ }
+ return false;
+ }
+ if (remaining_bytes >= 1) {
+ // Do 1-byte encoding
+ *next = (value & 0x3f);
+ IncreaseLength(1);
+ return true;
+ }
+ return false;
+ }
+ // Can not encode, high 2 bits not 0
+ return false;
+}
+
+bool QuicheDataWriter::WriteStringPieceVarInt62(
+ const absl::string_view& string_piece) {
+ if (!WriteVarInt62(string_piece.size())) {
+ return false;
+ }
+ if (!string_piece.empty()) {
+ if (!WriteBytes(string_piece.data(), string_piece.size())) {
+ return false;
+ }
+ }
+ return true;
+}
+
+// static
+QuicheVariableLengthIntegerLength QuicheDataWriter::GetVarInt62Len(
+ uint64_t value) {
+ if ((value & kVarInt62ErrorMask) != 0) {
+ QUICHE_BUG(invalid_varint) << "Attempted to encode a value, " << value
+ << ", that is too big for VarInt62";
+ return VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ }
+ if ((value & kVarInt62Mask8Bytes) != 0) {
+ return VARIABLE_LENGTH_INTEGER_LENGTH_8;
+ }
+ if ((value & kVarInt62Mask4Bytes) != 0) {
+ return VARIABLE_LENGTH_INTEGER_LENGTH_4;
+ }
+ if ((value & kVarInt62Mask2Bytes) != 0) {
+ return VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ }
+ return VARIABLE_LENGTH_INTEGER_LENGTH_1;
+}
+
+bool QuicheDataWriter::WriteVarInt62WithForcedLength(
+ uint64_t value, QuicheVariableLengthIntegerLength write_length) {
+ QUICHE_DCHECK_EQ(endianness(), NETWORK_BYTE_ORDER);
+
+ size_t remaining_bytes = remaining();
+ if (remaining_bytes < write_length) {
+ return false;
+ }
+
+ const QuicheVariableLengthIntegerLength min_length = GetVarInt62Len(value);
+ if (write_length < min_length) {
+ QUICHE_BUG(invalid_varint_forced) << "Cannot write value " << value
+ << " with write_length " << write_length;
+ return false;
+ }
+ if (write_length == min_length) {
+ return WriteVarInt62(value);
+ }
+
+ if (write_length == VARIABLE_LENGTH_INTEGER_LENGTH_2) {
+ return WriteUInt8(0b01000000) && WriteUInt8(value);
+ }
+ if (write_length == VARIABLE_LENGTH_INTEGER_LENGTH_4) {
+ return WriteUInt8(0b10000000) && WriteUInt8(0) && WriteUInt16(value);
+ }
+ if (write_length == VARIABLE_LENGTH_INTEGER_LENGTH_8) {
+ return WriteUInt8(0b11000000) && WriteUInt8(0) && WriteUInt16(0) &&
+ WriteUInt32(value);
+ }
+
+ QUICHE_BUG(invalid_write_length)
+ << "Invalid write_length " << static_cast<int>(write_length);
+ return false;
+}
+
bool QuicheDataWriter::Seek(size_t length) {
if (!BeginWrite(length)) {
return false;
diff --git a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.h b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.h
index 5f027a9bdd8..8035bb2df49 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.h
+++ b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer.h
@@ -17,6 +17,24 @@
namespace quiche {
+// Maximum value that can be properly encoded using RFC 9000 62-bit Variable
+// Length Integer encoding.
+enum : uint64_t {
+ kVarInt62MaxValue = UINT64_C(0x3fffffffffffffff),
+};
+
+// RFC 9000 62-bit Variable Length Integer encoding masks
+// If a uint64_t anded with a mask is not 0 then the value is encoded
+// using that length (or is too big, in the case of kVarInt62ErrorMask).
+// Values must be checked in order (error, 8-, 4-, and then 2- bytes)
+// and if none are non-0, the value is encoded in 1 byte.
+enum : uint64_t {
+ kVarInt62ErrorMask = UINT64_C(0xc000000000000000),
+ kVarInt62Mask8Bytes = UINT64_C(0x3fffffffc0000000),
+ kVarInt62Mask4Bytes = UINT64_C(0x000000003fffc000),
+ kVarInt62Mask2Bytes = UINT64_C(0x0000000000003fc0),
+};
+
// This class provides facilities for packing binary data.
//
// The QuicheDataWriter supports appending primitive values (int, string, etc)
@@ -69,6 +87,28 @@ class QUICHE_EXPORT_PRIVATE QuicheDataWriter {
// in big endian.
bool WriteTag(uint32_t tag);
+ // Write a 62-bit unsigned integer using RFC 9000 Variable Length Integer
+ // encoding. Returns false if the value is out of range or if there is no room
+ // in the buffer.
+ bool WriteVarInt62(uint64_t value);
+
+ // Same as WriteVarInt62(uint64_t), but forces an encoding size to write to.
+ // This is not as optimized as WriteVarInt62(uint64_t). Returns false if the
+ // value does not fit in the specified write_length or if there is no room in
+ // the buffer.
+ bool WriteVarInt62WithForcedLength(
+ uint64_t value, QuicheVariableLengthIntegerLength write_length);
+
+ // Writes a string piece as a consecutive length/content pair. The
+ // length uses RFC 9000 Variable Length Integer encoding.
+ bool WriteStringPieceVarInt62(const absl::string_view& string_piece);
+
+ // Utility function to return the number of bytes needed to encode
+ // the given value using IETF VarInt62 encoding. Returns the number
+ // of bytes required to encode the given integer or 0 if the value
+ // is too large to encode.
+ static QuicheVariableLengthIntegerLength GetVarInt62Len(uint64_t value);
+
// Advance the writer's position for writing by |length| bytes without writing
// anything. This method only makes sense to be used on a buffer that has
// already been written to (and is having certain parts rewritten).
diff --git a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer_test.cc b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer_test.cc
index 7ae15d2ed4a..eb143502b14 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/common/quiche_data_writer_test.cc
@@ -337,6 +337,416 @@ TEST_P(QuicheDataWriterTest, WriteBytes) {
}
}
+const int kVarIntBufferLength = 1024;
+
+// Encodes and then decodes a specified value, checks that the
+// value that was encoded is the same as the decoded value, the length
+// is correct, and that after decoding, all data in the buffer has
+// been consumed..
+// Returns true if everything works, false if not.
+bool EncodeDecodeValue(uint64_t value_in, char* buffer, size_t size_of_buffer) {
+ // Init the buffer to all 0, just for cleanliness. Makes for better
+ // output if, in debugging, we need to dump out the buffer.
+ memset(buffer, 0, size_of_buffer);
+ // make a writer. Note that for IETF encoding
+ // we do not care about endianness... It's always big-endian,
+ // but the c'tor expects to be told what endianness is in force...
+ QuicheDataWriter writer(size_of_buffer, buffer,
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+
+ // Try to write the value.
+ if (writer.WriteVarInt62(value_in) != true) {
+ return false;
+ }
+ // Look at the value we encoded. Determine how much should have been
+ // used based on the value, and then check the state of the writer
+ // to see that it matches.
+ size_t expected_length = 0;
+ if (value_in <= 0x3f) {
+ expected_length = 1;
+ } else if (value_in <= 0x3fff) {
+ expected_length = 2;
+ } else if (value_in <= 0x3fffffff) {
+ expected_length = 4;
+ } else {
+ expected_length = 8;
+ }
+ if (writer.length() != expected_length) {
+ return false;
+ }
+
+ // set up a reader, just the length we've used, no more, no less.
+ QuicheDataReader reader(buffer, expected_length,
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ uint64_t value_out;
+
+ if (reader.ReadVarInt62(&value_out) == false) {
+ return false;
+ }
+ if (value_in != value_out) {
+ return false;
+ }
+ // We only write one value so there had better be nothing left to read
+ return reader.IsDoneReading();
+}
+
+// Test that 8-byte-encoded Variable Length Integers are properly laid
+// out in the buffer.
+TEST_P(QuicheDataWriterTest, VarInt8Layout) {
+ char buffer[1024];
+
+ // Check that the layout of bytes in the buffer is correct. Bytes
+ // are always encoded big endian...
+ memset(buffer, 0, sizeof(buffer));
+ QuicheDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x3142f3e4d5c6b7a8)));
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 0)),
+ (0x31 + 0xc0)); // 0xc0 for encoding
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 1)), 0x42);
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 2)), 0xf3);
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 3)), 0xe4);
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 4)), 0xd5);
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 5)), 0xc6);
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 6)), 0xb7);
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 7)), 0xa8);
+}
+
+// Test that 4-byte-encoded Variable Length Integers are properly laid
+// out in the buffer.
+TEST_P(QuicheDataWriterTest, VarInt4Layout) {
+ char buffer[1024];
+
+ // Check that the layout of bytes in the buffer is correct. Bytes
+ // are always encoded big endian...
+ memset(buffer, 0, sizeof(buffer));
+ QuicheDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ EXPECT_TRUE(writer.WriteVarInt62(0x3243f4e5));
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 0)),
+ (0x32 + 0x80)); // 0x80 for encoding
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 1)), 0x43);
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 2)), 0xf4);
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 3)), 0xe5);
+}
+
+// Test that 2-byte-encoded Variable Length Integers are properly laid
+// out in the buffer.
+TEST_P(QuicheDataWriterTest, VarInt2Layout) {
+ char buffer[1024];
+
+ // Check that the layout of bytes in the buffer is correct. Bytes
+ // are always encoded big endian...
+ memset(buffer, 0, sizeof(buffer));
+ QuicheDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ EXPECT_TRUE(writer.WriteVarInt62(0x3647));
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 0)),
+ (0x36 + 0x40)); // 0x40 for encoding
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 1)), 0x47);
+}
+
+// Test that 1-byte-encoded Variable Length Integers are properly laid
+// out in the buffer.
+TEST_P(QuicheDataWriterTest, VarInt1Layout) {
+ char buffer[1024];
+
+ // Check that the layout of bytes in the buffer
+ // is correct. Bytes are always encoded big endian...
+ memset(buffer, 0, sizeof(buffer));
+ QuicheDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ EXPECT_TRUE(writer.WriteVarInt62(0x3f));
+ EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 0)), 0x3f);
+}
+
+// Test certain, targeted, values that are expected to succeed:
+// 0, 1,
+// 0x3e, 0x3f, 0x40, 0x41 (around the 1-2 byte transitions)
+// 0x3ffe, 0x3fff, 0x4000, 0x4001 (the 2-4 byte transition)
+// 0x3ffffffe, 0x3fffffff, 0x40000000, 0x40000001 (the 4-8 byte
+// transition)
+// 0x3ffffffffffffffe, 0x3fffffffffffffff, (the highest valid values)
+// 0xfe, 0xff, 0x100, 0x101,
+// 0xfffe, 0xffff, 0x10000, 0x10001,
+// 0xfffffe, 0xffffff, 0x1000000, 0x1000001,
+// 0xfffffffe, 0xffffffff, 0x100000000, 0x100000001,
+// 0xfffffffffe, 0xffffffffff, 0x10000000000, 0x10000000001,
+// 0xfffffffffffe, 0xffffffffffff, 0x1000000000000, 0x1000000000001,
+// 0xfffffffffffffe, 0xffffffffffffff, 0x100000000000000, 0x100000000000001,
+TEST_P(QuicheDataWriterTest, VarIntGoodTargetedValues) {
+ char buffer[kVarIntBufferLength];
+ uint64_t passing_values[] = {
+ 0,
+ 1,
+ 0x3e,
+ 0x3f,
+ 0x40,
+ 0x41,
+ 0x3ffe,
+ 0x3fff,
+ 0x4000,
+ 0x4001,
+ 0x3ffffffe,
+ 0x3fffffff,
+ 0x40000000,
+ 0x40000001,
+ 0x3ffffffffffffffe,
+ 0x3fffffffffffffff,
+ 0xfe,
+ 0xff,
+ 0x100,
+ 0x101,
+ 0xfffe,
+ 0xffff,
+ 0x10000,
+ 0x10001,
+ 0xfffffe,
+ 0xffffff,
+ 0x1000000,
+ 0x1000001,
+ 0xfffffffe,
+ 0xffffffff,
+ 0x100000000,
+ 0x100000001,
+ 0xfffffffffe,
+ 0xffffffffff,
+ 0x10000000000,
+ 0x10000000001,
+ 0xfffffffffffe,
+ 0xffffffffffff,
+ 0x1000000000000,
+ 0x1000000000001,
+ 0xfffffffffffffe,
+ 0xffffffffffffff,
+ 0x100000000000000,
+ 0x100000000000001,
+ };
+ for (uint64_t test_val : passing_values) {
+ EXPECT_TRUE(
+ EncodeDecodeValue(test_val, static_cast<char*>(buffer), sizeof(buffer)))
+ << " encode/decode of " << test_val << " failed";
+ }
+}
+//
+// Test certain, targeted, values where failure is expected (the
+// values are invalid w.r.t. IETF VarInt encoding):
+// 0x4000000000000000, 0x4000000000000001, ( Just above max allowed value)
+// 0xfffffffffffffffe, 0xffffffffffffffff, (should fail)
+TEST_P(QuicheDataWriterTest, VarIntBadTargetedValues) {
+ char buffer[kVarIntBufferLength];
+ uint64_t failing_values[] = {
+ 0x4000000000000000,
+ 0x4000000000000001,
+ 0xfffffffffffffffe,
+ 0xffffffffffffffff,
+ };
+ for (uint64_t test_val : failing_values) {
+ EXPECT_FALSE(
+ EncodeDecodeValue(test_val, static_cast<char*>(buffer), sizeof(buffer)))
+ << " encode/decode of " << test_val << " succeeded, but was an "
+ << "invalid value";
+ }
+}
+// Test writing varints with a forced length.
+TEST_P(QuicheDataWriterTest, WriteVarInt62WithForcedLength) {
+ char buffer[90];
+ memset(buffer, 0, sizeof(buffer));
+ QuicheDataWriter writer(sizeof(buffer), static_cast<char*>(buffer));
+
+ writer.WriteVarInt62WithForcedLength(1, VARIABLE_LENGTH_INTEGER_LENGTH_1);
+ writer.WriteVarInt62WithForcedLength(1, VARIABLE_LENGTH_INTEGER_LENGTH_2);
+ writer.WriteVarInt62WithForcedLength(1, VARIABLE_LENGTH_INTEGER_LENGTH_4);
+ writer.WriteVarInt62WithForcedLength(1, VARIABLE_LENGTH_INTEGER_LENGTH_8);
+
+ writer.WriteVarInt62WithForcedLength(63, VARIABLE_LENGTH_INTEGER_LENGTH_1);
+ writer.WriteVarInt62WithForcedLength(63, VARIABLE_LENGTH_INTEGER_LENGTH_2);
+ writer.WriteVarInt62WithForcedLength(63, VARIABLE_LENGTH_INTEGER_LENGTH_4);
+ writer.WriteVarInt62WithForcedLength(63, VARIABLE_LENGTH_INTEGER_LENGTH_8);
+
+ writer.WriteVarInt62WithForcedLength(64, VARIABLE_LENGTH_INTEGER_LENGTH_2);
+ writer.WriteVarInt62WithForcedLength(64, VARIABLE_LENGTH_INTEGER_LENGTH_4);
+ writer.WriteVarInt62WithForcedLength(64, VARIABLE_LENGTH_INTEGER_LENGTH_8);
+
+ writer.WriteVarInt62WithForcedLength(16383, VARIABLE_LENGTH_INTEGER_LENGTH_2);
+ writer.WriteVarInt62WithForcedLength(16383, VARIABLE_LENGTH_INTEGER_LENGTH_4);
+ writer.WriteVarInt62WithForcedLength(16383, VARIABLE_LENGTH_INTEGER_LENGTH_8);
+
+ writer.WriteVarInt62WithForcedLength(16384, VARIABLE_LENGTH_INTEGER_LENGTH_4);
+ writer.WriteVarInt62WithForcedLength(16384, VARIABLE_LENGTH_INTEGER_LENGTH_8);
+
+ writer.WriteVarInt62WithForcedLength(1073741823,
+ VARIABLE_LENGTH_INTEGER_LENGTH_4);
+ writer.WriteVarInt62WithForcedLength(1073741823,
+ VARIABLE_LENGTH_INTEGER_LENGTH_8);
+
+ writer.WriteVarInt62WithForcedLength(1073741824,
+ VARIABLE_LENGTH_INTEGER_LENGTH_8);
+
+ QuicheDataReader reader(buffer, sizeof(buffer));
+
+ uint64_t test_val = 0;
+ for (int i = 0; i < 4; ++i) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, 1u);
+ }
+ for (int i = 0; i < 4; ++i) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, 63u);
+ }
+
+ for (int i = 0; i < 3; ++i) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, 64u);
+ }
+ for (int i = 0; i < 3; ++i) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, 16383u);
+ }
+
+ for (int i = 0; i < 2; ++i) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, 16384u);
+ }
+ for (int i = 0; i < 2; ++i) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, 1073741823u);
+ }
+
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, 1073741824u);
+
+ // We are at the end of the buffer so this should fail.
+ EXPECT_FALSE(reader.ReadVarInt62(&test_val));
+}
+
+// Following tests all try to fill the buffer with multiple values,
+// go one value more than the buffer can accommodate, then read
+// the successfully encoded values, and try to read the unsuccessfully
+// encoded value. The following is the number of values to encode.
+const int kMultiVarCount = 1000;
+
+// Test writing & reading multiple 8-byte-encoded varints
+TEST_P(QuicheDataWriterTest, MultiVarInt8) {
+ uint64_t test_val;
+ char buffer[8 * kMultiVarCount];
+ memset(buffer, 0, sizeof(buffer));
+ QuicheDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ // Put N values into the buffer. Adding i to the value ensures that
+ // each value is different so we can detect if we overwrite values,
+ // or read the same value over and over.
+ for (int i = 0; i < kMultiVarCount; i++) {
+ EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x3142f3e4d5c6b7a8) + i));
+ }
+ EXPECT_EQ(writer.length(), 8u * kMultiVarCount);
+
+ // N+1st should fail, the buffer is full.
+ EXPECT_FALSE(writer.WriteVarInt62(UINT64_C(0x3142f3e4d5c6b7a8)));
+
+ // Now we should be able to read out the N values that were
+ // successfully encoded.
+ QuicheDataReader reader(buffer, sizeof(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ for (int i = 0; i < kMultiVarCount; i++) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, (UINT64_C(0x3142f3e4d5c6b7a8) + i));
+ }
+ // And the N+1st should fail.
+ EXPECT_FALSE(reader.ReadVarInt62(&test_val));
+}
+
+// Test writing & reading multiple 4-byte-encoded varints
+TEST_P(QuicheDataWriterTest, MultiVarInt4) {
+ uint64_t test_val;
+ char buffer[4 * kMultiVarCount];
+ memset(buffer, 0, sizeof(buffer));
+ QuicheDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ // Put N values into the buffer. Adding i to the value ensures that
+ // each value is different so we can detect if we overwrite values,
+ // or read the same value over and over.
+ for (int i = 0; i < kMultiVarCount; i++) {
+ EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x3142f3e4) + i));
+ }
+ EXPECT_EQ(writer.length(), 4u * kMultiVarCount);
+
+ // N+1st should fail, the buffer is full.
+ EXPECT_FALSE(writer.WriteVarInt62(UINT64_C(0x3142f3e4)));
+
+ // Now we should be able to read out the N values that were
+ // successfully encoded.
+ QuicheDataReader reader(buffer, sizeof(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ for (int i = 0; i < kMultiVarCount; i++) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, (UINT64_C(0x3142f3e4) + i));
+ }
+ // And the N+1st should fail.
+ EXPECT_FALSE(reader.ReadVarInt62(&test_val));
+}
+
+// Test writing & reading multiple 2-byte-encoded varints
+TEST_P(QuicheDataWriterTest, MultiVarInt2) {
+ uint64_t test_val;
+ char buffer[2 * kMultiVarCount];
+ memset(buffer, 0, sizeof(buffer));
+ QuicheDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ // Put N values into the buffer. Adding i to the value ensures that
+ // each value is different so we can detect if we overwrite values,
+ // or read the same value over and over.
+ for (int i = 0; i < kMultiVarCount; i++) {
+ EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x3142) + i));
+ }
+ EXPECT_EQ(writer.length(), 2u * kMultiVarCount);
+
+ // N+1st should fail, the buffer is full.
+ EXPECT_FALSE(writer.WriteVarInt62(UINT64_C(0x3142)));
+
+ // Now we should be able to read out the N values that were
+ // successfully encoded.
+ QuicheDataReader reader(buffer, sizeof(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ for (int i = 0; i < kMultiVarCount; i++) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, (UINT64_C(0x3142) + i));
+ }
+ // And the N+1st should fail.
+ EXPECT_FALSE(reader.ReadVarInt62(&test_val));
+}
+
+// Test writing & reading multiple 1-byte-encoded varints
+TEST_P(QuicheDataWriterTest, MultiVarInt1) {
+ uint64_t test_val;
+ char buffer[1 * kMultiVarCount];
+ memset(buffer, 0, sizeof(buffer));
+ QuicheDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ // Put N values into the buffer. Adding i to the value ensures that
+ // each value is different so we can detect if we overwrite values,
+ // or read the same value over and over. &0xf ensures we do not
+ // overflow the max value for single-byte encoding.
+ for (int i = 0; i < kMultiVarCount; i++) {
+ EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x30) + (i & 0xf)));
+ }
+ EXPECT_EQ(writer.length(), 1u * kMultiVarCount);
+
+ // N+1st should fail, the buffer is full.
+ EXPECT_FALSE(writer.WriteVarInt62(UINT64_C(0x31)));
+
+ // Now we should be able to read out the N values that were
+ // successfully encoded.
+ QuicheDataReader reader(buffer, sizeof(buffer),
+ quiche::Endianness::NETWORK_BYTE_ORDER);
+ for (int i = 0; i < kMultiVarCount; i++) {
+ EXPECT_TRUE(reader.ReadVarInt62(&test_val));
+ EXPECT_EQ(test_val, (UINT64_C(0x30) + (i & 0xf)));
+ }
+ // And the N+1st should fail.
+ EXPECT_FALSE(reader.ReadVarInt62(&test_val));
+}
+
TEST_P(QuicheDataWriterTest, Seek) {
char buffer[3] = {};
QuicheDataWriter writer(ABSL_ARRAYSIZE(buffer), buffer,
diff --git a/chromium/net/third_party/quiche/src/quiche/common/quiche_endian.h b/chromium/net/third_party/quiche/src/quiche/common/quiche_endian.h
index 30639ccd372..834f7433c47 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/quiche_endian.h
+++ b/chromium/net/third_party/quiche/src/quiche/common/quiche_endian.h
@@ -54,6 +54,20 @@ class QUICHE_EXPORT_PRIVATE QuicheEndian {
}
};
+enum QuicheVariableLengthIntegerLength : uint8_t {
+ // Length zero means the variable length integer is not present.
+ VARIABLE_LENGTH_INTEGER_LENGTH_0 = 0,
+ VARIABLE_LENGTH_INTEGER_LENGTH_1 = 1,
+ VARIABLE_LENGTH_INTEGER_LENGTH_2 = 2,
+ VARIABLE_LENGTH_INTEGER_LENGTH_4 = 4,
+ VARIABLE_LENGTH_INTEGER_LENGTH_8 = 8,
+
+ // By default we write the IETF long header length using the 2-byte encoding
+ // of variable length integers, even when the length is below 64, which allows
+ // us to fill in the length before knowing what the length actually is.
+ kQuicheDefaultLongHeaderLengthLength = VARIABLE_LENGTH_INTEGER_LENGTH_2,
+};
+
} // namespace quiche
#endif // QUICHE_COMMON_QUICHE_ENDIAN_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/common/quiche_protocol_flags_list.h b/chromium/net/third_party/quiche/src/quiche/common/quiche_protocol_flags_list.h
new file mode 100644
index 00000000000..90d21a361c6
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/common/quiche_protocol_flags_list.h
@@ -0,0 +1,15 @@
+// Copyright (c) 2022 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.
+
+// NOLINT(build/header_guard)
+// This file intentionally does not have header guards, it's intended to be
+// included multiple times, each time with a different definition of
+// QUICHE_PROTOCOL_FLAG.
+
+#if defined(QUICHE_PROTOCOL_FLAG)
+
+QUICHE_PROTOCOL_FLAG(bool, quiche_oghttp2_debug_trace, false,
+ "If true, emits trace logs for HTTP/2 events.")
+
+#endif
diff --git a/chromium/net/third_party/quiche/src/quiche/common/structured_headers.cc b/chromium/net/third_party/quiche/src/quiche/common/structured_headers.cc
index f19d15c6955..b348c2232e9 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/structured_headers.cc
+++ b/chromium/net/third_party/quiche/src/quiche/common/structured_headers.cc
@@ -756,8 +756,8 @@ bool operator==(const Item& lhs, const Item& rhs) {
ParameterizedItem::ParameterizedItem(const ParameterizedItem&) = default;
ParameterizedItem& ParameterizedItem::operator=(const ParameterizedItem&) =
default;
-ParameterizedItem::ParameterizedItem(Item id, const Parameters& ps)
- : item(std::move(id)), params(ps) {}
+ParameterizedItem::ParameterizedItem(Item id, Parameters ps)
+ : item(std::move(id)), params(std::move(ps)) {}
ParameterizedItem::~ParameterizedItem() = default;
ParameterizedMember::ParameterizedMember() = default;
@@ -766,23 +766,27 @@ ParameterizedMember& ParameterizedMember::operator=(
const ParameterizedMember&) = default;
ParameterizedMember::ParameterizedMember(std::vector<ParameterizedItem> id,
bool member_is_inner_list,
- const Parameters& ps)
+ Parameters ps)
: member(std::move(id)),
member_is_inner_list(member_is_inner_list),
- params(ps) {}
+ params(std::move(ps)) {}
ParameterizedMember::ParameterizedMember(std::vector<ParameterizedItem> id,
- const Parameters& ps)
- : member(std::move(id)), member_is_inner_list(true), params(ps) {}
-ParameterizedMember::ParameterizedMember(Item id, const Parameters& ps)
- : member({{std::move(id), {}}}), member_is_inner_list(false), params(ps) {}
+ Parameters ps)
+ : member(std::move(id)),
+ member_is_inner_list(true),
+ params(std::move(ps)) {}
+ParameterizedMember::ParameterizedMember(Item id, Parameters ps)
+ : member({{std::move(id), {}}}),
+ member_is_inner_list(false),
+ params(std::move(ps)) {}
ParameterizedMember::~ParameterizedMember() = default;
ParameterisedIdentifier::ParameterisedIdentifier(
const ParameterisedIdentifier&) = default;
ParameterisedIdentifier& ParameterisedIdentifier::operator=(
const ParameterisedIdentifier&) = default;
-ParameterisedIdentifier::ParameterisedIdentifier(Item id, const Parameters& ps)
- : identifier(std::move(id)), params(ps) {}
+ParameterisedIdentifier::ParameterisedIdentifier(Item id, Parameters ps)
+ : identifier(std::move(id)), params(std::move(ps)) {}
ParameterisedIdentifier::~ParameterisedIdentifier() = default;
Dictionary::Dictionary() = default;
diff --git a/chromium/net/third_party/quiche/src/quiche/common/structured_headers.h b/chromium/net/third_party/quiche/src/quiche/common/structured_headers.h
index 6b338a7b32a..f0eda840695 100644
--- a/chromium/net/third_party/quiche/src/quiche/common/structured_headers.h
+++ b/chromium/net/third_party/quiche/src/quiche/common/structured_headers.h
@@ -132,7 +132,7 @@ struct QUICHE_EXPORT_PRIVATE ParameterisedIdentifier {
ParameterisedIdentifier(const ParameterisedIdentifier&);
ParameterisedIdentifier& operator=(const ParameterisedIdentifier&);
- ParameterisedIdentifier(Item, const Parameters&);
+ ParameterisedIdentifier(Item, Parameters);
~ParameterisedIdentifier();
};
@@ -150,7 +150,7 @@ struct QUICHE_EXPORT_PRIVATE ParameterizedItem {
ParameterizedItem(const ParameterizedItem&);
ParameterizedItem& operator=(const ParameterizedItem&);
- ParameterizedItem(Item, const Parameters&);
+ ParameterizedItem(Item, Parameters);
~ParameterizedItem();
};
@@ -178,11 +178,11 @@ struct QUICHE_EXPORT_PRIVATE ParameterizedMember {
ParameterizedMember(const ParameterizedMember&);
ParameterizedMember& operator=(const ParameterizedMember&);
ParameterizedMember(std::vector<ParameterizedItem>, bool member_is_inner_list,
- const Parameters&);
+ Parameters);
// Shorthand constructor for a member which is an inner list.
- ParameterizedMember(std::vector<ParameterizedItem>, const Parameters&);
+ ParameterizedMember(std::vector<ParameterizedItem>, Parameters);
// Shorthand constructor for a member which is a single Item.
- ParameterizedMember(Item, const Parameters&);
+ ParameterizedMember(Item, Parameters);
~ParameterizedMember();
};
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc b/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc
index 716e6bb08f8..62a57c6f49b 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.cc
@@ -179,5 +179,20 @@ bool EventForwarder::OnUnknownFrame(spdy::SpdyStreamId stream_id,
return false;
}
+void EventForwarder::OnUnknownFrameStart(spdy::SpdyStreamId stream_id,
+ size_t length, uint8_t type,
+ uint8_t flags) {
+ if (can_forward_()) {
+ receiver_.OnUnknownFrameStart(stream_id, length, type, flags);
+ }
+}
+
+void EventForwarder::OnUnknownFramePayload(spdy::SpdyStreamId stream_id,
+ absl::string_view payload) {
+ if (can_forward_()) {
+ receiver_.OnUnknownFramePayload(stream_id, payload);
+ }
+}
+
} // namespace adapter
} // namespace http2
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.h b/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.h
index 1147162e720..efa10310556 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.h
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.h
@@ -66,6 +66,10 @@ class QUICHE_EXPORT_PRIVATE EventForwarder
absl::string_view priority_field_value) override;
bool OnUnknownFrame(spdy::SpdyStreamId stream_id,
uint8_t frame_type) override;
+ void OnUnknownFrameStart(spdy::SpdyStreamId stream_id, size_t length,
+ uint8_t type, uint8_t flags) override;
+ void OnUnknownFramePayload(spdy::SpdyStreamId stream_id,
+ absl::string_view payload) override;
private:
ForwardPredicate can_forward_;
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder_test.cc b/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder_test.cc
index a3d3bf654c0..0d33922bfd4 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder_test.cc
@@ -123,6 +123,11 @@ TEST(EventForwarderTest, ForwardsEventsWithTruePredicate) {
EXPECT_CALL(receiver, OnUnknownFrame(stream_id, /*frame_type=*/0x4D));
event_forwarder.OnUnknownFrame(stream_id, /*frame_type=*/0x4D);
+
+ EXPECT_CALL(receiver, OnUnknownFrameStart(stream_id, /*length=*/42,
+ /*type=*/0x4D, /*flags=*/0x0));
+ event_forwarder.OnUnknownFrameStart(stream_id, /*length=*/42, /*type=*/0x4D,
+ /*flags=*/0x0);
}
TEST(EventForwarderTest, DoesNotForwardEventsWithFalsePredicate) {
@@ -217,6 +222,10 @@ TEST(EventForwarderTest, DoesNotForwardEventsWithFalsePredicate) {
EXPECT_CALL(receiver, OnUnknownFrame).Times(0);
event_forwarder.OnUnknownFrame(stream_id, /*frame_type=*/0x4D);
+
+ EXPECT_CALL(receiver, OnUnknownFrameStart).Times(0);
+ event_forwarder.OnUnknownFrameStart(stream_id, /*length=*/42, /*type=*/0x4D,
+ /*flags=*/0x0);
}
} // namespace
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter_test.cc b/chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter_test.cc
index 8647b027895..9bf5bd219fe 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_adapter_test.cc
@@ -4744,6 +4744,81 @@ TEST(NgHttp2AdapterTest, ServerSubmitResponse) {
EXPECT_GT(adapter->GetHpackEncoderDynamicTableSize(), 0);
}
+TEST(NgHttp2AdapterTest, ServerSubmitResponseWithResetFromClient) {
+ DataSavingVisitor visitor;
+ auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor);
+ EXPECT_FALSE(adapter->want_write());
+
+ const std::string frames = TestFrameSequence()
+ .ClientPreface()
+ .Headers(1,
+ {{":method", "GET"},
+ {":scheme", "https"},
+ {":authority", "example.com"},
+ {":path", "/this/is/request/one"}},
+ /*fin=*/true)
+ .Serialize();
+ testing::InSequence s;
+
+ // Client preface (empty SETTINGS)
+ EXPECT_CALL(visitor, OnFrameHeader(0, 0, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnSettingsStart());
+ EXPECT_CALL(visitor, OnSettingsEnd());
+ // Stream 1
+ EXPECT_CALL(visitor, OnFrameHeader(1, _, HEADERS, 5));
+ EXPECT_CALL(visitor, OnBeginHeadersForStream(1));
+ EXPECT_CALL(visitor, OnHeaderForStream).Times(4);
+ EXPECT_CALL(visitor, OnEndHeadersForStream(1));
+ EXPECT_CALL(visitor, OnEndStream(1));
+
+ const int64_t result = adapter->ProcessBytes(frames);
+ EXPECT_EQ(frames.size(), result);
+
+ EXPECT_EQ(1, adapter->GetHighestReceivedStreamId());
+
+ // Server will want to send a SETTINGS ack.
+ EXPECT_TRUE(adapter->want_write());
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 0, 0x1));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, 0, 0x1, 0));
+
+ int send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+ EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS}));
+ visitor.Clear();
+
+ EXPECT_FALSE(adapter->want_write());
+ const absl::string_view kBody = "This is an example response body.";
+ auto body1 = absl::make_unique<TestDataFrameSource>(visitor, true);
+ body1->AppendPayload(kBody);
+ int submit_result = adapter->SubmitResponse(
+ 1,
+ ToHeaders({{":status", "404"},
+ {"x-comment", "I have no idea what you're talking about."}}),
+ std::move(body1));
+ EXPECT_EQ(submit_result, 0);
+ EXPECT_TRUE(adapter->want_write());
+
+ // Client resets the stream before the server can send the response.
+ const std::string reset =
+ TestFrameSequence().RstStream(1, Http2ErrorCode::CANCEL).Serialize();
+ EXPECT_CALL(visitor, OnFrameHeader(1, 4, RST_STREAM, 0));
+ EXPECT_CALL(visitor, OnRstStream(1, Http2ErrorCode::CANCEL));
+ EXPECT_CALL(visitor, OnCloseStream(1, Http2ErrorCode::CANCEL));
+ const int64_t reset_result = adapter->ProcessBytes(reset);
+ EXPECT_EQ(reset.size(), static_cast<size_t>(reset_result));
+
+ // Outbound HEADERS and DATA are dropped.
+ EXPECT_CALL(visitor, OnBeforeFrameSent(HEADERS, 1, _, _)).Times(0);
+ EXPECT_CALL(visitor, OnFrameSent(HEADERS, 1, _, _, _)).Times(0);
+ EXPECT_CALL(visitor, OnFrameSent(DATA, 1, _, _, _)).Times(0);
+
+ send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+
+ EXPECT_THAT(visitor.data(), testing::IsEmpty());
+}
+
// Should also test: client attempts shutdown, server attempts shutdown after an
// explicit GOAWAY.
TEST(NgHttp2AdapterTest, ServerSendsShutdown) {
@@ -5883,12 +5958,12 @@ TEST(NgHttp2AdapterTest, AutomaticPingAcksDisabled) {
EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS}));
}
-TEST(NgHttp2AdapterTest, InvalidMaxFrameSize) {
+TEST(NgHttp2AdapterTest, InvalidMaxFrameSizeSetting) {
DataSavingVisitor visitor;
auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor);
const std::string frames =
- TestFrameSequence().ClientPreface({{MAX_FRAME_SIZE, 3}}).Serialize();
+ TestFrameSequence().ClientPreface({{MAX_FRAME_SIZE, 3u}}).Serialize();
testing::InSequence s;
// Client preface
@@ -5912,6 +5987,90 @@ TEST(NgHttp2AdapterTest, InvalidMaxFrameSize) {
EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY}));
}
+TEST(OgHttp2AdapterTest, InvalidPushSetting) {
+ DataSavingVisitor visitor;
+ auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor);
+
+ const std::string frames =
+ TestFrameSequence().ClientPreface({{ENABLE_PUSH, 3u}}).Serialize();
+ testing::InSequence s;
+
+ // Client preface
+ EXPECT_CALL(visitor, OnFrameHeader(0, 6, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnInvalidFrame(0, _));
+
+ const int64_t read_result = adapter->ProcessBytes(frames);
+ EXPECT_EQ(static_cast<size_t>(read_result), frames.size());
+
+ EXPECT_TRUE(adapter->want_write());
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0));
+ EXPECT_CALL(visitor,
+ OnFrameSent(GOAWAY, 0, _, 0x0,
+ static_cast<int>(Http2ErrorCode::PROTOCOL_ERROR)));
+
+ int send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+ EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY}));
+}
+
+TEST(NgHttp2AdapterTest, InvalidConnectProtocolSetting) {
+ DataSavingVisitor visitor;
+ auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor);
+
+ const std::string frames = TestFrameSequence()
+ .ClientPreface({{ENABLE_CONNECT_PROTOCOL, 3u}})
+ .Serialize();
+ testing::InSequence s;
+
+ EXPECT_CALL(visitor, OnFrameHeader(0, 6, SETTINGS, 0));
+ EXPECT_CALL(
+ visitor,
+ OnInvalidFrame(0, Http2VisitorInterface::InvalidFrameError::kProtocol));
+
+ int64_t read_result = adapter->ProcessBytes(frames);
+ EXPECT_EQ(static_cast<size_t>(read_result), frames.size());
+
+ EXPECT_TRUE(adapter->want_write());
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0));
+ EXPECT_CALL(visitor,
+ OnFrameSent(GOAWAY, 0, _, 0x0,
+ static_cast<int>(Http2ErrorCode::PROTOCOL_ERROR)));
+
+ int send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+ EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY}));
+
+ auto adapter2 = NgHttp2Adapter::CreateServerAdapter(visitor);
+ const std::string frames2 = TestFrameSequence()
+ .ClientPreface({{ENABLE_CONNECT_PROTOCOL, 1}})
+ .Settings({{ENABLE_CONNECT_PROTOCOL, 0}})
+ .Serialize();
+
+ EXPECT_CALL(visitor, OnFrameHeader(0, 6, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnSettingsStart());
+ EXPECT_CALL(visitor, OnSetting(Http2Setting{ENABLE_CONNECT_PROTOCOL, 1u}));
+ EXPECT_CALL(visitor, OnSettingsEnd());
+ EXPECT_CALL(visitor, OnFrameHeader(0, 6, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnSettingsStart());
+ // Surprisingly, nghttp2 allows this behavior, which is prohibited in RFC
+ // 8441.
+ EXPECT_CALL(visitor, OnSetting(Http2Setting{ENABLE_CONNECT_PROTOCOL, 0u}));
+ EXPECT_CALL(visitor, OnSettingsEnd());
+
+ read_result = adapter2->ProcessBytes(frames2);
+ EXPECT_EQ(static_cast<size_t>(read_result), frames2.size());
+
+ EXPECT_TRUE(adapter2->want_write());
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x1, 0));
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x1, 0));
+ adapter2->Send();
+}
+
TEST(NgHttp2AdapterTest, ServerForbidsProtocolPseudoheaderBeforeAck) {
DataSavingVisitor visitor;
auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor);
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.h b/chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.h
index 15178bf89c8..423ad1bb7c0 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.h
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/nghttp2_util.h
@@ -12,7 +12,7 @@
#include "quiche/http2/adapter/http2_protocol.h"
#include "quiche/http2/adapter/http2_visitor_interface.h"
#include "quiche/http2/adapter/nghttp2.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace http2 {
namespace adapter {
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_test.cc b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_test.cc
index ba195bc7dc4..13c330bac8b 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter_test.cc
@@ -11,6 +11,7 @@
#include "quiche/http2/adapter/test_utils.h"
#include "quiche/common/platform/api/quiche_expect_bug.h"
#include "quiche/common/platform/api/quiche_test.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace http2 {
namespace adapter {
@@ -347,14 +348,14 @@ TEST(OgHttp2AdapterTest, AutomaticPingAcksDisabled) {
EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS}));
}
-TEST(OgHttp2AdapterTest, InvalidMaxFrameSize) {
+TEST(OgHttp2AdapterTest, InvalidMaxFrameSizeSetting) {
DataSavingVisitor visitor;
OgHttp2Adapter::Options options;
options.perspective = Perspective::kServer;
auto adapter = OgHttp2Adapter::Create(visitor, options);
const std::string frames =
- TestFrameSequence().ClientPreface({{MAX_FRAME_SIZE, 3}}).Serialize();
+ TestFrameSequence().ClientPreface({{MAX_FRAME_SIZE, 3u}}).Serialize();
testing::InSequence s;
// Client preface
@@ -383,6 +384,108 @@ TEST(OgHttp2AdapterTest, InvalidMaxFrameSize) {
EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY}));
}
+TEST(OgHttp2AdapterTest, InvalidPushSetting) {
+ DataSavingVisitor visitor;
+ OgHttp2Adapter::Options options;
+ options.perspective = Perspective::kServer;
+ auto adapter = OgHttp2Adapter::Create(visitor, options);
+
+ const std::string frames =
+ TestFrameSequence().ClientPreface({{ENABLE_PUSH, 3u}}).Serialize();
+ testing::InSequence s;
+
+ // Client preface
+ EXPECT_CALL(visitor, OnFrameHeader(0, 6, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnSettingsStart());
+ EXPECT_CALL(
+ visitor,
+ OnInvalidFrame(0, Http2VisitorInterface::InvalidFrameError::kProtocol));
+ EXPECT_CALL(visitor, OnConnectionError(ConnectionError::kInvalidSetting));
+
+ const int64_t read_result = adapter->ProcessBytes(frames);
+ EXPECT_EQ(static_cast<size_t>(read_result), frames.size());
+
+ EXPECT_TRUE(adapter->want_write());
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0));
+ EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0));
+ EXPECT_CALL(visitor,
+ OnFrameSent(GOAWAY, 0, _, 0x0,
+ static_cast<int>(Http2ErrorCode::PROTOCOL_ERROR)));
+
+ int send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+ EXPECT_THAT(visitor.data(),
+ EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY}));
+}
+
+TEST(OgHttp2AdapterTest, InvalidConnectProtocolSetting) {
+ DataSavingVisitor visitor;
+ OgHttp2Adapter::Options options;
+ options.perspective = Perspective::kServer;
+ auto adapter = OgHttp2Adapter::Create(visitor, options);
+
+ const std::string frames = TestFrameSequence()
+ .ClientPreface({{ENABLE_CONNECT_PROTOCOL, 3u}})
+ .Serialize();
+ testing::InSequence s;
+
+ EXPECT_CALL(visitor, OnFrameHeader(0, 6, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnSettingsStart());
+ EXPECT_CALL(
+ visitor,
+ OnInvalidFrame(0, Http2VisitorInterface::InvalidFrameError::kProtocol));
+ EXPECT_CALL(visitor, OnConnectionError(ConnectionError::kInvalidSetting));
+
+ int64_t read_result = adapter->ProcessBytes(frames);
+ EXPECT_EQ(static_cast<size_t>(read_result), frames.size());
+
+ EXPECT_TRUE(adapter->want_write());
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0));
+ EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0));
+ EXPECT_CALL(visitor,
+ OnFrameSent(GOAWAY, 0, _, 0x0,
+ static_cast<int>(Http2ErrorCode::PROTOCOL_ERROR)));
+
+ int send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+ EXPECT_THAT(visitor.data(),
+ EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY}));
+
+ auto adapter2 = OgHttp2Adapter::Create(visitor, options);
+ const std::string frames2 = TestFrameSequence()
+ .ClientPreface({{ENABLE_CONNECT_PROTOCOL, 1}})
+ .Settings({{ENABLE_CONNECT_PROTOCOL, 0}})
+ .Serialize();
+
+ EXPECT_CALL(visitor, OnFrameHeader(0, 6, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnSettingsStart());
+ EXPECT_CALL(visitor, OnSetting(Http2Setting{ENABLE_CONNECT_PROTOCOL, 1u}));
+ EXPECT_CALL(visitor, OnSettingsEnd());
+ EXPECT_CALL(visitor, OnFrameHeader(0, 6, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnSettingsStart());
+ EXPECT_CALL(
+ visitor,
+ OnInvalidFrame(0, Http2VisitorInterface::InvalidFrameError::kProtocol));
+ EXPECT_CALL(visitor, OnConnectionError(ConnectionError::kInvalidSetting));
+
+ read_result = adapter2->ProcessBytes(frames2);
+ EXPECT_EQ(static_cast<size_t>(read_result), frames2.size());
+
+ EXPECT_TRUE(adapter2->want_write());
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0));
+ EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0));
+ EXPECT_CALL(visitor,
+ OnFrameSent(GOAWAY, 0, _, 0x0,
+ static_cast<int>(Http2ErrorCode::PROTOCOL_ERROR)));
+ adapter2->Send();
+}
+
TEST(OgHttp2AdapterTest, ClientHandles100Headers) {
DataSavingVisitor visitor;
OgHttp2Adapter::Options options;
@@ -4766,7 +4869,7 @@ TEST(OgHttp2AdapterTest, ServerQueuesMetadataThenTrailers) {
visitor.Clear();
EXPECT_FALSE(adapter->want_write());
- spdy::SpdyHeaderBlock block;
+ spdy::Http2HeaderBlock block;
block["key"] = "wild value!";
adapter->SubmitMetadata(
1, 16384u, absl::make_unique<TestMetadataSource>(std::move(block)));
@@ -5913,6 +6016,185 @@ TEST(OgHttpAdapterTest, ServerReceivesGoAway) {
SpdyFrameType::HEADERS}));
}
+TEST(OgHttp2AdapterTest, ServerSubmitResponse) {
+ DataSavingVisitor visitor;
+ OgHttp2Adapter::Options options;
+ options.perspective = Perspective::kServer;
+ auto adapter = OgHttp2Adapter::Create(visitor, options);
+ EXPECT_FALSE(adapter->want_write());
+
+ const std::string frames = TestFrameSequence()
+ .ClientPreface()
+ .Headers(1,
+ {{":method", "GET"},
+ {":scheme", "https"},
+ {":authority", "example.com"},
+ {":path", "/this/is/request/one"}},
+ /*fin=*/true)
+ .Serialize();
+ testing::InSequence s;
+
+ const char* kSentinel1 = "arbitrary pointer 1";
+
+ // Client preface (empty SETTINGS)
+ EXPECT_CALL(visitor, OnFrameHeader(0, 0, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnSettingsStart());
+ EXPECT_CALL(visitor, OnSettingsEnd());
+ // Stream 1
+ EXPECT_CALL(visitor, OnFrameHeader(1, _, HEADERS, 5));
+ EXPECT_CALL(visitor, OnBeginHeadersForStream(1));
+ EXPECT_CALL(visitor, OnHeaderForStream(1, ":method", "GET"));
+ EXPECT_CALL(visitor, OnHeaderForStream(1, ":scheme", "https"));
+ EXPECT_CALL(visitor, OnHeaderForStream(1, ":authority", "example.com"));
+ EXPECT_CALL(visitor, OnHeaderForStream(1, ":path", "/this/is/request/one"));
+ EXPECT_CALL(visitor, OnEndHeadersForStream(1))
+ .WillOnce(testing::InvokeWithoutArgs([&adapter, kSentinel1]() {
+ adapter->SetStreamUserData(1, const_cast<char*>(kSentinel1));
+ return true;
+ }));
+ EXPECT_CALL(visitor, OnEndStream(1));
+
+ const int64_t result = adapter->ProcessBytes(frames);
+ EXPECT_EQ(frames.size(), result);
+
+ EXPECT_EQ(1, adapter->GetHighestReceivedStreamId());
+
+ // Server will want to send a SETTINGS and a SETTINGS ack.
+ EXPECT_TRUE(adapter->want_write());
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 6, 0x0));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, 6, 0x0, 0));
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 0, 0x1));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, 0, 0x1, 0));
+
+ int send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+ EXPECT_THAT(visitor.data(),
+ EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS}));
+ visitor.Clear();
+
+ EXPECT_EQ(0, adapter->GetHpackEncoderDynamicTableSize());
+
+ EXPECT_FALSE(adapter->want_write());
+ const absl::string_view kBody = "This is an example response body.";
+ // A data fin is not sent so that the stream remains open, and the flow
+ // control state can be verified.
+ auto body1 = absl::make_unique<TestDataFrameSource>(visitor, false);
+ body1->AppendPayload(kBody);
+ int submit_result = adapter->SubmitResponse(
+ 1,
+ ToHeaders({{":status", "404"},
+ {"x-comment", "I have no idea what you're talking about."}}),
+ std::move(body1));
+ EXPECT_EQ(submit_result, 0);
+ EXPECT_TRUE(adapter->want_write());
+
+ // Stream user data should have been set successfully after receiving headers.
+ EXPECT_EQ(kSentinel1, adapter->GetStreamUserData(1));
+ adapter->SetStreamUserData(1, nullptr);
+ EXPECT_EQ(nullptr, adapter->GetStreamUserData(1));
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(HEADERS, 1, _, 0x4));
+ EXPECT_CALL(visitor, OnFrameSent(HEADERS, 1, _, 0x4, 0));
+ EXPECT_CALL(visitor, OnFrameSent(DATA, 1, _, 0x0, 0));
+
+ send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+
+ EXPECT_THAT(visitor.data(),
+ EqualsFrames({SpdyFrameType::HEADERS, SpdyFrameType::DATA}));
+ EXPECT_THAT(visitor.data(), testing::HasSubstr(kBody));
+ EXPECT_FALSE(adapter->want_write());
+
+ // Some data was sent, so the remaining send window size should be less than
+ // the default.
+ EXPECT_LT(adapter->GetStreamSendWindowSize(1), kInitialFlowControlWindowSize);
+ EXPECT_GT(adapter->GetStreamSendWindowSize(1), 0);
+ // Send window for a nonexistent stream is not available.
+ EXPECT_EQ(adapter->GetStreamSendWindowSize(3), -1);
+
+ EXPECT_GT(adapter->GetHpackEncoderDynamicTableSize(), 0);
+}
+
+TEST(OgHttp2AdapterTest, ServerSubmitResponseWithResetFromClient) {
+ DataSavingVisitor visitor;
+ OgHttp2Adapter::Options options;
+ options.perspective = Perspective::kServer;
+ auto adapter = OgHttp2Adapter::Create(visitor, options);
+ EXPECT_FALSE(adapter->want_write());
+
+ const std::string frames = TestFrameSequence()
+ .ClientPreface()
+ .Headers(1,
+ {{":method", "GET"},
+ {":scheme", "https"},
+ {":authority", "example.com"},
+ {":path", "/this/is/request/one"}},
+ /*fin=*/true)
+ .Serialize();
+ testing::InSequence s;
+
+ // Client preface (empty SETTINGS)
+ EXPECT_CALL(visitor, OnFrameHeader(0, 0, SETTINGS, 0));
+ EXPECT_CALL(visitor, OnSettingsStart());
+ EXPECT_CALL(visitor, OnSettingsEnd());
+ // Stream 1
+ EXPECT_CALL(visitor, OnFrameHeader(1, _, HEADERS, 5));
+ EXPECT_CALL(visitor, OnBeginHeadersForStream(1));
+ EXPECT_CALL(visitor, OnHeaderForStream).Times(4);
+ EXPECT_CALL(visitor, OnEndHeadersForStream(1));
+ EXPECT_CALL(visitor, OnEndStream(1));
+
+ const int64_t result = adapter->ProcessBytes(frames);
+ EXPECT_EQ(frames.size(), result);
+
+ EXPECT_EQ(1, adapter->GetHighestReceivedStreamId());
+
+ // Server will want to send a SETTINGS and a SETTINGS ack.
+ EXPECT_TRUE(adapter->want_write());
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 6, 0x0));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, 6, 0x0, 0));
+ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 0, 0x1));
+ EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, 0, 0x1, 0));
+
+ int send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+ EXPECT_THAT(visitor.data(),
+ EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS}));
+ visitor.Clear();
+
+ EXPECT_FALSE(adapter->want_write());
+ const absl::string_view kBody = "This is an example response body.";
+ auto body1 = absl::make_unique<TestDataFrameSource>(visitor, true);
+ body1->AppendPayload(kBody);
+ int submit_result = adapter->SubmitResponse(
+ 1,
+ ToHeaders({{":status", "404"},
+ {"x-comment", "I have no idea what you're talking about."}}),
+ std::move(body1));
+ EXPECT_EQ(submit_result, 0);
+ EXPECT_TRUE(adapter->want_write());
+
+ // Client resets the stream before the server can send the response.
+ const std::string reset =
+ TestFrameSequence().RstStream(1, Http2ErrorCode::CANCEL).Serialize();
+ EXPECT_CALL(visitor, OnFrameHeader(1, 4, RST_STREAM, 0));
+ EXPECT_CALL(visitor, OnRstStream(1, Http2ErrorCode::CANCEL));
+ EXPECT_CALL(visitor, OnCloseStream(1, Http2ErrorCode::CANCEL));
+ const int64_t reset_result = adapter->ProcessBytes(reset);
+ EXPECT_EQ(reset.size(), static_cast<size_t>(reset_result));
+
+ EXPECT_CALL(visitor, OnBeforeFrameSent(HEADERS, 1, _, _)).Times(0);
+ EXPECT_CALL(visitor, OnFrameSent(HEADERS, 1, _, _, _)).Times(0);
+ EXPECT_CALL(visitor, OnFrameSent(DATA, 1, _, _, _)).Times(0);
+
+ send_result = adapter->Send();
+ EXPECT_EQ(0, send_result);
+
+ EXPECT_THAT(visitor.data(), testing::IsEmpty());
+}
+
TEST(OgHttp2AdapterTest, ServerRejectsStreamData) {
DataSavingVisitor visitor;
OgHttp2Adapter::Options options;
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc
index 9f48090d3ff..73f4e96fce8 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.cc
@@ -24,14 +24,6 @@ using SpdyFramerError = Http2DecoderAdapter::SpdyFramerError;
using ::spdy::SpdySettingsIR;
-// #define OGHTTP2_DEBUG_TRACE 1
-
-#ifdef OGHTTP2_DEBUG_TRACE
-const bool kTraceLoggingEnabled = true;
-#else
-const bool kTraceLoggingEnabled = false;
-#endif
-
const uint32_t kMaxAllowedMetadataFrameSize = 65536u;
const uint32_t kDefaultHpackTableCapacity = 4096u;
const uint32_t kMaximumHpackTableCapacity = 65536u;
@@ -343,10 +335,14 @@ OgHttp2Session::OgHttp2Session(Http2VisitorInterface& visitor, Options options)
event_forwarder_([this]() { return !latched_error_; }, *this),
receive_logger_(
&event_forwarder_, TracePerspectiveAsString(options.perspective),
- []() { return kTraceLoggingEnabled; }, this),
+ [logging_enabled = GetQuicheFlag(
+ FLAGS_quiche_oghttp2_debug_trace)]() { return logging_enabled; },
+ this),
send_logger_(
TracePerspectiveAsString(options.perspective),
- []() { return kTraceLoggingEnabled; }, this),
+ [logging_enabled = GetQuicheFlag(
+ FLAGS_quiche_oghttp2_debug_trace)]() { return logging_enabled; },
+ this),
headers_handler_(*this, visitor),
noop_headers_handler_(/*listener=*/nullptr),
connection_window_manager_(
@@ -357,7 +353,6 @@ OgHttp2Session::OgHttp2Session(Http2VisitorInterface& visitor, Options options)
options.should_window_update_fn,
/*update_window_on_notify=*/false) {
decoder_.set_visitor(&receive_logger_);
- decoder_.set_extension_visitor(this);
if (options_.max_header_list_bytes) {
// Limit buffering of encoded HPACK data to 2x the decoded limit.
decoder_.GetHpackDecoder()->set_max_decode_buffer_size_bytes(
@@ -993,7 +988,7 @@ int OgHttp2Session::SubmitTrailer(Http2StreamId stream_id,
<< "DataFrameSource will send fin, preventing trailers!";
// Save trailers so they can be written once data is done.
state.trailers =
- absl::make_unique<spdy::SpdyHeaderBlock>(ToHeaderBlock(trailers));
+ absl::make_unique<spdy::Http2HeaderBlock>(ToHeaderBlock(trailers));
if (!options_.trailers_require_end_data || !iter->second.data_deferred) {
trailers_ready_.insert(stream_id);
}
@@ -1233,6 +1228,18 @@ void OgHttp2Session::OnSetting(spdy::SpdySettingsId id, uint32_t value) {
encoder_header_table_capacity_when_acking_ = value;
}
break;
+ case ENABLE_PUSH:
+ if (value > 1u) {
+ visitor_.OnInvalidFrame(
+ 0, Http2VisitorInterface::InvalidFrameError::kProtocol);
+ // The specification says this is a connection-level protocol error.
+ LatchErrorAndNotify(
+ Http2ErrorCode::PROTOCOL_ERROR,
+ Http2VisitorInterface::ConnectionError::kInvalidSetting);
+ return;
+ }
+ // Aside from validation, this setting is ignored.
+ break;
case MAX_CONCURRENT_STREAMS:
max_outbound_concurrent_streams_ = value;
if (!IsServerSession()) {
@@ -1266,6 +1273,17 @@ void OgHttp2Session::OnSetting(spdy::SpdySettingsId id, uint32_t value) {
}
max_frame_payload_ = value;
break;
+ case ENABLE_CONNECT_PROTOCOL:
+ if (value > 1u || (value == 0 && peer_enables_connect_protocol_)) {
+ visitor_.OnInvalidFrame(
+ 0, Http2VisitorInterface::InvalidFrameError::kProtocol);
+ LatchErrorAndNotify(
+ Http2ErrorCode::PROTOCOL_ERROR,
+ Http2VisitorInterface::ConnectionError::kInvalidSetting);
+ return;
+ }
+ peer_enables_connect_protocol_ = (value == 1u);
+ break;
default:
// TODO(bnc): See if C++17 inline constants are allowed in QUICHE.
if (id == kMetadataExtensionId) {
@@ -1468,6 +1486,53 @@ bool OgHttp2Session::OnUnknownFrame(spdy::SpdyStreamId /*stream_id*/,
return true;
}
+void OgHttp2Session::OnUnknownFrameStart(spdy::SpdyStreamId stream_id,
+ size_t length, uint8_t type,
+ uint8_t flags) {
+ process_metadata_ = false;
+ if (streams_reset_.contains(stream_id)) {
+ return;
+ }
+ if (type == kMetadataFrameType) {
+ QUICHE_DCHECK_EQ(metadata_length_, 0u);
+ visitor_.OnBeginMetadataForStream(stream_id, length);
+ metadata_length_ = length;
+ process_metadata_ = true;
+ end_metadata_ = flags & kMetadataEndFlag;
+
+ // Empty metadata payloads will not trigger OnUnknownFramePayload(), so
+ // handle that possibility here.
+ MaybeHandleMetadataEndForStream(stream_id);
+ } else {
+ QUICHE_DLOG(INFO) << "Received unexpected frame type "
+ << static_cast<int>(type);
+ }
+}
+
+void OgHttp2Session::OnUnknownFramePayload(spdy::SpdyStreamId stream_id,
+ absl::string_view payload) {
+ if (!process_metadata_) {
+ return;
+ }
+ if (streams_reset_.contains(stream_id)) {
+ return;
+ }
+ if (metadata_length_ > 0) {
+ QUICHE_DCHECK_LE(payload.size(), metadata_length_);
+ const bool payload_success =
+ visitor_.OnMetadataForStream(stream_id, payload);
+ if (payload_success) {
+ metadata_length_ -= payload.size();
+ MaybeHandleMetadataEndForStream(stream_id);
+ } else {
+ fatal_visitor_callback_failure_ = true;
+ decoder_.StopProcessing();
+ }
+ } else {
+ QUICHE_DLOG(INFO) << "Unexpected metadata payload for stream " << stream_id;
+ }
+}
+
void OgHttp2Session::OnHeaderStatus(
Http2StreamId stream_id, Http2VisitorInterface::OnHeaderResult result) {
QUICHE_DCHECK_NE(result, Http2VisitorInterface::HEADER_OK);
@@ -1512,51 +1577,6 @@ void OgHttp2Session::OnHeaderStatus(
}
}
-bool OgHttp2Session::OnFrameHeader(spdy::SpdyStreamId stream_id, size_t length,
- uint8_t type, uint8_t flags) {
- if (streams_reset_.contains(stream_id)) {
- return false;
- }
- if (type == kMetadataFrameType) {
- QUICHE_DCHECK_EQ(metadata_length_, 0u);
- visitor_.OnBeginMetadataForStream(stream_id, length);
- metadata_stream_id_ = stream_id;
- metadata_length_ = length;
- end_metadata_ = flags & kMetadataEndFlag;
-
- // Empty metadata payloads will not trigger OnFramePayload(), so handle
- // that possibility here.
- MaybeHandleMetadataEndForStream(metadata_stream_id_);
-
- return true;
- } else {
- QUICHE_DLOG(INFO) << "Unexpected frame type " << static_cast<int>(type)
- << " received by the extension visitor.";
- return false;
- }
-}
-
-void OgHttp2Session::OnFramePayload(const char* data, size_t len) {
- if (streams_reset_.contains(metadata_stream_id_)) {
- return;
- }
- if (metadata_length_ > 0) {
- QUICHE_DCHECK_LE(len, metadata_length_);
- const bool payload_success = visitor_.OnMetadataForStream(
- metadata_stream_id_, absl::string_view(data, len));
- if (payload_success) {
- metadata_length_ -= len;
- MaybeHandleMetadataEndForStream(metadata_stream_id_);
- } else {
- fatal_visitor_callback_failure_ = true;
- decoder_.StopProcessing();
- }
- } else {
- QUICHE_DLOG(INFO) << "Unexpected metadata payload for stream "
- << metadata_stream_id_;
- }
-}
-
void OgHttp2Session::MaybeSetupPreface(bool sending_outbound_settings) {
if (!queued_preface_) {
queued_preface_ = true;
@@ -1663,7 +1683,7 @@ void OgHttp2Session::SendWindowUpdate(Http2StreamId stream_id,
}
void OgHttp2Session::SendHeaders(Http2StreamId stream_id,
- spdy::SpdyHeaderBlock headers,
+ spdy::Http2HeaderBlock headers,
bool end_stream) {
auto frame =
absl::make_unique<spdy::SpdyHeadersIR>(stream_id, std::move(headers));
@@ -1672,7 +1692,7 @@ void OgHttp2Session::SendHeaders(Http2StreamId stream_id,
}
void OgHttp2Session::SendTrailers(Http2StreamId stream_id,
- spdy::SpdyHeaderBlock trailers) {
+ spdy::Http2HeaderBlock trailers) {
auto frame =
absl::make_unique<spdy::SpdyHeadersIR>(stream_id, std::move(trailers));
frame->set_fin(true);
@@ -1722,7 +1742,7 @@ OgHttp2Session::StreamStateMap::iterator OgHttp2Session::CreateStream(
}
void OgHttp2Session::StartRequest(Http2StreamId stream_id,
- spdy::SpdyHeaderBlock headers,
+ spdy::Http2HeaderBlock headers,
std::unique_ptr<DataFrameSource> data_source,
void* user_data) {
if (received_goaway_) {
@@ -1761,7 +1781,21 @@ void OgHttp2Session::CloseStream(Http2StreamId stream_id,
stream_map_.erase(stream_id);
trailers_ready_.erase(stream_id);
streams_reset_.erase(stream_id);
- queued_frames_.erase(stream_id);
+ auto queued_it = queued_frames_.find(stream_id);
+ if (queued_it != queued_frames_.end()) {
+ // Remove any queued frames for this stream.
+ int frames_remaining = queued_it->second;
+ queued_frames_.erase(queued_it);
+ for (auto it = frames_.begin();
+ frames_remaining > 0 && it != frames_.end();) {
+ if (static_cast<Http2StreamId>((*it)->stream_id()) == stream_id) {
+ it = frames_.erase(it);
+ --frames_remaining;
+ } else {
+ ++it;
+ }
+ }
+ }
if (write_scheduler_.StreamRegistered(stream_id)) {
write_scheduler_.UnregisterStream(stream_id);
}
@@ -1864,7 +1898,7 @@ void OgHttp2Session::MaybeHandleMetadataEndForStream(Http2StreamId stream_id) {
fatal_visitor_callback_failure_ = true;
decoder_.StopProcessing();
}
- metadata_stream_id_ = 0;
+ process_metadata_ = false;
end_metadata_ = false;
}
}
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.h b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.h
index b4d713b07d9..e28af7a5b0e 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.h
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_session.h
@@ -23,11 +23,12 @@
#include "quiche/http2/core/priority_write_scheduler.h"
#include "quiche/common/platform/api/quiche_bug_tracker.h"
#include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/platform/api/quiche_flags.h"
#include "quiche/common/quiche_linked_hash_map.h"
#include "quiche/spdy/core/http2_frame_decoder_adapter.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/no_op_headers_handler.h"
#include "quiche/spdy/core/spdy_framer.h"
-#include "quiche/spdy/core/spdy_header_block.h"
#include "quiche/spdy/core/spdy_protocol.h"
namespace http2 {
@@ -36,8 +37,7 @@ namespace adapter {
// This class manages state associated with a single multiplexed HTTP/2 session.
class QUICHE_EXPORT_PRIVATE OgHttp2Session
: public Http2Session,
- public spdy::SpdyFramerVisitorInterface,
- public spdy::ExtensionVisitorInterface {
+ public spdy::SpdyFramerVisitorInterface {
public:
struct QUICHE_EXPORT_PRIVATE Options {
// Returns whether to send a WINDOW_UPDATE based on the window limit, window
@@ -153,6 +153,9 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
!goaway_rejected_streams_.empty());
}
int GetRemoteWindowSize() const override { return connection_send_window_; }
+ bool peer_enables_connect_protocol() {
+ return peer_enables_connect_protocol_;
+ }
// From SpdyFramerVisitorInterface
void OnError(http2::Http2DecoderAdapter::SpdyFramerError error,
@@ -200,19 +203,16 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
absl::string_view priority_field_value) override;
bool OnUnknownFrame(spdy::SpdyStreamId stream_id,
uint8_t frame_type) override;
+ void OnUnknownFrameStart(spdy::SpdyStreamId stream_id, size_t length,
+ uint8_t type, uint8_t flags) override;
+ void OnUnknownFramePayload(spdy::SpdyStreamId stream_id,
+ absl::string_view payload) override;
// Invoked when header processing encounters an invalid or otherwise
// problematic header.
void OnHeaderStatus(Http2StreamId stream_id,
Http2VisitorInterface::OnHeaderResult result);
- // Returns true if a recognized extension frame is received.
- bool OnFrameHeader(spdy::SpdyStreamId stream_id, size_t length, uint8_t type,
- uint8_t flags) override;
-
- // Handles the payload for a recognized extension frame.
- void OnFramePayload(const char* data, size_t len) override;
-
private:
struct QUICHE_EXPORT_PRIVATE StreamState {
StreamState(int32_t stream_receive_window, int32_t stream_send_window,
@@ -225,7 +225,7 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
WindowManager window_manager;
std::unique_ptr<DataFrameSource> outbound_body;
- std::unique_ptr<spdy::SpdyHeaderBlock> trailers;
+ std::unique_ptr<spdy::Http2HeaderBlock> trailers;
void* user_data = nullptr;
int32_t send_window;
absl::optional<HeaderType> received_header_type;
@@ -239,7 +239,7 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
using StreamStateMap = absl::flat_hash_map<Http2StreamId, StreamState>;
struct QUICHE_EXPORT_PRIVATE PendingStreamState {
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
std::unique_ptr<DataFrameSource> data_source;
void* user_data = nullptr;
};
@@ -363,10 +363,10 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
void SerializeMetadata(Http2StreamId stream_id,
std::unique_ptr<MetadataSource> source);
- void SendHeaders(Http2StreamId stream_id, spdy::SpdyHeaderBlock headers,
+ void SendHeaders(Http2StreamId stream_id, spdy::Http2HeaderBlock headers,
bool end_stream);
- void SendTrailers(Http2StreamId stream_id, spdy::SpdyHeaderBlock trailers);
+ void SendTrailers(Http2StreamId stream_id, spdy::Http2HeaderBlock trailers);
// Encapsulates the RST_STREAM NO_ERROR behavior described in RFC 7540
// Section 8.1.
@@ -381,7 +381,7 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
// Creates a stream for `stream_id`, stores the `data_source` and `user_data`
// in the stream state, and sends the `headers`.
- void StartRequest(Http2StreamId stream_id, spdy::SpdyHeaderBlock headers,
+ void StartRequest(Http2StreamId stream_id, spdy::Http2HeaderBlock headers,
std::unique_ptr<DataFrameSource> data_source,
void* user_data);
@@ -500,7 +500,6 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
// which this endpoint created a stream in the stream map.
Http2StreamId highest_received_stream_id_ = 0;
Http2StreamId highest_processed_stream_id_ = 0;
- Http2StreamId metadata_stream_id_ = 0;
Http2StreamId received_goaway_stream_id_ = 0;
size_t metadata_length_ = 0;
int32_t connection_send_window_ = kInitialFlowControlWindowSize;
@@ -508,7 +507,7 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
int32_t initial_stream_receive_window_ = kInitialFlowControlWindowSize;
// The initial flow control send window size for any newly created streams.
int32_t initial_stream_send_window_ = kInitialFlowControlWindowSize;
- uint32_t max_frame_payload_ = 16384u;
+ uint32_t max_frame_payload_ = kDefaultFramePayloadSizeLimit;
// The maximum number of concurrent streams that this connection can open to
// its peer and allow from its peer, respectively. Although the initial value
// is unlimited, the spec encourages a value of at least 100. We limit
@@ -530,6 +529,7 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
bool queued_preface_ = false;
bool peer_supports_metadata_ = false;
bool end_metadata_ = false;
+ bool process_metadata_ = false;
bool sent_non_ack_settings_ = false;
// Recursion guard for ProcessBytes().
@@ -537,6 +537,8 @@ class QUICHE_EXPORT_PRIVATE OgHttp2Session
// Recursion guard for Send().
bool sending_ = false;
+ bool peer_enables_connect_protocol_ = false;
+
// Replace this with a stream ID, for multiple GOAWAY support.
bool queued_goaway_ = false;
bool queued_immediate_goaway_ = false;
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.cc b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.cc
index b1acc22dbb8..26a3fb3461c 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.cc
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.cc
@@ -3,8 +3,8 @@
namespace http2 {
namespace adapter {
-spdy::SpdyHeaderBlock ToHeaderBlock(absl::Span<const Header> headers) {
- spdy::SpdyHeaderBlock block;
+spdy::Http2HeaderBlock ToHeaderBlock(absl::Span<const Header> headers) {
+ spdy::Http2HeaderBlock block;
for (const Header& header : headers) {
absl::string_view name = GetStringView(header.first).first;
absl::string_view value = GetStringView(header.second).first;
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.h b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.h
index c9f7aa68432..7d41cbd17ac 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.h
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util.h
@@ -4,12 +4,12 @@
#include "absl/types/span.h"
#include "quiche/http2/adapter/http2_protocol.h"
#include "quiche/common/platform/api/quiche_export.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace http2 {
namespace adapter {
-QUICHE_EXPORT_PRIVATE spdy::SpdyHeaderBlock ToHeaderBlock(
+QUICHE_EXPORT_PRIVATE spdy::Http2HeaderBlock ToHeaderBlock(
absl::Span<const Header> headers);
} // namespace adapter
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util_test.cc b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util_test.cc
index ac630738f18..d1a4177d9fb 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_util_test.cc
@@ -15,7 +15,7 @@ namespace {
using HeaderPair = std::pair<absl::string_view, absl::string_view>;
TEST(ToHeaderBlock, EmptySpan) {
- spdy::SpdyHeaderBlock block = ToHeaderBlock({});
+ spdy::Http2HeaderBlock block = ToHeaderBlock({});
EXPECT_TRUE(block.empty());
}
@@ -26,7 +26,7 @@ TEST(ToHeaderBlock, ExampleRequestHeaders) {
{":scheme", "http"},
{"accept", "text/plain, text/html"}};
const std::vector<Header> headers = ToHeaders(pairs);
- spdy::SpdyHeaderBlock block = ToHeaderBlock(headers);
+ spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
EXPECT_THAT(block, testing::ElementsAreArray(pairs));
}
@@ -36,7 +36,7 @@ TEST(ToHeaderBlock, ExampleResponseHeaders) {
{"content-length", "1023"},
{"x-extra-info", "humblest apologies"}};
const std::vector<Header> headers = ToHeaders(pairs);
- spdy::SpdyHeaderBlock block = ToHeaderBlock(headers);
+ spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
EXPECT_THAT(block, testing::ElementsAreArray(pairs));
}
@@ -54,7 +54,7 @@ TEST(ToHeaderBlock, RepeatedRequestHeaderNames) {
{"cookie", "chocolate_chips=yes; raisins=no"},
{"accept", "text/plain, text/html"}};
const std::vector<Header> headers = ToHeaders(pairs);
- spdy::SpdyHeaderBlock block = ToHeaderBlock(headers);
+ spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
EXPECT_THAT(block, testing::ElementsAreArray(expected));
}
@@ -73,7 +73,7 @@ TEST(ToHeaderBlock, RepeatedResponseHeaderNames) {
9)},
{"set-cookie", absl::string_view("chocolate_chips=yes\0raisins=no", 30)}};
const std::vector<Header> headers = ToHeaders(pairs);
- spdy::SpdyHeaderBlock block = ToHeaderBlock(headers);
+ spdy::Http2HeaderBlock block = ToHeaderBlock(headers);
EXPECT_THAT(block, testing::ElementsAreArray(expected));
}
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_frame_sequence.h b/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_frame_sequence.h
index e8d5bacb403..953aed111f0 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_frame_sequence.h
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_frame_sequence.h
@@ -8,6 +8,7 @@
#include "quiche/http2/adapter/http2_protocol.h"
#include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_protocol.h"
namespace http2 {
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.cc b/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.cc
index 0d08d27ceb8..f85d5a3f5e2 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.cc
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.cc
@@ -82,13 +82,13 @@ bool TestDataFrameSource::Send(absl::string_view frame_header,
return true;
}
-std::string EncodeHeaders(const spdy::SpdyHeaderBlock& entries) {
+std::string EncodeHeaders(const spdy::Http2HeaderBlock& entries) {
spdy::HpackEncoder encoder;
encoder.DisableCompression();
return encoder.EncodeHeaderBlock(entries);
}
-TestMetadataSource::TestMetadataSource(const spdy::SpdyHeaderBlock& entries)
+TestMetadataSource::TestMetadataSource(const spdy::Http2HeaderBlock& entries)
: encoded_entries_(EncodeHeaders(entries)) {
remaining_ = encoded_entries_;
}
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.h b/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.h
index d71a4008214..cd1aa8a3c1d 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.h
+++ b/chromium/net/third_party/quiche/src/quiche/http2/adapter/test_utils.h
@@ -12,7 +12,7 @@
#include "quiche/http2/adapter/mock_http2_visitor.h"
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_protocol.h"
namespace http2 {
@@ -103,7 +103,7 @@ class QUICHE_NO_EXPORT TestDataFrameSource : public DataFrameSource {
class QUICHE_NO_EXPORT TestMetadataSource : public MetadataSource {
public:
- explicit TestMetadataSource(const spdy::SpdyHeaderBlock& entries);
+ explicit TestMetadataSource(const spdy::Http2HeaderBlock& entries);
size_t NumFrames(size_t max_frame_size) const override {
// Round up to the next frame.
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc b/chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc
index 554bd5c3edc..591d63a699e 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc
+++ b/chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.cc
@@ -6,6 +6,7 @@
#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_bug_tracker.h"
#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_protocol.h"
// Convenience macros for printing function arguments in log lines in the
@@ -58,12 +59,12 @@ auto LogContainer(const T& container, ItemLogger item_logger)
namespace http2 {
+using spdy::Http2HeaderBlock;
using spdy::SettingsMap;
using spdy::SpdyAltSvcIR;
using spdy::SpdyContinuationIR;
using spdy::SpdyDataIR;
using spdy::SpdyGoAwayIR;
-using spdy::SpdyHeaderBlock;
using spdy::SpdyHeadersIR;
using spdy::SpdyPingIR;
using spdy::SpdyPriorityIR;
@@ -76,10 +77,10 @@ using spdy::SpdyWindowUpdateIR;
namespace {
-// Defines how elements of SpdyHeaderBlocks are logged.
+// Defines how elements of Http2HeaderBlocks are logged.
struct LogHeaderBlockEntry {
void Log(std::ostream& out,
- const SpdyHeaderBlock::value_type& entry) const { // NOLINT
+ const Http2HeaderBlock::value_type& entry) const { // NOLINT
out << "\"" << entry.first << "\": \"" << entry.second << "\"";
}
};
@@ -333,6 +334,24 @@ bool Http2TraceLogger::OnUnknownFrame(SpdyStreamId stream_id,
return wrapped_->OnUnknownFrame(stream_id, frame_type);
}
+void Http2TraceLogger::OnUnknownFrameStart(spdy::SpdyStreamId stream_id,
+ size_t length, uint8_t type,
+ uint8_t flags) {
+ HTTP2_TRACE_LOG(perspective_, is_enabled_)
+ << "OnUnknownFrameStart:" << FORMAT_ARG(connection_id_)
+ << FORMAT_ARG(stream_id) << FORMAT_ARG(length) << FORMAT_INT_ARG(type)
+ << FORMAT_INT_ARG(flags);
+ wrapped_->OnUnknownFrameStart(stream_id, length, type, flags);
+}
+
+void Http2TraceLogger::OnUnknownFramePayload(spdy::SpdyStreamId stream_id,
+ absl::string_view payload) {
+ HTTP2_TRACE_LOG(perspective_, is_enabled_)
+ << "OnUnknownFramePayload:" << FORMAT_ARG(connection_id_)
+ << FORMAT_ARG(stream_id) << " length=" << payload.size();
+ wrapped_->OnUnknownFramePayload(stream_id, payload);
+}
+
void Http2TraceLogger::LogReceivedHeaders() const {
if (recording_headers_handler_ == nullptr) {
// Trace logging was not enabled when the start of the header block was
diff --git a/chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.h b/chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.h
index deeeee1d446..7273770f6b9 100644
--- a/chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.h
+++ b/chromium/net/third_party/quiche/src/quiche/http2/core/http2_trace_logging.h
@@ -87,6 +87,10 @@ class QUICHE_EXPORT_PRIVATE Http2TraceLogger
void OnPriorityUpdate(SpdyStreamId prioritized_stream_id,
absl::string_view priority_field_value) override;
bool OnUnknownFrame(SpdyStreamId stream_id, uint8_t frame_type) override;
+ void OnUnknownFrameStart(SpdyStreamId stream_id, size_t length, uint8_t type,
+ uint8_t flags) override;
+ void OnUnknownFramePayload(SpdyStreamId stream_id,
+ absl::string_view payload) override;
private:
void LogReceivedHeaders() const;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent.cc b/chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent.cc
new file mode 100644
index 00000000000..996d70bb991
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent.cc
@@ -0,0 +1,236 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/bindings/quic_libevent.h"
+
+#include <memory>
+
+#include "absl/time/time.h"
+#include "event2/event.h"
+#include "event2/event_struct.h"
+#include "event2/thread.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_alarm.h"
+#include "quiche/quic/core/quic_clock.h"
+#include "quiche/quic/core/quic_default_clock.h"
+#include "quiche/quic/core/quic_time.h"
+
+namespace quic {
+
+using LibeventEventMask = short; // NOLINT(runtime/int)
+
+QuicSocketEventMask LibeventEventMaskToQuicEvents(int events) {
+ return ((events & EV_READ) ? kSocketEventReadable : 0) |
+ ((events & EV_WRITE) ? kSocketEventWritable : 0);
+}
+
+LibeventEventMask QuicEventsToLibeventEventMask(QuicSocketEventMask events) {
+ return ((events & kSocketEventReadable) ? EV_READ : 0) |
+ ((events & kSocketEventWritable) ? EV_WRITE : 0);
+}
+
+class LibeventAlarm : public QuicAlarm {
+ public:
+ LibeventAlarm(LibeventQuicEventLoop* loop,
+ QuicArenaScopedPtr<QuicAlarm::Delegate> delegate)
+ : QuicAlarm(std::move(delegate)), clock_(loop->clock()) {
+ event_.reset(evtimer_new(
+ loop->base(),
+ [](evutil_socket_t, LibeventEventMask, void* arg) {
+ LibeventAlarm* self = reinterpret_cast<LibeventAlarm*>(arg);
+ self->Fire();
+ },
+ this));
+ }
+
+ protected:
+ void SetImpl() override {
+ absl::Duration timeout =
+ absl::Microseconds((deadline() - clock_->Now()).ToMicroseconds());
+ timeval unix_time = absl::ToTimeval(timeout);
+ event_add(event_.get(), &unix_time);
+ }
+
+ void CancelImpl() override { event_del(event_.get()); }
+
+ private:
+ // While we inline `struct event` elsewhere, it is actually quite large, so
+ // doing that for the libevent-based QuicAlarm would cause it to not fit into
+ // the QuicConnectionArena.
+ struct EventDeleter {
+ void operator()(event* ev) { event_free(ev); }
+ };
+ std::unique_ptr<event, EventDeleter> event_;
+ QuicClock* clock_;
+};
+
+LibeventQuicEventLoop::LibeventQuicEventLoop(event_base* base, QuicClock* clock)
+ : base_(base),
+ edge_triggered_(event_base_get_features(base) & EV_FEATURE_ET),
+ clock_(clock) {
+ QUICHE_CHECK_LE(sizeof(event), event_get_struct_event_size())
+ << "libevent ABI mismatch: sizeof(event) is bigger than the one QUICHE "
+ "has been compiled with";
+}
+
+bool LibeventQuicEventLoop::RegisterSocket(QuicUdpSocketFd fd,
+ QuicSocketEventMask events,
+ QuicSocketEventListener* listener) {
+ auto [it, success] =
+ registration_map_.try_emplace(fd, this, fd, events, listener);
+ return success;
+}
+
+bool LibeventQuicEventLoop::UnregisterSocket(QuicUdpSocketFd fd) {
+ return registration_map_.erase(fd);
+}
+
+bool LibeventQuicEventLoop::RearmSocket(QuicUdpSocketFd fd,
+ QuicSocketEventMask events) {
+ if (edge_triggered_) {
+ QUICHE_BUG(LibeventQuicEventLoop_RearmSocket_called_on_ET)
+ << "RearmSocket() called on an edge-triggered event loop";
+ return false;
+ }
+ auto it = registration_map_.find(fd);
+ if (it == registration_map_.end()) {
+ return false;
+ }
+ it->second.Rearm(events);
+ return true;
+}
+
+bool LibeventQuicEventLoop::ArtificiallyNotifyEvent(
+ QuicUdpSocketFd fd, QuicSocketEventMask events) {
+ auto it = registration_map_.find(fd);
+ if (it == registration_map_.end()) {
+ return false;
+ }
+ it->second.ArtificiallyNotify(events);
+ return true;
+}
+
+void LibeventQuicEventLoop::RunEventLoopOnce(QuicTime::Delta default_timeout) {
+ timeval timeout =
+ absl::ToTimeval(absl::Microseconds(default_timeout.ToMicroseconds()));
+ event_base_loopexit(base_, &timeout);
+ event_base_loop(base_, EVLOOP_ONCE);
+}
+
+void LibeventQuicEventLoop::WakeUp() { event_base_loopbreak(base_); }
+
+LibeventQuicEventLoop::Registration::Registration(
+ LibeventQuicEventLoop* loop, QuicUdpSocketFd fd, QuicSocketEventMask events,
+ QuicSocketEventListener* listener)
+ : loop_(loop), listener_(listener) {
+ event_callback_fn callback = [](evutil_socket_t fd, LibeventEventMask events,
+ void* arg) {
+ auto* self = reinterpret_cast<LibeventQuicEventLoop::Registration*>(arg);
+ self->listener_->OnSocketEvent(self->loop_, fd,
+ LibeventEventMaskToQuicEvents(events));
+ };
+
+ if (loop_->SupportsEdgeTriggered()) {
+ LibeventEventMask mask =
+ QuicEventsToLibeventEventMask(events) | EV_PERSIST | EV_ET;
+ event_assign(&both_events_, loop_->base(), fd, mask, callback, this);
+ event_add(&both_events_, nullptr);
+ } else {
+ event_assign(&read_event_, loop_->base(), fd, EV_READ, callback, this);
+ event_assign(&write_event_, loop_->base(), fd, EV_WRITE, callback, this);
+ Rearm(events);
+ }
+}
+
+LibeventQuicEventLoop::Registration::~Registration() {
+ if (loop_->SupportsEdgeTriggered()) {
+ event_del(&both_events_);
+ } else {
+ event_del(&read_event_);
+ event_del(&write_event_);
+ }
+}
+
+void LibeventQuicEventLoop::Registration::ArtificiallyNotify(
+ QuicSocketEventMask events) {
+ if (loop_->SupportsEdgeTriggered()) {
+ event_active(&both_events_, QuicEventsToLibeventEventMask(events), 0);
+ return;
+ }
+
+ if (events & kSocketEventReadable) {
+ event_active(&read_event_, EV_READ, 0);
+ }
+ if (events & kSocketEventWritable) {
+ event_active(&write_event_, EV_WRITE, 0);
+ }
+}
+
+void LibeventQuicEventLoop::Registration::Rearm(QuicSocketEventMask events) {
+ QUICHE_DCHECK(!loop_->SupportsEdgeTriggered());
+ if (events & kSocketEventReadable) {
+ event_add(&read_event_, nullptr);
+ }
+ if (events & kSocketEventWritable) {
+ event_add(&write_event_, nullptr);
+ }
+}
+
+QuicAlarm* LibeventQuicEventLoop::AlarmFactory::CreateAlarm(
+ QuicAlarm::Delegate* delegate) {
+ return new LibeventAlarm(loop_,
+ QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate));
+}
+
+QuicArenaScopedPtr<QuicAlarm> LibeventQuicEventLoop::AlarmFactory::CreateAlarm(
+ QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
+ QuicConnectionArena* arena) {
+ if (arena != nullptr) {
+ return arena->New<LibeventAlarm>(loop_, std::move(delegate));
+ }
+ return QuicArenaScopedPtr<QuicAlarm>(
+ new LibeventAlarm(loop_, std::move(delegate)));
+}
+
+QuicLibeventEventLoopFactory::QuicLibeventEventLoopFactory(
+ bool force_level_triggered)
+ : force_level_triggered_(force_level_triggered) {
+ std::unique_ptr<QuicEventLoop> event_loop = Create(QuicDefaultClock::Get());
+ name_ = absl::StrFormat(
+ "libevent(%s)",
+ event_base_get_method(
+ static_cast<LibeventQuicEventLoopWithOwnership*>(event_loop.get())
+ ->base()));
+}
+
+struct LibeventConfigDeleter {
+ void operator()(event_config* config) { event_config_free(config); }
+};
+
+std::unique_ptr<LibeventQuicEventLoopWithOwnership>
+LibeventQuicEventLoopWithOwnership::Create(QuicClock* clock,
+ bool force_level_triggered) {
+ // Required for event_base_loopbreak() to actually work.
+ static int threads_initialized = []() {
+#ifdef _WIN32
+ return evthread_use_windows_threads();
+#else
+ return evthread_use_pthreads();
+#endif
+ }();
+ QUICHE_DCHECK_EQ(threads_initialized, 0);
+
+ std::unique_ptr<event_config, LibeventConfigDeleter> config(
+ event_config_new());
+ if (force_level_triggered) {
+ // epoll and kqueue are the two only current libevent backends that support
+ // edge-triggered I/O.
+ event_config_avoid_method(config.get(), "epoll");
+ event_config_avoid_method(config.get(), "kqueue");
+ }
+ return std::make_unique<LibeventQuicEventLoopWithOwnership>(
+ event_base_new_with_config(config.get()), clock);
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent.h b/chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent.h
new file mode 100644
index 00000000000..d8aa49370cd
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent.h
@@ -0,0 +1,155 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_BINDINGS_QUIC_LIBEVENT_H_
+#define QUICHE_QUIC_BINDINGS_QUIC_LIBEVENT_H_
+
+#include <memory>
+
+#include "absl/container/node_hash_map.h"
+#include "event2/event.h"
+#include "event2/event_struct.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_alarm.h"
+#include "quiche/quic/core/quic_alarm_factory.h"
+#include "quiche/quic/core/quic_udp_socket.h"
+
+namespace quic {
+
+// Provides a libevent-based implementation of QuicEventLoop. Since libevent
+// uses relative time for all timeouts, the provided clock does not need to use
+// the UNIX time.
+class QUICHE_EXPORT_PRIVATE LibeventQuicEventLoop : public QuicEventLoop {
+ public:
+ explicit LibeventQuicEventLoop(event_base* base, QuicClock* clock);
+
+ // QuicEventLoop implementation.
+ bool SupportsEdgeTriggered() const override { return edge_triggered_; }
+ std::unique_ptr<QuicAlarmFactory> CreateAlarmFactory() override {
+ return std::make_unique<AlarmFactory>(this);
+ }
+ bool RegisterSocket(QuicUdpSocketFd fd, QuicSocketEventMask events,
+ QuicSocketEventListener* listener) override;
+ bool UnregisterSocket(QuicUdpSocketFd fd) override;
+ bool RearmSocket(QuicUdpSocketFd fd, QuicSocketEventMask events) override;
+ bool ArtificiallyNotifyEvent(QuicUdpSocketFd fd,
+ QuicSocketEventMask events) override;
+ void RunEventLoopOnce(QuicTime::Delta default_timeout) override;
+
+ // Can be called from another thread to wake up the event loop from a blocking
+ // RunEventLoopOnce() call.
+ void WakeUp();
+
+ event_base* base() { return base_; }
+ QuicClock* clock() const { return clock_; }
+
+ private:
+ class AlarmFactory : public QuicAlarmFactory {
+ public:
+ AlarmFactory(LibeventQuicEventLoop* loop) : loop_(loop) {}
+
+ // QuicAlarmFactory interface.
+ QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) override;
+ QuicArenaScopedPtr<QuicAlarm> CreateAlarm(
+ QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
+ QuicConnectionArena* arena) override;
+
+ private:
+ LibeventQuicEventLoop* loop_;
+ };
+
+ class Registration {
+ public:
+ Registration(LibeventQuicEventLoop* loop, QuicUdpSocketFd fd,
+ QuicSocketEventMask events, QuicSocketEventListener* listener);
+ ~Registration();
+
+ void ArtificiallyNotify(QuicSocketEventMask events);
+ void Rearm(QuicSocketEventMask events);
+
+ private:
+ LibeventQuicEventLoop* loop_;
+ QuicSocketEventListener* listener_;
+
+ // Used for edge-triggered backends.
+ event both_events_;
+ // Used for level-triggered backends, since we may have to re-arm read
+ // events and write events separately.
+ event read_event_;
+ event write_event_;
+ };
+
+ using RegistrationMap = absl::node_hash_map<QuicUdpSocketFd, Registration>;
+
+ event_base* base_;
+ const bool edge_triggered_;
+ QuicClock* clock_;
+
+ RegistrationMap registration_map_;
+};
+
+// RAII-style wrapper around event_base.
+class QUICHE_EXPORT_PRIVATE LibeventLoop {
+ public:
+ LibeventLoop(struct event_base* base) : event_base_(base) {}
+ ~LibeventLoop() { event_base_free(event_base_); }
+
+ struct event_base* event_base() { return event_base_; }
+
+ private:
+ struct event_base* event_base_;
+};
+
+// A version of LibeventQuicEventLoop that owns the supplied `event_base`. Note
+// that the inheritance order here matters, since otherwise the `event_base` in
+// question will be deleted before the LibeventQuicEventLoop object referencing
+// it.
+class QUICHE_EXPORT_PRIVATE LibeventQuicEventLoopWithOwnership
+ : public LibeventLoop,
+ public LibeventQuicEventLoop {
+ public:
+ static std::unique_ptr<LibeventQuicEventLoopWithOwnership> Create(
+ QuicClock* clock, bool force_level_triggered = false);
+
+ // Takes ownership of |base|.
+ explicit LibeventQuicEventLoopWithOwnership(struct event_base* base,
+ QuicClock* clock)
+ : LibeventLoop(base), LibeventQuicEventLoop(base, clock) {}
+};
+
+class QUICHE_EXPORT_PRIVATE QuicLibeventEventLoopFactory
+ : public QuicEventLoopFactory {
+ public:
+ // Provides the preferred libevent backend.
+ static QuicLibeventEventLoopFactory* Get() {
+ static QuicLibeventEventLoopFactory* factory =
+ new QuicLibeventEventLoopFactory(/*force_level_triggered=*/false);
+ return factory;
+ }
+
+ // Provides the libevent backend that does not support edge-triggered
+ // notifications. Those are useful for tests, since we can test
+ // level-triggered I/O even on platforms where edge-triggered is the default.
+ static QuicLibeventEventLoopFactory* GetLevelTriggeredBackendForTests() {
+ static QuicLibeventEventLoopFactory* factory =
+ new QuicLibeventEventLoopFactory(/*force_level_triggered=*/true);
+ return factory;
+ }
+
+ std::unique_ptr<QuicEventLoop> Create(QuicClock* clock) override {
+ return LibeventQuicEventLoopWithOwnership::Create(clock,
+ force_level_triggered_);
+ }
+ std::string GetName() const override { return name_; }
+
+ private:
+ explicit QuicLibeventEventLoopFactory(bool force_level_triggered);
+
+ bool force_level_triggered_;
+ std::string name_;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_BINDINGS_QUIC_LIBEVENT_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent_test.cc
new file mode 100644
index 00000000000..e6f2427f8ac
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/bindings/quic_libevent_test.cc
@@ -0,0 +1,68 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/bindings/quic_libevent.h"
+
+#include <memory>
+
+#include "absl/memory/memory.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
+#include "quiche/quic/core/quic_alarm.h"
+#include "quiche/quic/core/quic_default_clock.h"
+#include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/quic/platform/api/quic_thread.h"
+
+namespace quic::test {
+namespace {
+
+class FailureAlarmDelegate : public QuicAlarm::Delegate {
+ public:
+ QuicConnectionContext* GetConnectionContext() override { return nullptr; }
+ void OnAlarm() override { ADD_FAILURE() << "Test timed out"; }
+};
+
+class LoopBreakThread : public QuicThread {
+ public:
+ LoopBreakThread(LibeventQuicEventLoop* loop)
+ : QuicThread("LoopBreakThread"), loop_(loop) {}
+
+ void Run() override {
+ // Make sure the other thread has actually made the blocking poll/epoll/etc
+ // call before calling WakeUp().
+ absl::SleepFor(absl::Milliseconds(250));
+
+ loop_broken_.store(true);
+ loop_->WakeUp();
+ }
+
+ std::atomic<int>& loop_broken() { return loop_broken_; }
+
+ private:
+ LibeventQuicEventLoop* loop_;
+ std::atomic<int> loop_broken_ = 0;
+};
+
+TEST(QuicLibeventTest, WakeUpFromAnotherThread) {
+ QuicClock* clock = QuicDefaultClock::Get();
+ auto event_loop_owned = QuicLibeventEventLoopFactory::Get()->Create(clock);
+ LibeventQuicEventLoop* event_loop =
+ static_cast<LibeventQuicEventLoop*>(event_loop_owned.get());
+ std::unique_ptr<QuicAlarmFactory> alarm_factory =
+ event_loop->CreateAlarmFactory();
+ std::unique_ptr<QuicAlarm> timeout_alarm =
+ absl::WrapUnique(alarm_factory->CreateAlarm(new FailureAlarmDelegate()));
+
+ const QuicTime kTimeoutAt = clock->Now() + QuicTime::Delta::FromSeconds(10);
+ timeout_alarm->Set(kTimeoutAt);
+
+ LoopBreakThread thread(event_loop);
+ thread.Start();
+ event_loop->RunEventLoopOnce(QuicTime::Delta::FromSeconds(5 * 60));
+ EXPECT_TRUE(thread.loop_broken().load());
+ thread.Join();
+}
+
+} // namespace
+} // namespace quic::test
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/chlo_extractor_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/chlo_extractor_test.cc
index 38524696e6c..6b49fdcab6b 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/chlo_extractor_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/chlo_extractor_test.cc
@@ -65,8 +65,9 @@ class ChloExtractorTest : public QuicTestWithParam<ParsedQuicVersion> {
header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
header.packet_number = QuicPacketNumber(1);
if (version_.HasLongHeaderLengths()) {
- header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.retry_token_length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
QuicFrames frames;
size_t offset = 0;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc
index bd0851aa222..6cc2852ef20 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.cc
@@ -76,6 +76,11 @@ void Bbr2NetworkModel::OnPacketSent(QuicTime sent_time,
QuicPacketNumber packet_number,
QuicByteCount bytes,
HasRetransmittableData is_retransmittable) {
+ // Updating the min here ensures a more realistic (0) value when flows exit
+ // quiescence.
+ if (bytes_in_flight < min_bytes_in_flight_in_round_) {
+ min_bytes_in_flight_in_round_ = bytes_in_flight;
+ }
round_trip_counter_.OnPacketSent(packet_number);
bandwidth_sampler_.OnPacketSent(sent_time, packet_number, bytes,
@@ -160,12 +165,11 @@ void Bbr2NetworkModel::OnCongestionEventStart(
congestion_event->last_packet_send_state.total_bytes_acked;
max_bytes_delivered_in_round_ =
std::max(max_bytes_delivered_in_round_, bytes_delivered);
- // TODO(ianswett) Consider treating any bytes lost as decreasing inflight,
- // because it's a sign of overutilization, not underutilization.
- if (min_bytes_in_flight_in_round_ == 0 ||
- congestion_event->bytes_in_flight < min_bytes_in_flight_in_round_) {
- min_bytes_in_flight_in_round_ = congestion_event->bytes_in_flight;
- }
+ }
+ // TODO(ianswett) Consider treating any bytes lost as decreasing inflight,
+ // because it's a sign of overutilization, not underutilization.
+ if (congestion_event->bytes_in_flight < min_bytes_in_flight_in_round_) {
+ min_bytes_in_flight_in_round_ = congestion_event->bytes_in_flight;
}
// |bandwidth_latest_| and |inflight_latest_| only increased within a round.
@@ -378,7 +382,7 @@ void Bbr2NetworkModel::OnNewRound() {
bytes_lost_in_round_ = 0;
loss_events_in_round_ = 0;
max_bytes_delivered_in_round_ = 0;
- min_bytes_in_flight_in_round_ = 0;
+ min_bytes_in_flight_in_round_ = std::numeric_limits<uint64_t>::max();
}
void Bbr2NetworkModel::cap_inflight_lo(QuicByteCount cap) {
@@ -432,6 +436,8 @@ bool Bbr2NetworkModel::HasBandwidthGrowth(
bool Bbr2NetworkModel::CheckPersistentQueue(
const Bbr2CongestionEvent& congestion_event, float bdp_gain) {
QUICHE_DCHECK(congestion_event.end_of_round_trip);
+ QUICHE_DCHECK_NE(min_bytes_in_flight_in_round_,
+ std::numeric_limits<uint64_t>::max());
QuicByteCount target = bdp_gain * BDP();
if (bdp_gain >= 2) {
// Use a more conservative threshold for STARTUP because CWND gain is 2.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.h b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.h
index cbfc2bddca0..3c85e85ec12 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_misc.h
@@ -75,7 +75,7 @@ struct QUIC_EXPORT_PRIVATE Bbr2Params {
* STARTUP parameters.
*/
- // The gain for both CWND and PacingRate at startup.
+ // The gain for CWND in startup.
float startup_cwnd_gain = 2.0;
// TODO(wub): Maybe change to the newly derived value of 2.773 (4 * ln(2)).
float startup_pacing_gain = 2.885;
@@ -560,7 +560,8 @@ class QUIC_EXPORT_PRIVATE Bbr2NetworkModel {
QuicByteCount max_bytes_delivered_in_round_ = 0;
// The minimum bytes in flight during this round.
- QuicByteCount min_bytes_in_flight_in_round_ = 0;
+ QuicByteCount min_bytes_in_flight_in_round_ =
+ std::numeric_limits<uint64_t>::max();
// Max bandwidth in the current round. Updated once per congestion event.
QuicBandwidth bandwidth_latest_ = QuicBandwidth::Zero();
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc
index 48d98dedb24..a06b7d11622 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_probe_bw.cc
@@ -365,8 +365,6 @@ void Bbr2ProbeBwMode::ProbeInflightHighUpward(
return;
}
} else if (Params().probe_up_includes_acks_after_cwnd_limited) {
- QUIC_RELOADABLE_FLAG_COUNT(
- quic_bbr2_add_bytes_acked_after_inflight_hi_limited);
// Don't continue adding bytes to probe_up_acked if the sender was not
// app-limited after being inflight_hi limited at least once.
if (!cycle_.probe_up_app_limited_since_inflight_hi_limited_ ||
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc
index 617890762f4..c6fab64782b 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_sender.cc
@@ -127,6 +127,13 @@ void Bbr2Sender::ApplyConnectionOptions(
QUIC_RELOADABLE_FLAG_COUNT_N(quic_bbr2_extra_acked_window, 2, 2);
model_.SetMaxAckHeightTrackerWindowLength(40);
}
+ if (GetQuicReloadableFlag(quic_bbr2_support_new_startup_pacing_gain) &&
+ ContainsQuicTag(connection_options, kBBQ1)) {
+ QUIC_RELOADABLE_FLAG_COUNT_N(quic_bbr2_support_new_startup_pacing_gain, 2,
+ 2);
+ params_.startup_pacing_gain = 2.773;
+ params_.drain_pacing_gain = 1.0 / params_.drain_cwnd_gain;
+ }
if (ContainsQuicTag(connection_options, kBBQ2)) {
params_.startup_cwnd_gain = 2.885;
params_.drain_cwnd_gain = 2.885;
@@ -198,9 +205,7 @@ void Bbr2Sender::ApplyConnectionOptions(
if (ContainsQuicTag(connection_options, kBBRB)) {
model_.SetLimitMaxAckHeightTrackerBySendRate(true);
}
- if (GetQuicReloadableFlag(
- quic_bbr2_add_bytes_acked_after_inflight_hi_limited) &&
- ContainsQuicTag(connection_options, kBBQ0)) {
+ if (ContainsQuicTag(connection_options, kBBQ0)) {
params_.probe_up_includes_acks_after_cwnd_limited = true;
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc
index fdf036b981c..43645e335cb 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc
@@ -617,6 +617,26 @@ TEST_F(Bbr2DefaultTopologyTest, SimpleTransferBBR5) {
EXPECT_APPROX_EQ(params.RTT(), rtt_stats()->min_rtt(), 0.2f);
}
+TEST_F(Bbr2DefaultTopologyTest, SimpleTransferBBQ1) {
+ SetQuicReloadableFlag(quic_bbr2_support_new_startup_pacing_gain, true);
+ SetConnectionOption(kBBQ1);
+ DefaultTopologyParams params;
+ CreateNetwork(params);
+
+ // Transfer 12MB.
+ DoSimpleTransfer(12 * 1024 * 1024, QuicTime::Delta::FromSeconds(35));
+ EXPECT_TRUE(Bbr2ModeIsOneOf({Bbr2Mode::PROBE_BW, Bbr2Mode::PROBE_RTT}));
+
+ EXPECT_APPROX_EQ(params.BottleneckBandwidth(),
+ sender_->ExportDebugState().bandwidth_hi, 0.01f);
+
+ EXPECT_LE(sender_loss_rate_in_packets(), 0.05);
+ // The margin here is high, because the aggregation greatly increases
+ // smoothed rtt.
+ EXPECT_GE(params.RTT() * 4, rtt_stats()->smoothed_rtt());
+ EXPECT_APPROX_EQ(params.RTT(), rtt_stats()->min_rtt(), 0.2f);
+}
+
TEST_F(Bbr2DefaultTopologyTest, SimpleTransferSmallBuffer) {
DefaultTopologyParams params;
params.switch_queue_capacity_in_bdp = 0.5;
@@ -776,8 +796,6 @@ TEST_F(Bbr2DefaultTopologyTest, QUIC_SLOW_TEST(BandwidthIncrease)) {
// Test Bbr2's reaction to a 100x bandwidth increase during a transfer with BBQ0
TEST_F(Bbr2DefaultTopologyTest, QUIC_SLOW_TEST(BandwidthIncreaseBBQ0)) {
- SetQuicReloadableFlag(quic_bbr2_add_bytes_acked_after_inflight_hi_limited,
- true);
SetConnectionOption(kBBQ0);
DefaultTopologyParams params;
params.local_link.bandwidth = QuicBandwidth::FromKBitsPerSecond(15000);
@@ -811,8 +829,6 @@ TEST_F(Bbr2DefaultTopologyTest, QUIC_SLOW_TEST(BandwidthIncreaseBBQ0)) {
// in the presence of ACK aggregation.
TEST_F(Bbr2DefaultTopologyTest,
QUIC_SLOW_TEST(BandwidthIncreaseBBQ0Aggregation)) {
- SetQuicReloadableFlag(quic_bbr2_add_bytes_acked_after_inflight_hi_limited,
- true);
SetConnectionOption(kBBQ0);
DefaultTopologyParams params;
params.local_link.bandwidth = QuicBandwidth::FromKBitsPerSecond(15000);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc
index 878b5985804..99b6a047e49 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/bbr_sender.cc
@@ -230,7 +230,13 @@ void BbrSender::SetFromConfig(const QuicConfig& config,
if (config.HasClientRequestedIndependentOption(kBBQ1, perspective)) {
set_high_gain(kDerivedHighGain);
set_high_cwnd_gain(kDerivedHighGain);
- set_drain_gain(1.f / kDerivedHighGain);
+ if (GetQuicReloadableFlag(quic_bbr2_support_new_startup_pacing_gain)) {
+ QUIC_RELOADABLE_FLAG_COUNT_N(quic_bbr2_support_new_startup_pacing_gain, 1,
+ 2);
+ set_drain_gain(1.0 / kDerivedHighCWNDGain);
+ } else {
+ set_drain_gain(1.f / kDerivedHighGain);
+ }
}
if (config.HasClientRequestedIndependentOption(kBBQ3, perspective)) {
enable_ack_aggregation_during_startup_ = true;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_test.cc
index 21af4f19e64..76e61a344bd 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/congestion_control/send_algorithm_test.cc
@@ -102,22 +102,6 @@ const QuicTime::Delta kTestCellularPropagationDelay =
const QuicTime::Delta kTestLinkSmallRTTDelay =
QuicTime::Delta::FromMilliseconds(10);
-const char* CongestionControlTypeToString(CongestionControlType cc_type) {
- switch (cc_type) {
- case kCubicBytes:
- return "CUBIC_BYTES";
- case kRenoBytes:
- return "RENO_BYTES";
- case kBBR:
- return "BBR";
- case kPCC:
- return "PCC";
- default:
- QUIC_DLOG(FATAL) << "Unexpected CongestionControlType";
- return nullptr;
- }
-}
-
struct TestParams {
explicit TestParams(CongestionControlType congestion_control_type)
: congestion_control_type(congestion_control_type) {}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/connection_id_generator.h b/chromium/net/third_party/quiche/src/quiche/quic/core/connection_id_generator.h
new file mode 100644
index 00000000000..65284d8bf34
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/connection_id_generator.h
@@ -0,0 +1,31 @@
+// Copyright (c) 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_CONNECTION_ID_GENERATOR_H_
+#define QUICHE_QUIC_CORE_CONNECTION_ID_GENERATOR_H_
+
+#include "quiche/quic/core/quic_connection_id.h"
+#include "quiche/quic/core/quic_versions.h"
+
+namespace quic {
+
+class QUIC_EXPORT_PRIVATE ConnectionIdGeneratorInterface {
+ // Interface which is responsible for generating new connection IDs from an
+ // existing connection ID.
+ public:
+ // Generate a new connection ID for a given connection ID. Returns the new
+ // connection ID. If it cannot be generated for some reason, returns
+ // empty.
+ virtual absl::optional<QuicConnectionId> GenerateNextConnectionId(
+ const QuicConnectionId& original) = 0;
+ // Consider the client-generated server connection ID in the quic handshake
+ // and consider replacing it. Returns empty if not replaced.
+ virtual absl::optional<QuicConnectionId> MaybeReplaceConnectionId(
+ const QuicConnectionId& original, const ParsedQuicVersion& version) = 0;
+ virtual ~ConnectionIdGeneratorInterface() = default;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_CONNECTION_ID_GENERATOR_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h b/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h
index 352242f3381..6a78b6d4428 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h
@@ -30,7 +30,7 @@ using ServerConfigID = std::string;
// "1CON", "BBQ4", "NCON", "RCID", "SREJ", "TBKP", "TB10", "SCLS", "SMHL",
// "QNZR", "B2HI", "H2PR", "FIFO", "LIFO", "RRWS", "QNSP", "B2CL", "CHSP",
// "BPTE", "ACKD", "AKD2", "AKD4", "MAD1", "MAD4", "MAD5", "ACD0", "ACKQ",
-// "TLPR", "CCS\0", "PDP4"
+// "TLPR", "CCS\0", "PDP4", "NCHP", "NBPE"
// clang-format off
const QuicTag kCHLO = TAG('C', 'H', 'L', 'O'); // Client hello
@@ -301,7 +301,7 @@ const QuicTag kNPCO = TAG('N', 'P', 'C', 'O'); // No pacing offload.
const QuicTag kBWRE = TAG('B', 'W', 'R', 'E'); // Bandwidth resumption.
const QuicTag kBWMX = TAG('B', 'W', 'M', 'X'); // Max bandwidth resumption.
const QuicTag kBWID = TAG('B', 'W', 'I', 'D'); // Send bandwidth when idle.
-const QuicTag kBWR1 = TAG('B', 'W', 'I', '1'); // Resume bandwidth experiment 1
+const QuicTag kBWI1 = TAG('B', 'W', 'I', '1'); // Resume bandwidth experiment 1
const QuicTag kBWRS = TAG('B', 'W', 'R', 'S'); // Server bandwidth resumption.
const QuicTag kBWS2 = TAG('B', 'W', 'S', '2'); // Server bw resumption v2.
const QuicTag kBWS3 = TAG('B', 'W', 'S', '3'); // QUIC Initial CWND - Control.
@@ -354,9 +354,6 @@ const QuicTag kMTUL = TAG('M', 'T', 'U', 'L'); // Low-target MTU discovery.
const QuicTag kNSLC = TAG('N', 'S', 'L', 'C'); // Always send connection close
// for idle timeout.
-const QuicTag kNCHP = TAG('N', 'C', 'H', 'P'); // No chaos protection.
-const QuicTag kNBPE = TAG('N', 'B', 'P', 'E'); // No BoringSSL Permutes
- // TLS Extensions.
// Proof types (i.e. certificate types)
// NOTE: although it would be silly to do so, specifying both kX509 and kX59R
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc
index 635d159a653..140c16a7902 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.cc
@@ -177,13 +177,13 @@ TransportParameters::IntegerParameter::IntegerParameter(
has_been_read_(false) {
QUICHE_DCHECK_LE(min_value, default_value);
QUICHE_DCHECK_LE(default_value, max_value);
- QUICHE_DCHECK_LE(max_value, kVarInt62MaxValue);
+ QUICHE_DCHECK_LE(max_value, quiche::kVarInt62MaxValue);
}
TransportParameters::IntegerParameter::IntegerParameter(
TransportParameters::TransportParameterId param_id)
: TransportParameters::IntegerParameter::IntegerParameter(
- param_id, 0, 0, kVarInt62MaxValue) {}
+ param_id, 0, 0, quiche::kVarInt62MaxValue) {}
void TransportParameters::IntegerParameter::set_value(uint64_t value) {
value_ = value;
@@ -206,13 +206,13 @@ bool TransportParameters::IntegerParameter::Write(
QUIC_BUG(quic_bug_10743_1) << "Failed to write param_id for " << *this;
return false;
}
- const QuicVariableLengthIntegerLength value_length =
+ const quiche::QuicheVariableLengthIntegerLength value_length =
QuicDataWriter::GetVarInt62Len(value_);
if (!writer->WriteVarInt62(value_length)) {
QUIC_BUG(quic_bug_10743_2) << "Failed to write value_length for " << *this;
return false;
}
- if (!writer->WriteVarInt62(value_, value_length)) {
+ if (!writer->WriteVarInt62WithForcedLength(value_, value_length)) {
QUIC_BUG(quic_bug_10743_3) << "Failed to write value for " << *this;
return false;
}
@@ -451,7 +451,8 @@ std::string TransportParameters::ToString() const {
TransportParameters::TransportParameters()
: max_idle_timeout_ms(kMaxIdleTimeout),
max_udp_payload_size(kMaxPacketSize, kDefaultMaxPacketSizeTransportParam,
- kMinMaxPacketSizeTransportParam, kVarInt62MaxValue),
+ kMinMaxPacketSizeTransportParam,
+ quiche::kVarInt62MaxValue),
initial_max_data(kInitialMaxData),
initial_max_stream_data_bidi_local(kInitialMaxStreamDataBidiLocal),
initial_max_stream_data_bidi_remote(kInitialMaxStreamDataBidiRemote),
@@ -469,7 +470,7 @@ TransportParameters::TransportParameters()
active_connection_id_limit(kActiveConnectionIdLimit,
kDefaultActiveConnectionIdLimitTransportParam,
kMinActiveConnectionIdLimitTransportParam,
- kVarInt62MaxValue),
+ quiche::kVarInt62MaxValue),
max_datagram_frame_size(kMaxDatagramFrameSize),
initial_round_trip_time_us(kInitialRoundTripTime)
// Important note: any new transport parameters must be added
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.h b/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.h
index e1f349b6da9..14ae6e97539 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/crypto/transport_parameters.h
@@ -61,7 +61,7 @@ struct QUIC_EXPORT_PRIVATE TransportParameters {
friend struct TransportParameters;
// Constructors for initial setup used by TransportParameters only.
// This constructor sets |default_value| and |min_value| to 0, and
- // |max_value| to kVarInt62MaxValue.
+ // |max_value| to quiche::kVarInt62MaxValue.
explicit IntegerParameter(TransportParameterId param_id);
IntegerParameter(TransportParameterId param_id, uint64_t default_value,
uint64_t min_value, uint64_t max_value);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc
new file mode 100644
index 00000000000..fd86dc7bdee
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.cc
@@ -0,0 +1,73 @@
+// Copyright (c) 2022 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.
+
+#include "quiche/quic/core/deterministic_connection_id_generator.h"
+
+#include "quiche/quic/core/quic_utils.h"
+#include "quiche/quic/platform/api/quic_bug_tracker.h"
+#include "quiche/quic/platform/api/quic_logging.h"
+
+namespace quic {
+
+DeterministicConnectionIdGenerator::DeterministicConnectionIdGenerator(
+ uint8_t expected_connection_id_length)
+ : expected_connection_id_length_(expected_connection_id_length) {
+ if (expected_connection_id_length_ >
+ kQuicMaxConnectionIdWithLengthPrefixLength) {
+ QUIC_BUG(quic_bug_465151159_01)
+ << "Issuing connection IDs longer than allowed in RFC9000";
+ }
+}
+
+absl::optional<QuicConnectionId>
+DeterministicConnectionIdGenerator::GenerateNextConnectionId(
+ const QuicConnectionId& original) {
+ if (expected_connection_id_length_ == 0) {
+ return EmptyQuicConnectionId();
+ }
+ const uint64_t connection_id_hash64 = QuicUtils::FNV1a_64_Hash(
+ absl::string_view(original.data(), original.length()));
+ if (expected_connection_id_length_ <= sizeof(uint64_t)) {
+ return QuicConnectionId(
+ reinterpret_cast<const char*>(&connection_id_hash64),
+ expected_connection_id_length_);
+ }
+ char new_connection_id_data[255] = {};
+ const absl::uint128 connection_id_hash128 = QuicUtils::FNV1a_128_Hash(
+ absl::string_view(original.data(), original.length()));
+ static_assert(sizeof(connection_id_hash64) + sizeof(connection_id_hash128) <=
+ sizeof(new_connection_id_data),
+ "bad size");
+ memcpy(new_connection_id_data, &connection_id_hash64,
+ sizeof(connection_id_hash64));
+ // TODO(martinduke): We don't have any test coverage of the line below. In
+ // particular, if the memcpy somehow misses a byte, a test could check if one
+ // byte position in generated connection IDs is always the same.
+ memcpy(new_connection_id_data + sizeof(connection_id_hash64),
+ &connection_id_hash128, sizeof(connection_id_hash128));
+ return QuicConnectionId(new_connection_id_data,
+ expected_connection_id_length_);
+}
+
+absl::optional<QuicConnectionId>
+DeterministicConnectionIdGenerator::MaybeReplaceConnectionId(
+ const QuicConnectionId& original, const ParsedQuicVersion& version) {
+ if (original.length() == expected_connection_id_length_) {
+ return absl::optional<QuicConnectionId>();
+ }
+ QUICHE_DCHECK(version.AllowsVariableLengthConnectionIds());
+ absl::optional<QuicConnectionId> new_connection_id =
+ GenerateNextConnectionId(original);
+ // Verify that ReplaceShortServerConnectionId is deterministic.
+ QUICHE_DCHECK(new_connection_id.has_value());
+ QUICHE_DCHECK_EQ(
+ *new_connection_id,
+ static_cast<QuicConnectionId>(*GenerateNextConnectionId(original)));
+ QUICHE_DCHECK_EQ(expected_connection_id_length_, new_connection_id->length());
+ QUIC_DLOG(INFO) << "Replacing incoming connection ID " << original << " with "
+ << new_connection_id.value();
+ return new_connection_id;
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.h b/chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.h
new file mode 100644
index 00000000000..cd27811e156
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.h
@@ -0,0 +1,37 @@
+// Copyright (c) 2022 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 Connection ID generator that generates deterministic connection IDs for
+// QUIC servers.
+
+#ifndef QUICHE_QUIC_CORE_CONNECTION_ID_GENERATOR_DETERMINISTIC_H_
+#define QUICHE_QUIC_CORE_CONNECTION_ID_GENERATOR_DETERMINISTIC_H_
+
+#include "quiche/quic/core/connection_id_generator.h"
+
+namespace quic {
+
+// Generates connection IDs deterministically from the provided original
+// connection ID.
+class QUIC_EXPORT_PRIVATE DeterministicConnectionIdGenerator
+ : public ConnectionIdGeneratorInterface {
+ public:
+ DeterministicConnectionIdGenerator(uint8_t expected_connection_id_length);
+
+ // Hashes |original| to create a new connection ID.
+ absl::optional<QuicConnectionId> GenerateNextConnectionId(
+ const QuicConnectionId& original) override;
+ // Replace the connection ID if and only if |original| is not of the expected
+ // length.
+ absl::optional<QuicConnectionId> MaybeReplaceConnectionId(
+ const QuicConnectionId& original,
+ const ParsedQuicVersion& version) override;
+
+ private:
+ const uint8_t expected_connection_id_length_;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE__CONNECTION_ID_GENERATOR_DETERMINISTIC_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator_test.cc
new file mode 100644
index 00000000000..67016b58222
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator_test.cc
@@ -0,0 +1,122 @@
+// Copyright (c) 2022 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.
+
+#include "quiche/quic/core/deterministic_connection_id_generator.h"
+
+#include <optional>
+
+#include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/quic/test_tools/quic_test_utils.h"
+
+namespace quic {
+namespace test {
+
+struct TestParams {
+ TestParams(int connection_id_length)
+ : connection_id_length_(connection_id_length) {}
+ TestParams() : TestParams(kQuicDefaultConnectionIdLength) {}
+
+ friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
+ os << "{ connection ID length: " << p.connection_id_length_ << " }";
+ return os;
+ }
+
+ int connection_id_length_;
+};
+
+// Constructs various test permutations.
+std::vector<struct TestParams> GetTestParams() {
+ std::vector<struct TestParams> params;
+ std::vector<int> connection_id_lengths{7, 8, 9, 16, 20};
+ for (int connection_id_length : connection_id_lengths) {
+ params.push_back(TestParams(connection_id_length));
+ }
+ return params;
+}
+
+class DeterministicConnectionIdGeneratorTest
+ : public QuicTestWithParam<TestParams> {
+ public:
+ DeterministicConnectionIdGeneratorTest()
+ : connection_id_length_(GetParam().connection_id_length_),
+ generator_(DeterministicConnectionIdGenerator(connection_id_length_)),
+ version_(ParsedQuicVersion::RFCv1()) {}
+
+ protected:
+ int connection_id_length_;
+ DeterministicConnectionIdGenerator generator_;
+ ParsedQuicVersion version_;
+};
+
+INSTANTIATE_TEST_SUITE_P(DeterministicConnectionIdGeneratorTests,
+ DeterministicConnectionIdGeneratorTest,
+ ::testing::ValuesIn(GetTestParams()));
+
+TEST_P(DeterministicConnectionIdGeneratorTest,
+ NextConnectionIdIsDeterministic) {
+ // Verify that two equal connection IDs get the same replacement.
+ QuicConnectionId connection_id64a = TestConnectionId(33);
+ QuicConnectionId connection_id64b = TestConnectionId(33);
+ EXPECT_EQ(connection_id64a, connection_id64b);
+ EXPECT_EQ(*generator_.GenerateNextConnectionId(connection_id64a),
+ *generator_.GenerateNextConnectionId(connection_id64b));
+ QuicConnectionId connection_id72a = TestConnectionIdNineBytesLong(42);
+ QuicConnectionId connection_id72b = TestConnectionIdNineBytesLong(42);
+ EXPECT_EQ(connection_id72a, connection_id72b);
+ EXPECT_EQ(*generator_.GenerateNextConnectionId(connection_id72a),
+ *generator_.GenerateNextConnectionId(connection_id72b));
+}
+
+TEST_P(DeterministicConnectionIdGeneratorTest,
+ NextConnectionIdLengthIsCorrect) {
+ // Verify that all generated IDs are of the correct length.
+ const char connection_id_bytes[255] = {};
+ for (uint8_t i = 0; i < sizeof(connection_id_bytes) - 1; ++i) {
+ QuicConnectionId connection_id(connection_id_bytes, i);
+ absl::optional<QuicConnectionId> replacement_connection_id =
+ generator_.GenerateNextConnectionId(connection_id);
+ ASSERT_TRUE(replacement_connection_id.has_value());
+ EXPECT_EQ(connection_id_length_, replacement_connection_id->length());
+ }
+}
+
+TEST_P(DeterministicConnectionIdGeneratorTest, NextConnectionIdHasEntropy) {
+ // Make sure all these test connection IDs have different replacements.
+ for (uint64_t i = 0; i < 256; ++i) {
+ QuicConnectionId connection_id_i = TestConnectionId(i);
+ absl::optional<QuicConnectionId> new_i =
+ generator_.GenerateNextConnectionId(connection_id_i);
+ ASSERT_TRUE(new_i.has_value());
+ EXPECT_NE(connection_id_i, *new_i);
+ for (uint64_t j = i + 1; j <= 256; ++j) {
+ QuicConnectionId connection_id_j = TestConnectionId(j);
+ EXPECT_NE(connection_id_i, connection_id_j);
+ absl::optional<QuicConnectionId> new_j =
+ generator_.GenerateNextConnectionId(connection_id_j);
+ ASSERT_TRUE(new_j.has_value());
+ EXPECT_NE(*new_i, *new_j);
+ }
+ }
+}
+
+TEST_P(DeterministicConnectionIdGeneratorTest,
+ OnlyReplaceConnectionIdWithWrongLength) {
+ const char connection_id_input[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
+ 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
+ 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14};
+ for (int i = 0; i < kQuicMaxConnectionIdWithLengthPrefixLength; i++) {
+ QuicConnectionId input = QuicConnectionId(connection_id_input, i);
+ absl::optional<QuicConnectionId> output =
+ generator_.MaybeReplaceConnectionId(input, version_);
+ if (i == connection_id_length_) {
+ EXPECT_FALSE(output.has_value());
+ } else {
+ ASSERT_TRUE(output.has_value());
+ EXPECT_EQ(*output, generator_.GenerateNextConnectionId(input));
+ }
+ }
+}
+
+} // namespace test
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/end_to_end_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/end_to_end_test.cc
index d602f388392..713d7c52c75 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/end_to_end_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/end_to_end_test.cc
@@ -21,10 +21,12 @@
#include "quiche/quic/core/http/http_constants.h"
#include "quiche/quic/core/http/quic_spdy_client_stream.h"
#include "quiche/quic/core/http/web_transport_http3.h"
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
#include "quiche/quic/core/quic_connection.h"
#include "quiche/quic/core/quic_constants.h"
#include "quiche/quic/core/quic_data_writer.h"
-#include "quiche/quic/core/quic_epoll_connection_helper.h"
+#include "quiche/quic/core/quic_default_clock.h"
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/core/quic_framer.h"
#include "quiche/quic/core/quic_packet_creator.h"
@@ -33,7 +35,6 @@
#include "quiche/quic/core/quic_session.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_utils.h"
-#include "quiche/quic/platform/api/quic_epoll.h"
#include "quiche/quic/platform/api/quic_expect_bug.h"
#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_logging.h"
@@ -45,7 +46,6 @@
#include "quiche/quic/test_tools/packet_dropping_test_writer.h"
#include "quiche/quic/test_tools/packet_reordering_writer.h"
#include "quiche/quic/test_tools/qpack/qpack_encoder_peer.h"
-#include "quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h"
#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
#include "quiche/quic/test_tools/quic_client_peer.h"
#include "quiche/quic/test_tools/quic_client_session_cache_peer.h"
@@ -73,10 +73,12 @@
#include "quiche/quic/tools/quic_server.h"
#include "quiche/quic/tools/quic_simple_client_stream.h"
#include "quiche/quic/tools/quic_simple_server_stream.h"
+#include "quiche/common/platform/api/quiche_test.h"
+#include "quiche/spdy/core/http2_header_block.h"
+using spdy::Http2HeaderBlock;
using spdy::kV3LowestPriority;
using spdy::SpdyFramer;
-using spdy::SpdyHeaderBlock;
using spdy::SpdySerializedFrame;
using spdy::SpdySettingsIR;
using ::testing::_;
@@ -98,9 +100,11 @@ const int kLongConnectionIdLength = 16;
// Run all tests with the cross products of all versions.
struct TestParams {
TestParams(const ParsedQuicVersion& version, QuicTag congestion_control_tag,
+ QuicEventLoopFactory* event_loop,
int override_server_connection_id_length)
: version(version),
congestion_control_tag(congestion_control_tag),
+ event_loop(event_loop),
override_server_connection_id_length(
override_server_connection_id_length) {}
@@ -108,6 +112,7 @@ struct TestParams {
os << "{ version: " << ParsedQuicVersionToString(p.version);
os << " congestion_control_tag: "
<< QuicTagToString(p.congestion_control_tag)
+ << " event loop: " << p.event_loop->GetName()
<< " connection ID length: " << p.override_server_connection_id_length
<< " }";
return os;
@@ -115,6 +120,7 @@ struct TestParams {
ParsedQuicVersion version;
QuicTag congestion_control_tag;
+ QuicEventLoopFactory* event_loop;
int override_server_connection_id_length;
};
@@ -122,13 +128,12 @@ struct TestParams {
std::string PrintToString(const TestParams& p) {
std::string rv = absl::StrCat(
ParsedQuicVersionToString(p.version), "_",
- QuicTagToString(p.congestion_control_tag), "_",
+ QuicTagToString(p.congestion_control_tag), "_", p.event_loop->GetName(),
+ "_",
std::to_string((p.override_server_connection_id_length == -1)
? static_cast<int>(kQuicDefaultConnectionIdLength)
: p.override_server_connection_id_length));
- std::replace(rv.begin(), rv.end(), ',', '_');
- std::replace(rv.begin(), rv.end(), ' ', '_');
- return rv;
+ return EscapeTestParamName(rv);
}
// Constructs various test permutations.
@@ -150,19 +155,29 @@ std::vector<TestParams> GetTestParams() {
// qQUIC as well.
if (connection_id_length == -1 || version.UsesTls()) {
params.push_back(TestParams(version, congestion_control_tag,
+ GetDefaultEventLoop(),
connection_id_length));
}
} // End of outer version loop.
} // End of congestion_control_tag loop.
} // End of connection_id_length loop.
+ // Only run every event loop implementation for one fixed configuration.
+ for (QuicEventLoopFactory* event_loop : GetAllSupportedEventLoops()) {
+ if (event_loop == GetDefaultEventLoop()) {
+ continue;
+ }
+ params.push_back(
+ TestParams(ParsedQuicVersion::RFCv1(), kTBBR, event_loop, -1));
+ }
+
return params;
}
void WriteHeadersOnStream(QuicSpdyStream* stream) {
// Since QuicSpdyStream uses QuicHeaderList::empty() to detect too large
// headers, it also fails when receiving empty headers.
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":authority"] = "test.example.com:443";
headers[":path"] = "/path";
headers[":method"] = "GET";
@@ -183,15 +198,15 @@ class ServerDelegate : public PacketDroppingTestWriter::Delegate {
class ClientDelegate : public PacketDroppingTestWriter::Delegate {
public:
- explicit ClientDelegate(QuicClient* client) : client_(client) {}
+ explicit ClientDelegate(QuicDefaultClient* client) : client_(client) {}
~ClientDelegate() override = default;
void OnCanWrite() override {
- QuicEpollEvent event(EPOLLOUT);
- client_->epoll_network_helper()->OnEvent(client_->GetLatestFD(), &event);
+ client_->default_network_helper()->OnSocketEvent(
+ nullptr, client_->GetLatestFD(), kSocketEventWritable);
}
private:
- QuicClient* client_;
+ QuicDefaultClient* client_;
};
class EndToEndTest : public QuicTestWithParam<TestParams> {
@@ -201,6 +216,7 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
connect_to_server_on_initialize_(true),
server_address_(QuicSocketAddress(TestLoopback(), 0)),
server_hostname_("test.example.com"),
+ fd_(kQuicInvalidSocketFd),
client_writer_(nullptr),
server_writer_(nullptr),
version_(GetParam().version),
@@ -241,11 +257,12 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
}
QuicTestClient* CreateQuicClient(QuicPacketWriterWrapper* writer) {
- QuicTestClient* client =
- new QuicTestClient(server_address_, server_hostname_, client_config_,
- client_supported_versions_,
- crypto_test_utils::ProofVerifierForTesting(),
- std::make_unique<QuicClientSessionCache>());
+ QuicTestClient* client = new QuicTestClient(
+ server_address_, server_hostname_, client_config_,
+ client_supported_versions_,
+ crypto_test_utils::ProofVerifierForTesting(),
+ std::make_unique<QuicClientSessionCache>(),
+ GetParam().event_loop->Create(QuicDefaultClock::Get()));
client->SetUserAgentID(kTestUserAgentId);
client->UseWriter(writer);
if (!pre_shared_key_client_.empty()) {
@@ -432,7 +449,6 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
ADD_FAILURE() << "Missing MockableQuicClient";
return false;
}
- static QuicEpollEvent event(EPOLLOUT);
if (client_writer_ != nullptr) {
QuicConnection* client_connection = GetClientConnection();
if (client_connection == nullptr) {
@@ -464,14 +480,29 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
} else {
ADD_FAILURE() << "Missing client connection";
}
- StopServer();
+ StopServer(/*will_restart=*/false);
+ if (fd_ != kQuicInvalidSocketFd) {
+ // Every test should follow StopServer(true) with StartServer(), so we
+ // should never get here.
+ QuicUdpSocketApi socket_api;
+ socket_api.Destroy(fd_);
+ fd_ = kQuicInvalidSocketFd;
+ }
}
void StartServer() {
+ if (fd_ != kQuicInvalidSocketFd) {
+ // We previously called StopServer to reserve the ephemeral port. Close
+ // the socket so that it's available below.
+ QuicUdpSocketApi socket_api;
+ socket_api.Destroy(fd_);
+ fd_ = kQuicInvalidSocketFd;
+ }
auto test_server = std::make_unique<QuicTestServer>(
crypto_test_utils::ProofSourceForTesting(), server_config_,
server_supported_versions_, &memory_cache_backend_,
expected_server_connection_id_length_);
+ test_server->SetEventLoopFactory(GetParam().event_loop);
server_thread_ =
std::make_unique<ServerThread>(std::move(test_server), server_address_);
if (chlo_multiplier_ != 0) {
@@ -485,6 +516,7 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
QuicSocketAddress(server_address_.host(), server_thread_->GetPort());
QuicDispatcher* dispatcher =
QuicServerPeer::GetDispatcher(server_thread_->server());
+ ASSERT_TRUE(dispatcher != nullptr);
QuicDispatcherPeer::UseWriter(dispatcher, server_writer_);
server_writer_->Initialize(QuicDispatcherPeer::GetHelper(dispatcher),
@@ -498,11 +530,30 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
server_thread_->Start();
}
- void StopServer() {
+ void StopServer(bool will_restart = true) {
if (server_thread_) {
server_thread_->Quit();
server_thread_->Join();
}
+ if (will_restart) {
+ // server_address_ now contains the random listening port. Since many
+ // tests will attempt to re-bind the socket, claim it so that the kernel
+ // doesn't give away the ephemeral port.
+ QuicUdpSocketApi socket_api;
+ fd_ = socket_api.Create(
+ server_address_.host().AddressFamilyToInt(),
+ /*receive_buffer_size =*/kDefaultSocketReceiveBuffer,
+ /*send_buffer_size =*/kDefaultSocketReceiveBuffer);
+ if (fd_ == kQuicInvalidSocketFd) {
+ QUIC_LOG(ERROR) << "CreateSocket() failed: " << strerror(errno);
+ return;
+ }
+ int rc = socket_api.Bind(fd_, server_address_);
+ if (rc < 0) {
+ QUIC_LOG(ERROR) << "Bind failed: " << strerror(errno);
+ return;
+ }
+ }
}
void AddToCache(absl::string_view path, int response_code,
@@ -629,7 +680,7 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
bool CheckResponseHeaders(QuicTestClient* client,
const std::string& expected_status) {
- const spdy::SpdyHeaderBlock* response_headers = client->response_headers();
+ const spdy::Http2HeaderBlock* response_headers = client->response_headers();
auto it = response_headers->find(":status");
if (it == response_headers->end()) {
ADD_FAILURE() << "Did not find :status header in response";
@@ -717,7 +768,7 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
return nullptr;
}
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
headers[":scheme"] = "https";
headers[":authority"] = "localhost";
headers[":path"] = path;
@@ -834,6 +885,9 @@ class EndToEndTest : public QuicTestWithParam<TestParams> {
std::string server_hostname_;
QuicTestBackend memory_cache_backend_;
std::unique_ptr<ServerThread> server_thread_;
+ // This socket keeps the ephemeral port reserved so that the kernel doesn't
+ // give it away while the server is shut down.
+ QuicUdpSocketFd fd_;
std::unique_ptr<QuicTestClient> client_;
QuicConnectionDebugVisitor* connection_debug_visitor_ = nullptr;
PacketDroppingTestWriter* client_writer_;
@@ -1252,7 +1306,7 @@ TEST_P(EndToEndTest, MixGoodAndBadConnectionIdLengths) {
// Start client2 which will use a good connection ID length.
std::unique_ptr<QuicTestClient> client2(CreateQuicClient(nullptr));
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1364,7 +1418,7 @@ TEST_P(EndToEndTest, SeparateFinPacket) {
ASSERT_TRUE(Initialize());
// Send a request in two parts: the request and then an empty packet with FIN.
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1407,7 +1461,7 @@ TEST_P(EndToEndTest, MultipleStreams) {
const int kNumRequests = 10;
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1428,7 +1482,7 @@ TEST_P(EndToEndTest, MultipleClients) {
ASSERT_TRUE(Initialize());
std::unique_ptr<QuicTestClient> client2(CreateQuicClient(nullptr));
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1473,7 +1527,7 @@ TEST_P(EndToEndTest, PostMissingBytes) {
ASSERT_TRUE(Initialize());
// Add a content length header with no body.
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1495,7 +1549,7 @@ TEST_P(EndToEndTest, LargePostNoPacketLoss) {
// 1 MB body.
std::string body(1024 * 1024, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1517,7 +1571,7 @@ TEST_P(EndToEndTest, QUICHE_SLOW_TEST(LargePostNoPacketLoss1sRTT)) {
// 100 KB body.
std::string body(100 * 1024, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1541,7 +1595,7 @@ TEST_P(EndToEndTest, LargePostWithPacketLoss) {
// 10 KB body.
std::string body(1024 * 10, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1585,7 +1639,7 @@ TEST_P(EndToEndTest, LargePostWithPacketLossAndAlwaysBundleWindowUpdates) {
// 10 KB body.
std::string body(1024 * 10, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1609,7 +1663,7 @@ TEST_P(EndToEndTest, LargePostWithPacketLossAndBlockedSocket) {
// 10 KB body.
std::string body(1024 * 10, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1628,7 +1682,7 @@ TEST_P(EndToEndTest, LargePostNoPacketLossWithDelayAndReordering) {
// 1 MB body.
std::string body(1024 * 1024, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1800,7 +1854,7 @@ TEST_P(EndToEndTest, LargePostZeroRTTFailure) {
ASSERT_TRUE(Initialize());
std::string body(20480, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -1944,7 +1998,7 @@ TEST_P(EndToEndTest, LargePostSynchronousRequest) {
ASSERT_TRUE(Initialize());
std::string body(20480, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -2059,7 +2113,7 @@ TEST_P(EndToEndTest, PostZeroRTTRequestDuringHandshake) {
EXPECT_TRUE(
GetClientConnection()->framer().HasEncrypterOfEncryptionLevel(
ENCRYPTION_HANDSHAKE));
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -2184,7 +2238,7 @@ TEST_P(EndToEndTest, LargePostSmallBandwidthLargeBuffer) {
// 1 MB body.
std::string body(1024 * 1024, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -2201,7 +2255,7 @@ TEST_P(EndToEndTest, DoNotSetSendAlarmIfConnectionFlowControlBlocked) {
// Regression test for b/14677858.
// Test that the resume write alarm is not set in QuicConnection::OnCanWrite
// if currently connection level flow control blocked. If set, this results in
- // an infinite loop in the EpollServer, as the alarm fires and is immediately
+ // an infinite loop in the EventLoop, as the alarm fires and is immediately
// rescheduled.
ASSERT_TRUE(Initialize());
EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
@@ -2244,7 +2298,7 @@ TEST_P(EndToEndTest, InvalidStream) {
EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
std::string body(kMaxOutgoingPacketSize, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -2270,7 +2324,7 @@ TEST_P(EndToEndTest, LargeHeaders) {
EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
std::string body(kMaxOutgoingPacketSize, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -2299,7 +2353,7 @@ TEST_P(EndToEndTest, EarlyResponseWithQuicStreamNoError) {
EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
std::string large_body(1024 * 1024, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -2371,7 +2425,7 @@ TEST_P(EndToEndTest, MaxDynamicStreamsLimitRespected) {
QuicSessionPeer::SetMaxOpenOutgoingStreams(client_session,
kServerMaxStreams + 1);
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -2812,6 +2866,9 @@ TEST_P(EndToEndTest, StreamCancelErrorTest) {
TEST_P(EndToEndTest, ConnectionMigrationClientIPChanged) {
ASSERT_TRUE(Initialize());
+ if (GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
+ return;
+ }
SendSynchronousFooRequestAndCheckResponse();
// Store the client IP address which was used to send the first request.
@@ -2852,7 +2909,8 @@ TEST_P(EndToEndTest, ConnectionMigrationClientIPChanged) {
TEST_P(EndToEndTest, IetfConnectionMigrationClientIPChangedMultipleTimes) {
ASSERT_TRUE(Initialize());
- if (!GetClientConnection()->connection_migration_use_new_cid()) {
+ if (!GetClientConnection()->connection_migration_use_new_cid() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
SendSynchronousFooRequestAndCheckResponse();
@@ -2963,7 +3021,8 @@ TEST_P(EndToEndTest, IetfConnectionMigrationClientIPChangedMultipleTimes) {
TEST_P(EndToEndTest,
ConnectionMigrationWithNonZeroConnectionIDClientIPChangedMultipleTimes) {
- if (!version_.SupportsClientConnectionIds()) {
+ if (!version_.SupportsClientConnectionIds() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
ASSERT_TRUE(Initialize());
return;
}
@@ -3100,7 +3159,8 @@ TEST_P(EndToEndTest,
TEST_P(EndToEndTest, ConnectionMigrationNewTokenForNewIp) {
ASSERT_TRUE(Initialize());
if (!version_.HasIetfQuicFrames() ||
- !client_->client()->session()->connection()->validate_client_address()) {
+ !client_->client()->session()->connection()->validate_client_address() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
SendSynchronousFooRequestAndCheckResponse();
@@ -3391,10 +3451,12 @@ TEST_P(EndToEndTest, ConnectionMigrationClientPortChanged) {
// Create a new socket before closing the old one, which will result in a new
// ephemeral port.
- QuicClientPeer::CreateUDPSocketAndBind(client_->client());
+ client_->client()->network_helper()->CreateUDPSocketAndBind(
+ client_->client()->server_address(), client_->client()->bind_to_address(),
+ client_->client()->local_port());
// Stop listening and close the old FD.
- QuicClientPeer::CleanUpUDPSocket(client_->client(), old_fd);
+ client_->client()->default_network_helper()->CleanUpUDPSocket(old_fd);
// The packet writer needs to be updated to use the new FD.
client_->client()->network_helper()->CreateQuicPacketWriter();
@@ -3406,19 +3468,13 @@ TEST_P(EndToEndTest, ConnectionMigrationClientPortChanged) {
// FD rather than any more complex NAT rebinding simulation.
int new_port =
client_->client()->network_helper()->GetLatestClientAddress().port();
- QuicClientPeer::SetClientPort(client_->client(), new_port);
+ client_->client()->default_network_helper()->SetClientPort(new_port);
QuicConnection* client_connection = GetClientConnection();
ASSERT_TRUE(client_connection);
QuicConnectionPeer::SetSelfAddress(
client_connection,
QuicSocketAddress(client_connection->self_address().host(), new_port));
- // Register the new FD for epoll events.
- int new_fd = client_->client()->GetLatestFD();
- QuicEpollServer* eps = client_->epoll_server();
- eps->RegisterFD(new_fd, client_->client()->epoll_network_helper(),
- EPOLLIN | EPOLLOUT | EPOLLET);
-
// Send a second request, using the new FD.
SendSynchronousBarRequestAndCheckResponse();
@@ -3808,7 +3864,7 @@ class TestAckListener : public QuicAckListenerInterface {
class TestResponseListener : public QuicSpdyClientBase::ResponseListener {
public:
void OnCompleteResponse(QuicStreamId id,
- const SpdyHeaderBlock& response_headers,
+ const Http2HeaderBlock& response_headers,
const std::string& response_body) override {
QUIC_DVLOG(1) << "response for stream " << id << " "
<< response_headers.DebugString() << "\n"
@@ -3860,13 +3916,16 @@ TEST_P(EndToEndTest, AckNotifierWithPacketLossAndBlockedSocket) {
}
// Create a POST request and send the headers only.
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
headers[":authority"] = server_hostname_;
- client_->SendMessage(headers, "", /*fin=*/false);
+ // Here, we have to specify flush=false, otherwise we risk a race condition in
+ // which the headers are sent and acknowledged before the ack notifier is
+ // installed.
+ client_->SendMessage(headers, "", /*fin=*/false, /*flush=*/false);
// Size of headers on the request stream. This is zero if headers are sent on
// the header stream.
@@ -3908,10 +3967,15 @@ TEST_P(EndToEndTest, AckNotifierWithPacketLossAndBlockedSocket) {
SendSynchronousBarRequestAndCheckResponse();
// Make sure the delegate does get the notification it expects.
+ int attempts = 0;
+ constexpr int kMaxAttempts = 20;
while (ack_listener->total_bytes_acked() < expected_bytes_acked) {
// Waits for up to 50 ms.
client_->client()->WaitForEvents();
ASSERT_TRUE(client_->connected());
+ if (++attempts >= kMaxAttempts) {
+ break;
+ }
}
EXPECT_EQ(ack_listener->total_bytes_acked(), expected_bytes_acked)
<< " header_size " << header_size << " request length "
@@ -4309,7 +4373,7 @@ TEST_P(EndToEndTest, CanceledStreamDoesNotBecomeZombie) {
EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
// Lose the request.
SetPacketLossPercentage(100);
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -4341,7 +4405,7 @@ class ServerStreamWithErrorResponseBody : public QuicSimpleServerStream {
protected:
void SendErrorResponse() override {
QUIC_DLOG(INFO) << "Sending error response for stream " << id();
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":status"] = "500";
headers["content-length"] = absl::StrCat(response_body_.size());
// This method must call CloseReadSide to cause the test case, StopReading
@@ -4528,26 +4592,17 @@ TEST_P(EndToEndTest, BlockedFrameIncludesOffset) {
SendSynchronousRequestAndCheckResponse("/blocked", response_body);
client_->Disconnect();
- bool include_offset_flag =
- GetQuicReloadableFlag(quic_include_offset_in_blocked_frames);
- QuicStreamOffset expected_connection_offset =
- include_offset_flag
- ? client_config_.GetInitialSessionFlowControlWindowToSend()
- : 0;
- QuicStreamOffset expected_stream_offset =
- include_offset_flag
- ? client_config_.GetInitialStreamFlowControlWindowToSend()
- : 0;
-
ASSERT_GE(observer.blocked_frames().size(), static_cast<uint64_t>(0));
for (const QuicBlockedFrame& frame : observer.blocked_frames()) {
if (frame.stream_id ==
QuicUtils::GetInvalidStreamId(version_.transport_version)) {
// connection-level BLOCKED frame
- ASSERT_EQ(frame.offset, expected_connection_offset);
+ ASSERT_EQ(frame.offset,
+ client_config_.GetInitialSessionFlowControlWindowToSend());
} else {
// stream-level BLOCKED frame
- ASSERT_EQ(frame.offset, expected_stream_offset);
+ ASSERT_EQ(frame.offset,
+ client_config_.GetInitialStreamFlowControlWindowToSend());
}
}
@@ -4583,7 +4638,7 @@ TEST_P(EndToEndTest, EarlyResponseFinRecording) {
// and before the body is received, due to invalid content-length.
// Set an invalid content-length, so the request will receive an early 500
// response.
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/garbage";
headers[":scheme"] = "https";
@@ -4632,11 +4687,11 @@ TEST_P(EndToEndTest, Trailers) {
// Add a response with headers, body, and trailers.
const std::string kBody = "body content";
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":status"] = "200";
headers["content-length"] = absl::StrCat(kBody.size());
- SpdyHeaderBlock trailers;
+ Http2HeaderBlock trailers;
trailers["some-trailing-header"] = "trailing-header-value";
memory_cache_backend_.AddResponse(server_hostname_, "/trailer_url",
@@ -4655,9 +4710,6 @@ TEST_P(EndToEndTest, DISABLED_TestHugePostWithPacketLoss) {
ServerStreamThatDropsBodyFactory stream_factory;
SetSpdyStreamFactory(&stream_factory);
ASSERT_TRUE(Initialize());
- // Set client's epoll server's time out to 0 to make this test be finished
- // within a short time.
- client_->epoll_server()->set_timeout_in_us(0);
EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
SetPacketLossPercentage(1);
@@ -4669,7 +4721,7 @@ TEST_P(EndToEndTest, DISABLED_TestHugePostWithPacketLoss) {
ASSERT_LT(INT64_C(4294967296), request_body_size_bytes);
std::string body(kSizeBytes, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -4708,7 +4760,6 @@ TEST_P(EndToEndTest, DISABLED_TestHugeResponseWithPacketLoss) {
client->UseWriter(client_writer_);
client->Connect();
client_.reset(client);
- static QuicEpollEvent event(EPOLLOUT);
QuicConnection* client_connection = GetClientConnection();
ASSERT_TRUE(client_connection);
client_writer_->Initialize(
@@ -4791,7 +4842,7 @@ TEST_P(EndToEndTest, ReleaseHeadersStreamBufferWhenIdle) {
TEST_P(EndToEndTest, WayTooLongRequestHeaders) {
ASSERT_TRUE(Initialize());
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "GET";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -4841,7 +4892,7 @@ TEST_P(EndToEndTest, WindowUpdateInAck) {
client_connection->set_debug_visitor(&observer);
// 100KB body.
std::string body(100 * 1024, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -4874,8 +4925,6 @@ TEST_P(EndToEndTest, SendStatelessResetTokenInShlo) {
// Regression test for b/116200989.
TEST_P(EndToEndTest,
SendStatelessResetIfServerConnectionClosedLocallyDuringHandshake) {
- SetQuicReloadableFlag(
- quic_consider_original_connection_id_as_active_pre_handshake, true);
connect_to_server_on_initialize_ = false;
ASSERT_TRUE(Initialize());
@@ -4962,7 +5011,7 @@ TEST_P(EndToEndTest, DoNotCrashOnPacketWriteError) {
// 1 MB body.
std::string body(1024 * 1024, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -5090,7 +5139,7 @@ TEST_P(EndToEndTest, RequestAndStreamRstInOnePacket) {
// INCOMPLETE_RESPONSE will cause the server to not to send the trailer
// (and the FIN) after the response body.
std::string response_body(1305, 'a');
- SpdyHeaderBlock response_headers;
+ Http2HeaderBlock response_headers;
response_headers[":status"] = absl::StrCat(200);
response_headers["content-length"] = absl::StrCat(response_body.length());
memory_cache_backend_.AddSpecialResponse(
@@ -5672,7 +5721,7 @@ TEST_P(EndToEndPacketReorderingTest, Buffer0RttRequest) {
client_->client()->Initialize();
// Send a request before handshake finishes.
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/bar";
headers[":scheme"] = "https";
@@ -5692,7 +5741,7 @@ TEST_P(EndToEndTest, SimpleStopSendingRstStreamTest) {
ASSERT_TRUE(Initialize());
// Send a request without a fin, to keep the stream open
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -5874,7 +5923,7 @@ TEST_P(EndToEndTest, TooBigStreamIdClosesConnection) {
EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
std::string body(kMaxOutgoingPacketSize, 'a');
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "POST";
headers[":path"] = "/foo";
headers[":scheme"] = "https";
@@ -5950,6 +5999,10 @@ TEST_P(EndToEndTest, CustomTransportParameters) {
}
TEST_P(EndToEndTest, LegacyVersionEncapsulation) {
+ if (GetQuicRestartFlag(quic_disable_legacy_version_encapsulation)) {
+ ASSERT_TRUE(Initialize());
+ return;
+ }
if (!version_.HasLongHeaderLengths() ||
override_server_connection_id_length_ > -1) {
// Decapsulating Legacy Version Encapsulation packets from these versions
@@ -5968,6 +6021,10 @@ TEST_P(EndToEndTest, LegacyVersionEncapsulation) {
}
TEST_P(EndToEndTest, LegacyVersionEncapsulationWithMultiPacketChlo) {
+ if (GetQuicRestartFlag(quic_disable_legacy_version_encapsulation)) {
+ ASSERT_TRUE(Initialize());
+ return;
+ }
if (!version_.HasLongHeaderLengths() ||
override_server_connection_id_length_ > -1) {
// Decapsulating Legacy Version Encapsulation packets from these versions
@@ -5996,6 +6053,10 @@ TEST_P(EndToEndTest, LegacyVersionEncapsulationWithMultiPacketChlo) {
}
TEST_P(EndToEndTest, LegacyVersionEncapsulationWithVersionNegotiation) {
+ if (GetQuicRestartFlag(quic_disable_legacy_version_encapsulation)) {
+ ASSERT_TRUE(Initialize());
+ return;
+ }
if (!version_.HasLongHeaderLengths() ||
override_server_connection_id_length_ > -1) {
// Decapsulating Legacy Version Encapsulation packets from these versions
@@ -6016,6 +6077,10 @@ TEST_P(EndToEndTest, LegacyVersionEncapsulationWithVersionNegotiation) {
}
TEST_P(EndToEndTest, LegacyVersionEncapsulationWithLoss) {
+ if (GetQuicRestartFlag(quic_disable_legacy_version_encapsulation)) {
+ ASSERT_TRUE(Initialize());
+ return;
+ }
if (!version_.HasLongHeaderLengths() ||
override_server_connection_id_length_ > -1) {
// Decapsulating Legacy Version Encapsulation packets from these versions
@@ -6064,41 +6129,6 @@ class CopyingPacketWriter : public PacketDroppingTestWriter {
std::vector<std::unique_ptr<QuicEncryptedPacket>> packets_;
};
-TEST_P(EndToEndTest, ChaosProtectionDisabled) {
- if (!version_.UsesCryptoFrames()) {
- ASSERT_TRUE(Initialize());
- return;
- }
- // Replace the client's writer with one that'll save the first packet.
- auto copying_writer = new CopyingPacketWriter(1);
- delete client_writer_;
- client_writer_ = copying_writer;
- // Disable chaos protection and perform an HTTP request.
- client_config_.SetClientConnectionOptions(QuicTagVector{kNCHP});
- ASSERT_TRUE(Initialize());
- SendSynchronousFooRequestAndCheckResponse();
- // Parse the saved packet to make sure it's valid.
- SimpleQuicFramer validation_framer({version_});
- validation_framer.framer()->SetInitialObfuscators(
- GetClientConnection()->GetOriginalDestinationConnectionId());
- ASSERT_GT(copying_writer->packets().size(), 0u);
- EXPECT_TRUE(validation_framer.ProcessPacket(*copying_writer->packets()[0]));
- // TODO(dschinazi) figure out a way to use a MockRandom in this test so we
- // can inspect the contents of this packet.
-}
-
-TEST_P(EndToEndTest, DisablePermuteTlsExtensions) {
- if (!version_.UsesTls()) {
- ASSERT_TRUE(Initialize());
- return;
- }
- // Disable TLS extension permutation and perform an HTTP request.
- client_config_.SetClientConnectionOptions(QuicTagVector{kNBPE});
- ASSERT_TRUE(Initialize());
- EXPECT_FALSE(GetClientSession()->permutes_tls_extensions());
- SendSynchronousFooRequestAndCheckResponse();
-}
-
TEST_P(EndToEndTest, KeyUpdateInitiatedByClient) {
if (!version_.UsesTls()) {
// Key Update is only supported in TLS handshake.
@@ -6473,7 +6503,7 @@ TEST_P(EndToEndTest, WebTransportSessionSetupWithEchoWithSuffix) {
EXPECT_TRUE(server_session->GetWebTransportSession(web_transport->id()) !=
nullptr);
server_thread_->Resume();
- const spdy::SpdyHeaderBlock* response_headers = client_->response_headers();
+ const spdy::Http2HeaderBlock* response_headers = client_->response_headers();
auto it = response_headers->find("bar");
EXPECT_NE(it, response_headers->end());
EXPECT_EQ(it->second, "baz");
@@ -6885,7 +6915,7 @@ TEST_P(EndToEndTest, InvalidExtendedConnect) {
return;
}
// Missing :path header.
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
headers[":scheme"] = "https";
headers[":authority"] = "localhost";
headers[":method"] = "CONNECT";
@@ -6908,7 +6938,7 @@ TEST_P(EndToEndTest, RejectExtendedConnect) {
return;
}
// This extended CONNECT should be rejected.
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
headers[":scheme"] = "https";
headers[":authority"] = "localhost";
headers[":method"] = "CONNECT";
@@ -6920,7 +6950,7 @@ TEST_P(EndToEndTest, RejectExtendedConnect) {
CheckResponseHeaders("400");
// Vanilla CONNECT should be sent to backend.
- spdy::SpdyHeaderBlock headers2;
+ spdy::Http2HeaderBlock headers2;
headers2[":authority"] = "localhost";
headers2[":method"] = "CONNECT";
@@ -6936,7 +6966,7 @@ TEST_P(EndToEndTest, RejectInvalidRequestHeader) {
SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
ASSERT_TRUE(Initialize());
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
headers[":scheme"] = "https";
headers[":authority"] = "localhost";
headers[":method"] = "GET";
@@ -6955,11 +6985,11 @@ TEST_P(EndToEndTest, RejectTransferEncodingResponse) {
ASSERT_TRUE(Initialize());
// Add a response with transfer-encoding headers.
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":status"] = "200";
headers["transfer-encoding"] = "gzip";
- SpdyHeaderBlock trailers;
+ Http2HeaderBlock trailers;
trailers["some-trailing-header"] = "trailing-header-value";
memory_cache_backend_.AddResponse(server_hostname_, "/eep",
@@ -6975,7 +7005,7 @@ TEST_P(EndToEndTest, RejectUpperCaseRequest) {
SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
ASSERT_TRUE(Initialize());
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
headers[":scheme"] = "https";
headers[":authority"] = "localhost";
headers[":method"] = "GET";
@@ -6992,7 +7022,7 @@ TEST_P(EndToEndTest, RejectRequestWithInvalidToken) {
SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
ASSERT_TRUE(Initialize());
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
headers[":scheme"] = "https";
headers[":authority"] = "localhost";
headers[":method"] = "GET";
@@ -7004,6 +7034,45 @@ TEST_P(EndToEndTest, RejectRequestWithInvalidToken) {
CheckResponseHeaders("400");
}
+TEST_P(EndToEndTest, OriginalConnectionIdClearedFromMap) {
+ SetQuicRestartFlag(quic_map_original_connection_ids2, true);
+ connect_to_server_on_initialize_ = false;
+ ASSERT_TRUE(Initialize());
+ if (override_client_connection_id_length_ != kLongConnectionIdLength) {
+ // There might not be an original connection ID.
+ CreateClientWithWriter();
+ return;
+ }
+
+ server_thread_->Pause();
+ QuicDispatcher* dispatcher =
+ QuicServerPeer::GetDispatcher(server_thread_->server());
+ EXPECT_EQ(QuicDispatcherPeer::GetFirstSessionIfAny(dispatcher), nullptr);
+ server_thread_->Resume();
+
+ CreateClientWithWriter(); // Also connects.
+ EXPECT_NE(client_, nullptr);
+
+ server_thread_->Pause();
+ EXPECT_NE(QuicDispatcherPeer::GetFirstSessionIfAny(dispatcher), nullptr);
+ EXPECT_EQ(dispatcher->NumSessions(), 1);
+ auto ids = GetServerConnection()->GetActiveServerConnectionIds();
+ ASSERT_EQ(ids.size(), 2);
+ for (QuicConnectionId id : ids) {
+ EXPECT_NE(QuicDispatcherPeer::FindSession(dispatcher, id), nullptr);
+ }
+ QuicConnectionId original = ids[1];
+ server_thread_->Resume();
+
+ client_->SendSynchronousRequest("/foo");
+ client_->Disconnect();
+
+ server_thread_->Pause();
+ EXPECT_EQ(QuicDispatcherPeer::GetFirstSessionIfAny(dispatcher), nullptr);
+ EXPECT_EQ(QuicDispatcherPeer::FindSession(dispatcher, original), nullptr);
+ server_thread_->Resume();
+}
+
} // namespace
} // namespace test
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.cc
index a22620d9f94..e429678604c 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.cc
@@ -21,6 +21,7 @@ std::string H3SettingsToString(Http3AndQpackSettingsIdentifiers identifier) {
RETURN_STRING_LITERAL(SETTINGS_H3_DATAGRAM_DRAFT09);
RETURN_STRING_LITERAL(SETTINGS_WEBTRANS_DRAFT00);
RETURN_STRING_LITERAL(SETTINGS_ENABLE_CONNECT_PROTOCOL);
+ RETURN_STRING_LITERAL(SETTINGS_ENABLE_METADATA);
}
return absl::StrCat("UNSUPPORTED_SETTINGS_TYPE(", identifier, ")");
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.h
index 9e1a696dbbb..b5dc19b5b2a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_constants.h
@@ -46,6 +46,7 @@ enum Http3AndQpackSettingsIdentifiers : uint64_t {
SETTINGS_WEBTRANS_DRAFT00 = 0x2b603742,
// draft-ietf-httpbis-h3-websockets
SETTINGS_ENABLE_CONNECT_PROTOCOL = 0x08,
+ SETTINGS_ENABLE_METADATA = 0x4d44,
};
// Returns HTTP/3 SETTINGS identifier as a string.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc
index 5845a37b264..2bdce8eff3e 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder.cc
@@ -657,9 +657,9 @@ QuicByteCount HttpDecoder::MaxFrameLength(uint64_t frame_type) {
case static_cast<uint64_t>(HttpFrameType::SETTINGS):
return kPayloadLengthLimit;
case static_cast<uint64_t>(HttpFrameType::GOAWAY):
- return VARIABLE_LENGTH_INTEGER_LENGTH_8;
+ return quiche::VARIABLE_LENGTH_INTEGER_LENGTH_8;
case static_cast<uint64_t>(HttpFrameType::MAX_PUSH_ID):
- return VARIABLE_LENGTH_INTEGER_LENGTH_8;
+ return quiche::VARIABLE_LENGTH_INTEGER_LENGTH_8;
case static_cast<uint64_t>(HttpFrameType::PRIORITY_UPDATE_REQUEST_STREAM):
return kPayloadLengthLimit;
case static_cast<uint64_t>(HttpFrameType::ACCEPT_CH):
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder_test.cc
index 7f80d175b10..c0a18eedb9f 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_decoder_test.cc
@@ -38,54 +38,6 @@ class HttpDecoderPeer {
namespace {
-class MockHttpDecoderVisitor : public HttpDecoder::Visitor {
- public:
- ~MockHttpDecoderVisitor() override = default;
-
- // Called if an error is detected.
- MOCK_METHOD(void, OnError, (HttpDecoder*), (override));
-
- MOCK_METHOD(bool, OnMaxPushIdFrame, (), (override));
- MOCK_METHOD(bool, OnGoAwayFrame, (const GoAwayFrame& frame), (override));
- MOCK_METHOD(bool, OnSettingsFrameStart, (QuicByteCount header_length),
- (override));
- MOCK_METHOD(bool, OnSettingsFrame, (const SettingsFrame& frame), (override));
-
- MOCK_METHOD(bool, OnDataFrameStart,
- (QuicByteCount header_length, QuicByteCount payload_length),
- (override));
- MOCK_METHOD(bool, OnDataFramePayload, (absl::string_view payload),
- (override));
- MOCK_METHOD(bool, OnDataFrameEnd, (), (override));
-
- MOCK_METHOD(bool, OnHeadersFrameStart,
- (QuicByteCount header_length, QuicByteCount payload_length),
- (override));
- MOCK_METHOD(bool, OnHeadersFramePayload, (absl::string_view payload),
- (override));
- MOCK_METHOD(bool, OnHeadersFrameEnd, (), (override));
-
- MOCK_METHOD(bool, OnPriorityUpdateFrameStart, (QuicByteCount header_length),
- (override));
- MOCK_METHOD(bool, OnPriorityUpdateFrame, (const PriorityUpdateFrame& frame),
- (override));
-
- MOCK_METHOD(bool, OnAcceptChFrameStart, (QuicByteCount header_length),
- (override));
- MOCK_METHOD(bool, OnAcceptChFrame, (const AcceptChFrame& frame), (override));
- MOCK_METHOD(void, OnWebTransportStreamFrameType,
- (QuicByteCount header_length, WebTransportSessionId session_id),
- (override));
-
- MOCK_METHOD(bool, OnUnknownFrameStart,
- (uint64_t frame_type, QuicByteCount header_length,
- QuicByteCount payload_length),
- (override));
- MOCK_METHOD(bool, OnUnknownFramePayload, (absl::string_view payload),
- (override));
- MOCK_METHOD(bool, OnUnknownFrameEnd, (), (override));
-};
-
class HttpDecoderTest : public QuicTest {
public:
HttpDecoderTest() : decoder_(&visitor_) {
@@ -617,7 +569,8 @@ TEST_F(HttpDecoderTest, FrameWithOverlyLargePayload) {
HttpDecoder decoder(&visitor);
QuicDataWriter writer(max_input_length, input);
ASSERT_TRUE(writer.WriteVarInt62(frame_type)); // frame type.
- ASSERT_TRUE(writer.WriteVarInt62(kVarInt62MaxValue)); // frame length.
+ ASSERT_TRUE(
+ writer.WriteVarInt62(quiche::kVarInt62MaxValue)); // frame length.
ASSERT_TRUE(writer.WriteUInt8(0x00)); // one byte of payload.
EXPECT_NE(decoder.ProcessInput(input, writer.length()), 0u) << frame_type;
}
@@ -806,11 +759,11 @@ TEST_F(HttpDecoderTest, EmptyMaxPushIdFrame) {
TEST_F(HttpDecoderTest, LargeStreamIdInGoAway) {
GoAwayFrame frame;
frame.id = 1ull << 60;
- std::unique_ptr<char[]> buffer;
- uint64_t length = HttpEncoder::SerializeGoAwayFrame(frame, &buffer);
+ std::string goaway = HttpEncoder::SerializeGoAwayFrame(frame);
EXPECT_CALL(visitor_, OnGoAwayFrame(frame));
- EXPECT_GT(length, 0u);
- EXPECT_EQ(length, decoder_.ProcessInput(buffer.get(), length));
+ EXPECT_GT(goaway.length(), 0u);
+ EXPECT_EQ(goaway.length(),
+ decoder_.ProcessInput(goaway.data(), goaway.length()));
EXPECT_THAT(decoder_.error(), IsQuicNoError());
EXPECT_EQ("", decoder_.error_detail());
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc
index 32c8d91eb18..e36c3f5d628 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.cc
@@ -33,7 +33,6 @@ QuicByteCount GetTotalLength(QuicByteCount payload_length, HttpFrameType type) {
} // namespace
-// static
QuicByteCount HttpEncoder::GetDataFrameHeaderLength(
QuicByteCount payload_length) {
QUICHE_DCHECK_NE(0u, payload_length);
@@ -42,7 +41,6 @@ QuicByteCount HttpEncoder::GetDataFrameHeaderLength(
static_cast<uint64_t>(HttpFrameType::DATA));
}
-// static
quiche::QuicheBuffer HttpEncoder::SerializeDataFrameHeader(
QuicByteCount payload_length, quiche::QuicheBufferAllocator* allocator) {
QUICHE_DCHECK_NE(0u, payload_length);
@@ -59,30 +57,28 @@ quiche::QuicheBuffer HttpEncoder::SerializeDataFrameHeader(
return quiche::QuicheBuffer();
}
-// static
-QuicByteCount HttpEncoder::SerializeHeadersFrameHeader(
- QuicByteCount payload_length, std::unique_ptr<char[]>* output) {
+std::string HttpEncoder::SerializeHeadersFrameHeader(
+ QuicByteCount payload_length) {
QUICHE_DCHECK_NE(0u, payload_length);
QuicByteCount header_length =
QuicDataWriter::GetVarInt62Len(payload_length) +
QuicDataWriter::GetVarInt62Len(
static_cast<uint64_t>(HttpFrameType::HEADERS));
- output->reset(new char[header_length]);
- QuicDataWriter writer(header_length, output->get());
+ std::string frame;
+ frame.resize(header_length);
+ QuicDataWriter writer(header_length, frame.data());
if (WriteFrameHeader(payload_length, HttpFrameType::HEADERS, &writer)) {
- return header_length;
+ return frame;
}
QUIC_DLOG(ERROR)
<< "Http encoder failed when attempting to serialize headers "
"frame header.";
- return 0;
+ return {};
}
-// static
-QuicByteCount HttpEncoder::SerializeSettingsFrame(
- const SettingsFrame& settings, std::unique_ptr<char[]>* output) {
+std::string HttpEncoder::SerializeSettingsFrame(const SettingsFrame& settings) {
QuicByteCount payload_length = 0;
std::vector<std::pair<uint64_t, uint64_t>> ordered_settings{
settings.values.begin(), settings.values.end()};
@@ -96,53 +92,51 @@ QuicByteCount HttpEncoder::SerializeSettingsFrame(
QuicByteCount total_length =
GetTotalLength(payload_length, HttpFrameType::SETTINGS);
- output->reset(new char[total_length]);
- QuicDataWriter writer(total_length, output->get());
+ std::string frame;
+ frame.resize(total_length);
+ QuicDataWriter writer(total_length, frame.data());
if (!WriteFrameHeader(payload_length, HttpFrameType::SETTINGS, &writer)) {
QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
"settings frame header.";
- return 0;
+ return {};
}
for (const auto& p : ordered_settings) {
if (!writer.WriteVarInt62(p.first) || !writer.WriteVarInt62(p.second)) {
QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
"settings frame payload.";
- return 0;
+ return {};
}
}
- return total_length;
+ return frame;
}
-// static
-QuicByteCount HttpEncoder::SerializeGoAwayFrame(
- const GoAwayFrame& goaway, std::unique_ptr<char[]>* output) {
+std::string HttpEncoder::SerializeGoAwayFrame(const GoAwayFrame& goaway) {
QuicByteCount payload_length = QuicDataWriter::GetVarInt62Len(goaway.id);
QuicByteCount total_length =
GetTotalLength(payload_length, HttpFrameType::GOAWAY);
- output->reset(new char[total_length]);
- QuicDataWriter writer(total_length, output->get());
+ std::string frame;
+ frame.resize(total_length);
+ QuicDataWriter writer(total_length, frame.data());
if (WriteFrameHeader(payload_length, HttpFrameType::GOAWAY, &writer) &&
writer.WriteVarInt62(goaway.id)) {
- return total_length;
+ return frame;
}
QUIC_DLOG(ERROR)
<< "Http encoder failed when attempting to serialize goaway frame.";
- return 0;
+ return {};
}
-// static
-QuicByteCount HttpEncoder::SerializePriorityUpdateFrame(
- const PriorityUpdateFrame& priority_update,
- std::unique_ptr<char[]>* output) {
+std::string HttpEncoder::SerializePriorityUpdateFrame(
+ const PriorityUpdateFrame& priority_update) {
if (priority_update.prioritized_element_type != REQUEST_STREAM) {
QUIC_BUG(quic_bug_10402_1)
<< "PRIORITY_UPDATE for push streams not implemented";
- return 0;
+ return {};
}
QuicByteCount payload_length =
@@ -151,8 +145,9 @@ QuicByteCount HttpEncoder::SerializePriorityUpdateFrame(
QuicByteCount total_length = GetTotalLength(
payload_length, HttpFrameType::PRIORITY_UPDATE_REQUEST_STREAM);
- output->reset(new char[total_length]);
- QuicDataWriter writer(total_length, output->get());
+ std::string frame;
+ frame.resize(total_length);
+ QuicDataWriter writer(total_length, frame.data());
if (WriteFrameHeader(payload_length,
HttpFrameType::PRIORITY_UPDATE_REQUEST_STREAM,
@@ -160,17 +155,16 @@ QuicByteCount HttpEncoder::SerializePriorityUpdateFrame(
writer.WriteVarInt62(priority_update.prioritized_element_id) &&
writer.WriteBytes(priority_update.priority_field_value.data(),
priority_update.priority_field_value.size())) {
- return total_length;
+ return frame;
}
QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
"PRIORITY_UPDATE frame.";
- return 0;
+ return {};
}
-// static
-QuicByteCount HttpEncoder::SerializeAcceptChFrame(
- const AcceptChFrame& accept_ch, std::unique_ptr<char[]>* output) {
+std::string HttpEncoder::SerializeAcceptChFrame(
+ const AcceptChFrame& accept_ch) {
QuicByteCount payload_length = 0;
for (const auto& entry : accept_ch.entries) {
payload_length += QuicDataWriter::GetVarInt62Len(entry.origin.size());
@@ -182,13 +176,14 @@ QuicByteCount HttpEncoder::SerializeAcceptChFrame(
QuicByteCount total_length =
GetTotalLength(payload_length, HttpFrameType::ACCEPT_CH);
- output->reset(new char[total_length]);
- QuicDataWriter writer(total_length, output->get());
+ std::string frame;
+ frame.resize(total_length);
+ QuicDataWriter writer(total_length, frame.data());
if (!WriteFrameHeader(payload_length, HttpFrameType::ACCEPT_CH, &writer)) {
QUIC_DLOG(ERROR)
<< "Http encoder failed to serialize ACCEPT_CH frame header.";
- return 0;
+ return {};
}
for (const auto& entry : accept_ch.entries) {
@@ -196,16 +191,14 @@ QuicByteCount HttpEncoder::SerializeAcceptChFrame(
!writer.WriteStringPieceVarInt62(entry.value)) {
QUIC_DLOG(ERROR)
<< "Http encoder failed to serialize ACCEPT_CH frame payload.";
- return 0;
+ return {};
}
}
- return total_length;
+ return frame;
}
-// static
-QuicByteCount HttpEncoder::SerializeGreasingFrame(
- std::unique_ptr<char[]>* output) {
+std::string HttpEncoder::SerializeGreasingFrame() {
uint64_t frame_type;
QuicByteCount payload_length;
std::string payload;
@@ -222,17 +215,17 @@ QuicByteCount HttpEncoder::SerializeGreasingFrame(
payload_length = result % 4;
if (payload_length > 0) {
- std::unique_ptr<char[]> buffer(new char[payload_length]);
- QuicRandom::GetInstance()->RandBytes(buffer.get(), payload_length);
- payload = std::string(buffer.get(), payload_length);
+ payload.resize(payload_length);
+ QuicRandom::GetInstance()->RandBytes(payload.data(), payload_length);
}
}
QuicByteCount total_length = QuicDataWriter::GetVarInt62Len(frame_type) +
QuicDataWriter::GetVarInt62Len(payload_length) +
payload_length;
- output->reset(new char[total_length]);
- QuicDataWriter writer(total_length, output->get());
+ std::string frame;
+ frame.resize(total_length);
+ QuicDataWriter writer(total_length, frame.data());
bool success =
writer.WriteVarInt62(frame_type) && writer.WriteVarInt62(payload_length);
@@ -242,32 +235,55 @@ QuicByteCount HttpEncoder::SerializeGreasingFrame(
}
if (success) {
- return total_length;
+ return frame;
}
QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
"greasing frame.";
- return 0;
+ return {};
}
-QuicByteCount HttpEncoder::SerializeWebTransportStreamFrameHeader(
- WebTransportSessionId session_id, std::unique_ptr<char[]>* output) {
+std::string HttpEncoder::SerializeWebTransportStreamFrameHeader(
+ WebTransportSessionId session_id) {
uint64_t stream_type =
static_cast<uint64_t>(HttpFrameType::WEBTRANSPORT_STREAM);
QuicByteCount header_length = QuicDataWriter::GetVarInt62Len(stream_type) +
QuicDataWriter::GetVarInt62Len(session_id);
- *output = std::make_unique<char[]>(header_length);
- QuicDataWriter writer(header_length, output->get());
+ std::string frame;
+ frame.resize(header_length);
+ QuicDataWriter writer(header_length, frame.data());
+
bool success =
writer.WriteVarInt62(stream_type) && writer.WriteVarInt62(session_id);
if (success && writer.remaining() == 0) {
- return header_length;
+ return frame;
}
QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
"WEBTRANSPORT_STREAM frame header.";
- return 0;
+ return {};
+}
+
+std::string HttpEncoder::SerializeMetadataFrameHeader(
+ QuicByteCount payload_length) {
+ QUICHE_DCHECK_NE(0u, payload_length);
+ QuicByteCount header_length =
+ QuicDataWriter::GetVarInt62Len(payload_length) +
+ QuicDataWriter::GetVarInt62Len(
+ static_cast<uint64_t>(HttpFrameType::METADATA));
+
+ std::string frame;
+ frame.resize(header_length);
+ QuicDataWriter writer(header_length, frame.data());
+
+ if (WriteFrameHeader(payload_length, HttpFrameType::METADATA, &writer)) {
+ return frame;
+ }
+ QUIC_DLOG(ERROR)
+ << "Http encoder failed when attempting to serialize METADATA "
+ "frame header.";
+ return {};
}
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.h
index fc5987f1503..28a8a2cd100 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder.h
@@ -31,40 +31,33 @@ class QUIC_EXPORT_PRIVATE HttpEncoder {
static quiche::QuicheBuffer SerializeDataFrameHeader(
QuicByteCount payload_length, quiche::QuicheBufferAllocator* allocator);
- // Serializes a HEADERS frame header into a new buffer stored in |output|.
- // Returns the length of the buffer on success, or 0 otherwise.
- static QuicByteCount SerializeHeadersFrameHeader(
- QuicByteCount payload_length, std::unique_ptr<char[]>* output);
-
- // Serializes a SETTINGS frame into a new buffer stored in |output|.
- // Returns the length of the buffer on success, or 0 otherwise.
- static QuicByteCount SerializeSettingsFrame(const SettingsFrame& settings,
- std::unique_ptr<char[]>* output);
-
- // Serializes a GOAWAY frame into a new buffer stored in |output|.
- // Returns the length of the buffer on success, or 0 otherwise.
- static QuicByteCount SerializeGoAwayFrame(const GoAwayFrame& goaway,
- std::unique_ptr<char[]>* output);
-
- // Serializes a PRIORITY_UPDATE frame into a new buffer stored in |output|.
- // Returns the length of the buffer on success, or 0 otherwise.
- static QuicByteCount SerializePriorityUpdateFrame(
- const PriorityUpdateFrame& priority_update,
- std::unique_ptr<char[]>* output);
-
- // Serializes an ACCEPT_CH frame into a new buffer stored in |output|.
- // Returns the length of the buffer on success, or 0 otherwise.
- static QuicByteCount SerializeAcceptChFrame(const AcceptChFrame& accept_ch,
- std::unique_ptr<char[]>* output);
+ // Serializes a HEADERS frame header.
+ static std::string SerializeHeadersFrameHeader(QuicByteCount payload_length);
+
+ // Serializes a SETTINGS frame.
+ static std::string SerializeSettingsFrame(const SettingsFrame& settings);
+
+ // Serializes a GOAWAY frame.
+ static std::string SerializeGoAwayFrame(const GoAwayFrame& goaway);
+
+ // Serializes a PRIORITY_UPDATE frame.
+ static std::string SerializePriorityUpdateFrame(
+ const PriorityUpdateFrame& priority_update);
+
+ // Serializes an ACCEPT_CH frame.
+ static std::string SerializeAcceptChFrame(const AcceptChFrame& accept_ch);
// Serializes a frame with reserved frame type specified in
// https://tools.ietf.org/html/draft-ietf-quic-http-25#section-7.2.9.
- static QuicByteCount SerializeGreasingFrame(std::unique_ptr<char[]>* output);
+ static std::string SerializeGreasingFrame();
// Serializes a WEBTRANSPORT_STREAM frame header as specified in
// https://www.ietf.org/archive/id/draft-ietf-webtrans-http3-00.html#name-client-initiated-bidirectio
- static QuicByteCount SerializeWebTransportStreamFrameHeader(
- WebTransportSessionId session_id, std::unique_ptr<char[]>* output);
+ static std::string SerializeWebTransportStreamFrameHeader(
+ WebTransportSessionId session_id);
+
+ // Serializes a METADATA frame header.
+ static std::string SerializeMetadataFrameHeader(QuicByteCount payload_length);
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder_test.cc
index 217d98a5371..be052033502 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_encoder_test.cc
@@ -17,26 +17,21 @@ namespace test {
TEST(HttpEncoderTest, SerializeDataFrameHeader) {
quiche::QuicheBuffer buffer = HttpEncoder::SerializeDataFrameHeader(
/* payload_length = */ 5, quiche::SimpleBufferAllocator::Get());
- char output[] = {// type (DATA)
- 0x00,
- // length
- 0x05};
+ char output[] = {0x00, // type (DATA)
+ 0x05}; // length
EXPECT_EQ(ABSL_ARRAYSIZE(output), buffer.size());
quiche::test::CompareCharArraysWithHexError(
"DATA", buffer.data(), buffer.size(), output, ABSL_ARRAYSIZE(output));
}
TEST(HttpEncoderTest, SerializeHeadersFrameHeader) {
- std::unique_ptr<char[]> buffer;
- uint64_t length = HttpEncoder::SerializeHeadersFrameHeader(
- /* payload_length = */ 7, &buffer);
- char output[] = {// type (HEADERS)
- 0x01,
- // length
- 0x07};
- EXPECT_EQ(ABSL_ARRAYSIZE(output), length);
- quiche::test::CompareCharArraysWithHexError("HEADERS", buffer.get(), length,
- output, ABSL_ARRAYSIZE(output));
+ std::string header =
+ HttpEncoder::SerializeHeadersFrameHeader(/* payload_length = */ 7);
+ char output[] = {0x01, // type (HEADERS)
+ 0x07}; // length
+ quiche::test::CompareCharArraysWithHexError("HEADERS", header.data(),
+ header.length(), output,
+ ABSL_ARRAYSIZE(output));
}
TEST(HttpEncoderTest, SerializeSettingsFrame) {
@@ -44,43 +39,28 @@ TEST(HttpEncoderTest, SerializeSettingsFrame) {
settings.values[1] = 2;
settings.values[6] = 5;
settings.values[256] = 4;
- char output[] = {// type (SETTINGS)
- 0x04,
- // length
- 0x07,
- // identifier (SETTINGS_QPACK_MAX_TABLE_CAPACITY)
- 0x01,
- // content
- 0x02,
- // identifier (SETTINGS_MAX_HEADER_LIST_SIZE)
- 0x06,
- // content
- 0x05,
- // identifier (256 in variable length integer)
- 0x40 + 0x01, 0x00,
- // content
- 0x04};
- std::unique_ptr<char[]> buffer;
- uint64_t length = HttpEncoder::SerializeSettingsFrame(settings, &buffer);
- EXPECT_EQ(ABSL_ARRAYSIZE(output), length);
- quiche::test::CompareCharArraysWithHexError("SETTINGS", buffer.get(), length,
- output, ABSL_ARRAYSIZE(output));
+ char output[] = {0x04, // type (SETTINGS)
+ 0x07, // length
+ 0x01, // identifier (SETTINGS_QPACK_MAX_TABLE_CAPACITY)
+ 0x02, // content
+ 0x06, // identifier (SETTINGS_MAX_HEADER_LIST_SIZE)
+ 0x05, // content
+ 0x41, 0x00, // identifier 0x100, varint encoded
+ 0x04}; // content
+ std::string frame = HttpEncoder::SerializeSettingsFrame(settings);
+ quiche::test::CompareCharArraysWithHexError(
+ "SETTINGS", frame.data(), frame.length(), output, ABSL_ARRAYSIZE(output));
}
TEST(HttpEncoderTest, SerializeGoAwayFrame) {
GoAwayFrame goaway;
goaway.id = 0x1;
- char output[] = {// type (GOAWAY)
- 0x07,
- // length
- 0x1,
- // ID
- 0x01};
- std::unique_ptr<char[]> buffer;
- uint64_t length = HttpEncoder::SerializeGoAwayFrame(goaway, &buffer);
- EXPECT_EQ(ABSL_ARRAYSIZE(output), length);
- quiche::test::CompareCharArraysWithHexError("GOAWAY", buffer.get(), length,
- output, ABSL_ARRAYSIZE(output));
+ char output[] = {0x07, // type (GOAWAY)
+ 0x1, // length
+ 0x01}; // ID
+ std::string frame = HttpEncoder::SerializeGoAwayFrame(goaway);
+ quiche::test::CompareCharArraysWithHexError(
+ "GOAWAY", frame.data(), frame.length(), output, ABSL_ARRAYSIZE(output));
}
TEST(HttpEncoderTest, SerializePriorityUpdateFrame) {
@@ -91,13 +71,11 @@ TEST(HttpEncoderTest, SerializePriorityUpdateFrame) {
0x01, // length
0x03}; // prioritized element id
- std::unique_ptr<char[]> buffer;
- uint64_t length =
- HttpEncoder::SerializePriorityUpdateFrame(priority_update1, &buffer);
- EXPECT_EQ(ABSL_ARRAYSIZE(output1), length);
+ std::string frame =
+ HttpEncoder::SerializePriorityUpdateFrame(priority_update1);
quiche::test::CompareCharArraysWithHexError(
- "PRIORITY_UPDATE", buffer.get(), length, reinterpret_cast<char*>(output1),
- ABSL_ARRAYSIZE(output1));
+ "PRIORITY_UPDATE", frame.data(), frame.length(),
+ reinterpret_cast<char*>(output1), ABSL_ARRAYSIZE(output1));
}
TEST(HttpEncoderTest, SerializeAcceptChFrame) {
@@ -105,12 +83,10 @@ TEST(HttpEncoderTest, SerializeAcceptChFrame) {
uint8_t output1[] = {0x40, 0x89, // type (ACCEPT_CH)
0x00}; // length
- std::unique_ptr<char[]> buffer;
- uint64_t length = HttpEncoder::SerializeAcceptChFrame(accept_ch, &buffer);
- EXPECT_EQ(ABSL_ARRAYSIZE(output1), length);
- quiche::test::CompareCharArraysWithHexError("ACCEPT_CH", buffer.get(), length,
- reinterpret_cast<char*>(output1),
- ABSL_ARRAYSIZE(output1));
+ std::string frame1 = HttpEncoder::SerializeAcceptChFrame(accept_ch);
+ quiche::test::CompareCharArraysWithHexError(
+ "ACCEPT_CH", frame1.data(), frame1.length(),
+ reinterpret_cast<char*>(output1), ABSL_ARRAYSIZE(output1));
accept_ch.entries.push_back({"foo", "bar"});
uint8_t output2[] = {0x40, 0x89, // type (ACCEPT_CH)
@@ -118,11 +94,10 @@ TEST(HttpEncoderTest, SerializeAcceptChFrame) {
0x03, 0x66, 0x6f, 0x6f, // length of "foo"; "foo"
0x03, 0x62, 0x61, 0x72}; // length of "bar"; "bar"
- length = HttpEncoder::SerializeAcceptChFrame(accept_ch, &buffer);
- EXPECT_EQ(ABSL_ARRAYSIZE(output2), length);
- quiche::test::CompareCharArraysWithHexError("ACCEPT_CH", buffer.get(), length,
- reinterpret_cast<char*>(output2),
- ABSL_ARRAYSIZE(output2));
+ std::string frame2 = HttpEncoder::SerializeAcceptChFrame(accept_ch);
+ quiche::test::CompareCharArraysWithHexError(
+ "ACCEPT_CH", frame2.data(), frame2.length(),
+ reinterpret_cast<char*>(output2), ABSL_ARRAYSIZE(output2));
}
TEST(HttpEncoderTest, SerializeWebTransportStreamFrameHeader) {
@@ -130,12 +105,20 @@ TEST(HttpEncoderTest, SerializeWebTransportStreamFrameHeader) {
char output[] = {0x40, 0x41, // type (WEBTRANSPORT_STREAM)
0x17}; // session ID
- std::unique_ptr<char[]> buffer;
- uint64_t length =
- HttpEncoder::SerializeWebTransportStreamFrameHeader(session_id, &buffer);
- EXPECT_EQ(sizeof(output), length);
+ std::string frame =
+ HttpEncoder::SerializeWebTransportStreamFrameHeader(session_id);
+ quiche::test::CompareCharArraysWithHexError("WEBTRANSPORT_STREAM",
+ frame.data(), frame.length(),
+ output, sizeof(output));
+}
+
+TEST(HttpEncoderTest, SerializeMetadataFrameHeader) {
+ std::string frame = HttpEncoder::SerializeMetadataFrameHeader(
+ /* payload_length = */ 7);
+ char output[] = {0x40, 0x4d, // type (METADATA, 0x4d, varint encoded)
+ 0x07}; // length
quiche::test::CompareCharArraysWithHexError(
- "WEBTRANSPORT_STREAM", buffer.get(), length, output, sizeof(output));
+ "METADATA", frame.data(), frame.length(), output, ABSL_ARRAYSIZE(output));
}
} // namespace test
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_frames.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_frames.h
index b96c5fbec8a..f55881a5f82 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_frames.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/http_frames.h
@@ -34,6 +34,7 @@ enum class HttpFrameType {
PRIORITY_UPDATE_REQUEST_STREAM = 0xF0700,
// https://www.ietf.org/archive/id/draft-ietf-webtrans-http3-00.html
WEBTRANSPORT_STREAM = 0x41,
+ METADATA = 0x4d,
};
// 7.2.1. DATA
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.cc
index 2567fde1fc2..db53585adba 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.cc
@@ -11,7 +11,7 @@
#include "quiche/quic/platform/api/quic_logging.h"
#include "quiche/spdy/core/spdy_protocol.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
namespace quic {
@@ -42,10 +42,10 @@ void QuicClientPromisedInfo::Init() {
QuicTime::Delta::FromSeconds(kPushPromiseTimeoutSecs));
}
-bool QuicClientPromisedInfo::OnPromiseHeaders(const SpdyHeaderBlock& headers) {
+bool QuicClientPromisedInfo::OnPromiseHeaders(const Http2HeaderBlock& headers) {
// RFC7540, Section 8.2, requests MUST be safe [RFC7231], Section
// 4.2.1. GET and HEAD are the methods that are safe and required.
- SpdyHeaderBlock::const_iterator it = headers.find(spdy::kHttp2MethodHeader);
+ Http2HeaderBlock::const_iterator it = headers.find(spdy::kHttp2MethodHeader);
if (it == headers.end()) {
QUIC_DVLOG(1) << "Promise for stream " << id_ << " has no method";
Reset(QUIC_INVALID_PROMISE_METHOD);
@@ -72,8 +72,9 @@ bool QuicClientPromisedInfo::OnPromiseHeaders(const SpdyHeaderBlock& headers) {
return true;
}
-void QuicClientPromisedInfo::OnResponseHeaders(const SpdyHeaderBlock& headers) {
- response_headers_ = std::make_unique<SpdyHeaderBlock>(headers.Clone());
+void QuicClientPromisedInfo::OnResponseHeaders(
+ const Http2HeaderBlock& headers) {
+ response_headers_ = std::make_unique<Http2HeaderBlock>(headers.Clone());
if (client_request_delegate_) {
// We already have a client request waiting.
FinalValidation();
@@ -112,7 +113,7 @@ QuicAsyncStatus QuicClientPromisedInfo::FinalValidation() {
}
QuicAsyncStatus QuicClientPromisedInfo::HandleClientRequest(
- const SpdyHeaderBlock& request_headers,
+ const Http2HeaderBlock& request_headers,
QuicClientPushPromiseIndex::Delegate* delegate) {
if (session_->IsClosedStream(id_)) {
// There was a RST on the response stream.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.h
index 68eaecddbdd..7b4f460c2ff 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.h
@@ -14,6 +14,7 @@
#include "quiche/quic/core/quic_alarm.h"
#include "quiche/quic/core/quic_packets.h"
#include "quiche/quic/platform/api/quic_export.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_framer.h"
namespace quic {
@@ -39,15 +40,15 @@ class QUIC_EXPORT_PRIVATE QuicClientPromisedInfo
void Init();
// Validate promise headers etc. Returns true if headers are valid.
- bool OnPromiseHeaders(const spdy::SpdyHeaderBlock& headers);
+ bool OnPromiseHeaders(const spdy::Http2HeaderBlock& headers);
// Store response, possibly proceed with final validation.
- void OnResponseHeaders(const spdy::SpdyHeaderBlock& headers);
+ void OnResponseHeaders(const spdy::Http2HeaderBlock& headers);
// Rendezvous between this promised stream and a client request that
// has a matching URL.
virtual QuicAsyncStatus HandleClientRequest(
- const spdy::SpdyHeaderBlock& headers,
+ const spdy::Http2HeaderBlock& headers,
QuicClientPushPromiseIndex::Delegate* delegate);
void Cancel() override;
@@ -67,9 +68,9 @@ class QUIC_EXPORT_PRIVATE QuicClientPromisedInfo
// validation requires the response headers (for the actual Vary
// field list), the promise headers (taking the role of the "cached"
// request), and the client request headers.
- spdy::SpdyHeaderBlock* request_headers() { return &request_headers_; }
+ spdy::Http2HeaderBlock* request_headers() { return &request_headers_; }
- spdy::SpdyHeaderBlock* response_headers() { return response_headers_.get(); }
+ spdy::Http2HeaderBlock* response_headers() { return response_headers_.get(); }
// After validation, client will use this to access the pushed stream.
@@ -99,9 +100,9 @@ class QUIC_EXPORT_PRIVATE QuicClientPromisedInfo
QuicSpdyClientSessionBase* session_;
QuicStreamId id_;
std::string url_;
- spdy::SpdyHeaderBlock request_headers_;
- std::unique_ptr<spdy::SpdyHeaderBlock> response_headers_;
- spdy::SpdyHeaderBlock client_request_headers_;
+ spdy::Http2HeaderBlock request_headers_;
+ std::unique_ptr<spdy::Http2HeaderBlock> response_headers_;
+ spdy::Http2HeaderBlock client_request_headers_;
QuicClientPushPromiseIndex::Delegate* client_request_delegate_;
// The promise will commit suicide eventually if it is not claimed by a GET
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info_test.cc
index 7636579d037..469c0c2384f 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info_test.cc
@@ -20,7 +20,7 @@
#include "quiche/quic/test_tools/quic_spdy_session_peer.h"
#include "quiche/quic/test_tools/quic_test_utils.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
using testing::_;
using testing::StrictMock;
@@ -122,12 +122,12 @@ class QuicClientPromisedInfoTest : public QuicTest {
std::unique_ptr<QuicSpdyClientStream> stream_;
std::unique_ptr<StreamVisitor> stream_visitor_;
std::unique_ptr<QuicSpdyClientStream> promised_stream_;
- SpdyHeaderBlock headers_;
+ Http2HeaderBlock headers_;
std::string body_;
- SpdyHeaderBlock push_promise_;
+ Http2HeaderBlock push_promise_;
QuicStreamId promise_id_;
std::string promise_url_;
- SpdyHeaderBlock client_request_;
+ Http2HeaderBlock client_request_;
};
TEST_F(QuicClientPromisedInfoTest, PushPromise) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.cc
index 60a51c104ca..00ac30a3f8b 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.cc
@@ -9,8 +9,6 @@
#include "quiche/quic/core/http/quic_client_promised_info.h"
#include "quiche/quic/core/http/spdy_server_push_utils.h"
-using spdy::SpdyHeaderBlock;
-
namespace quic {
QuicClientPushPromiseIndex::QuicClientPushPromiseIndex() {}
@@ -29,7 +27,7 @@ QuicClientPromisedInfo* QuicClientPushPromiseIndex::GetPromised(
}
QuicAsyncStatus QuicClientPushPromiseIndex::Try(
- const spdy::SpdyHeaderBlock& request,
+ const spdy::Http2HeaderBlock& request,
QuicClientPushPromiseIndex::Delegate* delegate, TryHandle** handle) {
std::string url(SpdyServerPushUtils::GetPromisedUrlFromHeaders(request));
auto it = promised_by_url_.find(url);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h
index ba786d8628c..c00a17eac54 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h
@@ -10,6 +10,7 @@
#include "quiche/quic/core/http/quic_spdy_client_session_base.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/platform/api/quic_export.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -32,9 +33,9 @@ class QUIC_EXPORT_PRIVATE QuicClientPushPromiseIndex {
// is honored. If Vary is not present, return true. If Vary is
// present, return whether designated header fields of
// |promise_request| and |client_request| match.
- virtual bool CheckVary(const spdy::SpdyHeaderBlock& client_request,
- const spdy::SpdyHeaderBlock& promise_request,
- const spdy::SpdyHeaderBlock& promise_response) = 0;
+ virtual bool CheckVary(const spdy::Http2HeaderBlock& client_request,
+ const spdy::Http2HeaderBlock& promise_request,
+ const spdy::Http2HeaderBlock& promise_response) = 0;
// On rendezvous success, provides the promised |stream|. Callee
// does not inherit ownership of |stream|. On rendezvous failure,
@@ -84,7 +85,7 @@ class QUIC_EXPORT_PRIVATE QuicClientPushPromiseIndex {
// cancel the request if need be. The caller does not inherit
// ownership of |*handle|, and it ceases to be valid if the caller
// invokes |handle->Cancel()| or if |delegate->OnReponse()| fires.
- QuicAsyncStatus Try(const spdy::SpdyHeaderBlock& request, Delegate* delegate,
+ QuicAsyncStatus Try(const spdy::Http2HeaderBlock& request, Delegate* delegate,
TryHandle** handle);
QuicPromisedByUrlMap* promised_by_url() { return &promised_by_url_; }
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index_test.cc
index d491710bd1a..58104fd2bd8 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index_test.cc
@@ -64,7 +64,7 @@ class QuicClientPushPromiseIndexTest : public QuicTest {
StrictMock<MockQuicConnection>* connection_;
MockQuicSpdyClientSession session_;
QuicClientPushPromiseIndex index_;
- spdy::SpdyHeaderBlock request_;
+ spdy::Http2HeaderBlock request_;
std::string url_;
MockQuicClientPromisedInfo promised_;
QuicClientPushPromiseIndex::TryHandle* handle_;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_header_list.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_header_list.h
index 9cccf02519e..ac25f89e008 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_header_list.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_header_list.h
@@ -14,7 +14,6 @@
#include "quiche/quic/platform/api/quic_bug_tracker.h"
#include "quiche/quic/platform/api/quic_export.h"
#include "quiche/common/quiche_circular_deque.h"
-#include "quiche/spdy/core/spdy_header_block.h"
#include "quiche/spdy/core/spdy_headers_handler_interface.h"
namespace quic {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream_test.cc
index 76083f33330..f4c48c0669a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_headers_stream_test.cc
@@ -28,12 +28,14 @@
#include "quiche/quic/test_tools/quic_test_utils.h"
#include "quiche/common/quiche_endian.h"
#include "quiche/spdy/core/http2_frame_decoder_adapter.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/recording_headers_handler.h"
#include "quiche/spdy/core/spdy_alt_svc_wire_format.h"
#include "quiche/spdy/core/spdy_protocol.h"
#include "quiche/spdy/test_tools/spdy_test_utils.h"
using spdy::ERROR_CODE_PROTOCOL_ERROR;
+using spdy::Http2HeaderBlock;
using spdy::RecordingHeadersHandler;
using spdy::SETTINGS_ENABLE_PUSH;
using spdy::SETTINGS_HEADER_TABLE_SIZE;
@@ -47,7 +49,6 @@ using spdy::SpdyErrorCode;
using spdy::SpdyFramer;
using spdy::SpdyFramerVisitorInterface;
using spdy::SpdyGoAwayIR;
-using spdy::SpdyHeaderBlock;
using spdy::SpdyHeadersHandlerInterface;
using spdy::SpdyHeadersIR;
using spdy::SpdyPingId;
@@ -129,6 +130,12 @@ class MockVisitor : public SpdyFramerVisitorInterface {
(override));
MOCK_METHOD(bool, OnUnknownFrame,
(SpdyStreamId stream_id, uint8_t frame_type), (override));
+ MOCK_METHOD(void, OnUnknownFrameStart,
+ (SpdyStreamId stream_id, size_t length, uint8_t type,
+ uint8_t flags),
+ (override));
+ MOCK_METHOD(void, OnUnknownFramePayload,
+ (SpdyStreamId stream_id, absl::string_view payload), (override));
};
struct TestParams {
@@ -347,7 +354,7 @@ class QuicHeadersStreamTest : public QuicTestWithParam<TestParams> {
StrictMock<MockQuicConnection>* connection_;
StrictMock<MockQuicSpdySession> session_;
QuicHeadersStream* headers_stream_;
- SpdyHeaderBlock headers_;
+ Http2HeaderBlock headers_;
std::unique_ptr<RecordingHeadersHandler> headers_handler_;
std::string body_;
std::string saved_data_;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream_test.cc
index c2dcfa7d4b2..af7e5d43bc6 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_receive_control_stream_test.cc
@@ -109,22 +109,6 @@ class QuicReceiveControlStreamTest : public QuicTestWithParam<TestParams> {
Perspective perspective() const { return GetParam().perspective; }
- std::string EncodeSettings(const SettingsFrame& settings) {
- std::unique_ptr<char[]> buffer;
- QuicByteCount settings_frame_length =
- HttpEncoder::SerializeSettingsFrame(settings, &buffer);
- return std::string(buffer.get(), settings_frame_length);
- }
-
- std::string SerializePriorityUpdateFrame(
- const PriorityUpdateFrame& priority_update) {
- std::unique_ptr<char[]> priority_buffer;
- QuicByteCount priority_frame_length =
- HttpEncoder::SerializePriorityUpdateFrame(priority_update,
- &priority_buffer);
- return std::string(priority_buffer.get(), priority_frame_length);
- }
-
QuicStreamOffset NumBytesConsumed() {
return QuicStreamPeer::sequencer(receive_control_stream_)
->NumBytesConsumed();
@@ -158,7 +142,7 @@ TEST_P(QuicReceiveControlStreamTest, ReceiveSettings) {
settings.values[SETTINGS_MAX_FIELD_SECTION_SIZE] = 5;
settings.values[SETTINGS_QPACK_BLOCKED_STREAMS] = 12;
settings.values[SETTINGS_QPACK_MAX_TABLE_CAPACITY] = 37;
- std::string data = EncodeSettings(settings);
+ std::string data = HttpEncoder::SerializeSettingsFrame(settings);
QuicStreamFrame frame(receive_control_stream_->id(), false, 1, data);
QpackEncoder* qpack_encoder = session_.qpack_encoder();
@@ -185,7 +169,7 @@ TEST_P(QuicReceiveControlStreamTest, ReceiveSettingsTwice) {
settings.values[0x21] = 100;
settings.values[0x40] = 200;
- std::string settings_frame = EncodeSettings(settings);
+ std::string settings_frame = HttpEncoder::SerializeSettingsFrame(settings);
QuicStreamOffset offset = 1;
EXPECT_EQ(offset, NumBytesConsumed());
@@ -223,7 +207,7 @@ TEST_P(QuicReceiveControlStreamTest, ReceiveSettingsFragments) {
SettingsFrame settings;
settings.values[10] = 2;
settings.values[SETTINGS_MAX_FIELD_SECTION_SIZE] = 5;
- std::string data = EncodeSettings(settings);
+ std::string data = HttpEncoder::SerializeSettingsFrame(settings);
std::string data1 = data.substr(0, 1);
std::string data2 = data.substr(1, data.length() - 1);
@@ -250,7 +234,7 @@ TEST_P(QuicReceiveControlStreamTest, ReceiveWrongFrame) {
TEST_P(QuicReceiveControlStreamTest,
ReceivePriorityUpdateFrameBeforeSettingsFrame) {
- std::string serialized_frame = SerializePriorityUpdateFrame({});
+ std::string serialized_frame = HttpEncoder::SerializePriorityUpdateFrame({});
QuicStreamFrame data(receive_control_stream_->id(), /* fin = */ false,
/* offset = */ 1, serialized_frame);
@@ -275,7 +259,7 @@ TEST_P(QuicReceiveControlStreamTest, ReceiveGoAwayFrame) {
// Receive SETTINGS frame.
SettingsFrame settings;
- std::string settings_frame = EncodeSettings(settings);
+ std::string settings_frame = HttpEncoder::SerializeSettingsFrame(settings);
EXPECT_CALL(debug_visitor, OnSettingsFrameReceived(settings));
receive_control_stream_->OnStreamFrame(
QuicStreamFrame(receive_control_stream_->id(), /* fin = */ false, offset,
@@ -283,18 +267,15 @@ TEST_P(QuicReceiveControlStreamTest, ReceiveGoAwayFrame) {
offset += settings_frame.length();
GoAwayFrame goaway{/* id = */ 0};
+ std::string goaway_frame = HttpEncoder::SerializeGoAwayFrame(goaway);
+ QuicStreamFrame frame(receive_control_stream_->id(), false, offset,
+ goaway_frame);
- std::unique_ptr<char[]> buffer;
- QuicByteCount header_length =
- HttpEncoder::SerializeGoAwayFrame(goaway, &buffer);
- std::string data = std::string(buffer.get(), header_length);
-
- QuicStreamFrame frame(receive_control_stream_->id(), false, offset, data);
EXPECT_FALSE(session_.goaway_received());
EXPECT_CALL(debug_visitor, OnGoAwayFrameReceived(goaway));
-
receive_control_stream_->OnStreamFrame(frame);
+
EXPECT_TRUE(session_.goaway_received());
}
@@ -320,7 +301,7 @@ TEST_P(QuicReceiveControlStreamTest, ConsumeUnknownFrame) {
QuicStreamOffset offset = 1;
// Receive SETTINGS frame.
- std::string settings_frame = EncodeSettings({});
+ std::string settings_frame = HttpEncoder::SerializeSettingsFrame({});
receive_control_stream_->OnStreamFrame(
QuicStreamFrame(receive_control_stream_->id(), /* fin = */ false, offset,
settings_frame));
@@ -352,7 +333,7 @@ TEST_P(QuicReceiveControlStreamTest, ReceiveUnknownFrame) {
// Receive SETTINGS frame.
SettingsFrame settings;
- std::string settings_frame = EncodeSettings(settings);
+ std::string settings_frame = HttpEncoder::SerializeSettingsFrame(settings);
EXPECT_CALL(debug_visitor, OnSettingsFrameReceived(settings));
receive_control_stream_->OnStreamFrame(
QuicStreamFrame(id, /* fin = */ false, offset, settings_frame));
@@ -426,7 +407,7 @@ TEST_P(QuicReceiveControlStreamTest, ReceiveAcceptChFrame) {
// Receive SETTINGS frame.
SettingsFrame settings;
- std::string settings_frame = EncodeSettings(settings);
+ std::string settings_frame = HttpEncoder::SerializeSettingsFrame(settings);
EXPECT_CALL(debug_visitor, OnSettingsFrameReceived(settings));
receive_control_stream_->OnStreamFrame(
QuicStreamFrame(id, /* fin = */ false, offset, settings_frame));
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc
index 44f658ff99a..6c71740d86e 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_send_control_stream.cc
@@ -66,25 +66,20 @@ void QuicSendControlStream::MaybeSendSettingsFrame() {
settings.values[setting_id] = result;
}
- std::unique_ptr<char[]> buffer;
- QuicByteCount frame_length =
- HttpEncoder::SerializeSettingsFrame(settings, &buffer);
+ std::string settings_frame = HttpEncoder::SerializeSettingsFrame(settings);
QUIC_DVLOG(1) << "Control stream " << id() << " is writing settings frame "
<< settings;
if (spdy_session_->debug_visitor()) {
spdy_session_->debug_visitor()->OnSettingsFrameSent(settings);
}
- WriteOrBufferData(absl::string_view(buffer.get(), frame_length),
- /*fin = */ false, nullptr);
+ WriteOrBufferData(settings_frame, /*fin = */ false, nullptr);
settings_sent_ = true;
// https://tools.ietf.org/html/draft-ietf-quic-http-25#section-7.2.9
// specifies that a reserved frame type has no semantic meaning and should be
// discarded. A greasing frame is added here.
- std::unique_ptr<char[]> grease;
- QuicByteCount grease_length = HttpEncoder::SerializeGreasingFrame(&grease);
- WriteOrBufferData(absl::string_view(grease.get(), grease_length),
- /*fin = */ false, nullptr);
+ WriteOrBufferData(HttpEncoder::SerializeGreasingFrame(), /*fin = */ false,
+ nullptr);
}
void QuicSendControlStream::WritePriorityUpdate(
@@ -96,13 +91,11 @@ void QuicSendControlStream::WritePriorityUpdate(
spdy_session_->debug_visitor()->OnPriorityUpdateFrameSent(priority_update);
}
- std::unique_ptr<char[]> buffer;
- QuicByteCount frame_length =
- HttpEncoder::SerializePriorityUpdateFrame(priority_update, &buffer);
+ std::string frame =
+ HttpEncoder::SerializePriorityUpdateFrame(priority_update);
QUIC_DVLOG(1) << "Control Stream " << id() << " is writing "
<< priority_update;
- WriteOrBufferData(absl::string_view(buffer.get(), frame_length), false,
- nullptr);
+ WriteOrBufferData(frame, false, nullptr);
}
void QuicSendControlStream::SendGoAway(QuicStreamId id) {
@@ -115,11 +108,7 @@ void QuicSendControlStream::SendGoAway(QuicStreamId id) {
spdy_session_->debug_visitor()->OnGoAwayFrameSent(id);
}
- std::unique_ptr<char[]> buffer;
- QuicByteCount frame_length =
- HttpEncoder::SerializeGoAwayFrame(frame, &buffer);
- WriteOrBufferData(absl::string_view(buffer.get(), frame_length), false,
- nullptr);
+ WriteOrBufferData(HttpEncoder::SerializeGoAwayFrame(frame), false, nullptr);
}
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.cc
index f3b16ef86dc..c036c2c236c 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.cc
@@ -17,7 +17,7 @@ void QuicServerInitiatedSpdyStream::OnBodyAvailable() {
}
size_t QuicServerInitiatedSpdyStream::WriteHeaders(
- spdy::SpdyHeaderBlock /*header_block*/, bool /*fin*/,
+ spdy::Http2HeaderBlock /*header_block*/, bool /*fin*/,
quiche::QuicheReferenceCountedPointer<
QuicAckListenerInterface> /*ack_listener*/) {
QUIC_BUG(Writing headers in QuicServerInitiatedSpdyStream)
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.h
index a93cb40aa0b..a47a712434c 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_initiated_spdy_stream.h
@@ -6,6 +6,7 @@
#define QUICHE_QUIC_CORE_HTTP_QUIC_SERVER_INITIATED_SPDY_STREAM_H_
#include "quiche/quic/core/http/quic_spdy_stream.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -19,7 +20,7 @@ class QUIC_EXPORT_PRIVATE QuicServerInitiatedSpdyStream
void OnBodyAvailable() override;
size_t WriteHeaders(
- spdy::SpdyHeaderBlock header_block, bool fin,
+ spdy::Http2HeaderBlock header_block, bool fin,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener) override;
void OnInitialHeadersComplete(bool fin, size_t frame_len,
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc
index d59602e103c..8057060f10c 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base.cc
@@ -88,7 +88,7 @@ void QuicServerSessionBase::OnConfigNegotiated() {
enable_sending_bandwidth_estimate_when_network_idle_ =
GetQuicRestartFlag(
- quic_enable_sending_bandwidth_estimate_when_network_idle) &&
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2) &&
version().HasIetfQuicFrames() &&
ContainsQuicTag(config()->ReceivedConnectionOptions(), kBWID);
@@ -146,7 +146,7 @@ void QuicServerSessionBase::OnBandwidthUpdateTimeout() {
const bool success = MaybeSendAddressToken();
QUIC_BUG_IF(QUIC_BUG_25522, !success) << "Failed to send address token.";
QUIC_RESTART_FLAG_COUNT_N(
- quic_enable_sending_bandwidth_estimate_when_network_idle, 2, 3);
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2, 2, 3);
}
}
@@ -154,9 +154,9 @@ void QuicServerSessionBase::OnCongestionWindowChange(QuicTime now) {
// Sending bandwidth is no longer conditioned on if session does bandwidth
// resumption.
if (GetQuicRestartFlag(
- quic_enable_sending_bandwidth_estimate_when_network_idle)) {
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2)) {
QUIC_RESTART_FLAG_COUNT_N(
- quic_enable_sending_bandwidth_estimate_when_network_idle, 3, 3);
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2, 3, 3);
return;
}
if (!bandwidth_resumption_enabled_) {
@@ -317,13 +317,12 @@ void QuicServerSessionBase::SendSettingsToCryptoStream() {
if (!version().UsesTls()) {
return;
}
- std::unique_ptr<char[]> buffer;
- QuicByteCount buffer_size =
- HttpEncoder::SerializeSettingsFrame(settings(), &buffer);
+ std::string settings_frame = HttpEncoder::SerializeSettingsFrame(settings());
std::unique_ptr<ApplicationState> serialized_settings =
- std::make_unique<ApplicationState>(buffer.get(),
- buffer.get() + buffer_size);
+ std::make_unique<ApplicationState>(
+ settings_frame.data(),
+ settings_frame.data() + settings_frame.length());
GetMutableCryptoStream()->SetServerApplicationStateForResumption(
std::move(serialized_settings));
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base_test.cc
index df099a66f3d..a72224051cf 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_server_session_base_test.cc
@@ -608,7 +608,7 @@ TEST_P(QuicServerSessionBaseTest, BandwidthEstimates) {
HAS_RETRANSMITTABLE_DATA, true);
if (GetQuicRestartFlag(
- quic_enable_sending_bandwidth_estimate_when_network_idle)) {
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2)) {
EXPECT_CALL(*connection_, OnSendConnectionState(_)).Times(0);
} else {
// Verify that the proto has exactly the values we expect.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc
index 171e0c4cc46..707281a460a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.cc
@@ -38,7 +38,11 @@ void QuicSpdyClientSession::Initialize() {
crypto_stream_ = CreateQuicCryptoStream();
if (config()->HasClientRequestedIndependentOption(kQLVE,
Perspective::IS_CLIENT)) {
- connection()->EnableLegacyVersionEncapsulation(server_id_.host());
+ if (GetQuicRestartFlag(quic_disable_legacy_version_encapsulation)) {
+ QUIC_CODE_COUNT(quic_disable_legacy_version_encapsulation_client_init);
+ } else {
+ connection()->EnableLegacyVersionEncapsulation(server_id_.host());
+ }
}
QuicSpdyClientSessionBase::Initialize();
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc
index 5a5c72b38de..3b38b1e77d6 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc
@@ -12,7 +12,7 @@
#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_logging.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
namespace quic {
@@ -38,7 +38,7 @@ void QuicSpdyClientSessionBase::OnConfigNegotiated() {
}
void QuicSpdyClientSessionBase::OnInitialHeadersComplete(
- QuicStreamId stream_id, const SpdyHeaderBlock& response_headers) {
+ QuicStreamId stream_id, const Http2HeaderBlock& response_headers) {
// Note that the strong ordering of the headers stream means that
// QuicSpdyClientStream::OnPromiseHeadersComplete must have already
// been called (on the associated stream) if this is a promised
@@ -100,9 +100,9 @@ void QuicSpdyClientSessionBase::OnPromiseHeaderList(
stream->OnPromiseHeaderList(promised_stream_id, frame_len, header_list);
}
-bool QuicSpdyClientSessionBase::HandlePromised(QuicStreamId /* associated_id */,
- QuicStreamId promised_id,
- const SpdyHeaderBlock& headers) {
+bool QuicSpdyClientSessionBase::HandlePromised(
+ QuicStreamId /* associated_id */, QuicStreamId promised_id,
+ const Http2HeaderBlock& headers) {
// TODO(b/136295430): Do not treat |promised_id| as a stream ID when using
// IETF QUIC.
// Due to pathalogical packet re-ordering, it is possible that
@@ -259,11 +259,9 @@ bool QuicSpdyClientSessionBase::OnSettingsFrame(const SettingsFrame& frame) {
if (!QuicSpdySession::OnSettingsFrame(frame)) {
return false;
}
- std::unique_ptr<char[]> buffer;
- QuicByteCount frame_length =
- HttpEncoder::SerializeSettingsFrame(frame, &buffer);
+ std::string settings_frame = HttpEncoder::SerializeSettingsFrame(frame);
auto serialized_data = std::make_unique<ApplicationState>(
- buffer.get(), buffer.get() + frame_length);
+ settings_frame.data(), settings_frame.data() + settings_frame.length());
GetMutableCryptoStream()->SetServerApplicationStateForResumption(
std::move(serialized_data));
return true;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.h
index 79e49abd4be..04a0d763966 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.h
@@ -11,6 +11,7 @@
#include "quiche/quic/core/http/quic_spdy_session.h"
#include "quiche/quic/core/quic_crypto_client_stream.h"
#include "quiche/quic/platform/api/quic_export.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -60,7 +61,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyClientSessionBase
// needed to detect promised server push streams, as part of
// client-request to push-stream rendezvous.
void OnInitialHeadersComplete(QuicStreamId stream_id,
- const spdy::SpdyHeaderBlock& response_headers);
+ const spdy::Http2HeaderBlock& response_headers);
// Called by |QuicSpdyClientStream| on receipt of PUSH_PROMISE, does
// some session level validation and creates the
@@ -69,7 +70,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyClientSessionBase
// stream and returns false otherwise.
virtual bool HandlePromised(QuicStreamId associated_id,
QuicStreamId promised_id,
- const spdy::SpdyHeaderBlock& headers);
+ const spdy::Http2HeaderBlock& headers);
// For cross-origin server push, this should verify the server is
// authoritative per [RFC2818], Section 3. Roughly, subjectAltName
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_test.cc
index 6ebacc594c9..a39a1ac8dbd 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_test.cc
@@ -39,8 +39,9 @@
#include "quiche/quic/test_tools/quic_stream_peer.h"
#include "quiche/quic/test_tools/quic_test_utils.h"
#include "quiche/quic/test_tools/simple_session_cache.h"
+#include "quiche/spdy/core/http2_header_block.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
using ::testing::_;
using ::testing::AnyNumber;
using ::testing::AtLeast;
@@ -215,7 +216,7 @@ class QuicSpdyClientSessionTest : public QuicTestWithParam<ParsedQuicVersion> {
::testing::NiceMock<PacketSavingConnection>* connection_;
std::unique_ptr<TestQuicSpdyClientSession> session_;
QuicClientPushPromiseIndex push_promise_index_;
- SpdyHeaderBlock push_promise_;
+ Http2HeaderBlock push_promise_;
std::string promise_url_;
QuicStreamId promised_stream_id_;
QuicStreamId associated_stream_id_;
@@ -715,7 +716,7 @@ TEST_P(QuicSpdyClientSessionTest, PushPromiseAlreadyClosed) {
OnStreamReset(promised_stream_id_, QUIC_REFUSED_STREAM));
session_->ResetPromised(promised_stream_id_, QUIC_REFUSED_STREAM);
- SpdyHeaderBlock promise_headers;
+ Http2HeaderBlock promise_headers;
EXPECT_FALSE(session_->HandlePromised(associated_stream_id_,
promised_stream_id_, promise_headers));
@@ -820,14 +821,14 @@ TEST_P(QuicSpdyClientSessionTest, OnInitialHeadersCompleteIsPush) {
EXPECT_NE(session_->GetPromisedStream(promised_stream_id_), nullptr);
EXPECT_NE(session_->GetPromisedByUrl(promise_url_), nullptr);
- session_->OnInitialHeadersComplete(promised_stream_id_, SpdyHeaderBlock());
+ session_->OnInitialHeadersComplete(promised_stream_id_, Http2HeaderBlock());
}
TEST_P(QuicSpdyClientSessionTest, OnInitialHeadersCompleteIsNotPush) {
// Initialize crypto before the client session will create a stream.
CompleteCryptoHandshake();
session_->CreateOutgoingBidirectionalStream();
- session_->OnInitialHeadersComplete(promised_stream_id_, SpdyHeaderBlock());
+ session_->OnInitialHeadersComplete(promised_stream_id_, Http2HeaderBlock());
}
TEST_P(QuicSpdyClientSessionTest, DeletePromised) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc
index 044c616591d..92277f916c0 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.cc
@@ -16,7 +16,7 @@
#include "quiche/common/quiche_text_utils.h"
#include "quiche/spdy/core/spdy_protocol.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
namespace quic {
@@ -126,7 +126,7 @@ void QuicSpdyClientStream::OnPromiseHeaderList(
const QuicHeaderList& header_list) {
header_bytes_read_ += frame_len;
int64_t content_length = -1;
- SpdyHeaderBlock promise_headers;
+ Http2HeaderBlock promise_headers;
if (!SpdyUtils::CopyAndValidateHeaders(header_list, &content_length,
&promise_headers)) {
QUIC_DLOG(ERROR) << "Failed to parse promise headers: "
@@ -172,7 +172,7 @@ void QuicSpdyClientStream::OnBodyAvailable() {
}
}
-size_t QuicSpdyClientStream::SendRequest(SpdyHeaderBlock headers,
+size_t QuicSpdyClientStream::SendRequest(Http2HeaderBlock headers,
absl::string_view body, bool fin) {
QuicConnection::ScopedPacketFlusher flusher(session_->connection());
bool send_fin_with_headers = fin && body.empty();
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.h
index 6311726bced..a0806d757bf 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream.h
@@ -11,6 +11,7 @@
#include "absl/strings/string_view.h"
#include "quiche/quic/core/http/quic_spdy_stream.h"
#include "quiche/quic/core/quic_packets.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_framer.h"
namespace quic {
@@ -46,16 +47,16 @@ class QUIC_EXPORT_PRIVATE QuicSpdyClientStream : public QuicSpdyStream {
// Serializes the headers and body, sends it to the server, and
// returns the number of bytes sent.
- size_t SendRequest(spdy::SpdyHeaderBlock headers, absl::string_view body,
+ size_t SendRequest(spdy::Http2HeaderBlock headers, absl::string_view body,
bool fin);
// Returns the response data.
const std::string& data() { return data_; }
// Returns whatever headers have been received for this stream.
- const spdy::SpdyHeaderBlock& response_headers() { return response_headers_; }
+ const spdy::Http2HeaderBlock& response_headers() { return response_headers_; }
- const spdy::SpdyHeaderBlock& preliminary_headers() {
+ const spdy::Http2HeaderBlock& preliminary_headers() {
return preliminary_headers_;
}
@@ -74,7 +75,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyClientStream : public QuicSpdyStream {
private:
// The parsed headers received from the server.
- spdy::SpdyHeaderBlock response_headers_;
+ spdy::Http2HeaderBlock response_headers_;
// The parsed content-length, or -1 if none is specified.
int64_t content_length_;
@@ -89,7 +90,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyClientStream : public QuicSpdyStream {
// that may arrive before the response headers when the request has
// Expect: 100-continue.
bool has_preliminary_headers_;
- spdy::SpdyHeaderBlock preliminary_headers_;
+ spdy::Http2HeaderBlock preliminary_headers_;
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream_test.cc
index 17901e08c1c..d5b41374ebe 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_stream_test.cc
@@ -21,7 +21,7 @@
#include "quiche/quic/test_tools/quic_test_utils.h"
#include "quiche/common/simple_buffer_allocator.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
using testing::_;
using testing::StrictMock;
@@ -99,7 +99,7 @@ class QuicSpdyClientStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
MockQuicSpdyClientSession session_;
QuicSpdyClientStream* stream_;
std::unique_ptr<StreamVisitor> stream_visitor_;
- SpdyHeaderBlock headers_;
+ Http2HeaderBlock headers_;
std::string body_;
};
@@ -292,7 +292,7 @@ TEST_P(QuicSpdyClientStreamTest, ReceivingTrailers) {
// Send trailers before sending the body. Even though a FIN has been received
// the stream should not be closed, as it does not yet have all the data bytes
// promised by the final offset field.
- SpdyHeaderBlock trailer_block;
+ Http2HeaderBlock trailer_block;
trailer_block["trailer key"] = "trailer value";
trailer_block[kFinalOffsetHeaderKey] = absl::StrCat(body_.size());
auto trailers = AsHeaderList(trailer_block);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc
index ff14bb75115..8ebf712d62e 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_server_stream_base_test.cc
@@ -8,10 +8,11 @@
#include "quiche/quic/core/crypto/null_encrypter.h"
#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_test.h"
-#include "quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h"
+#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
#include "quiche/quic/test_tools/quic_spdy_session_peer.h"
#include "quiche/quic/test_tools/quic_stream_peer.h"
#include "quiche/quic/test_tools/quic_test_utils.h"
+#include "quiche/spdy/core/http2_header_block.h"
using testing::_;
@@ -308,21 +309,17 @@ TEST_F(QuicSpdyServerStreamBaseTest, InvalidRequestHeader) {
TEST_F(QuicSpdyServerStreamBaseTest, EmptyHeaders) {
SetQuicReloadableFlag(quic_verify_request_headers_2, true);
SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
- spdy::SpdyHeaderBlock empty_header;
+ spdy::Http2HeaderBlock empty_header;
quic::test::NoopQpackStreamSenderDelegate encoder_stream_sender_delegate;
- quic::test::NoopDecoderStreamErrorDelegate decoder_stream_error_delegate;
+ NoopDecoderStreamErrorDelegate decoder_stream_error_delegate;
auto qpack_encoder =
std::make_unique<quic::QpackEncoder>(&decoder_stream_error_delegate);
qpack_encoder->set_qpack_stream_sender_delegate(
&encoder_stream_sender_delegate);
std::string payload =
qpack_encoder->EncodeHeaderList(stream_->id(), empty_header, nullptr);
- std::unique_ptr<char[]> headers_buffer;
- quic::QuicByteCount headers_frame_header_length =
- quic::HttpEncoder::SerializeHeadersFrameHeader(payload.length(),
- &headers_buffer);
- absl::string_view headers_frame_header(headers_buffer.get(),
- headers_frame_header_length);
+ std::string headers_frame_header =
+ quic::HttpEncoder::SerializeHeadersFrameHeader(payload.length());
EXPECT_CALL(
session_,
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc
index e54c84616b4..8b6d5eacabe 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.cc
@@ -34,6 +34,7 @@
#include "quiche/spdy/core/http2_frame_decoder_adapter.h"
using http2::Http2DecoderAdapter;
+using spdy::Http2HeaderBlock;
using spdy::Http2WeightToSpdy3Priority;
using spdy::Spdy3PriorityToHttp2Weight;
using spdy::SpdyErrorCode;
@@ -41,7 +42,6 @@ using spdy::SpdyFramer;
using spdy::SpdyFramerDebugVisitorInterface;
using spdy::SpdyFramerVisitorInterface;
using spdy::SpdyFrameType;
-using spdy::SpdyHeaderBlock;
using spdy::SpdyHeadersHandlerInterface;
using spdy::SpdyHeadersIR;
using spdy::SpdyPingId;
@@ -389,6 +389,12 @@ class QuicSpdySession::SpdyFramerVisitor
return false;
}
+ void OnUnknownFrameStart(SpdyStreamId /*stream_id*/, size_t /*length*/,
+ uint8_t /*type*/, uint8_t /*flags*/) override {}
+
+ void OnUnknownFramePayload(SpdyStreamId /*stream_id*/,
+ absl::string_view /*payload*/) override {}
+
// SpdyFramerDebugVisitorInterface implementation
void OnSendCompressedFrame(SpdyStreamId /*stream_id*/, SpdyFrameType /*type*/,
size_t payload_len, size_t frame_len) override {
@@ -684,7 +690,7 @@ size_t QuicSpdySession::ProcessHeaderData(const struct iovec& iov) {
}
size_t QuicSpdySession::WriteHeadersOnHeadersStream(
- QuicStreamId id, SpdyHeaderBlock headers, bool fin,
+ QuicStreamId id, Http2HeaderBlock headers, bool fin,
const spdy::SpdyStreamPrecedence& precedence,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener) {
@@ -796,7 +802,7 @@ void QuicSpdySession::SendHttp3GoAway(QuicErrorCode error_code,
void QuicSpdySession::WritePushPromise(QuicStreamId original_stream_id,
QuicStreamId promised_stream_id,
- SpdyHeaderBlock headers) {
+ Http2HeaderBlock headers) {
if (perspective() == Perspective::IS_CLIENT) {
QUIC_BUG(quic_bug_10360_4) << "Client shouldn't send PUSH_PROMISE";
return;
@@ -903,7 +909,7 @@ bool QuicSpdySession::UsesPendingStreamForFrame(QuicFrameType type,
}
size_t QuicSpdySession::WriteHeadersOnHeadersStreamImpl(
- QuicStreamId id, spdy::SpdyHeaderBlock headers, bool fin,
+ QuicStreamId id, spdy::Http2HeaderBlock headers, bool fin,
QuicStreamId parent_stream_id, int weight, bool exclusive,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h
index f1173280d9c..f1ef594abec 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h
@@ -34,6 +34,7 @@
#include "quiche/quic/platform/api/quic_export.h"
#include "quiche/common/quiche_circular_deque.h"
#include "quiche/spdy/core/http2_frame_decoder_adapter.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -109,7 +110,7 @@ class QUIC_EXPORT_PRIVATE Http3DebugVisitor {
QuicByteCount /*payload_length*/) {}
virtual void OnHeadersFrameSent(
QuicStreamId /*stream_id*/,
- const spdy::SpdyHeaderBlock& /*header_block*/) {}
+ const spdy::Http2HeaderBlock& /*header_block*/) {}
// 0-RTT related events.
virtual void OnSettingsFrameResumed(const SettingsFrame& /*frame*/) {}
@@ -199,7 +200,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdySession
// If provided, |ack_notifier_delegate| will be registered to be notified when
// we have seen ACKs for all packets resulting from this call.
virtual size_t WriteHeadersOnHeadersStream(
- QuicStreamId id, spdy::SpdyHeaderBlock headers, bool fin,
+ QuicStreamId id, spdy::Http2HeaderBlock headers, bool fin,
const spdy::SpdyStreamPrecedence& precedence,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener);
@@ -230,7 +231,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdySession
// PUSH_PROMISE frame to peer.
virtual void WritePushPromise(QuicStreamId original_stream_id,
QuicStreamId promised_stream_id,
- spdy::SpdyHeaderBlock headers);
+ spdy::Http2HeaderBlock headers);
QpackEncoder* qpack_encoder();
QpackDecoder* qpack_decoder();
@@ -482,7 +483,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdySession
QuicStream* ProcessPendingStream(PendingStream* pending) override;
size_t WriteHeadersOnHeadersStreamImpl(
- QuicStreamId id, spdy::SpdyHeaderBlock headers, bool fin,
+ QuicStreamId id, spdy::Http2HeaderBlock headers, bool fin,
QuicStreamId parent_stream_id, int weight, bool exclusive,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session_test.cc
index 4cfb5b72fa5..fcc61030e57 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -51,10 +51,10 @@
#include "quiche/common/test_tools/quiche_test_utils.h"
#include "quiche/spdy/core/spdy_framer.h"
+using spdy::Http2HeaderBlock;
using spdy::kV3HighestPriority;
using spdy::Spdy3PriorityToHttp2Weight;
using spdy::SpdyFramer;
-using spdy::SpdyHeaderBlock;
using spdy::SpdyPriority;
using spdy::SpdyPriorityIR;
using spdy::SpdySerializedFrame;
@@ -505,21 +505,6 @@ class QuicSpdySessionTestBase : public QuicTestWithParam<ParsedQuicVersion> {
return QuicUtils::StreamIdDelta(transport_version());
}
- std::string EncodeSettings(const SettingsFrame& settings) {
- std::unique_ptr<char[]> buffer;
- auto header_length = HttpEncoder::SerializeSettingsFrame(settings, &buffer);
- return std::string(buffer.get(), header_length);
- }
-
- std::string SerializePriorityUpdateFrame(
- const PriorityUpdateFrame& priority_update) {
- std::unique_ptr<char[]> priority_buffer;
- QuicByteCount priority_frame_length =
- HttpEncoder::SerializePriorityUpdateFrame(priority_update,
- &priority_buffer);
- return std::string(priority_buffer.get(), priority_frame_length);
- }
-
QuicStreamId StreamCountToId(QuicStreamCount stream_count,
Perspective perspective, bool bidirectional) {
// Calculate and build up stream ID rather than use
@@ -560,8 +545,8 @@ class QuicSpdySessionTestBase : public QuicTestWithParam<ParsedQuicVersion> {
settings.values[SETTINGS_H3_DATAGRAM_DRAFT04] = 1;
settings.values[SETTINGS_WEBTRANS_DRAFT00] = 1;
settings.values[SETTINGS_ENABLE_CONNECT_PROTOCOL] = 1;
- std::string data =
- std::string(1, kControlStream) + EncodeSettings(settings);
+ std::string data = std::string(1, kControlStream) +
+ HttpEncoder::SerializeSettingsFrame(settings);
QuicStreamId control_stream_id =
session_.perspective() == Perspective::IS_SERVER
? GetNthClientInitiatedUnidirectionalStreamId(transport_version(),
@@ -587,7 +572,7 @@ class QuicSpdySessionTestBase : public QuicTestWithParam<ParsedQuicVersion> {
WebTransportHttp3* web_transport =
session_.GetWebTransportSession(session_id);
ASSERT_TRUE(web_transport != nullptr);
- spdy::SpdyHeaderBlock header_block;
+ spdy::Http2HeaderBlock header_block;
web_transport->HeadersReceived(header_block);
}
@@ -1557,7 +1542,7 @@ TEST_P(QuicSpdySessionTestServer,
// Write until the header stream is flow control blocked.
EXPECT_CALL(*connection_, SendControlFrame(_))
.WillOnce(Invoke(&ClearControlFrame));
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
SimpleRandom random;
while (!headers_stream->IsFlowControlBlocked() && stream_id < 2000) {
EXPECT_FALSE(session_.IsConnectionFlowControlBlocked());
@@ -1898,7 +1883,7 @@ TEST_P(QuicSpdySessionTestClient, TooLargeHeadersMustNotCauseWriteAfterReset) {
.WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0)));
// Write headers with FIN set to close write side of stream.
// Header block does not matter.
- stream->WriteHeaders(SpdyHeaderBlock(), /* fin = */ true, nullptr);
+ stream->WriteHeaders(Http2HeaderBlock(), /* fin = */ true, nullptr);
// Receive headers that are too large or empty, with FIN set.
// This causes the stream to be reset. No frames must be written after this.
@@ -2217,7 +2202,7 @@ TEST_P(QuicSpdySessionTestServer, OnPriorityUpdateFrame) {
QuicSpdySessionPeer::GetReceiveControlStream(&session_)->id());
// Send SETTINGS frame.
- std::string serialized_settings = EncodeSettings({});
+ std::string serialized_settings = HttpEncoder::SerializeSettingsFrame({});
QuicStreamFrame data2(receive_control_stream_id, false, offset,
serialized_settings);
offset += serialized_settings.length();
@@ -2231,7 +2216,7 @@ TEST_P(QuicSpdySessionTestServer, OnPriorityUpdateFrame) {
priority_update1.prioritized_element_id = stream_id1;
priority_update1.priority_field_value = "u=2";
std::string serialized_priority_update1 =
- SerializePriorityUpdateFrame(priority_update1);
+ HttpEncoder::SerializePriorityUpdateFrame(priority_update1);
QuicStreamFrame data3(receive_control_stream_id,
/* fin = */ false, offset, serialized_priority_update1);
offset += serialized_priority_update1.size();
@@ -2251,7 +2236,7 @@ TEST_P(QuicSpdySessionTestServer, OnPriorityUpdateFrame) {
priority_update2.prioritized_element_id = stream_id2;
priority_update2.priority_field_value = "u=2";
std::string serialized_priority_update2 =
- SerializePriorityUpdateFrame(priority_update2);
+ HttpEncoder::SerializePriorityUpdateFrame(priority_update2);
QuicStreamFrame stream_frame3(receive_control_stream_id,
/* fin = */ false, offset,
serialized_priority_update2);
@@ -2421,8 +2406,8 @@ TEST_P(QuicSpdySessionTestServer, ReceiveControlStream) {
settings.values[SETTINGS_QPACK_MAX_TABLE_CAPACITY] = 512;
settings.values[SETTINGS_MAX_FIELD_SECTION_SIZE] = 5;
settings.values[SETTINGS_QPACK_BLOCKED_STREAMS] = 42;
- std::string data = EncodeSettings(settings);
- QuicStreamFrame frame(stream_id, false, 1, absl::string_view(data));
+ std::string data = HttpEncoder::SerializeSettingsFrame(settings);
+ QuicStreamFrame frame(stream_id, false, 1, data);
QpackEncoder* qpack_encoder = session_.qpack_encoder();
QpackEncoderHeaderTable* header_table =
@@ -2451,9 +2436,9 @@ TEST_P(QuicSpdySessionTestServer, ReceiveControlStreamOutOfOrderDelivery) {
SettingsFrame settings;
settings.values[10] = 2;
settings.values[SETTINGS_MAX_FIELD_SECTION_SIZE] = 5;
- std::string data = EncodeSettings(settings);
+ std::string data = HttpEncoder::SerializeSettingsFrame(settings);
- QuicStreamFrame data1(stream_id, false, 1, absl::string_view(data));
+ QuicStreamFrame data1(stream_id, false, 1, data);
QuicStreamFrame data2(stream_id, false, 0, absl::string_view(type, 1));
session_.OnStreamFrame(data1);
@@ -2474,15 +2459,12 @@ TEST_P(QuicSpdySessionTestServer, StreamClosedWhileHeaderDecodingBlocked) {
TestStream* stream = session_.CreateIncomingStream(stream_id);
// HEADERS frame referencing first dynamic table entry.
- std::string headers_payload = absl::HexStringToBytes("020080");
- std::unique_ptr<char[]> headers_buffer;
- QuicByteCount headers_frame_header_length =
- HttpEncoder::SerializeHeadersFrameHeader(headers_payload.length(),
- &headers_buffer);
- absl::string_view headers_frame_header(headers_buffer.get(),
- headers_frame_header_length);
- std::string headers = absl::StrCat(headers_frame_header, headers_payload);
- stream->OnStreamFrame(QuicStreamFrame(stream_id, false, 0, headers));
+ std::string headers_frame_payload = absl::HexStringToBytes("020080");
+ std::string headers_frame_header =
+ HttpEncoder::SerializeHeadersFrameHeader(headers_frame_payload.length());
+ std::string headers_frame =
+ absl::StrCat(headers_frame_header, headers_frame_payload);
+ stream->OnStreamFrame(QuicStreamFrame(stream_id, false, 0, headers_frame));
// Decoding is blocked because dynamic table entry has not been received yet.
EXPECT_FALSE(stream->headers_decompressed());
@@ -2508,15 +2490,12 @@ TEST_P(QuicSpdySessionTestServer, SessionDestroyedWhileHeaderDecodingBlocked) {
TestStream* stream = session_.CreateIncomingStream(stream_id);
// HEADERS frame referencing first dynamic table entry.
- std::string headers_payload = absl::HexStringToBytes("020080");
- std::unique_ptr<char[]> headers_buffer;
- QuicByteCount headers_frame_header_length =
- HttpEncoder::SerializeHeadersFrameHeader(headers_payload.length(),
- &headers_buffer);
- absl::string_view headers_frame_header(headers_buffer.get(),
- headers_frame_header_length);
- std::string headers = absl::StrCat(headers_frame_header, headers_payload);
- stream->OnStreamFrame(QuicStreamFrame(stream_id, false, 0, headers));
+ std::string headers_frame_payload = absl::HexStringToBytes("020080");
+ std::string headers_frame_header =
+ HttpEncoder::SerializeHeadersFrameHeader(headers_frame_payload.length());
+ std::string headers_frame =
+ absl::StrCat(headers_frame_header, headers_frame_payload);
+ stream->OnStreamFrame(QuicStreamFrame(stream_id, false, 0, headers_frame));
// Decoding is blocked because dynamic table entry has not been received yet.
EXPECT_FALSE(stream->headers_decompressed());
@@ -2833,7 +2812,7 @@ TEST_P(QuicSpdySessionTestClient, CloseConnectionOnCancelPush) {
QuicSpdySessionPeer::GetReceiveControlStream(&session_)->id());
// First frame has to be SETTINGS.
- std::string serialized_settings = EncodeSettings({});
+ std::string serialized_settings = HttpEncoder::SerializeSettingsFrame({});
QuicStreamFrame data2(receive_control_stream_id, /* fin = */ false, offset,
serialized_settings);
offset += serialized_settings.length();
@@ -3035,7 +3014,7 @@ TEST_P(QuicSpdySessionTestServer, CloseConnectionOnCancelPush) {
QuicSpdySessionPeer::GetReceiveControlStream(&session_)->id());
// First frame has to be SETTINGS.
- std::string serialized_settings = EncodeSettings({});
+ std::string serialized_settings = HttpEncoder::SerializeSettingsFrame({});
QuicStreamFrame data2(receive_control_stream_id, /* fin = */ false, offset,
serialized_settings);
offset += serialized_settings.length();
@@ -3073,13 +3052,9 @@ TEST_P(QuicSpdySessionTestServer, Http3GoAwayWhenClosingConnection) {
// Create stream by receiving some data (CreateIncomingStream() would not
// update the session's largest peer created stream ID).
- const size_t headers_payload_length = 10;
- std::unique_ptr<char[]> headers_buffer;
- QuicByteCount headers_frame_header_length =
- HttpEncoder::SerializeHeadersFrameHeader(headers_payload_length,
- &headers_buffer);
- absl::string_view headers_frame_header(headers_buffer.get(),
- headers_frame_header_length);
+ const QuicByteCount headers_payload_length = 10;
+ std::string headers_frame_header =
+ HttpEncoder::SerializeHeadersFrameHeader(headers_payload_length);
EXPECT_CALL(debug_visitor,
OnHeadersFrameReceived(stream_id, headers_payload_length));
session_.OnStreamFrame(
@@ -3165,7 +3140,7 @@ TEST_P(QuicSpdySessionTestClient, ReceiveAcceptChFrame) {
QuicSpdySessionPeer::GetReceiveControlStream(&session_)->id());
// First frame has to be SETTINGS.
- std::string serialized_settings = EncodeSettings({});
+ std::string serialized_settings = HttpEncoder::SerializeSettingsFrame({});
QuicStreamFrame data2(receive_control_stream_id, /* fin = */ false, offset,
serialized_settings);
offset += serialized_settings.length();
@@ -3176,10 +3151,9 @@ TEST_P(QuicSpdySessionTestClient, ReceiveAcceptChFrame) {
// Receive ACCEPT_CH frame.
AcceptChFrame accept_ch;
accept_ch.entries.push_back({"foo", "bar"});
- std::unique_ptr<char[]> buffer;
- auto frame_length = HttpEncoder::SerializeAcceptChFrame(accept_ch, &buffer);
+ std::string accept_ch_frame = HttpEncoder::SerializeAcceptChFrame(accept_ch);
QuicStreamFrame data3(receive_control_stream_id, /* fin = */ false, offset,
- absl::string_view(buffer.get(), frame_length));
+ accept_ch_frame);
EXPECT_CALL(debug_visitor, OnAcceptChFrameReceived(accept_ch));
EXPECT_CALL(session_, OnAcceptChFrame(accept_ch));
@@ -3404,7 +3378,8 @@ void QuicSpdySessionTestBase::TestHttpDatagramSetting(
settings.values[SETTINGS_H3_DATAGRAM_DRAFT09] = 1;
break;
}
- std::string data = std::string(1, kControlStream) + EncodeSettings(settings);
+ std::string data = std::string(1, kControlStream) +
+ HttpEncoder::SerializeSettingsFrame(settings);
QuicStreamId stream_id =
GetNthServerInitiatedUnidirectionalStreamId(transport_version(), 3);
QuicStreamFrame frame(stream_id, /*fin=*/false, /*offset=*/0, data);
@@ -3531,8 +3506,8 @@ TEST_P(QuicSpdySessionTestClient, WebTransportSettingSetToZero) {
SettingsFrame server_settings;
server_settings.values[SETTINGS_H3_DATAGRAM_DRAFT04] = 1;
server_settings.values[SETTINGS_WEBTRANS_DRAFT00] = 0;
- std::string data =
- std::string(1, kControlStream) + EncodeSettings(server_settings);
+ std::string data = std::string(1, kControlStream) +
+ HttpEncoder::SerializeSettingsFrame(server_settings);
QuicStreamId stream_id =
GetNthServerInitiatedUnidirectionalStreamId(transport_version(), 3);
QuicStreamFrame frame(stream_id, /*fin=*/false, /*offset=*/0, data);
@@ -3684,7 +3659,8 @@ TEST_P(QuicSpdySessionTestClient, WebTransportWithoutExtendedConnect) {
settings.values[SETTINGS_H3_DATAGRAM_DRAFT04] = 1;
settings.values[SETTINGS_WEBTRANS_DRAFT00] = 1;
// No SETTINGS_ENABLE_CONNECT_PROTOCOL here.
- std::string data = std::string(1, kControlStream) + EncodeSettings(settings);
+ std::string data = std::string(1, kControlStream) +
+ HttpEncoder::SerializeSettingsFrame(settings);
QuicStreamId control_stream_id =
session_.perspective() == Perspective::IS_SERVER
? GetNthClientInitiatedUnidirectionalStreamId(transport_version(), 3)
@@ -3713,7 +3689,7 @@ TEST_P(QuicSpdySessionTestClient, LimitEncoderDynamicTableSize) {
TestStream* stream = session_.CreateOutgoingBidirectionalStream();
EXPECT_CALL(*writer_, IsWriteBlocked()).WillRepeatedly(Return(true));
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "GET"; // entry with index 2 in HPACK static table
stream->WriteHeaders(std::move(headers), /* fin = */ true, nullptr);
@@ -3792,7 +3768,8 @@ TEST_P(QuicSpdySessionTestServerNoExtendedConnect, BadExtendedConnectSetting) {
// ENABLE_CONNECT_PROTOCOL setting value has to be 1 or 0;
SettingsFrame settings;
settings.values[SETTINGS_ENABLE_CONNECT_PROTOCOL] = 2;
- std::string data = std::string(1, kControlStream) + EncodeSettings(settings);
+ std::string data = std::string(1, kControlStream) +
+ HttpEncoder::SerializeSettingsFrame(settings);
QuicStreamId control_stream_id =
session_.perspective() == Perspective::IS_SERVER
? GetNthClientInitiatedUnidirectionalStreamId(transport_version(), 3)
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc
index 10d76afb171..056514c26eb 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.cc
@@ -36,7 +36,7 @@
#include "quiche/common/quiche_text_utils.h"
#include "quiche/spdy/core/spdy_protocol.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
using spdy::SpdyPriority;
namespace quic {
@@ -185,8 +185,6 @@ QuicSpdyStream::QuicSpdyStream(QuicStreamId id, QuicSpdySession* spdy_session,
headers_payload_length_(0),
trailers_decompressed_(false),
trailers_consumed_(false),
- qpack_decoded_headers_accumulator_reset_reason_(
- QpackDecodedHeadersAccumulatorResetReason::kUnSet),
http_decoder_visitor_(std::make_unique<HttpDecoderVisitor>(this)),
decoder_(http_decoder_visitor_.get(),
HttpDecoderOptionsForBidiStream(spdy_session)),
@@ -223,8 +221,6 @@ QuicSpdyStream::QuicSpdyStream(PendingStream* pending,
headers_payload_length_(0),
trailers_decompressed_(false),
trailers_consumed_(false),
- qpack_decoded_headers_accumulator_reset_reason_(
- QpackDecodedHeadersAccumulatorResetReason::kUnSet),
http_decoder_visitor_(std::make_unique<HttpDecoderVisitor>(this)),
decoder_(http_decoder_visitor_.get()),
sequencer_offset_(sequencer()->NumBytesConsumed()),
@@ -250,7 +246,7 @@ QuicSpdyStream::QuicSpdyStream(PendingStream* pending,
QuicSpdyStream::~QuicSpdyStream() {}
size_t QuicSpdyStream::WriteHeaders(
- SpdyHeaderBlock header_block, bool fin,
+ Http2HeaderBlock header_block, bool fin,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener) {
if (!AssertNotWebTransportDataStream("writing headers")) {
@@ -341,7 +337,7 @@ void QuicSpdyStream::WriteOrBufferBody(absl::string_view data, bool fin) {
}
size_t QuicSpdyStream::WriteTrailers(
- SpdyHeaderBlock trailer_block,
+ Http2HeaderBlock trailer_block,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener) {
if (fin_sent()) {
@@ -561,8 +557,6 @@ void QuicSpdyStream::OnHeadersDecoded(QuicHeaderList headers,
bool header_list_size_limit_exceeded) {
header_list_size_limit_exceeded_ = header_list_size_limit_exceeded;
qpack_decoded_headers_accumulator_.reset();
- qpack_decoded_headers_accumulator_reset_reason_ =
- QpackDecodedHeadersAccumulatorResetReason::kResetInOnHeadersDecoded;
QuicSpdySession::LogHeaderCompressionRatioHistogram(
/* using_qpack = */ true,
@@ -592,8 +586,6 @@ void QuicSpdyStream::OnHeadersDecoded(QuicHeaderList headers,
void QuicSpdyStream::OnHeaderDecodingError(QuicErrorCode error_code,
absl::string_view error_message) {
qpack_decoded_headers_accumulator_.reset();
- qpack_decoded_headers_accumulator_reset_reason_ =
- QpackDecodedHeadersAccumulatorResetReason::kResetInOnHeaderDecodingError;
std::string connection_close_error_message = absl::StrCat(
"Error decoding ", headers_decompressed_ ? "trailers" : "headers",
@@ -631,6 +623,12 @@ void QuicSpdyStream::OnInitialHeadersComplete(
bool header_too_large = VersionUsesHttp3(transport_version())
? header_list_size_limit_exceeded_
: header_list.empty();
+ if (!AreHeaderFieldValuesValid(header_list)) {
+ OnInvalidHeaders();
+ QUIC_RELOADABLE_FLAG_COUNT_N(
+ quic_validate_header_field_value_at_spdy_stream, 2, 2);
+ return;
+ }
// Validate request headers if it did not exceed size limit. If it did,
// OnHeadersTooLarge() should have already handled it previously.
if (!header_too_large && !AreHeadersValid(header_list)) {
@@ -734,42 +732,18 @@ void QuicSpdyStream::OnStreamReset(const QuicRstStreamFrame& frame) {
return;
}
- // TODO(bnc): Merge the two blocks below when both
- // quic_abort_qpack_on_stream_reset and quic_fix_on_stream_reset are
- // deprecated.
- if (frame.error_code != QUIC_STREAM_NO_ERROR) {
- if (VersionUsesHttp3(transport_version()) && !fin_received() &&
- spdy_session_->qpack_decoder()) {
- QUIC_CODE_COUNT_N(quic_abort_qpack_on_stream_reset, 1, 2);
- spdy_session_->qpack_decoder()->OnStreamReset(id());
- if (GetQuicReloadableFlag(quic_abort_qpack_on_stream_reset)) {
- QUIC_RELOADABLE_FLAG_COUNT_N(quic_abort_qpack_on_stream_reset, 1, 2);
- qpack_decoded_headers_accumulator_.reset();
- qpack_decoded_headers_accumulator_reset_reason_ =
- QpackDecodedHeadersAccumulatorResetReason::kResetInOnStreamReset1;
- }
- }
+ if (VersionUsesHttp3(transport_version()) && !fin_received() &&
+ spdy_session_->qpack_decoder()) {
+ spdy_session_->qpack_decoder()->OnStreamReset(id());
+ qpack_decoded_headers_accumulator_.reset();
+ }
+ if (VersionUsesHttp3(transport_version()) ||
+ frame.error_code != QUIC_STREAM_NO_ERROR) {
QuicStream::OnStreamReset(frame);
return;
}
- if (VersionUsesHttp3(transport_version())) {
- QUIC_CODE_COUNT(quic_fix_on_stream_reset);
- if (GetQuicReloadableFlag(quic_fix_on_stream_reset)) {
- QUIC_RELOADABLE_FLAG_COUNT(quic_fix_on_stream_reset);
- if (!fin_received() && spdy_session_->qpack_decoder()) {
- spdy_session_->qpack_decoder()->OnStreamReset(id());
- qpack_decoded_headers_accumulator_.reset();
- qpack_decoded_headers_accumulator_reset_reason_ =
- QpackDecodedHeadersAccumulatorResetReason::kResetInOnStreamReset2;
- }
-
- QuicStream::OnStreamReset(frame);
- return;
- }
- }
-
QUIC_DVLOG(1) << ENDPOINT
<< "Received QUIC_STREAM_NO_ERROR, not discarding response";
set_rst_received(true);
@@ -781,14 +755,8 @@ void QuicSpdyStream::OnStreamReset(const QuicRstStreamFrame& frame) {
void QuicSpdyStream::ResetWithError(QuicResetStreamError error) {
if (VersionUsesHttp3(transport_version()) && !fin_received() &&
spdy_session_->qpack_decoder() && web_transport_data_ == nullptr) {
- QUIC_CODE_COUNT_N(quic_abort_qpack_on_stream_reset, 2, 2);
spdy_session_->qpack_decoder()->OnStreamReset(id());
- if (GetQuicReloadableFlag(quic_abort_qpack_on_stream_reset)) {
- QUIC_RELOADABLE_FLAG_COUNT_N(quic_abort_qpack_on_stream_reset, 2, 2);
- qpack_decoded_headers_accumulator_.reset();
- qpack_decoded_headers_accumulator_reset_reason_ =
- QpackDecodedHeadersAccumulatorResetReason::kResetInResetWithError;
- }
+ qpack_decoded_headers_accumulator_.reset();
}
QuicStream::ResetWithError(error);
@@ -890,8 +858,6 @@ void QuicSpdyStream::OnClose() {
QuicStream::OnClose();
qpack_decoded_headers_accumulator_.reset();
- qpack_decoded_headers_accumulator_reset_reason_ =
- QpackDecodedHeadersAccumulatorResetReason::kResetInOnClose;
if (visitor_) {
Visitor* visitor = visitor_;
@@ -934,9 +900,9 @@ bool QuicSpdyStream::FinishedReadingHeaders() const {
}
// static
-bool QuicSpdyStream::ParseHeaderStatusCode(const SpdyHeaderBlock& header,
+bool QuicSpdyStream::ParseHeaderStatusCode(const Http2HeaderBlock& header,
int* status_code) {
- SpdyHeaderBlock::const_iterator it = header.find(spdy::kHttp2StatusHeader);
+ Http2HeaderBlock::const_iterator it = header.find(spdy::kHttp2StatusHeader);
if (it == header.end()) {
return false;
}
@@ -1085,8 +1051,7 @@ bool QuicSpdyStream::OnHeadersFramePayload(absl::string_view payload) {
QUICHE_DCHECK(VersionUsesHttp3(transport_version()));
if (!qpack_decoded_headers_accumulator_) {
- QUIC_BUG(b215142466_OnHeadersFramePayload)
- << static_cast<int>(qpack_decoded_headers_accumulator_reset_reason_);
+ QUIC_BUG(b215142466_OnHeadersFramePayload);
OnHeaderDecodingError(QUIC_INTERNAL_ERROR,
"qpack_decoded_headers_accumulator_ is nullptr");
return false;
@@ -1107,8 +1072,7 @@ bool QuicSpdyStream::OnHeadersFrameEnd() {
QUICHE_DCHECK(VersionUsesHttp3(transport_version()));
if (!qpack_decoded_headers_accumulator_) {
- QUIC_BUG(b215142466_OnHeadersFrameEnd)
- << static_cast<int>(qpack_decoded_headers_accumulator_reset_reason_);
+ QUIC_BUG(b215142466_OnHeadersFrameEnd);
OnHeaderDecodingError(QUIC_INTERNAL_ERROR,
"qpack_decoded_headers_accumulator_ is nullptr");
return false;
@@ -1182,7 +1146,7 @@ bool QuicSpdyStream::OnUnknownFramePayload(absl::string_view payload) {
bool QuicSpdyStream::OnUnknownFrameEnd() { return true; }
size_t QuicSpdyStream::WriteHeadersImpl(
- spdy::SpdyHeaderBlock header_block, bool fin,
+ spdy::Http2HeaderBlock header_block, bool fin,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener) {
if (!VersionUsesHttp3(transport_version())) {
@@ -1202,20 +1166,17 @@ size_t QuicSpdyStream::WriteHeadersImpl(
}
// Write HEADERS frame.
- std::unique_ptr<char[]> headers_frame_header;
- const size_t headers_frame_header_length =
- HttpEncoder::SerializeHeadersFrameHeader(encoded_headers.size(),
- &headers_frame_header);
+ std::string headers_frame_header =
+ HttpEncoder::SerializeHeadersFrameHeader(encoded_headers.size());
unacked_frame_headers_offsets_.Add(
send_buffer().stream_offset(),
- send_buffer().stream_offset() + headers_frame_header_length);
+ send_buffer().stream_offset() + headers_frame_header.length());
QUIC_DLOG(INFO) << ENDPOINT << "Stream " << id()
<< " is writing HEADERS frame header of length "
- << headers_frame_header_length;
- WriteOrBufferData(absl::string_view(headers_frame_header.get(),
- headers_frame_header_length),
- /* fin = */ false, /* ack_listener = */ nullptr);
+ << headers_frame_header.length();
+ WriteOrBufferData(headers_frame_header, /* fin = */ false,
+ /* ack_listener = */ nullptr);
QUIC_DLOG(INFO) << ENDPOINT << "Stream " << id()
<< " is writing HEADERS frame payload of length "
@@ -1290,7 +1251,7 @@ void QuicSpdyStream::MaybeProcessReceivedWebTransportHeaders() {
}
void QuicSpdyStream::MaybeProcessSentWebTransportHeaders(
- spdy::SpdyHeaderBlock& headers) {
+ spdy::Http2HeaderBlock& headers) {
if (!spdy_session_->SupportsWebTransport()) {
return;
}
@@ -1347,10 +1308,9 @@ void QuicSpdyStream::ConvertToWebTransportDataStream(
return;
}
- std::unique_ptr<char[]> header;
- QuicByteCount header_size =
- HttpEncoder::SerializeWebTransportStreamFrameHeader(session_id, &header);
- if (header_size == 0) {
+ std::string header =
+ HttpEncoder::SerializeWebTransportStreamFrameHeader(session_id);
+ if (header.empty()) {
QUIC_BUG(Failed to serialize WEBTRANSPORT_STREAM)
<< "Failed to serialize a WEBTRANSPORT_STREAM frame.";
OnUnrecoverableError(QUIC_INTERNAL_ERROR,
@@ -1358,8 +1318,7 @@ void QuicSpdyStream::ConvertToWebTransportDataStream(
return;
}
- WriteOrBufferData(absl::string_view(header.get(), header_size), /*fin=*/false,
- nullptr);
+ WriteOrBufferData(header, /*fin=*/false, nullptr);
web_transport_data_ =
std::make_unique<WebTransportDataStream>(this, session_id);
QUIC_DVLOG(1) << ENDPOINT << "Successfully opened WebTransport data stream "
@@ -1603,6 +1562,33 @@ bool QuicSpdyStream::AreHeadersValid(const QuicHeaderList& header_list) const {
return true;
}
+bool QuicSpdyStream::AreHeaderFieldValuesValid(
+ const QuicHeaderList& header_list) const {
+ if (!GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) ||
+ !VersionUsesHttp3(transport_version())) {
+ return true;
+ }
+ QUIC_RELOADABLE_FLAG_COUNT_N(quic_validate_header_field_value_at_spdy_stream,
+ 1, 2);
+ // According to https://www.rfc-editor.org/rfc/rfc9114.html#section-10.3
+ // "[...] HTTP/3 can transport field values that are not valid. While most
+ // values that can be encoded will not alter field parsing, carriage return
+ // (ASCII 0x0d), line feed (ASCII 0x0a), and the null character (ASCII 0x00)
+ // might be exploited by an attacker if they are translated verbatim. Any
+ // request or response that contains a character not permitted in a field
+ // value MUST be treated as malformed.
+ // [...]"
+ for (const std::pair<std::string, std::string>& pair : header_list) {
+ const std::string& value = pair.second;
+ for (const auto c : value) {
+ if (c == '\0' || c == '\n' || c == '\r') {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
void QuicSpdyStream::OnInvalidHeaders() { Reset(QUIC_BAD_APPLICATION_PAYLOAD); }
#undef ENDPOINT // undef for jumbo builds
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h
index 61cd7e36f59..62b0eea7fee 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream.h
@@ -36,8 +36,8 @@
#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/common/platform/api/quiche_mem_slice.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_framer.h"
-#include "quiche/spdy/core/spdy_header_block.h"
namespace quic {
@@ -124,7 +124,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyStream
// number of bytes sent, including data sent on the encoder stream when using
// QPACK.
virtual size_t WriteHeaders(
- spdy::SpdyHeaderBlock header_block, bool fin,
+ spdy::Http2HeaderBlock header_block, bool fin,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener);
@@ -136,7 +136,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyStream
// always have the FIN flag set. Returns the number of bytes sent, including
// data sent on the encoder stream when using QPACK.
virtual size_t WriteTrailers(
- spdy::SpdyHeaderBlock trailer_block,
+ spdy::Http2HeaderBlock trailer_block,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener);
@@ -178,7 +178,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyStream
// Returns true if header contains a valid 3-digit status and parse the status
// code to |status_code|.
- static bool ParseHeaderStatusCode(const spdy::SpdyHeaderBlock& header,
+ static bool ParseHeaderStatusCode(const spdy::Http2HeaderBlock& header,
int* status_code);
// Returns true when all data from the peer has been read and consumed,
@@ -198,7 +198,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyStream
bool trailers_decompressed() const { return trailers_decompressed_; }
// Returns whatever trailers have been received for this stream.
- const spdy::SpdyHeaderBlock& received_trailers() const {
+ const spdy::Http2HeaderBlock& received_trailers() const {
return received_trailers_;
}
@@ -301,7 +301,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyStream
virtual void OnTrailingHeadersComplete(bool fin, size_t frame_len,
const QuicHeaderList& header_list);
virtual size_t WriteHeadersImpl(
- spdy::SpdyHeaderBlock header_block, bool fin,
+ spdy::Http2HeaderBlock header_block, bool fin,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener);
@@ -318,6 +318,10 @@ class QUIC_EXPORT_PRIVATE QuicSpdyStream
void OnWriteSideInDataRecvdState() override;
virtual bool AreHeadersValid(const QuicHeaderList& header_list) const;
+ // TODO(b/202433856) Merge AreHeaderFieldValueValid into AreHeadersValid once
+ // all flags guarding the behavior of AreHeadersValid has been rolled out.
+ virtual bool AreHeaderFieldValuesValid(
+ const QuicHeaderList& header_list) const;
// Reset stream upon invalid request headers.
virtual void OnInvalidHeaders();
@@ -336,20 +340,6 @@ class QUIC_EXPORT_PRIVATE QuicSpdyStream
WebTransportStreamAdapter adapter;
};
- // Reason codes for `qpack_decoded_headers_accumulator_` being nullptr.
- enum class QpackDecodedHeadersAccumulatorResetReason {
- // `qpack_decoded_headers_accumulator_` was default constructed to nullptr.
- kUnSet = 0,
- // `qpack_decoded_headers_accumulator_` was reset in the corresponding
- // method.
- kResetInOnHeadersDecoded = 1,
- kResetInOnHeaderDecodingError = 2,
- kResetInOnStreamReset1 = 3,
- kResetInOnStreamReset2 = 4,
- kResetInResetWithError = 5,
- kResetInOnClose = 6,
- };
-
// Called by HttpDecoderVisitor.
bool OnDataFrameStart(QuicByteCount header_length,
QuicByteCount payload_length);
@@ -371,7 +361,7 @@ class QUIC_EXPORT_PRIVATE QuicSpdyStream
QuicByteCount GetNumFrameHeadersInInterval(QuicStreamOffset offset,
QuicByteCount data_length) const;
- void MaybeProcessSentWebTransportHeaders(spdy::SpdyHeaderBlock& headers);
+ void MaybeProcessSentWebTransportHeaders(spdy::Http2HeaderBlock& headers);
void MaybeProcessReceivedWebTransportHeaders();
// Writes HTTP/3 DATA frame header. If |force_write| is true, use
@@ -412,14 +402,11 @@ class QUIC_EXPORT_PRIVATE QuicSpdyStream
bool trailers_consumed_;
// The parsed trailers received from the peer.
- spdy::SpdyHeaderBlock received_trailers_;
+ spdy::Http2HeaderBlock received_trailers_;
// Headers accumulator for decoding HEADERS frame payload.
std::unique_ptr<QpackDecodedHeadersAccumulator>
qpack_decoded_headers_accumulator_;
- // Reason for `qpack_decoded_headers_accumulator_` being nullptr.
- QpackDecodedHeadersAccumulatorResetReason
- qpack_decoded_headers_accumulator_reset_reason_;
// Visitor of the HttpDecoder.
std::unique_ptr<HttpDecoderVisitor> http_decoder_visitor_;
// HttpDecoder for processing raw incoming stream frames.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_test.cc
index c4526ed99ed..6255251a879 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_stream_test.cc
@@ -39,9 +39,9 @@
#include "quiche/common/quiche_mem_slice_storage.h"
#include "quiche/common/simple_buffer_allocator.h"
+using spdy::Http2HeaderBlock;
using spdy::kV3HighestPriority;
using spdy::kV3LowestPriority;
-using spdy::SpdyHeaderBlock;
using spdy::SpdyPriority;
using testing::_;
using testing::AnyNumber;
@@ -243,7 +243,7 @@ class TestStream : public QuicSpdyStream {
MOCK_METHOD(void, WriteHeadersMock, (bool fin), ());
size_t WriteHeadersImpl(
- spdy::SpdyHeaderBlock header_block, bool fin,
+ spdy::Http2HeaderBlock header_block, bool fin,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
/*ack_listener*/) override {
saved_headers_ = std::move(header_block);
@@ -258,7 +258,7 @@ class TestStream : public QuicSpdyStream {
}
const std::string& data() const { return data_; }
- const spdy::SpdyHeaderBlock& saved_headers() const { return saved_headers_; }
+ const spdy::Http2HeaderBlock& saved_headers() const { return saved_headers_; }
// Expose protected accessor.
const QuicStreamSequencer* sequencer() const {
@@ -280,7 +280,7 @@ class TestStream : public QuicSpdyStream {
private:
bool should_process_data_;
- spdy::SpdyHeaderBlock saved_headers_;
+ spdy::Http2HeaderBlock saved_headers_;
std::string data_;
size_t headers_payload_length_;
};
@@ -376,7 +376,7 @@ class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
// Return QPACK-encoded header block without using the dynamic table.
std::string EncodeQpackHeaders(
std::vector<std::pair<absl::string_view, absl::string_view>> headers) {
- SpdyHeaderBlock header_block;
+ Http2HeaderBlock header_block;
for (const auto& header_field : headers) {
header_block.AppendValueOrAddHeader(header_field.first,
header_field.second);
@@ -386,7 +386,7 @@ class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
}
// Return QPACK-encoded header block without using the dynamic table.
- std::string EncodeQpackHeaders(const SpdyHeaderBlock& header) {
+ std::string EncodeQpackHeaders(const Http2HeaderBlock& header) {
NoopQpackStreamSenderDelegate encoder_stream_sender_delegate;
auto qpack_encoder = std::make_unique<QpackEncoder>(session_.get());
qpack_encoder->set_qpack_stream_sender_delegate(
@@ -458,7 +458,7 @@ class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
session_->GetMutableCryptoStream()->OnHandshakeMessage(message);
}
- QuicHeaderList ProcessHeaders(bool fin, const SpdyHeaderBlock& headers) {
+ QuicHeaderList ProcessHeaders(bool fin, const Http2HeaderBlock& headers) {
QuicHeaderList h = AsHeaderList(headers);
stream_->OnStreamHeaderList(fin, h.uncompressed_header_bytes(), h);
return h;
@@ -482,18 +482,14 @@ class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
// Construct HEADERS frame with QPACK-encoded |headers| without using the
// dynamic table.
- std::string HeadersFrame(const SpdyHeaderBlock& headers) {
+ std::string HeadersFrame(const Http2HeaderBlock& headers) {
return HeadersFrame(EncodeQpackHeaders(headers));
}
// Construct HEADERS frame with given payload.
std::string HeadersFrame(absl::string_view payload) {
- std::unique_ptr<char[]> headers_buffer;
- QuicByteCount headers_frame_header_length =
- HttpEncoder::SerializeHeadersFrameHeader(payload.length(),
- &headers_buffer);
- absl::string_view headers_frame_header(headers_buffer.get(),
- headers_frame_header_length);
+ std::string headers_frame_header =
+ HttpEncoder::SerializeHeadersFrameHeader(payload.length());
return absl::StrCat(headers_frame_header, payload);
}
@@ -530,7 +526,7 @@ class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
TestStream* stream_;
TestStream* stream2_;
- SpdyHeaderBlock headers_;
+ Http2HeaderBlock headers_;
};
INSTANTIATE_TEST_SUITE_P(Tests, QuicSpdyStreamTest,
@@ -709,17 +705,14 @@ TEST_P(QuicSpdyStreamTest, ProcessWrongFramesOnSpdyStream) {
connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
GoAwayFrame goaway;
goaway.id = 0x1;
- std::unique_ptr<char[]> buffer;
- QuicByteCount header_length =
- HttpEncoder::SerializeGoAwayFrame(goaway, &buffer);
- std::string data = std::string(buffer.get(), header_length);
+ std::string goaway_frame = HttpEncoder::SerializeGoAwayFrame(goaway);
EXPECT_EQ("", stream_->data());
QuicHeaderList headers = ProcessHeaders(false, headers_);
EXPECT_EQ(headers, stream_->header_list());
stream_->ConsumeHeaderList();
QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
- absl::string_view(data));
+ goaway_frame);
EXPECT_CALL(*connection_,
CloseConnection(QUIC_HTTP_FRAME_UNEXPECTED_ON_SPDY_STREAM, _, _))
@@ -1202,7 +1195,7 @@ TEST_P(QuicSpdyStreamTest, TestHandlingQuicRstStreamNoError) {
stream_->OnStreamReset(QuicRstStreamFrame(
kInvalidControlFrameId, stream_->id(), QUIC_STREAM_NO_ERROR, 0));
- if (GetQuicReloadableFlag(quic_fix_on_stream_reset) && UsesHttp3()) {
+ if (UsesHttp3()) {
// RESET_STREAM should close the read side but not the write side.
EXPECT_TRUE(stream_->read_side_closed());
EXPECT_FALSE(stream_->write_side_closed());
@@ -1281,11 +1274,11 @@ TEST_P(QuicSpdyStreamTest, ReceivingTrailersViaHeaderList) {
stream_->ConsumeHeaderList();
// Receive trailing headers.
- SpdyHeaderBlock trailers_block;
+ Http2HeaderBlock trailers_block;
trailers_block["key1"] = "value1";
trailers_block["key2"] = "value2";
trailers_block["key3"] = "value3";
- SpdyHeaderBlock trailers_block_with_final_offset = trailers_block.Clone();
+ Http2HeaderBlock trailers_block_with_final_offset = trailers_block.Clone();
if (!UsesHttp3()) {
// :final-offset pseudo-header is only added if trailers are sent
// on the headers stream.
@@ -1328,7 +1321,7 @@ TEST_P(QuicSpdyStreamTest, ReceivingTrailersWithOffset) {
std::string data = UsesHttp3() ? DataFrame(body) : body;
// Receive trailing headers.
- SpdyHeaderBlock trailers_block;
+ Http2HeaderBlock trailers_block;
trailers_block["key1"] = "value1";
trailers_block["key2"] = "value2";
trailers_block["key3"] = "value3";
@@ -1371,7 +1364,7 @@ TEST_P(QuicSpdyStreamTest, ReceivingTrailersWithoutOffset) {
stream_->ConsumeHeaderList();
// Receive trailing headers, without kFinalOffsetHeaderKey.
- SpdyHeaderBlock trailers_block;
+ Http2HeaderBlock trailers_block;
trailers_block["key1"] = "value1";
trailers_block["key2"] = "value2";
trailers_block["key3"] = "value3";
@@ -1405,7 +1398,7 @@ TEST_P(QuicSpdyStreamTest, ReceivingTrailersWithoutFin) {
stream_->ConsumeHeaderList();
// Receive trailing headers with FIN deliberately set to false.
- SpdyHeaderBlock trailers_block;
+ Http2HeaderBlock trailers_block;
trailers_block["foo"] = "bar";
auto trailers = AsHeaderList(trailers_block);
@@ -1432,7 +1425,7 @@ TEST_P(QuicSpdyStreamTest, ReceivingTrailersAfterHeadersWithFin) {
stream_->ConsumeHeaderList();
// Receive trailing headers after FIN already received.
- SpdyHeaderBlock trailers_block;
+ Http2HeaderBlock trailers_block;
trailers_block["foo"] = "bar";
EXPECT_CALL(*connection_,
CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, _, _))
@@ -1461,7 +1454,7 @@ TEST_P(QuicSpdyStreamTest, ReceivingTrailersAfterBodyWithFin) {
stream_->OnStreamFrame(frame);
// Receive trailing headers after FIN already received.
- SpdyHeaderBlock trailers_block;
+ Http2HeaderBlock trailers_block;
trailers_block["foo"] = "bar";
EXPECT_CALL(*connection_,
CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, _, _))
@@ -1504,10 +1497,10 @@ TEST_P(QuicSpdyStreamTest, WritingTrailersSendsAFin) {
// Write the initial headers, without a FIN.
EXPECT_CALL(*stream_, WriteHeadersMock(false));
- stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr);
+ stream_->WriteHeaders(Http2HeaderBlock(), /*fin=*/false, nullptr);
// Writing trailers implicitly sends a FIN.
- SpdyHeaderBlock trailers;
+ Http2HeaderBlock trailers;
trailers["trailer key"] = "trailer value";
EXPECT_CALL(*stream_, WriteHeadersMock(true));
stream_->WriteTrailers(std::move(trailers), nullptr);
@@ -1537,10 +1530,10 @@ TEST_P(QuicSpdyStreamTest, DoNotSendPriorityUpdateWithDefaultUrgency) {
// Write the initial headers, without a FIN.
EXPECT_CALL(*stream_, WriteHeadersMock(false));
EXPECT_CALL(debug_visitor, OnHeadersFrameSent(stream_->id(), _));
- stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr);
+ stream_->WriteHeaders(Http2HeaderBlock(), /*fin=*/false, nullptr);
// Writing trailers implicitly sends a FIN.
- SpdyHeaderBlock trailers;
+ Http2HeaderBlock trailers;
trailers["trailer key"] = "trailer value";
EXPECT_CALL(*stream_, WriteHeadersMock(true));
EXPECT_CALL(debug_visitor, OnHeadersFrameSent(stream_->id(), _));
@@ -1561,7 +1554,7 @@ TEST_P(QuicSpdyStreamTest, ChangePriority) {
EXPECT_CALL(*session_, WritevData(stream_->id(), _, _, _, _, _)).Times(2);
EXPECT_CALL(*stream_, WriteHeadersMock(false));
EXPECT_CALL(debug_visitor, OnHeadersFrameSent(stream_->id(), _));
- stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr);
+ stream_->WriteHeaders(Http2HeaderBlock(), /*fin=*/false, nullptr);
// PRIORITY_UPDATE frame on the control stream.
auto send_control_stream =
@@ -1594,7 +1587,7 @@ TEST_P(QuicSpdyStreamTest, ChangePriorityBeforeWritingHeaders) {
// PRIORITY_UPDATE frame is not sent this time, because one is already sent.
EXPECT_CALL(*session_, WritevData(stream_->id(), _, _, _, _, _)).Times(2);
EXPECT_CALL(*stream_, WriteHeadersMock(true));
- stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/true, nullptr);
+ stream_->WriteHeaders(Http2HeaderBlock(), /*fin=*/true, nullptr);
}
// Test that when writing trailers, the trailers that are actually sent to the
@@ -1610,7 +1603,7 @@ TEST_P(QuicSpdyStreamTest, WritingTrailersFinalOffset) {
// Write the initial headers.
EXPECT_CALL(*stream_, WriteHeadersMock(false));
- stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr);
+ stream_->WriteHeaders(Http2HeaderBlock(), /*fin=*/false, nullptr);
// Write non-zero body data to force a non-zero final offset.
EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).Times(AtLeast(1));
@@ -1626,10 +1619,10 @@ TEST_P(QuicSpdyStreamTest, WritingTrailersFinalOffset) {
// The final offset field in the trailing headers is populated with the
// number of body bytes written (including queued bytes).
- SpdyHeaderBlock trailers;
+ Http2HeaderBlock trailers;
trailers["trailer key"] = "trailer value";
- SpdyHeaderBlock expected_trailers(trailers.Clone());
+ Http2HeaderBlock expected_trailers(trailers.Clone());
// :final-offset pseudo-header is only added if trailers are sent
// on the headers stream.
if (!UsesHttp3()) {
@@ -1654,7 +1647,7 @@ TEST_P(QuicSpdyStreamTest, WritingTrailersClosesWriteSide) {
// Write the initial headers.
EXPECT_CALL(*stream_, WriteHeadersMock(false));
- stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr);
+ stream_->WriteHeaders(Http2HeaderBlock(), /*fin=*/false, nullptr);
// Write non-zero body data.
const int kBodySize = 1 * 1024; // 1 kB
@@ -1664,7 +1657,7 @@ TEST_P(QuicSpdyStreamTest, WritingTrailersClosesWriteSide) {
// Headers and body have been fully written, there is no queued data. Writing
// trailers marks the end of this stream, and thus the write side is closed.
EXPECT_CALL(*stream_, WriteHeadersMock(true));
- stream_->WriteTrailers(SpdyHeaderBlock(), nullptr);
+ stream_->WriteTrailers(Http2HeaderBlock(), nullptr);
EXPECT_TRUE(stream_->write_side_closed());
}
@@ -1683,7 +1676,7 @@ TEST_P(QuicSpdyStreamTest, WritingTrailersWithQueuedBytes) {
// Write the initial headers.
EXPECT_CALL(*stream_, WriteHeadersMock(false));
- stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr);
+ stream_->WriteHeaders(Http2HeaderBlock(), /*fin=*/false, nullptr);
// Write non-zero body data, but only consume partially, ensuring queueing.
const int kBodySize = 1 * 1024; // 1 kB
@@ -1698,7 +1691,7 @@ TEST_P(QuicSpdyStreamTest, WritingTrailersWithQueuedBytes) {
// Writing trailers will send a FIN, but not close the write side of the
// stream as there are queued bytes.
EXPECT_CALL(*stream_, WriteHeadersMock(true));
- stream_->WriteTrailers(SpdyHeaderBlock(), nullptr);
+ stream_->WriteTrailers(Http2HeaderBlock(), nullptr);
EXPECT_TRUE(stream_->fin_sent());
EXPECT_FALSE(stream_->write_side_closed());
@@ -1720,12 +1713,12 @@ TEST_P(QuicSpdyStreamTest, WritingTrailersAfterFIN) {
// Write the initial headers, with a FIN.
EXPECT_CALL(*stream_, WriteHeadersMock(true));
- stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/true, nullptr);
+ stream_->WriteHeaders(Http2HeaderBlock(), /*fin=*/true, nullptr);
EXPECT_TRUE(stream_->fin_sent());
// Writing Trailers should fail, as the FIN has already been sent.
// populated with the number of body bytes written.
- EXPECT_QUIC_BUG(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr),
+ EXPECT_QUIC_BUG(stream_->WriteTrailers(Http2HeaderBlock(), nullptr),
"Trailers cannot be sent after a FIN");
}
@@ -2097,7 +2090,7 @@ TEST_P(QuicSpdyStreamTest, ProcessBodyAfterTrailers) {
// A header block that will take more than one block of sequencer buffer.
// This ensures that when the trailers are consumed, some buffer buckets will
// be freed.
- SpdyHeaderBlock trailers_block;
+ Http2HeaderBlock trailers_block;
trailers_block["key1"] = std::string(10000, 'x');
std::string trailers = HeadersFrame(trailers_block);
@@ -2564,27 +2557,13 @@ TEST_P(QuicSpdyStreamTest, HeaderDecodingUnblockedAfterResetReceived) {
/* offset = */ 1, _, _, _));
// OnStreamReset() is called when RESET_STREAM frame is received from peer.
+ // This aborts header decompression.
stream_->OnStreamReset(QuicRstStreamFrame(
kInvalidControlFrameId, stream_->id(), QUIC_STREAM_CANCELLED, 0));
- if (!GetQuicReloadableFlag(quic_abort_qpack_on_stream_reset)) {
- // Header acknowledgement.
- EXPECT_CALL(*session_,
- WritevData(decoder_send_stream->id(), /* write_length = */ 1,
- /* offset = */ 2, _, _, _));
- EXPECT_CALL(debug_visitor, OnHeadersDecoded(stream_->id(), _));
- }
-
// Deliver dynamic table entry to decoder.
session_->qpack_decoder()->OnInsertWithoutNameReference("foo", "bar");
-
- if (GetQuicReloadableFlag(quic_abort_qpack_on_stream_reset)) {
- EXPECT_FALSE(stream_->headers_decompressed());
- } else {
- // Verify headers.
- EXPECT_TRUE(stream_->headers_decompressed());
- EXPECT_THAT(stream_->header_list(), ElementsAre(Pair("foo", "bar")));
- }
+ EXPECT_FALSE(stream_->headers_decompressed());
}
class QuicSpdyStreamIncrementalConsumptionTest : public QuicSpdyStreamTest {
@@ -2858,7 +2837,7 @@ TEST_P(QuicSpdyStreamTest, TrailersAfterTrailers) {
.WillOnce(InvokeWithoutArgs([this]() { stream_->StopReading(); }));
// Receive another HEADERS frame, with no header fields.
- std::string trailers2 = HeadersFrame(SpdyHeaderBlock());
+ std::string trailers2 = HeadersFrame(Http2HeaderBlock());
stream_->OnStreamFrame(
QuicStreamFrame(stream_->id(), false, offset, trailers2));
}
@@ -3031,7 +3010,7 @@ TEST_P(QuicSpdyStreamTest, WriteHeadersReturnValue) {
DoAll(SaveArg<1>(&headers_frame_payload_length),
Invoke(session_.get(), &MockQuicSpdySession::ConsumeData)));
- SpdyHeaderBlock request_headers;
+ Http2HeaderBlock request_headers;
request_headers["foo"] = "bar";
size_t write_headers_return_value =
stream_->WriteHeaders(std::move(request_headers), /*fin=*/true, nullptr);
@@ -3060,20 +3039,9 @@ TEST_P(QuicSpdyStreamTest, TwoResetStreamFrames) {
QuicRstStreamFrame rst_frame2(kInvalidControlFrameId, stream_->id(),
QUIC_STREAM_NO_ERROR, /* bytes_written = */ 0);
- if (GetQuicReloadableFlag(quic_fix_on_stream_reset)) {
- stream_->OnStreamReset(rst_frame2);
- EXPECT_TRUE(stream_->read_side_closed());
- EXPECT_FALSE(stream_->write_side_closed());
- } else {
- EXPECT_CALL(
- *session_,
- MaybeSendRstStreamFrame(
- stream_->id(),
- QuicResetStreamError::FromInternal(QUIC_RST_ACKNOWLEDGEMENT), _));
- EXPECT_QUIC_BUG(
- stream_->OnStreamReset(rst_frame2),
- "The stream should've already sent RST in response to STOP_SENDING");
- }
+ stream_->OnStreamReset(rst_frame2);
+ EXPECT_TRUE(stream_->read_side_closed());
+ EXPECT_FALSE(stream_->write_side_closed());
}
TEST_P(QuicSpdyStreamTest, ProcessOutgoingWebTransportHeadersDatagramDraft04) {
@@ -3093,7 +3061,7 @@ TEST_P(QuicSpdyStreamTest, ProcessOutgoingWebTransportHeadersDatagramDraft04) {
EXPECT_CALL(*session_, WritevData(stream_->id(), _, _, _, _, _))
.Times(AnyNumber());
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
headers[":method"] = "CONNECT";
headers[":protocol"] = "webtransport";
stream_->WriteHeaders(std::move(headers), /*fin=*/false, nullptr);
@@ -3209,15 +3177,14 @@ TEST_P(QuicSpdyStreamTest,
// Resets `qpack_decoded_headers_accumulator_`.
stream_->OnHeadersDecoded({}, false);
- // This private method should never be called when
- // `qpack_decoded_headers_accumulator_` is nullptr. The number 1 identifies
- // the site where `qpack_decoded_headers_accumulator_` was last reset.
EXPECT_QUIC_BUG(
{
EXPECT_CALL(*connection_, CloseConnection(_, _, _));
+ // This private method should never be called when
+ // `qpack_decoded_headers_accumulator_` is nullptr.
EXPECT_FALSE(QuicSpdyStreamPeer::OnHeadersFrameEnd(stream_));
},
- "b215142466_OnHeadersFrameEnd.?: 1");
+ "b215142466_OnHeadersFrameEnd");
}
} // namespace
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.cc
index 103f6dd0b85..22dc13fa9f8 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.cc
@@ -7,13 +7,13 @@
#include "absl/strings/string_view.h"
#include "url/gurl.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
namespace quic {
// static
std::string SpdyServerPushUtils::GetPromisedUrlFromHeaders(
- const SpdyHeaderBlock& headers) {
+ const Http2HeaderBlock& headers) {
// RFC 7540, Section 8.1.2.3: All HTTP/2 requests MUST include exactly
// one valid value for the ":method", ":scheme", and ":path" pseudo-header
// fields, unless it is a CONNECT request.
@@ -31,7 +31,7 @@ std::string SpdyServerPushUtils::GetPromisedUrlFromHeaders(
// POST as cacheable, ...
//
// So the only methods allowed in a PUSH_PROMISE are GET and HEAD.
- SpdyHeaderBlock::const_iterator it = headers.find(":method");
+ Http2HeaderBlock::const_iterator it = headers.find(":method");
if (it == headers.end() || (it->second != "GET" && it->second != "HEAD")) {
return std::string();
}
@@ -67,14 +67,14 @@ std::string SpdyServerPushUtils::GetPromisedUrlFromHeaders(
// static
std::string SpdyServerPushUtils::GetPromisedHostNameFromHeaders(
- const SpdyHeaderBlock& headers) {
+ const Http2HeaderBlock& headers) {
// TODO(fayang): Consider just checking out the value of the ":authority" key
// in headers.
return GURL(GetPromisedUrlFromHeaders(headers)).host();
}
// static
-bool SpdyServerPushUtils::PromisedUrlIsValid(const SpdyHeaderBlock& headers) {
+bool SpdyServerPushUtils::PromisedUrlIsValid(const Http2HeaderBlock& headers) {
std::string url(GetPromisedUrlFromHeaders(headers));
return !url.empty() && GURL(url).is_valid();
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.h
index c79f52c389d..a924158bf34 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils.h
@@ -7,7 +7,7 @@
#include "absl/strings/string_view.h"
#include "quiche/quic/platform/api/quic_export.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -20,15 +20,15 @@ class QUIC_EXPORT_PRIVATE SpdyServerPushUtils {
// conform to HTTP/2 spec or if the ":method" header contains a forbidden
// method for PUSH_PROMISE.
static std::string GetPromisedUrlFromHeaders(
- const spdy::SpdyHeaderBlock& headers);
+ const spdy::Http2HeaderBlock& headers);
// Returns hostname, or empty string if missing.
static std::string GetPromisedHostNameFromHeaders(
- const spdy::SpdyHeaderBlock& headers);
+ const spdy::Http2HeaderBlock& headers);
// Returns true if result of |GetPromisedUrlFromHeaders()| is non-empty
// and is a well-formed URL.
- static bool PromisedUrlIsValid(const spdy::SpdyHeaderBlock& headers);
+ static bool PromisedUrlIsValid(const spdy::Http2HeaderBlock& headers);
// Returns a canonical, valid URL for a PUSH_PROMISE with the specified
// ":scheme", ":authority", and ":path" header fields, or an empty
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils_test.cc
index d9aff41c413..b11bcbe57fe 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_server_push_utils_test.cc
@@ -10,7 +10,7 @@
#include "absl/base/macros.h"
#include "quiche/quic/platform/api/quic_test.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
namespace quic {
namespace test {
@@ -18,7 +18,7 @@ namespace test {
using GetPromisedUrlFromHeaders = QuicTest;
TEST_F(GetPromisedUrlFromHeaders, Basic) {
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "GET";
EXPECT_EQ(SpdyServerPushUtils::GetPromisedUrlFromHeaders(headers), "");
headers[":scheme"] = "https";
@@ -35,7 +35,7 @@ TEST_F(GetPromisedUrlFromHeaders, Basic) {
}
TEST_F(GetPromisedUrlFromHeaders, Connect) {
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "CONNECT";
EXPECT_EQ(SpdyServerPushUtils::GetPromisedUrlFromHeaders(headers), "");
headers[":authority"] = "www.google.com";
@@ -47,7 +47,7 @@ TEST_F(GetPromisedUrlFromHeaders, Connect) {
}
TEST_F(GetPromisedUrlFromHeaders, InvalidUserinfo) {
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "GET";
headers[":authority"] = "user@www.google.com";
headers[":scheme"] = "https";
@@ -56,7 +56,7 @@ TEST_F(GetPromisedUrlFromHeaders, InvalidUserinfo) {
}
TEST_F(GetPromisedUrlFromHeaders, InvalidPath) {
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "GET";
headers[":authority"] = "www.google.com";
headers[":scheme"] = "https";
@@ -67,7 +67,7 @@ TEST_F(GetPromisedUrlFromHeaders, InvalidPath) {
using GetPromisedHostNameFromHeaders = QuicTest;
TEST_F(GetPromisedHostNameFromHeaders, NormalUsage) {
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":method"] = "GET";
EXPECT_EQ(SpdyServerPushUtils::GetPromisedHostNameFromHeaders(headers), "");
headers[":scheme"] = "https";
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.cc
index b8282e43127..873d39c9ff6 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.cc
@@ -20,13 +20,13 @@
#include "quiche/common/quiche_text_utils.h"
#include "quiche/spdy/core/spdy_protocol.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
namespace quic {
// static
bool SpdyUtils::ExtractContentLengthFromHeaders(int64_t* content_length,
- SpdyHeaderBlock* headers) {
+ Http2HeaderBlock* headers) {
auto it = headers->find("content-length");
if (it == headers->end()) {
return false;
@@ -61,7 +61,7 @@ bool SpdyUtils::ExtractContentLengthFromHeaders(int64_t* content_length,
bool SpdyUtils::CopyAndValidateHeaders(const QuicHeaderList& header_list,
int64_t* content_length,
- SpdyHeaderBlock* headers) {
+ Http2HeaderBlock* headers) {
for (const auto& p : header_list) {
const std::string& name = p.first;
if (name.empty()) {
@@ -90,7 +90,7 @@ bool SpdyUtils::CopyAndValidateHeaders(const QuicHeaderList& header_list,
bool SpdyUtils::CopyAndValidateTrailers(const QuicHeaderList& header_list,
bool expect_final_byte_offset,
size_t* final_byte_offset,
- SpdyHeaderBlock* trailers) {
+ Http2HeaderBlock* trailers) {
bool found_final_byte_offset = false;
for (const auto& p : header_list) {
const std::string& name = p.first;
@@ -135,7 +135,7 @@ bool SpdyUtils::CopyAndValidateTrailers(const QuicHeaderList& header_list,
// static
// TODO(danzh): Move it to quic/tools/ and switch to use GURL.
bool SpdyUtils::PopulateHeaderBlockFromUrl(const std::string url,
- SpdyHeaderBlock* headers) {
+ Http2HeaderBlock* headers) {
(*headers)[":method"] = "GET";
size_t pos = url.find("://");
if (pos == std::string::npos) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.h
index d88087c5436..05a237d3ec3 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.h
@@ -14,8 +14,8 @@
#include "quiche/quic/core/http/quic_header_list.h"
#include "quiche/quic/core/quic_packets.h"
#include "quiche/quic/platform/api/quic_export.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_alt_svc_wire_format.h"
-#include "quiche/spdy/core/spdy_header_block.h"
namespace quic {
@@ -27,14 +27,14 @@ class QUIC_EXPORT_PRIVATE SpdyUtils {
// Returns true on success, false if parsing fails or content-length header is
// missing.
static bool ExtractContentLengthFromHeaders(int64_t* content_length,
- spdy::SpdyHeaderBlock* headers);
+ spdy::Http2HeaderBlock* headers);
- // Copies a list of headers to a SpdyHeaderBlock.
+ // Copies a list of headers to a Http2HeaderBlock.
static bool CopyAndValidateHeaders(const QuicHeaderList& header_list,
int64_t* content_length,
- spdy::SpdyHeaderBlock* headers);
+ spdy::Http2HeaderBlock* headers);
- // Copies a list of headers to a SpdyHeaderBlock.
+ // Copies a list of headers to a Http2HeaderBlock.
// If |expect_final_byte_offset| is true, requires exactly one header field
// with key kFinalOffsetHeaderKey and an integer value.
// If |expect_final_byte_offset| is false, no kFinalOffsetHeaderKey may be
@@ -47,12 +47,12 @@ class QUIC_EXPORT_PRIVATE SpdyUtils {
static bool CopyAndValidateTrailers(const QuicHeaderList& header_list,
bool expect_final_byte_offset,
size_t* final_byte_offset,
- spdy::SpdyHeaderBlock* trailers);
+ spdy::Http2HeaderBlock* trailers);
// Populates the fields of |headers| to make a GET request of |url|,
// which must be fully-qualified.
static bool PopulateHeaderBlockFromUrl(const std::string url,
- spdy::SpdyHeaderBlock* headers);
+ spdy::Http2HeaderBlock* headers);
// Returns the advertised QUIC version from the specified alternative service
// advertisement, or ParsedQuicVersion::Unsupported() if no supported version
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils_test.cc
index 718d54854d9..43177ba05f6 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/spdy_utils_test.cc
@@ -12,7 +12,7 @@
#include "quiche/quic/core/quic_versions.h"
#include "quiche/quic/platform/api/quic_test.h"
-using spdy::SpdyHeaderBlock;
+using spdy::Http2HeaderBlock;
using testing::Pair;
using testing::UnorderedElementsAre;
@@ -64,7 +64,7 @@ TEST_F(CopyAndValidateHeaders, NormalUsage) {
{"cookie", " fin!"}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_TRUE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
EXPECT_THAT(block,
@@ -80,7 +80,7 @@ TEST_F(CopyAndValidateHeaders, NormalUsage) {
TEST_F(CopyAndValidateHeaders, EmptyName) {
auto headers = FromList({{"foo", "foovalue"}, {"", "barvalue"}, {"baz", ""}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_FALSE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
}
@@ -89,7 +89,7 @@ TEST_F(CopyAndValidateHeaders, UpperCaseName) {
auto headers =
FromList({{"foo", "foovalue"}, {"bar", "barvalue"}, {"bAz", ""}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_FALSE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
}
@@ -101,7 +101,7 @@ TEST_F(CopyAndValidateHeaders, MultipleContentLengths) {
{"bar", "barvalue"},
{"baz", ""}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_TRUE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
EXPECT_THAT(block, UnorderedElementsAre(
@@ -118,7 +118,7 @@ TEST_F(CopyAndValidateHeaders, InconsistentContentLengths) {
{"bar", "barvalue"},
{"baz", ""}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_FALSE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
}
@@ -129,7 +129,7 @@ TEST_F(CopyAndValidateHeaders, LargeContentLength) {
{"bar", "barvalue"},
{"baz", ""}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_TRUE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
EXPECT_THAT(block,
@@ -149,7 +149,7 @@ TEST_F(CopyAndValidateHeaders, NonDigitContentLength) {
{"bar", "barvalue"},
{"baz", ""}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_FALSE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
}
@@ -161,7 +161,7 @@ TEST_F(CopyAndValidateHeaders, MultipleValues) {
{"foo", "boo"},
{"baz", "buzz"}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_TRUE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
EXPECT_THAT(block, UnorderedElementsAre(
@@ -176,7 +176,7 @@ TEST_F(CopyAndValidateHeaders, MoreThanTwoValues) {
{"set-cookie", "value2"},
{"set-cookie", "value3"}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_TRUE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
EXPECT_THAT(block, UnorderedElementsAre(Pair(
@@ -191,7 +191,7 @@ TEST_F(CopyAndValidateHeaders, Cookie) {
{"cookie", "value1"},
{"baz", ""}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_TRUE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
EXPECT_THAT(block, UnorderedElementsAre(
@@ -207,7 +207,7 @@ TEST_F(CopyAndValidateHeaders, MultipleCookies) {
{"baz", ""},
{"cookie", "value2"}});
int64_t content_length = -1;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
ASSERT_TRUE(
SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
EXPECT_THAT(block, UnorderedElementsAre(
@@ -223,7 +223,7 @@ TEST_F(CopyAndValidateTrailers, SimplestValidList) {
// gets parsed successfully.
auto trailers = FromList({{kFinalOffsetHeaderKey, "1234"}});
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(
*trailers, kExpectFinalByteOffset, &final_byte_offset, &block));
EXPECT_EQ(1234u, final_byte_offset);
@@ -234,7 +234,7 @@ TEST_F(CopyAndValidateTrailers, EmptyTrailerListWithFinalByteOffsetExpected) {
// not present.
QuicHeaderList trailers;
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(
trailers, kExpectFinalByteOffset, &final_byte_offset, &block));
}
@@ -245,7 +245,7 @@ TEST_F(CopyAndValidateTrailers,
// not expected.
QuicHeaderList trailers;
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(
trailers, kDoNotExpectFinalByteOffset, &final_byte_offset, &block));
EXPECT_TRUE(block.empty());
@@ -256,7 +256,7 @@ TEST_F(CopyAndValidateTrailers, FinalByteOffsetExpectedButNotPresent) {
// the rest of the header block is valid.
auto trailers = FromList({{"key", "value"}});
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(
*trailers, kExpectFinalByteOffset, &final_byte_offset, &block));
}
@@ -266,7 +266,7 @@ TEST_F(CopyAndValidateTrailers, FinalByteOffsetNotExpectedButPresent) {
// even if the rest of the header block is valid.
auto trailers = FromList({{"key", "value"}, {kFinalOffsetHeaderKey, "1234"}});
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(
*trailers, kDoNotExpectFinalByteOffset, &final_byte_offset, &block));
}
@@ -276,7 +276,7 @@ TEST_F(CopyAndValidateTrailers, FinalByteOffsetNotExpectedAndNotPresent) {
// present.
auto trailers = FromList({{"key", "value"}});
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(
*trailers, kDoNotExpectFinalByteOffset, &final_byte_offset, &block));
EXPECT_THAT(block, UnorderedElementsAre(Pair("key", "value")));
@@ -287,7 +287,7 @@ TEST_F(CopyAndValidateTrailers, EmptyName) {
// valid block of trailers.
auto trailers = FromList({{"", "value"}, {kFinalOffsetHeaderKey, "1234"}});
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(
*trailers, kExpectFinalByteOffset, &final_byte_offset, &block));
}
@@ -297,7 +297,7 @@ TEST_F(CopyAndValidateTrailers, PseudoHeaderInTrailers) {
auto trailers =
FromList({{":pseudo_key", "value"}, {kFinalOffsetHeaderKey, "1234"}});
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(
*trailers, kExpectFinalByteOffset, &final_byte_offset, &block));
}
@@ -316,7 +316,7 @@ TEST_F(CopyAndValidateTrailers, DuplicateTrailers) {
{"other_key", "value"},
{"key", "non_contiguous_duplicate"}});
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(
*trailers, kExpectFinalByteOffset, &final_byte_offset, &block));
EXPECT_THAT(
@@ -340,7 +340,7 @@ TEST_F(CopyAndValidateTrailers, DuplicateCookies) {
{"cookie", " non_contiguous_cookie!"}});
size_t final_byte_offset = 0;
- SpdyHeaderBlock block;
+ Http2HeaderBlock block;
EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(
*headers, kExpectFinalByteOffset, &final_byte_offset, &block));
EXPECT_THAT(
@@ -354,7 +354,7 @@ using PopulateHeaderBlockFromUrl = QuicTest;
TEST_F(PopulateHeaderBlockFromUrl, NormalUsage) {
std::string url = "https://www.google.com/index.html";
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers));
EXPECT_EQ("https", headers[":scheme"].as_string());
EXPECT_EQ("www.google.com", headers[":authority"].as_string());
@@ -363,7 +363,7 @@ TEST_F(PopulateHeaderBlockFromUrl, NormalUsage) {
TEST_F(PopulateHeaderBlockFromUrl, UrlWithNoPath) {
std::string url = "https://www.google.com";
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers));
EXPECT_EQ("https", headers[":scheme"].as_string());
EXPECT_EQ("www.google.com", headers[":authority"].as_string());
@@ -371,7 +371,7 @@ TEST_F(PopulateHeaderBlockFromUrl, UrlWithNoPath) {
}
TEST_F(PopulateHeaderBlockFromUrl, Failure) {
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/", &headers));
EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/index.html", &headers));
EXPECT_FALSE(
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc
index a9babe80447..888331e8e26 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.cc
@@ -29,7 +29,7 @@ namespace quic {
namespace {
class QUIC_NO_EXPORT NoopWebTransportVisitor : public WebTransportVisitor {
- void OnSessionReady(const spdy::SpdyHeaderBlock&) override {}
+ void OnSessionReady(const spdy::Http2HeaderBlock&) override {}
void OnSessionClosed(WebTransportSessionError /*error_code*/,
const std::string& /*error_message*/) override {}
void OnIncomingBidirectionalStreamAvailable() override {}
@@ -159,7 +159,7 @@ void WebTransportHttp3::CloseSessionWithFinOnlyForTests() {
connect_stream_->WriteOrBufferBody("", /*fin=*/true);
}
-void WebTransportHttp3::HeadersReceived(const spdy::SpdyHeaderBlock& headers) {
+void WebTransportHttp3::HeadersReceived(const spdy::Http2HeaderBlock& headers) {
if (session_->perspective() == Perspective::IS_CLIENT) {
int status_code;
if (!QuicSpdyStream::ParseHeaderStatusCode(headers, &status_code)) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.h b/chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.h
index 3924a7d41f6..67c2fc81919 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/http/web_transport_http3.h
@@ -17,7 +17,7 @@
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/web_transport_interface.h"
#include "quiche/common/platform/api/quiche_mem_slice.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -44,7 +44,7 @@ class QUIC_EXPORT_PRIVATE WebTransportHttp3
WebTransportHttp3(QuicSpdySession* session, QuicSpdyStream* connect_stream,
WebTransportSessionId id);
- void HeadersReceived(const spdy::SpdyHeaderBlock& headers);
+ void HeadersReceived(const spdy::Http2HeaderBlock& headers);
void SetVisitor(std::unique_ptr<WebTransportVisitor> visitor) {
visitor_ = std::move(visitor);
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_socket_factory.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_socket_factory.cc
new file mode 100644
index 00000000000..4d2508e4f4f
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_socket_factory.cc
@@ -0,0 +1,36 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/core/io/event_loop_socket_factory.h"
+
+#include <memory>
+
+#include "quiche/quic/core/io/event_loop_tcp_client_socket.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/io/stream_client_socket.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/quiche_buffer_allocator.h"
+
+namespace quic {
+
+EventLoopSocketFactory::EventLoopSocketFactory(
+ QuicEventLoop* event_loop, quiche::QuicheBufferAllocator* buffer_allocator)
+ : event_loop_(event_loop), buffer_allocator_(buffer_allocator) {
+ QUICHE_DCHECK(event_loop_);
+ QUICHE_DCHECK(buffer_allocator_);
+}
+
+std::unique_ptr<StreamClientSocket>
+EventLoopSocketFactory::CreateTcpClientSocket(
+ const quic::QuicSocketAddress& peer_address,
+ QuicByteCount receive_buffer_size, QuicByteCount send_buffer_size,
+ StreamClientSocket::AsyncVisitor* async_visitor) {
+ return std::make_unique<EventLoopTcpClientSocket>(
+ peer_address, receive_buffer_size, send_buffer_size, event_loop_,
+ buffer_allocator_, async_visitor);
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_socket_factory.h b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_socket_factory.h
new file mode 100644
index 00000000000..6882e808797
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_socket_factory.h
@@ -0,0 +1,41 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_IO_EVENT_LOOP_SOCKET_FACTORY_H_
+#define QUICHE_QUIC_CORE_IO_EVENT_LOOP_SOCKET_FACTORY_H_
+
+#include <memory>
+
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/io/socket_factory.h"
+#include "quiche/quic/core/io/stream_client_socket.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/quiche_buffer_allocator.h"
+
+namespace quic {
+
+// A socket factory that creates sockets implemented using an underlying
+// QuicEventLoop.
+class QUICHE_EXPORT_PRIVATE EventLoopSocketFactory : public SocketFactory {
+ public:
+ // `event_loop` and `buffer_allocator` must outlive the created factory.
+ EventLoopSocketFactory(QuicEventLoop* event_loop,
+ quiche::QuicheBufferAllocator* buffer_allocator);
+
+ // SocketFactory:
+ std::unique_ptr<StreamClientSocket> CreateTcpClientSocket(
+ const quic::QuicSocketAddress& peer_address,
+ QuicByteCount receive_buffer_size, QuicByteCount send_buffer_size,
+ StreamClientSocket::AsyncVisitor* async_visitor) override;
+
+ private:
+ QuicEventLoop* const event_loop_; // unowned
+ quiche::QuicheBufferAllocator* buffer_allocator_; // unowned
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_IO_EVENT_LOOP_SOCKET_FACTORY_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket.cc
new file mode 100644
index 00000000000..84263bc9a82
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket.cc
@@ -0,0 +1,610 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/core/io/event_loop_tcp_client_socket.h"
+
+#include <limits>
+#include <string>
+#include <utility>
+
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/span.h"
+#include "absl/types/variant.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/io/socket.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/platform/api/quiche_mem_slice.h"
+
+namespace quic {
+
+EventLoopTcpClientSocket::EventLoopTcpClientSocket(
+ const quic::QuicSocketAddress& peer_address,
+ QuicByteCount receive_buffer_size, QuicByteCount send_buffer_size,
+ QuicEventLoop* event_loop, quiche::QuicheBufferAllocator* buffer_allocator,
+ AsyncVisitor* async_visitor)
+ : peer_address_(peer_address),
+ receive_buffer_size_(receive_buffer_size),
+ send_buffer_size_(send_buffer_size),
+ event_loop_(event_loop),
+ buffer_allocator_(buffer_allocator),
+ async_visitor_(async_visitor) {
+ QUICHE_DCHECK(event_loop_);
+ QUICHE_DCHECK(buffer_allocator_);
+}
+
+EventLoopTcpClientSocket::~EventLoopTcpClientSocket() {
+ // Connected socket must be closed via Disconnect() before destruction. Cannot
+ // safely recover if state indicates caller may be expecting async callbacks.
+ QUICHE_DCHECK(connect_status_ != ConnectStatus::kConnecting);
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+ if (descriptor_ != kInvalidSocketFd) {
+ QUICHE_BUG(quic_event_loop_tcp_socket_invalid_destruction)
+ << "Must call Disconnect() on connected TCP socket before destruction.";
+ Close();
+ }
+
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kNotConnected);
+ QUICHE_DCHECK(send_remaining_.empty());
+}
+
+absl::Status EventLoopTcpClientSocket::ConnectBlocking() {
+ QUICHE_DCHECK_EQ(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kNotConnected);
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+
+ absl::Status status = Open();
+ if (!status.ok()) {
+ return status;
+ }
+
+ status = socket_api::SetSocketBlocking(descriptor_, /*blocking=*/true);
+ if (!status.ok()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Failed to set socket to address: " << peer_address_.ToString()
+ << " as blocking for connect with error: " << status;
+ Close();
+ return status;
+ }
+
+ status = DoInitialConnect();
+
+ if (absl::IsUnavailable(status)) {
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Non-blocking connect to should-be blocking socket to address:"
+ << peer_address_.ToString() << ".";
+ Close();
+ connect_status_ = ConnectStatus::kNotConnected;
+ return status;
+ } else if (!status.ok()) {
+ // DoInitialConnect() closes the socket on failures.
+ QUICHE_DCHECK_EQ(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kNotConnected);
+ return status;
+ }
+
+ status = socket_api::SetSocketBlocking(descriptor_, /*blocking=*/false);
+ if (!status.ok()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Failed to return socket to address: " << peer_address_.ToString()
+ << " to non-blocking after connect with error: " << status;
+ Close();
+ connect_status_ = ConnectStatus::kNotConnected;
+ }
+
+ QUICHE_DCHECK(connect_status_ != ConnectStatus::kConnecting);
+ return status;
+}
+
+void EventLoopTcpClientSocket::ConnectAsync() {
+ QUICHE_DCHECK(async_visitor_);
+ QUICHE_DCHECK_EQ(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kNotConnected);
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+
+ absl::Status status = Open();
+ if (!status.ok()) {
+ async_visitor_->ConnectComplete(status);
+ return;
+ }
+
+ FinishOrRearmAsyncConnect(DoInitialConnect());
+}
+
+void EventLoopTcpClientSocket::Disconnect() {
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ != ConnectStatus::kNotConnected);
+
+ Close();
+ QUICHE_DCHECK_EQ(descriptor_, kInvalidSocketFd);
+
+ // Reset all state before invoking any callbacks.
+ bool require_connect_callback = connect_status_ == ConnectStatus::kConnecting;
+ connect_status_ = ConnectStatus::kNotConnected;
+ bool require_receive_callback = receive_max_size_.has_value();
+ receive_max_size_.reset();
+ bool require_send_callback =
+ !absl::holds_alternative<absl::monostate>(send_data_);
+ send_data_ = absl::monostate();
+ send_remaining_ = "";
+
+ if (require_connect_callback) {
+ QUICHE_DCHECK(async_visitor_);
+ async_visitor_->ConnectComplete(absl::CancelledError());
+ }
+ if (require_receive_callback) {
+ QUICHE_DCHECK(async_visitor_);
+ async_visitor_->ReceiveComplete(absl::CancelledError());
+ }
+ if (require_send_callback) {
+ QUICHE_DCHECK(async_visitor_);
+ async_visitor_->SendComplete(absl::CancelledError());
+ }
+}
+
+absl::StatusOr<quiche::QuicheMemSlice>
+EventLoopTcpClientSocket::ReceiveBlocking(QuicByteCount max_size) {
+ QUICHE_DCHECK_GT(max_size, 0u);
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kConnected);
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+
+ absl::Status status =
+ socket_api::SetSocketBlocking(descriptor_, /*blocking=*/true);
+ if (!status.ok()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Failed to set socket to address: " << peer_address_.ToString()
+ << " as blocking for receive with error: " << status;
+ return status;
+ }
+
+ receive_max_size_ = max_size;
+ absl::StatusOr<quiche::QuicheMemSlice> buffer = ReceiveInternal();
+
+ if (!buffer.ok() && absl::IsUnavailable(buffer.status())) {
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Non-blocking receive from should-be blocking socket to address:"
+ << peer_address_.ToString() << ".";
+ receive_max_size_.reset();
+ } else {
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+ }
+
+ absl::Status set_non_blocking_status =
+ socket_api::SetSocketBlocking(descriptor_, /*blocking=*/false);
+ if (!set_non_blocking_status.ok()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Failed to return socket to address: " << peer_address_.ToString()
+ << " to non-blocking after receive with error: "
+ << set_non_blocking_status;
+ return set_non_blocking_status;
+ }
+
+ return buffer;
+}
+
+void EventLoopTcpClientSocket::ReceiveAsync(QuicByteCount max_size) {
+ QUICHE_DCHECK(async_visitor_);
+ QUICHE_DCHECK_GT(max_size, 0u);
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kConnected);
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+
+ receive_max_size_ = max_size;
+
+ FinishOrRearmAsyncReceive(ReceiveInternal());
+}
+
+absl::Status EventLoopTcpClientSocket::SendBlocking(std::string data) {
+ QUICHE_DCHECK(!data.empty());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+
+ send_data_ = std::move(data);
+ return SendBlockingInternal();
+}
+
+absl::Status EventLoopTcpClientSocket::SendBlocking(
+ quiche::QuicheMemSlice data) {
+ QUICHE_DCHECK(!data.empty());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+
+ send_data_ = std::move(data);
+ return SendBlockingInternal();
+}
+
+void EventLoopTcpClientSocket::SendAsync(std::string data) {
+ QUICHE_DCHECK(!data.empty());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+
+ send_data_ = std::move(data);
+ send_remaining_ = absl::get<std::string>(send_data_);
+
+ FinishOrRearmAsyncSend(SendInternal());
+}
+
+void EventLoopTcpClientSocket::SendAsync(quiche::QuicheMemSlice data) {
+ QUICHE_DCHECK(!data.empty());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+
+ send_data_ = std::move(data);
+ send_remaining_ =
+ absl::get<quiche::QuicheMemSlice>(send_data_).AsStringView();
+
+ FinishOrRearmAsyncSend(SendInternal());
+}
+
+void EventLoopTcpClientSocket::OnSocketEvent(QuicEventLoop* event_loop,
+ SocketFd fd,
+ QuicSocketEventMask events) {
+ QUICHE_DCHECK_EQ(event_loop, event_loop_);
+ QUICHE_DCHECK_EQ(fd, descriptor_);
+
+ if (connect_status_ == ConnectStatus::kConnecting &&
+ (events & (kSocketEventWritable | kSocketEventError))) {
+ FinishOrRearmAsyncConnect(GetConnectResult());
+ return;
+ }
+
+ if (receive_max_size_.has_value() &&
+ (events & (kSocketEventReadable | kSocketEventError))) {
+ FinishOrRearmAsyncReceive(ReceiveInternal());
+ }
+ if (!send_remaining_.empty() &&
+ (events & (kSocketEventWritable | kSocketEventError))) {
+ FinishOrRearmAsyncSend(SendInternal());
+ }
+}
+
+absl::Status EventLoopTcpClientSocket::Open() {
+ QUICHE_DCHECK_EQ(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kNotConnected);
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+ QUICHE_DCHECK(send_remaining_.empty());
+
+ absl::StatusOr<SocketFd> descriptor = socket_api::CreateSocket(
+ peer_address_.host().address_family(), socket_api::SocketProtocol::kTcp,
+ /*blocking=*/false);
+ if (!descriptor.ok()) {
+ QUICHE_DVLOG(1) << "Failed to open socket for connection to address: "
+ << peer_address_.ToString()
+ << " with error: " << descriptor.status();
+ return descriptor.status();
+ }
+ QUICHE_DCHECK_NE(descriptor.value(), kInvalidSocketFd);
+
+ descriptor_ = descriptor.value();
+
+ if (async_visitor_) {
+ bool registered;
+ if (event_loop_->SupportsEdgeTriggered()) {
+ registered = event_loop_->RegisterSocket(
+ descriptor_,
+ kSocketEventReadable | kSocketEventWritable | kSocketEventError,
+ this);
+ } else {
+ // Just register the socket without any armed events for now. Will rearm
+ // with specific events as needed. Registering now before events are
+ // needed makes it easier to ensure the socket is registered only once
+ // and can always be unregistered on socket close.
+ registered = event_loop_->RegisterSocket(descriptor_, /*events=*/0, this);
+ }
+ QUICHE_DCHECK(registered);
+ }
+
+ if (receive_buffer_size_ != 0) {
+ absl::Status status =
+ socket_api::SetReceiveBufferSize(descriptor_, receive_buffer_size_);
+ if (!status.ok()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Failed to set receive buffer size to: " << receive_buffer_size_
+ << " for socket to address: " << peer_address_.ToString()
+ << " with error: " << status;
+ Close();
+ return status;
+ }
+ }
+
+ if (send_buffer_size_ != 0) {
+ absl::Status status =
+ socket_api::SetSendBufferSize(descriptor_, send_buffer_size_);
+ if (!status.ok()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Failed to set send buffer size to: " << send_buffer_size_
+ << " for socket to address: " << peer_address_.ToString()
+ << " with error: " << status;
+ Close();
+ return status;
+ }
+ }
+
+ return absl::OkStatus();
+}
+
+void EventLoopTcpClientSocket::Close() {
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+
+ bool unregistered = event_loop_->UnregisterSocket(descriptor_);
+ QUICHE_DCHECK_EQ(unregistered, !!async_visitor_);
+
+ absl::Status status = socket_api::Close(descriptor_);
+ if (!status.ok()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Could not close socket to address: " << peer_address_.ToString()
+ << " with error: " << status;
+ }
+
+ descriptor_ = kInvalidSocketFd;
+}
+
+absl::Status EventLoopTcpClientSocket::DoInitialConnect() {
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kNotConnected);
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+
+ absl::Status connect_result = socket_api::Connect(descriptor_, peer_address_);
+
+ if (connect_result.ok()) {
+ connect_status_ = ConnectStatus::kConnected;
+ } else if (absl::IsUnavailable(connect_result)) {
+ connect_status_ = ConnectStatus::kConnecting;
+ } else {
+ QUICHE_DVLOG(1) << "Synchronously failed to connect socket to address: "
+ << peer_address_.ToString()
+ << " with error: " << connect_result;
+ Close();
+ connect_status_ = ConnectStatus::kNotConnected;
+ }
+
+ return connect_result;
+}
+
+absl::Status EventLoopTcpClientSocket::GetConnectResult() {
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kConnecting);
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+
+ absl::Status error = socket_api::GetSocketError(descriptor_);
+
+ if (!error.ok()) {
+ QUICHE_DVLOG(1) << "Asynchronously failed to connect socket to address: "
+ << peer_address_.ToString() << " with error: " << error;
+ Close();
+ connect_status_ = ConnectStatus::kNotConnected;
+ return error;
+ }
+
+ // Peek at one byte to confirm the connection is actually alive. Motivation:
+ // 1) Plausibly could have a lot of cases where the connection operation
+ // itself technically succeeds but the socket then quickly fails. Don't
+ // want to claim connection success here if, by the time this code is
+ // running after event triggers and such, the socket has already failed.
+ // Lot of undefined room around whether or not such errors would be saved
+ // into SO_ERROR and returned by socket_api::GetSocketError().
+ // 2) With the various platforms and event systems involved, less than 100%
+ // trust that it's impossible to end up in this method before the async
+ // connect has completed/errored. Given that Connect() and GetSocketError()
+ // does not difinitevely differentiate between success and
+ // still-in-progress, and given that there's a very simple and performant
+ // way to positively confirm the socket is connected (peek), do that here.
+ // (Could consider making the not-connected case a QUIC_BUG if a way is
+ // found to differentiate it from (1).)
+ absl::StatusOr<bool> peek_data = OneBytePeek();
+ if (peek_data.ok() || absl::IsUnavailable(peek_data.status())) {
+ connect_status_ = ConnectStatus::kConnected;
+ } else {
+ error = peek_data.status();
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Socket to address: " << peer_address_.ToString()
+ << " signalled writable after connect and no connect error found, "
+ "but socket does not appear connected with error: "
+ << error;
+ Close();
+ connect_status_ = ConnectStatus::kNotConnected;
+ }
+
+ return error;
+}
+
+void EventLoopTcpClientSocket::FinishOrRearmAsyncConnect(absl::Status status) {
+ if (absl::IsUnavailable(status)) {
+ if (!event_loop_->SupportsEdgeTriggered()) {
+ bool result = event_loop_->RearmSocket(
+ descriptor_, kSocketEventWritable | kSocketEventError);
+ QUICHE_DCHECK(result);
+ }
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kConnecting);
+ } else {
+ QUICHE_DCHECK(connect_status_ != ConnectStatus::kConnecting);
+ async_visitor_->ConnectComplete(status);
+ }
+}
+
+absl::StatusOr<quiche::QuicheMemSlice>
+EventLoopTcpClientSocket::ReceiveInternal() {
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kConnected);
+ QUICHE_CHECK(receive_max_size_.has_value());
+ QUICHE_DCHECK_GE(receive_max_size_.value(), 1u);
+ QUICHE_DCHECK_LE(receive_max_size_.value(),
+ std::numeric_limits<size_t>::max());
+
+ // Before allocating a buffer, do a 1-byte peek to determine if needed.
+ if (receive_max_size_.value() > 1) {
+ absl::StatusOr<bool> peek_data = OneBytePeek();
+ if (!peek_data.ok()) {
+ if (!absl::IsUnavailable(peek_data.status())) {
+ receive_max_size_.reset();
+ }
+ return peek_data.status();
+ } else if (!peek_data.value()) {
+ receive_max_size_.reset();
+ return quiche::QuicheMemSlice();
+ }
+ }
+
+ quiche::QuicheBuffer buffer(buffer_allocator_, receive_max_size_.value());
+ absl::StatusOr<absl::Span<char>> received = socket_api::Receive(
+ descriptor_, absl::MakeSpan(buffer.data(), buffer.size()));
+
+ if (received.ok()) {
+ QUICHE_DCHECK_LE(received.value().size(), buffer.size());
+ QUICHE_DCHECK_EQ(received.value().data(), buffer.data());
+
+ receive_max_size_.reset();
+ return quiche::QuicheMemSlice(
+ quiche::QuicheBuffer(buffer.Release(), received.value().size()));
+ } else {
+ if (!absl::IsUnavailable(received.status())) {
+ QUICHE_DVLOG(1) << "Failed to receive from socket to address: "
+ << peer_address_.ToString()
+ << " with error: " << received.status();
+ receive_max_size_.reset();
+ }
+ return received.status();
+ }
+}
+
+void EventLoopTcpClientSocket::FinishOrRearmAsyncReceive(
+ absl::StatusOr<quiche::QuicheMemSlice> buffer) {
+ QUICHE_DCHECK(async_visitor_);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kConnected);
+
+ if (!buffer.ok() && absl::IsUnavailable(buffer.status())) {
+ if (!event_loop_->SupportsEdgeTriggered()) {
+ bool result = event_loop_->RearmSocket(
+ descriptor_, kSocketEventReadable | kSocketEventError);
+ QUICHE_DCHECK(result);
+ }
+ QUICHE_DCHECK(receive_max_size_.has_value());
+ } else {
+ QUICHE_DCHECK(!receive_max_size_.has_value());
+ async_visitor_->ReceiveComplete(std::move(buffer));
+ }
+}
+
+absl::StatusOr<bool> EventLoopTcpClientSocket::OneBytePeek() {
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+
+ char peek_buffer;
+ absl::StatusOr<absl::Span<char>> peek_received = socket_api::Receive(
+ descriptor_, absl::MakeSpan(&peek_buffer, /*size=*/1), /*peek=*/true);
+ if (!peek_received.ok()) {
+ return peek_received.status();
+ } else {
+ return !peek_received.value().empty();
+ }
+}
+
+absl::Status EventLoopTcpClientSocket::SendBlockingInternal() {
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kConnected);
+ QUICHE_DCHECK(!absl::holds_alternative<absl::monostate>(send_data_));
+ QUICHE_DCHECK(send_remaining_.empty());
+
+ absl::Status status =
+ socket_api::SetSocketBlocking(descriptor_, /*blocking=*/true);
+ if (!status.ok()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Failed to set socket to address: " << peer_address_.ToString()
+ << " as blocking for send with error: " << status;
+ send_data_ = absl::monostate();
+ return status;
+ }
+
+ if (absl::holds_alternative<std::string>(send_data_)) {
+ send_remaining_ = absl::get<std::string>(send_data_);
+ } else {
+ send_remaining_ =
+ absl::get<quiche::QuicheMemSlice>(send_data_).AsStringView();
+ }
+
+ status = SendInternal();
+ if (absl::IsUnavailable(status)) {
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Non-blocking send for should-be blocking socket to address:"
+ << peer_address_.ToString();
+ send_data_ = absl::monostate();
+ send_remaining_ = "";
+ } else {
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+ QUICHE_DCHECK(send_remaining_.empty());
+ }
+
+ absl::Status set_non_blocking_status =
+ socket_api::SetSocketBlocking(descriptor_, /*blocking=*/false);
+ if (!set_non_blocking_status.ok()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Failed to return socket to address: " << peer_address_.ToString()
+ << " to non-blocking after send with error: "
+ << set_non_blocking_status;
+ return set_non_blocking_status;
+ }
+
+ return status;
+}
+
+absl::Status EventLoopTcpClientSocket::SendInternal() {
+ QUICHE_DCHECK_NE(descriptor_, kInvalidSocketFd);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kConnected);
+ QUICHE_DCHECK(!absl::holds_alternative<absl::monostate>(send_data_));
+ QUICHE_DCHECK(!send_remaining_.empty());
+
+ // Repeat send until all data sent, unavailable, or error.
+ while (!send_remaining_.empty()) {
+ absl::StatusOr<absl::string_view> remainder =
+ socket_api::Send(descriptor_, send_remaining_);
+
+ if (remainder.ok()) {
+ QUICHE_DCHECK(remainder.value().empty() ||
+ (remainder.value().data() >= send_remaining_.data() &&
+ remainder.value().data() <
+ send_remaining_.data() + send_remaining_.size()));
+ QUICHE_DCHECK(remainder.value().empty() ||
+ (remainder.value().data() + remainder.value().size() ==
+ send_remaining_.data() + send_remaining_.size()));
+ send_remaining_ = remainder.value();
+ } else {
+ if (!absl::IsUnavailable(remainder.status())) {
+ QUICHE_DVLOG(1) << "Failed to send to socket to address: "
+ << peer_address_.ToString()
+ << " with error: " << remainder.status();
+ send_data_ = absl::monostate();
+ send_remaining_ = "";
+ }
+ return remainder.status();
+ }
+ }
+
+ send_data_ = absl::monostate();
+ return absl::OkStatus();
+}
+
+void EventLoopTcpClientSocket::FinishOrRearmAsyncSend(absl::Status status) {
+ QUICHE_DCHECK(async_visitor_);
+ QUICHE_DCHECK(connect_status_ == ConnectStatus::kConnected);
+
+ if (absl::IsUnavailable(status)) {
+ if (!event_loop_->SupportsEdgeTriggered()) {
+ bool result = event_loop_->RearmSocket(
+ descriptor_, kSocketEventWritable | kSocketEventError);
+ QUICHE_DCHECK(result);
+ }
+ QUICHE_DCHECK(!absl::holds_alternative<absl::monostate>(send_data_));
+ QUICHE_DCHECK(!send_remaining_.empty());
+ } else {
+ QUICHE_DCHECK(absl::holds_alternative<absl::monostate>(send_data_));
+ QUICHE_DCHECK(send_remaining_.empty());
+ async_visitor_->SendComplete(status);
+ }
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket.h b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket.h
new file mode 100644
index 00000000000..2d50087a5e8
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket.h
@@ -0,0 +1,103 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_IO_EVENT_LOOP_TCP_CLIENT_SOCKET_H_
+#define QUICHE_QUIC_CORE_IO_EVENT_LOOP_TCP_CLIENT_SOCKET_H_
+
+#include <string>
+
+#include "absl/status/status.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
+#include "absl/types/variant.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/io/stream_client_socket.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/quiche_buffer_allocator.h"
+
+namespace quic {
+
+// A TCP client socket implemented using an underlying QuicEventLoop.
+class QUICHE_EXPORT_PRIVATE EventLoopTcpClientSocket
+ : public StreamClientSocket,
+ public QuicSocketEventListener {
+ public:
+ // Will use platform default buffer size if `receive_buffer_size` or
+ // `send_buffer_size` is zero. `async_visitor` may be null if no async
+ // operations will be requested. `event_loop`, `buffer_allocator`, and
+ // `async_visitor` (if non-null) must outlive the created socket.
+ EventLoopTcpClientSocket(const quic::QuicSocketAddress& peer_address,
+ QuicByteCount receive_buffer_size,
+ QuicByteCount send_buffer_size,
+ QuicEventLoop* event_loop,
+ quiche::QuicheBufferAllocator* buffer_allocator,
+ AsyncVisitor* async_visitor);
+
+ ~EventLoopTcpClientSocket() override;
+
+ // StreamClientSocket:
+ absl::Status ConnectBlocking() override;
+ void ConnectAsync() override;
+ void Disconnect() override;
+
+ // Socket:
+ absl::StatusOr<quiche::QuicheMemSlice> ReceiveBlocking(
+ QuicByteCount max_size) override;
+ void ReceiveAsync(QuicByteCount max_size) override;
+ absl::Status SendBlocking(std::string data) override;
+ absl::Status SendBlocking(quiche::QuicheMemSlice data) override;
+ void SendAsync(std::string data) override;
+ void SendAsync(quiche::QuicheMemSlice data) override;
+
+ // QuicSocketEventListener:
+ void OnSocketEvent(QuicEventLoop* event_loop, SocketFd fd,
+ QuicSocketEventMask events) override;
+
+ private:
+ enum class ConnectStatus {
+ kNotConnected,
+ kConnecting,
+ kConnected,
+ };
+
+ absl::Status Open();
+ void Close();
+ absl::Status DoInitialConnect();
+ absl::Status GetConnectResult();
+ void FinishOrRearmAsyncConnect(absl::Status status);
+ absl::StatusOr<quiche::QuicheMemSlice> ReceiveInternal();
+ void FinishOrRearmAsyncReceive(absl::StatusOr<quiche::QuicheMemSlice> buffer);
+ // Returns `true` if a byte received, or `false` if successfully received
+ // empty data.
+ absl::StatusOr<bool> OneBytePeek();
+ absl::Status SendBlockingInternal();
+ absl::Status SendInternal();
+ void FinishOrRearmAsyncSend(absl::Status status);
+
+ const QuicSocketAddress peer_address_;
+ const QuicByteCount receive_buffer_size_;
+ const QuicByteCount send_buffer_size_;
+ QuicEventLoop* const event_loop_; // unowned
+ quiche::QuicheBufferAllocator* buffer_allocator_; // unowned
+ AsyncVisitor* const async_visitor_; // unowned, potentially null
+
+ SocketFd descriptor_ = kInvalidSocketFd;
+ ConnectStatus connect_status_ = ConnectStatus::kNotConnected;
+
+ // Only set while receive in progress or pending, otherwise nullopt.
+ absl::optional<QuicByteCount> receive_max_size_;
+
+ // Only contains data while send in progress or pending, otherwise monostate.
+ absl::variant<absl::monostate, std::string, quiche::QuicheMemSlice>
+ send_data_;
+ // Points to the unsent portion of `send_data_` while send in progress or
+ // pending, otherwise empty.
+ absl::string_view send_remaining_;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_IO_EVENT_LOOP_TCP_CLIENT_SOCKET_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket_test.cc
new file mode 100644
index 00000000000..f3c0800457a
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/event_loop_tcp_client_socket_test.cc
@@ -0,0 +1,523 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/core/io/event_loop_tcp_client_socket.h"
+
+#include <functional>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "absl/functional/bind_front.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
+#include "absl/types/span.h"
+#include "quiche/quic/core/io/event_loop_socket_factory.h"
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/io/socket.h"
+#include "quiche/quic/core/io/stream_client_socket.h"
+#include "quiche/quic/core/quic_time.h"
+#include "quiche/quic/platform/api/quic_ip_address_family.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/quic/test_tools/mock_clock.h"
+#include "quiche/quic/test_tools/quic_test_utils.h"
+#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/platform/api/quiche_mem_slice.h"
+#include "quiche/common/platform/api/quiche_mutex.h"
+#include "quiche/common/platform/api/quiche_test.h"
+#include "quiche/common/platform/api/quiche_test_loopback.h"
+#include "quiche/common/platform/api/quiche_thread.h"
+#include "quiche/common/simple_buffer_allocator.h"
+
+namespace quic::test {
+namespace {
+
+bool CreateListeningServerSocket(SocketFd* out_socket_descriptor,
+ QuicSocketAddress* out_socket_address) {
+ QUICHE_CHECK(out_socket_descriptor);
+ QUICHE_CHECK(out_socket_address);
+
+ absl::StatusOr<SocketFd> socket = socket_api::CreateSocket(
+ quiche::TestLoopback().address_family(), socket_api::SocketProtocol::kTcp,
+ /*blocking=*/true);
+ QUICHE_CHECK(socket.ok());
+
+ // Set an extremely small receive buffer size to increase the odds of buffers
+ // filling up when testing asynchronous writes.
+ static const QuicByteCount kReceiveBufferSize = 2;
+ absl::Status result =
+ socket_api::SetReceiveBufferSize(socket.value(), kReceiveBufferSize);
+ QUICHE_CHECK(result.ok());
+
+ QuicSocketAddress bind_address(quiche::TestLoopback(), /*port=*/0);
+ result = socket_api::Bind(socket.value(), bind_address);
+ QUICHE_CHECK(result.ok());
+
+ absl::StatusOr<QuicSocketAddress> socket_address =
+ socket_api::GetSocketAddress(socket.value());
+ QUICHE_CHECK(socket_address.ok());
+
+ result = socket_api::Listen(socket.value(), /*backlog=*/1);
+ QUICHE_CHECK(result.ok());
+
+ *out_socket_descriptor = socket.value();
+ *out_socket_address = std::move(socket_address).value();
+ return true;
+}
+
+class TestTcpServerSocketRunner : public quiche::QuicheThread {
+ public:
+ using SocketBehavior = std::function<void(SocketFd connected_socket)>;
+
+ // On construction, spins a separate thread to accept a connection from
+ // `server_socket_descriptor`, runs `behavior` with that connection, and then
+ // closes the accepted connection socket. If `allow_accept_failure` is true,
+ // will silently stop if an error is encountered accepting the connection.
+ TestTcpServerSocketRunner(SocketFd server_socket_descriptor,
+ SocketBehavior behavior,
+ bool allow_accept_failure = false)
+ : QuicheThread("TestTcpServerSocketRunner"),
+ server_socket_descriptor_(server_socket_descriptor),
+ behavior_(std::move(behavior)),
+ allow_accept_failure_(allow_accept_failure) {
+ Start();
+ }
+
+ ~TestTcpServerSocketRunner() override { WaitForCompletion(); }
+
+ void WaitForCompletion() { completion_notification_.WaitForNotification(); }
+
+ protected:
+ void Run() override {
+ if (AcceptSocket()) {
+ behavior_(connection_socket_descriptor_);
+ CloseSocket();
+ } else {
+ QUICHE_CHECK(allow_accept_failure_);
+ }
+
+ completion_notification_.Notify();
+ }
+
+ private:
+ bool AcceptSocket() {
+ absl::StatusOr<socket_api::AcceptResult> connection_socket =
+ socket_api::Accept(server_socket_descriptor_, /*blocking=*/true);
+ if (connection_socket.ok()) {
+ connection_socket_descriptor_ = connection_socket.value().fd;
+ }
+ return connection_socket.ok();
+ }
+
+ void CloseSocket() {
+ QUICHE_CHECK(socket_api::Close(connection_socket_descriptor_).ok());
+ }
+
+ const SocketFd server_socket_descriptor_;
+ const SocketBehavior behavior_;
+ const bool allow_accept_failure_;
+
+ SocketFd connection_socket_descriptor_;
+
+ quiche::QuicheNotification completion_notification_;
+};
+
+class EventLoopTcpClientSocketTest
+ : public quiche::test::QuicheTestWithParam<QuicEventLoopFactory*>,
+ public StreamClientSocket::AsyncVisitor {
+ public:
+ void SetUp() override {
+ QUICHE_CHECK(CreateListeningServerSocket(&server_socket_descriptor_,
+ &server_socket_address_));
+ }
+
+ void TearDown() override {
+ if (server_socket_descriptor_ != kInvalidSocketFd) {
+ QUICHE_CHECK(socket_api::Close(server_socket_descriptor_).ok());
+ }
+ }
+
+ void ConnectComplete(absl::Status status) override {
+ QUICHE_CHECK(!connect_result_.has_value());
+ connect_result_ = std::move(status);
+ }
+
+ void ReceiveComplete(absl::StatusOr<quiche::QuicheMemSlice> data) override {
+ QUICHE_CHECK(!receive_result_.has_value());
+ receive_result_ = std::move(data);
+ }
+
+ void SendComplete(absl::Status status) override {
+ QUICHE_CHECK(!send_result_.has_value());
+ send_result_ = std::move(status);
+ }
+
+ protected:
+ SocketFd server_socket_descriptor_ = kInvalidSocketFd;
+ QuicSocketAddress server_socket_address_;
+
+ MockClock clock_;
+ std::unique_ptr<QuicEventLoop> event_loop_ = GetParam()->Create(&clock_);
+ EventLoopSocketFactory socket_factory_{event_loop_.get(),
+ quiche::SimpleBufferAllocator::Get()};
+
+ absl::optional<absl::Status> connect_result_;
+ absl::optional<absl::StatusOr<quiche::QuicheMemSlice>> receive_result_;
+ absl::optional<absl::Status> send_result_;
+};
+
+std::string GetTestParamName(
+ ::testing::TestParamInfo<QuicEventLoopFactory*> info) {
+ return EscapeTestParamName(info.param->GetName());
+}
+
+INSTANTIATE_TEST_SUITE_P(EventLoopTcpClientSocketTests,
+ EventLoopTcpClientSocketTest,
+ ::testing::ValuesIn(GetAllSupportedEventLoops()),
+ &GetTestParamName);
+
+TEST_P(EventLoopTcpClientSocketTest, Connect) {
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/nullptr);
+
+ // No socket runner to accept the connection for the server, but that is not
+ // expected to be necessary for the connection to complete from the client.
+ EXPECT_TRUE(socket->ConnectBlocking().ok());
+
+ socket->Disconnect();
+}
+
+TEST_P(EventLoopTcpClientSocketTest, ConnectAsync) {
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/this);
+
+ socket->ConnectAsync();
+
+ // Synchronous completion not normally expected, but since there is no known
+ // way to delay the server side of the connection (the OS does not wait for
+ // an accept() call), cannot be gauranteed that the connection will always
+ // complete asynchronously. If connecting asynchronously (normal behavior),
+ // expect completion once signalled by the event loop.
+ if (!connect_result_.has_value()) {
+ event_loop_->RunEventLoopOnce(QuicTime::Delta::FromSeconds(1));
+ ASSERT_TRUE(connect_result_.has_value());
+ }
+ EXPECT_TRUE(connect_result_.value().ok());
+
+ connect_result_.reset();
+ socket->Disconnect();
+ EXPECT_FALSE(connect_result_.has_value());
+}
+
+TEST_P(EventLoopTcpClientSocketTest, ErrorBeforeConnectAsync) {
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/this);
+
+ // Close the server socket.
+ EXPECT_TRUE(socket_api::Close(server_socket_descriptor_).ok());
+ server_socket_descriptor_ = kInvalidSocketFd;
+
+ socket->ConnectAsync();
+ if (!connect_result_.has_value()) {
+ event_loop_->RunEventLoopOnce(QuicTime::Delta::FromSeconds(1));
+ ASSERT_TRUE(connect_result_.has_value());
+ }
+
+ // Expect an error because server socket was closed before connection.
+ EXPECT_FALSE(connect_result_.value().ok());
+}
+
+TEST_P(EventLoopTcpClientSocketTest, ErrorDuringConnectAsync) {
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/this);
+
+ socket->ConnectAsync();
+
+ if (connect_result_.has_value()) {
+ // Not typical, but theoretically nothing to stop the connection from
+ // completing before the server socket is closed to trigger the error.
+ EXPECT_TRUE(connect_result_.value().ok());
+ return;
+ }
+
+ // Close the server socket.
+ EXPECT_TRUE(socket_api::Close(server_socket_descriptor_).ok());
+ server_socket_descriptor_ = kInvalidSocketFd;
+
+ // Expect an error once signalled.
+ EXPECT_FALSE(connect_result_.has_value());
+ event_loop_->RunEventLoopOnce(QuicTime::Delta::FromSeconds(1));
+ ASSERT_TRUE(connect_result_.has_value());
+ EXPECT_FALSE(connect_result_.value().ok());
+}
+
+TEST_P(EventLoopTcpClientSocketTest, Disconnect) {
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/nullptr);
+
+ ASSERT_TRUE(socket->ConnectBlocking().ok());
+ socket->Disconnect();
+}
+
+TEST_P(EventLoopTcpClientSocketTest, DisconnectCancelsConnectAsync) {
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/this);
+
+ socket->ConnectAsync();
+
+ if (connect_result_.has_value()) {
+ // Not typical, but theoretically nothing to stop the connection from
+ // completing before the server socket is closed to trigger the error.
+ EXPECT_TRUE(connect_result_.value().ok());
+ return;
+ }
+
+ socket->Disconnect();
+
+ // Expect immediate cancelled error.
+ ASSERT_TRUE(connect_result_.has_value());
+ EXPECT_TRUE(absl::IsCancelled(connect_result_.value()));
+}
+
+TEST_P(EventLoopTcpClientSocketTest, ConnectAndReconnect) {
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/nullptr);
+
+ ASSERT_TRUE(socket->ConnectBlocking().ok());
+ socket->Disconnect();
+
+ // Expect `socket` can reconnect now that it has been disconnected.
+ EXPECT_TRUE(socket->ConnectBlocking().ok());
+ socket->Disconnect();
+}
+
+void SendDataOnSocket(absl::string_view data, SocketFd connected_socket) {
+ while (!data.empty()) {
+ absl::StatusOr<absl::string_view> remainder =
+ socket_api::Send(connected_socket, data);
+ if (!remainder.ok()) {
+ return;
+ }
+ data = remainder.value();
+ }
+}
+
+TEST_P(EventLoopTcpClientSocketTest, Receive) {
+ std::string expected = {1, 2, 3, 4, 5, 6, 7, 8};
+ TestTcpServerSocketRunner runner(
+ server_socket_descriptor_, absl::bind_front(&SendDataOnSocket, expected));
+
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/nullptr);
+ ASSERT_TRUE(socket->ConnectBlocking().ok());
+
+ std::string received;
+ absl::StatusOr<quiche::QuicheMemSlice> data;
+ do {
+ data = socket->ReceiveBlocking(100);
+ ASSERT_TRUE(data.ok());
+ received.append(data.value().data(), data.value().length());
+ } while (!data.value().empty());
+ EXPECT_EQ(received, expected);
+
+ socket->Disconnect();
+}
+
+TEST_P(EventLoopTcpClientSocketTest, ReceiveAsync) {
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/this);
+ ASSERT_TRUE(socket->ConnectBlocking().ok());
+
+ // Start an async receive. Expect no immediate results because runner not yet
+ // setup to accept and send.
+ socket->ReceiveAsync(100);
+ EXPECT_FALSE(receive_result_.has_value());
+
+ // Send data from server.
+ std::string expected = {1, 2, 3, 4, 5, 6, 7, 8};
+ TestTcpServerSocketRunner runner(
+ server_socket_descriptor_, absl::bind_front(&SendDataOnSocket, expected));
+ EXPECT_FALSE(receive_result_.has_value());
+ for (int i = 0; i < 5 && !receive_result_.has_value(); ++i) {
+ event_loop_->RunEventLoopOnce(QuicTime::Delta::FromSeconds(1));
+ }
+
+ // Expect to receive at least some of the sent data.
+ ASSERT_TRUE(receive_result_.has_value());
+ ASSERT_TRUE(receive_result_.value().ok());
+ EXPECT_FALSE(receive_result_.value().value().empty());
+ std::string received(receive_result_.value().value().data(),
+ receive_result_.value().value().length());
+
+ // Get any remaining data via blocking calls.
+ absl::StatusOr<quiche::QuicheMemSlice> data;
+ do {
+ data = socket->ReceiveBlocking(100);
+ ASSERT_TRUE(data.ok());
+ received.append(data.value().data(), data.value().length());
+ } while (!data.value().empty());
+
+ EXPECT_EQ(received, expected);
+
+ receive_result_.reset();
+ socket->Disconnect();
+ EXPECT_FALSE(receive_result_.has_value());
+}
+
+TEST_P(EventLoopTcpClientSocketTest, DisconnectCancelsReceiveAsync) {
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/this);
+
+ ASSERT_TRUE(socket->ConnectBlocking().ok());
+
+ // Start an asynchronous read, expecting no completion because server never
+ // sends any data.
+ socket->ReceiveAsync(100);
+ EXPECT_FALSE(receive_result_.has_value());
+
+ // Disconnect and expect an immediate cancelled error.
+ socket->Disconnect();
+ ASSERT_TRUE(receive_result_.has_value());
+ ASSERT_FALSE(receive_result_.value().ok());
+ EXPECT_TRUE(absl::IsCancelled(receive_result_.value().status()));
+}
+
+// Receive from `connected_socket` until connection is closed, writing received
+// data to `out_received`.
+void ReceiveDataFromSocket(std::string* out_received,
+ SocketFd connected_socket) {
+ out_received->clear();
+
+ std::string buffer(100, 0);
+ absl::StatusOr<absl::Span<char>> received;
+ do {
+ received = socket_api::Receive(connected_socket, absl::MakeSpan(buffer));
+ QUICHE_CHECK(received.ok());
+ out_received->insert(out_received->end(), received.value().begin(),
+ received.value().end());
+ } while (!received.value().empty());
+}
+
+TEST_P(EventLoopTcpClientSocketTest, Send) {
+ std::string sent;
+ TestTcpServerSocketRunner runner(
+ server_socket_descriptor_,
+ absl::bind_front(&ReceiveDataFromSocket, &sent));
+
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/nullptr);
+ ASSERT_TRUE(socket->ConnectBlocking().ok());
+
+ std::string expected = {1, 2, 3, 4, 5, 6, 7, 8};
+ EXPECT_TRUE(socket->SendBlocking(expected).ok());
+ socket->Disconnect();
+
+ runner.WaitForCompletion();
+ EXPECT_EQ(sent, expected);
+}
+
+TEST_P(EventLoopTcpClientSocketTest, SendAsync) {
+ // Use a small send buffer to improve chances of a send needing to be
+ // asynchronous.
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/4,
+ /*async_visitor=*/this);
+ ASSERT_TRUE(socket->ConnectBlocking().ok());
+
+ std::string data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+ std::string expected;
+
+ // Repeatedly write to socket until it does not complete synchronously.
+ do {
+ expected.insert(expected.end(), data.begin(), data.end());
+ send_result_.reset();
+ socket->SendAsync(data);
+ ASSERT_TRUE(!send_result_.has_value() || send_result_.value().ok());
+ } while (send_result_.has_value());
+
+ // Begin receiving from server and expect more data to send.
+ std::string sent;
+ TestTcpServerSocketRunner runner(
+ server_socket_descriptor_,
+ absl::bind_front(&ReceiveDataFromSocket, &sent));
+ EXPECT_FALSE(send_result_.has_value());
+ for (int i = 0; i < 5 && !send_result_.has_value(); ++i) {
+ event_loop_->RunEventLoopOnce(QuicTime::Delta::FromSeconds(1));
+ }
+ ASSERT_TRUE(send_result_.has_value());
+ EXPECT_TRUE(send_result_.value().ok());
+
+ send_result_.reset();
+ socket->Disconnect();
+ EXPECT_FALSE(send_result_.has_value());
+
+ runner.WaitForCompletion();
+ EXPECT_EQ(sent, expected);
+}
+
+TEST_P(EventLoopTcpClientSocketTest, DisconnectCancelsSendAsync) {
+ // Use a small send buffer to improve chances of a send needing to be
+ // asynchronous.
+ std::unique_ptr<StreamClientSocket> socket =
+ socket_factory_.CreateTcpClientSocket(server_socket_address_,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/4,
+ /*async_visitor=*/this);
+ ASSERT_TRUE(socket->ConnectBlocking().ok());
+
+ std::string data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+
+ // Repeatedly write to socket until it does not complete synchronously.
+ do {
+ send_result_.reset();
+ socket->SendAsync(data);
+ ASSERT_TRUE(!send_result_.has_value() || send_result_.value().ok());
+ } while (send_result_.has_value());
+
+ // Disconnect and expect immediate cancelled error.
+ socket->Disconnect();
+ ASSERT_TRUE(send_result_.has_value());
+ EXPECT_TRUE(absl::IsCancelled(send_result_.value()));
+}
+
+} // namespace
+} // namespace quic::test
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_all_event_loops_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_all_event_loops_test.cc
new file mode 100644
index 00000000000..16eb3443f44
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_all_event_loops_test.cc
@@ -0,0 +1,423 @@
+// Copyright 2022 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 universal test for all event loops supported by the build of QUICHE in
+// question.
+//
+// This test is very similar to QuicPollEventLoopTest, however, there are some
+// notable differences:
+// (1) This test uses the real clock, since the event loop implementation may
+// not support accepting a mock clock.
+// (2) This test covers both level-triggered and edge-triggered event loops.
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "absl/cleanup/cleanup.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/string_view.h"
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_alarm.h"
+#include "quiche/quic/core/quic_alarm_factory.h"
+#include "quiche/quic/core/quic_default_clock.h"
+#include "quiche/quic/core/quic_time.h"
+#include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/quic/test_tools/quic_test_utils.h"
+
+namespace quic::test {
+namespace {
+
+using testing::_;
+using testing::AtMost;
+
+MATCHER_P(HasFlagSet, value, "Checks a flag in a bit mask") {
+ return (arg & value) != 0;
+}
+
+constexpr QuicSocketEventMask kAllEvents =
+ kSocketEventReadable | kSocketEventWritable | kSocketEventError;
+
+class MockQuicSocketEventListener : public QuicSocketEventListener {
+ public:
+ MOCK_METHOD(void, OnSocketEvent,
+ (QuicEventLoop* /*event_loop*/, QuicUdpSocketFd /*fd*/,
+ QuicSocketEventMask /*events*/),
+ (override));
+};
+
+class MockDelegate : public QuicAlarm::Delegate {
+ public:
+ QuicConnectionContext* GetConnectionContext() override { return nullptr; }
+ MOCK_METHOD(void, OnAlarm, (), (override));
+};
+
+void SetNonBlocking(int fd) {
+ QUICHE_CHECK(::fcntl(fd, F_SETFL, ::fcntl(fd, F_GETFL) | O_NONBLOCK) == 0)
+ << "Failed to mark FD non-blocking, errno: " << errno;
+}
+
+class QuicEventLoopFactoryTest
+ : public QuicTestWithParam<QuicEventLoopFactory*> {
+ public:
+ QuicEventLoopFactoryTest()
+ : loop_(GetParam()->Create(&clock_)),
+ factory_(loop_->CreateAlarmFactory()) {
+ int fds[2];
+ int result = ::pipe(fds);
+ QUICHE_CHECK(result >= 0) << "Failed to create a pipe, errno: " << errno;
+ read_fd_ = fds[0];
+ write_fd_ = fds[1];
+
+ SetNonBlocking(read_fd_);
+ SetNonBlocking(write_fd_);
+ }
+
+ ~QuicEventLoopFactoryTest() {
+ close(read_fd_);
+ close(write_fd_);
+ }
+
+ std::pair<std::unique_ptr<QuicAlarm>, MockDelegate*> CreateAlarm() {
+ auto delegate = std::make_unique<testing::StrictMock<MockDelegate>>();
+ MockDelegate* delegate_unowned = delegate.get();
+ auto alarm = absl::WrapUnique(factory_->CreateAlarm(delegate.release()));
+ return std::make_pair(std::move(alarm), delegate_unowned);
+ }
+
+ template <typename Condition>
+ void RunEventLoopUntil(Condition condition, QuicTime::Delta timeout) {
+ const QuicTime end = clock_.Now() + timeout;
+ while (!condition() && clock_.Now() < end) {
+ loop_->RunEventLoopOnce(end - clock_.Now());
+ }
+ }
+
+ protected:
+ QuicDefaultClock clock_;
+ std::unique_ptr<QuicEventLoop> loop_;
+ std::unique_ptr<QuicAlarmFactory> factory_;
+ int read_fd_;
+ int write_fd_;
+};
+
+std::string GetTestParamName(
+ ::testing::TestParamInfo<QuicEventLoopFactory*> info) {
+ return EscapeTestParamName(info.param->GetName());
+}
+
+INSTANTIATE_TEST_SUITE_P(QuicEventLoopFactoryTests, QuicEventLoopFactoryTest,
+ ::testing::ValuesIn(GetAllSupportedEventLoops()),
+ GetTestParamName);
+
+TEST_P(QuicEventLoopFactoryTest, NothingHappens) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(read_fd_, kAllEvents, &listener));
+ ASSERT_TRUE(loop_->RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ // Attempt double-registration.
+ EXPECT_FALSE(loop_->RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(4));
+ // Expect no further calls.
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(5));
+}
+
+TEST_P(QuicEventLoopFactoryTest, RearmWriter) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ if (loop_->SupportsEdgeTriggered()) {
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable))
+ .Times(1);
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ } else {
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable))
+ .Times(2);
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ ASSERT_TRUE(loop_->RearmSocket(write_fd_, kSocketEventWritable));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ }
+}
+
+TEST_P(QuicEventLoopFactoryTest, Readable) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(read_fd_, kAllEvents, &listener));
+
+ ASSERT_EQ(4, write(write_fd_, "test", 4));
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ // Expect no further calls.
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+}
+
+// A common pattern: read a limited amount of data from an FD, and expect to
+// read the remainder on the next operation.
+TEST_P(QuicEventLoopFactoryTest, ArtificialNotifyFromCallback) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(read_fd_, kSocketEventReadable, &listener));
+
+ constexpr absl::string_view kData = "test test test test test test test ";
+ constexpr size_t kTimes = kData.size() / 5;
+ ASSERT_EQ(kData.size(), write(write_fd_, kData.data(), kData.size()));
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable))
+ .Times(loop_->SupportsEdgeTriggered() ? (kTimes + 1) : kTimes)
+ .WillRepeatedly([&]() {
+ char buf[5];
+ int read_result = read(read_fd_, buf, sizeof(buf));
+ if (read_result > 0) {
+ ASSERT_EQ(read_result, 5);
+ if (loop_->SupportsEdgeTriggered()) {
+ EXPECT_TRUE(
+ loop_->ArtificiallyNotifyEvent(read_fd_, kSocketEventReadable));
+ } else {
+ EXPECT_TRUE(loop_->RearmSocket(read_fd_, kSocketEventReadable));
+ }
+ } else {
+ EXPECT_EQ(errno, EAGAIN);
+ }
+ });
+ for (size_t i = 0; i < kTimes + 2; i++) {
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ }
+}
+
+TEST_P(QuicEventLoopFactoryTest, WriterUnblocked) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+
+ int io_result;
+ std::string data(2048, 'a');
+ do {
+ io_result = write(write_fd_, data.data(), data.size());
+ } while (io_result > 0);
+ ASSERT_EQ(errno, EAGAIN);
+
+ // Rearm if necessary and expect no immediate calls.
+ if (!loop_->SupportsEdgeTriggered()) {
+ ASSERT_TRUE(loop_->RearmSocket(write_fd_, kSocketEventWritable));
+ }
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
+ do {
+ io_result = read(read_fd_, data.data(), data.size());
+ } while (io_result > 0);
+ ASSERT_EQ(errno, EAGAIN);
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+}
+
+TEST_P(QuicEventLoopFactoryTest, ArtificialEvent) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(read_fd_, kAllEvents, &listener));
+ ASSERT_TRUE(loop_->RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ ASSERT_TRUE(loop_->ArtificiallyNotifyEvent(read_fd_, kSocketEventReadable));
+
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable));
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+}
+
+TEST_P(QuicEventLoopFactoryTest, Unregister) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(write_fd_, kAllEvents, &listener));
+ ASSERT_TRUE(loop_->UnregisterSocket(write_fd_));
+
+ // Expect nothing to happen.
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+
+ EXPECT_FALSE(loop_->UnregisterSocket(write_fd_));
+ if (!loop_->SupportsEdgeTriggered()) {
+ EXPECT_FALSE(loop_->RearmSocket(write_fd_, kSocketEventWritable));
+ }
+ EXPECT_FALSE(loop_->ArtificiallyNotifyEvent(write_fd_, kSocketEventWritable));
+}
+
+TEST_P(QuicEventLoopFactoryTest, UnregisterInsideEventHandler) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(read_fd_, kAllEvents, &listener));
+ ASSERT_TRUE(loop_->RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ // We are not guaranteed the order in which those events will happen, so we
+ // try to accommodate both possibilities.
+ int total_called = 0;
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable))
+ .Times(AtMost(1))
+ .WillOnce([&]() {
+ ++total_called;
+ ASSERT_TRUE(loop_->UnregisterSocket(write_fd_));
+ });
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable))
+ .Times(AtMost(1))
+ .WillOnce([&]() {
+ ++total_called;
+ ASSERT_TRUE(loop_->UnregisterSocket(read_fd_));
+ });
+ ASSERT_TRUE(loop_->ArtificiallyNotifyEvent(read_fd_, kSocketEventReadable));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ EXPECT_EQ(total_called, 1);
+}
+
+TEST_P(QuicEventLoopFactoryTest, UnregisterSelfInsideEventHandler) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable))
+ .WillOnce([&]() { ASSERT_TRUE(loop_->UnregisterSocket(write_fd_)); });
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+}
+
+// Creates a bidirectional socket and tests its behavior when it's both readable
+// and writable.
+TEST_P(QuicEventLoopFactoryTest, ReadWriteSocket) {
+ int sockets[2];
+ ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sockets), 0);
+ auto close_sockets = absl::MakeCleanup([&]() {
+ close(sockets[0]);
+ close(sockets[1]);
+ });
+ SetNonBlocking(sockets[0]);
+ SetNonBlocking(sockets[1]);
+
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_->RegisterSocket(sockets[0], kAllEvents, &listener));
+ EXPECT_CALL(listener, OnSocketEvent(_, sockets[0], kSocketEventWritable));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(4));
+
+ int io_result;
+ std::string data(2048, 'a');
+ do {
+ io_result = write(sockets[0], data.data(), data.size());
+ } while (io_result > 0);
+ ASSERT_EQ(errno, EAGAIN);
+
+ if (!loop_->SupportsEdgeTriggered()) {
+ ASSERT_TRUE(loop_->RearmSocket(sockets[0], kSocketEventWritable));
+ }
+ // We are not write-blocked, so this should not notify.
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(4));
+
+ EXPECT_GT(write(sockets[1], data.data(), data.size()), 0);
+ EXPECT_CALL(listener, OnSocketEvent(_, sockets[0], kSocketEventReadable));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(4));
+
+ do {
+ char buffer[2048];
+ io_result = read(sockets[1], buffer, sizeof(buffer));
+ } while (io_result > 0);
+ ASSERT_EQ(errno, EAGAIN);
+ // Here, we can receive either "writable" or "readable and writable"
+ // notification depending on the backend in question.
+ EXPECT_CALL(listener,
+ OnSocketEvent(_, sockets[0], HasFlagSet(kSocketEventWritable)));
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(4));
+}
+
+TEST_P(QuicEventLoopFactoryTest, AlarmInFuture) {
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm, delegate] = CreateAlarm();
+
+ alarm->Set(clock_.Now() + kAlarmTimeout);
+
+ bool alarm_called = false;
+ EXPECT_CALL(*delegate, OnAlarm()).WillOnce([&]() { alarm_called = true; });
+ RunEventLoopUntil([&]() { return alarm_called; },
+ QuicTime::Delta::FromMilliseconds(100));
+}
+
+TEST_P(QuicEventLoopFactoryTest, AlarmsInPast) {
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm1, delegate1] = CreateAlarm();
+ auto [alarm2, delegate2] = CreateAlarm();
+
+ alarm1->Set(clock_.Now() - 2 * kAlarmTimeout);
+ alarm2->Set(clock_.Now() - kAlarmTimeout);
+
+ {
+ testing::InSequence s;
+ EXPECT_CALL(*delegate1, OnAlarm());
+ EXPECT_CALL(*delegate2, OnAlarm());
+ }
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
+}
+
+TEST_P(QuicEventLoopFactoryTest, AlarmCancelled) {
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm, delegate] = CreateAlarm();
+
+ alarm->Set(clock_.Now() + kAlarmTimeout);
+ alarm->Cancel();
+
+ loop_->RunEventLoopOnce(kAlarmTimeout * 2);
+}
+
+TEST_P(QuicEventLoopFactoryTest, AlarmCancelledAndSetAgain) {
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm, delegate] = CreateAlarm();
+
+ alarm->Set(clock_.Now() + kAlarmTimeout);
+ alarm->Cancel();
+ alarm->Set(clock_.Now() + 2 * kAlarmTimeout);
+
+ bool alarm_called = false;
+ EXPECT_CALL(*delegate, OnAlarm()).WillOnce([&]() { alarm_called = true; });
+ RunEventLoopUntil([&]() { return alarm_called; },
+ QuicTime::Delta::FromMilliseconds(100));
+}
+
+TEST_P(QuicEventLoopFactoryTest, AlarmCancelsAnotherAlarm) {
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm1_ptr, delegate1] = CreateAlarm();
+ auto [alarm2_ptr, delegate2] = CreateAlarm();
+
+ QuicAlarm& alarm1 = *alarm1_ptr;
+ QuicAlarm& alarm2 = *alarm2_ptr;
+ alarm1.Set(clock_.Now() - kAlarmTimeout);
+ alarm2.Set(clock_.Now() - kAlarmTimeout);
+
+ int alarms_called = 0;
+ // Since the order in which alarms are cancelled is not well-determined, make
+ // each one cancel another.
+ EXPECT_CALL(*delegate1, OnAlarm()).Times(AtMost(1)).WillOnce([&]() {
+ alarm2.Cancel();
+ ++alarms_called;
+ });
+ EXPECT_CALL(*delegate2, OnAlarm()).Times(AtMost(1)).WillOnce([&]() {
+ alarm1.Cancel();
+ ++alarms_called;
+ });
+ // Run event loop twice to ensure the second alarm is not called after two
+ // iterations.
+ loop_->RunEventLoopOnce(kAlarmTimeout * 2);
+ loop_->RunEventLoopOnce(kAlarmTimeout * 2);
+ EXPECT_EQ(alarms_called, 1);
+}
+
+TEST_P(QuicEventLoopFactoryTest, DestructorWithPendingAlarm) {
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm1_ptr, delegate1] = CreateAlarm();
+
+ alarm1_ptr->Set(clock_.Now() + kAlarmTimeout);
+ // Expect destructor to cleanly unregister itself before the event loop is
+ // gone.
+}
+
+TEST_P(QuicEventLoopFactoryTest, NegativeTimeout) {
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromSeconds(300);
+ auto [alarm1_ptr, delegate1] = CreateAlarm();
+
+ alarm1_ptr->Set(clock_.Now() + kAlarmTimeout);
+
+ loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(-1));
+}
+
+} // namespace
+} // namespace quic::test
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_default_event_loop.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_default_event_loop.cc
new file mode 100644
index 00000000000..8c1877c4fd2
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_default_event_loop.cc
@@ -0,0 +1,43 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+
+#include <memory>
+
+#include "quiche/quic/core/io/quic_poll_event_loop.h"
+#include "quiche/common/platform/api/quiche_event_loop.h"
+
+#ifdef QUICHE_ENABLE_LIBEVENT
+#include "quiche/quic/bindings/quic_libevent.h"
+#endif
+
+namespace quic {
+
+QuicEventLoopFactory* GetDefaultEventLoop() {
+ if (QuicEventLoopFactory* factory =
+ quiche::GetOverrideForDefaultEventLoop()) {
+ return factory;
+ }
+#ifdef QUICHE_ENABLE_LIBEVENT
+ return QuicLibeventEventLoopFactory::Get();
+#else
+ return QuicPollEventLoopFactory::Get();
+#endif
+}
+
+std::vector<QuicEventLoopFactory*> GetAllSupportedEventLoops() {
+ std::vector<QuicEventLoopFactory*> loops = {
+#ifdef QUICHE_ENABLE_LIBEVENT
+ QuicLibeventEventLoopFactory::Get(),
+ QuicLibeventEventLoopFactory::GetLevelTriggeredBackendForTests(),
+#endif
+ QuicPollEventLoopFactory::Get()};
+ std::vector<QuicEventLoopFactory*> extra =
+ quiche::GetExtraEventLoopImplementations();
+ loops.insert(loops.end(), extra.begin(), extra.end());
+ return loops;
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_default_event_loop.h b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_default_event_loop.h
new file mode 100644
index 00000000000..6073a6e9a38
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_default_event_loop.h
@@ -0,0 +1,26 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_IO_QUIC_DEFAULT_EVENT_LOOP_H_
+#define QUICHE_QUIC_CORE_IO_QUIC_DEFAULT_EVENT_LOOP_H_
+
+#include <memory>
+
+#include "quiche/quic/core/io/quic_event_loop.h"
+
+namespace quic {
+
+// Returns the default implementation of QuicheEventLoop. The embedders can
+// override this using the platform API. The factory pointer returned is an
+// unowned static variable.
+QUICHE_NO_EXPORT QuicEventLoopFactory* GetDefaultEventLoop();
+
+// Returns the factory objects for all event loops. This is particularly useful
+// for the unit tests. The factory pointers returned are unowned static
+// variables.
+QUICHE_NO_EXPORT std::vector<QuicEventLoopFactory*> GetAllSupportedEventLoops();
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_IO_QUIC_DEFAULT_EVENT_LOOP_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_event_loop.h b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_event_loop.h
new file mode 100644
index 00000000000..1b09562d8c2
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_event_loop.h
@@ -0,0 +1,97 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_IO_QUIC_EVENT_LOOP_H_
+#define QUICHE_QUIC_IO_QUIC_EVENT_LOOP_H_
+
+#include <cstdint>
+#include <memory>
+
+#include "absl/base/attributes.h"
+#include "quiche/quic/core/quic_alarm_factory.h"
+#include "quiche/quic/core/quic_clock.h"
+#include "quiche/quic/core/quic_udp_socket.h"
+
+namespace quic {
+
+// A bitmask indicating a set of I/O events.
+using QuicSocketEventMask = uint8_t;
+inline constexpr QuicSocketEventMask kSocketEventReadable = 0x01;
+inline constexpr QuicSocketEventMask kSocketEventWritable = 0x02;
+inline constexpr QuicSocketEventMask kSocketEventError = 0x04;
+
+class QuicEventLoop;
+
+// A listener associated with a file descriptor.
+class QUICHE_NO_EXPORT QuicSocketEventListener {
+ public:
+ virtual ~QuicSocketEventListener() = default;
+
+ virtual void OnSocketEvent(QuicEventLoop* event_loop, QuicUdpSocketFd fd,
+ QuicSocketEventMask events) = 0;
+};
+
+// An abstraction for an event loop that can handle alarms and notify the
+// listener about I/O events occuring to the registered UDP sockets.
+//
+// Note on error handling: while most of the methods below return a boolean to
+// indicate whether the operation has succeeded or not, some will QUIC_BUG
+// instead.
+class QUICHE_NO_EXPORT QuicEventLoop {
+ public:
+ virtual ~QuicEventLoop() = default;
+
+ // Indicates whether the event loop implementation supports edge-triggered
+ // notifications. If true, all of the events are permanent and are notified
+ // as long as they are registered. If false, whenever an event is triggered,
+ // the event registration is unset and has to be re-armed using RearmSocket().
+ virtual bool SupportsEdgeTriggered() const = 0;
+
+ // Watches for all of the requested |events| that occur on the |fd| and
+ // notifies the |listener| about them. |fd| must not be already registered;
+ // if it is, the function returns false. The |listener| must be alive for as
+ // long as it is registered.
+ virtual ABSL_MUST_USE_RESULT bool RegisterSocket(
+ QuicUdpSocketFd fd, QuicSocketEventMask events,
+ QuicSocketEventListener* listener) = 0;
+ // Removes the listener associated with |fd|. Returns false if the listener
+ // is not found.
+ virtual ABSL_MUST_USE_RESULT bool UnregisterSocket(QuicUdpSocketFd fd) = 0;
+ // Adds |events| to the list of the listened events for |fd|, given that |fd|
+ // is already registered. Must be only called if SupportsEdgeTriggered() is
+ // false.
+ virtual ABSL_MUST_USE_RESULT bool RearmSocket(QuicUdpSocketFd fd,
+ QuicSocketEventMask events) = 0;
+ // Causes the |fd| to be notified of |events| on the next event loop iteration
+ // even if none of the specified events has happened.
+ virtual ABSL_MUST_USE_RESULT bool ArtificiallyNotifyEvent(
+ QuicUdpSocketFd fd, QuicSocketEventMask events) = 0;
+
+ // Runs a single iteration of the event loop. The iteration will run for at
+ // most |default_timeout|.
+ virtual void RunEventLoopOnce(QuicTime::Delta default_timeout) = 0;
+
+ // Returns an alarm factory that allows alarms to be scheduled on this event
+ // loop.
+ virtual std::unique_ptr<QuicAlarmFactory> CreateAlarmFactory() = 0;
+};
+
+// A factory object for the event loop. Every implementation is expected to have
+// a static singleton instance.
+class QUICHE_NO_EXPORT QuicEventLoopFactory {
+ public:
+ virtual ~QuicEventLoopFactory() {}
+
+ // Creates an event loop. Note that |clock| may be ignored if the event loop
+ // implementation uses its own clock internally.
+ virtual std::unique_ptr<QuicEventLoop> Create(QuicClock* clock) = 0;
+
+ // A human-readable name of the event loop implementation used in diagnostics
+ // output.
+ virtual std::string GetName() const = 0;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_IO_QUIC_EVENT_LOOP_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.cc
new file mode 100644
index 00000000000..1c90be54d12
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.cc
@@ -0,0 +1,266 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/core/io/quic_poll_event_loop.h"
+
+#include <poll.h>
+
+#include <algorithm>
+#include <cerrno>
+#include <memory>
+
+#include "absl/types/span.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_alarm.h"
+#include "quiche/quic/core/quic_time.h"
+#include "quiche/quic/platform/api/quic_bug_tracker.h"
+
+namespace quic {
+
+namespace {
+
+using PollMask = decltype(::pollfd().events);
+
+PollMask GetPollMask(QuicSocketEventMask event_mask) {
+ return ((event_mask & kSocketEventReadable) ? POLLIN : 0) |
+ ((event_mask & kSocketEventWritable) ? POLLOUT : 0) |
+ ((event_mask & kSocketEventError) ? POLLERR : 0);
+}
+
+QuicSocketEventMask GetEventMask(PollMask poll_mask) {
+ return ((poll_mask & POLLIN) ? kSocketEventReadable : 0) |
+ ((poll_mask & POLLOUT) ? kSocketEventWritable : 0) |
+ ((poll_mask & POLLERR) ? kSocketEventError : 0);
+}
+
+} // namespace
+
+QuicPollEventLoop::QuicPollEventLoop(QuicClock* clock) : clock_(clock) {}
+
+bool QuicPollEventLoop::RegisterSocket(QuicUdpSocketFd fd,
+ QuicSocketEventMask events,
+ QuicSocketEventListener* listener) {
+ auto [it, success] =
+ registrations_.insert({fd, std::make_shared<Registration>()});
+ if (!success) {
+ return false;
+ }
+ Registration& registration = *it->second;
+ registration.events = events;
+ registration.listener = listener;
+ return true;
+}
+
+bool QuicPollEventLoop::UnregisterSocket(QuicUdpSocketFd fd) {
+ return registrations_.erase(fd);
+}
+
+bool QuicPollEventLoop::RearmSocket(QuicUdpSocketFd fd,
+ QuicSocketEventMask events) {
+ auto it = registrations_.find(fd);
+ if (it == registrations_.end()) {
+ return false;
+ }
+ it->second->events |= events;
+ return true;
+}
+
+bool QuicPollEventLoop::ArtificiallyNotifyEvent(QuicUdpSocketFd fd,
+ QuicSocketEventMask events) {
+ auto it = registrations_.find(fd);
+ if (it == registrations_.end()) {
+ return false;
+ }
+ has_artificial_events_pending_ = true;
+ it->second->artificially_notify_at_next_iteration |= events;
+ return true;
+}
+
+void QuicPollEventLoop::RunEventLoopOnce(QuicTime::Delta default_timeout) {
+ const QuicTime start_time = clock_->Now();
+ ProcessAlarmsUpTo(start_time);
+
+ QuicTime::Delta timeout = ComputePollTimeout(start_time, default_timeout);
+ ProcessIoEvents(start_time, timeout);
+
+ const QuicTime end_time = clock_->Now();
+ ProcessAlarmsUpTo(end_time);
+}
+
+QuicTime::Delta QuicPollEventLoop::ComputePollTimeout(
+ QuicTime now, QuicTime::Delta default_timeout) const {
+ default_timeout = std::max(default_timeout, QuicTime::Delta::Zero());
+ if (has_artificial_events_pending_) {
+ return QuicTime::Delta::Zero();
+ }
+ if (alarms_.empty()) {
+ return default_timeout;
+ }
+ QuicTime end_time = std::min(now + default_timeout, alarms_.begin()->first);
+ if (end_time < now) {
+ // Since we call ProcessAlarmsUpTo() right before this, this should never
+ // happen.
+ QUIC_BUG(Newest alarm is in the past)
+ << "now " << now.ToDebuggingValue()
+ << ", end_time: " << end_time.ToDebuggingValue()
+ << ", default timeout: " << default_timeout;
+ return QuicTime::Delta::Zero();
+ }
+ return end_time - now;
+}
+
+int QuicPollEventLoop::PollWithRetries(absl::Span<pollfd> fds,
+ QuicTime start_time,
+ QuicTime::Delta timeout) {
+ const QuicTime timeout_at = start_time + timeout;
+ int poll_result;
+ for (;;) {
+ float timeout_ms = std::ceil(timeout.ToMicroseconds() / 1000.f);
+ poll_result =
+ PollSyscall(fds.data(), fds.size(), static_cast<int>(timeout_ms));
+
+ // Retry if EINTR happens.
+ bool is_eintr = poll_result < 0 && errno == EINTR;
+ if (!is_eintr) {
+ break;
+ }
+ QuicTime now = clock_->Now();
+ if (now >= timeout_at) {
+ break;
+ }
+ timeout = timeout_at - now;
+ }
+ return poll_result;
+}
+
+void QuicPollEventLoop::ProcessIoEvents(QuicTime start_time,
+ QuicTime::Delta timeout) {
+ // Set up the pollfd[] array.
+ const size_t registration_count = registrations_.size();
+ auto pollfds = std::make_unique<pollfd[]>(registration_count);
+ size_t i = 0;
+ for (auto& [fd, registration] : registrations_) {
+ QUICHE_CHECK_LT(
+ i, registration_count); // Crash instead of out-of-bounds access.
+ pollfds[i].fd = fd;
+ pollfds[i].events = GetPollMask(registration->events);
+ pollfds[i].revents = 0;
+ ++i;
+ }
+
+ // Actually run poll(2).
+ int poll_result =
+ PollWithRetries(absl::Span<pollfd>(pollfds.get(), registration_count),
+ start_time, timeout);
+ if (poll_result == 0 && !has_artificial_events_pending_) {
+ return;
+ }
+
+ // Prepare the list of all callbacks to be called, while resetting all events,
+ // since we're operating in the level-triggered mode.
+ std::vector<ReadyListEntry> ready_list;
+ ready_list.reserve(registration_count);
+ for (i = 0; i < registration_count; i++) {
+ DispatchIoEvent(ready_list, pollfds[i].fd, pollfds[i].revents);
+ }
+ has_artificial_events_pending_ = false;
+
+ // Actually call all of the callbacks.
+ RunReadyCallbacks(ready_list);
+}
+
+void QuicPollEventLoop::DispatchIoEvent(std::vector<ReadyListEntry>& ready_list,
+ QuicUdpSocketFd fd, PollMask mask) {
+ auto it = registrations_.find(fd);
+ if (it == registrations_.end()) {
+ QUIC_BUG(poll returned an unregistered fd) << fd;
+ return;
+ }
+ Registration& registration = *it->second;
+
+ mask |= GetPollMask(registration.artificially_notify_at_next_iteration);
+ registration.artificially_notify_at_next_iteration = QuicSocketEventMask();
+
+ // poll() always returns certain classes of events even if not requested.
+ mask &= GetPollMask(registration.events);
+ if (!mask) {
+ return;
+ }
+
+ ready_list.push_back(ReadyListEntry{fd, it->second, GetEventMask(mask)});
+ registration.events &= ~GetEventMask(mask);
+}
+
+void QuicPollEventLoop::RunReadyCallbacks(
+ std::vector<ReadyListEntry>& ready_list) {
+ for (ReadyListEntry& entry : ready_list) {
+ std::shared_ptr<Registration> registration = entry.registration.lock();
+ if (!registration) {
+ // The socket has been unregistered from within one of the callbacks.
+ continue;
+ }
+ registration->listener->OnSocketEvent(this, entry.fd, entry.events);
+ }
+ ready_list.clear();
+}
+
+void QuicPollEventLoop::ProcessAlarmsUpTo(QuicTime time) {
+ // Determine which alarm callbacks needs to be run.
+ std::vector<std::weak_ptr<Alarm*>> alarms_to_call;
+ while (!alarms_.empty() && alarms_.begin()->first <= time) {
+ auto& [deadline, schedule_handle_weak] = *alarms_.begin();
+ alarms_to_call.push_back(std::move(schedule_handle_weak));
+ alarms_.erase(alarms_.begin());
+ }
+ // Actually run those callbacks.
+ for (std::weak_ptr<Alarm*>& schedule_handle_weak : alarms_to_call) {
+ std::shared_ptr<Alarm*> schedule_handle = schedule_handle_weak.lock();
+ if (!schedule_handle) {
+ // The alarm has been cancelled and might not even exist anymore.
+ continue;
+ }
+ (*schedule_handle)->DoFire();
+ }
+ // Clean up all of the alarms in the front that have been cancelled.
+ while (!alarms_.empty()) {
+ if (alarms_.begin()->second.expired()) {
+ alarms_.erase(alarms_.begin());
+ } else {
+ break;
+ }
+ }
+}
+
+QuicAlarm* QuicPollEventLoop::AlarmFactory::CreateAlarm(
+ QuicAlarm::Delegate* delegate) {
+ return new Alarm(loop_, QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate));
+}
+
+QuicArenaScopedPtr<QuicAlarm> QuicPollEventLoop::AlarmFactory::CreateAlarm(
+ QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
+ QuicConnectionArena* arena) {
+ if (arena != nullptr) {
+ return arena->New<Alarm>(loop_, std::move(delegate));
+ }
+ return QuicArenaScopedPtr<QuicAlarm>(new Alarm(loop_, std::move(delegate)));
+}
+
+QuicPollEventLoop::Alarm::Alarm(
+ QuicPollEventLoop* loop, QuicArenaScopedPtr<QuicAlarm::Delegate> delegate)
+ : QuicAlarm(std::move(delegate)), loop_(loop) {}
+
+void QuicPollEventLoop::Alarm::SetImpl() {
+ current_schedule_handle_ = std::make_shared<Alarm*>(this);
+ loop_->alarms_.insert({deadline(), current_schedule_handle_});
+}
+
+void QuicPollEventLoop::Alarm::CancelImpl() {
+ current_schedule_handle_.reset();
+}
+
+std::unique_ptr<QuicAlarmFactory> QuicPollEventLoop::CreateAlarmFactory() {
+ return std::make_unique<AlarmFactory>(this);
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.h b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.h
new file mode 100644
index 00000000000..4e19ff91349
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop.h
@@ -0,0 +1,165 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_IO_QUIC_POLL_EVENT_LOOP_H_
+#define QUICHE_QUIC_CORE_IO_QUIC_POLL_EVENT_LOOP_H_
+
+#include <poll.h>
+
+#include <memory>
+
+#include "absl/container/btree_map.h"
+#include "absl/types/span.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_alarm.h"
+#include "quiche/quic/core/quic_alarm_factory.h"
+#include "quiche/quic/core/quic_clock.h"
+#include "quiche/quic/core/quic_udp_socket.h"
+#include "quiche/common/quiche_linked_hash_map.h"
+
+namespace quic {
+
+// A simple and portable implementation of QuicEventLoop using poll(2). Works
+// on all POSIX platforms (and can be potentially made to support Windows using
+// WSAPoll).
+//
+// For most operations, this implementation has a typical runtime of
+// O(N + log M), where N is the number of file descriptors, and M is the number
+// of pending alarms.
+//
+// This API has to deal with the situations where callbacks are modified from
+// the callbacks themselves. To address this, we use the following two
+// approaches:
+// 1. The code does not execute any callbacks until the very end of the
+// processing, when all of the state for the event loop is consistent.
+// 2. The callbacks are stored as weak pointers, since other callbacks can
+// cause them to be unregistered.
+class QUICHE_NO_EXPORT QuicPollEventLoop : public QuicEventLoop {
+ public:
+ QuicPollEventLoop(QuicClock* clock);
+
+ // QuicEventLoop implementation.
+ bool SupportsEdgeTriggered() const override { return false; }
+ ABSL_MUST_USE_RESULT bool RegisterSocket(
+ QuicUdpSocketFd fd, QuicSocketEventMask events,
+ QuicSocketEventListener* listener) override;
+ ABSL_MUST_USE_RESULT bool UnregisterSocket(QuicUdpSocketFd fd) override;
+ ABSL_MUST_USE_RESULT bool RearmSocket(QuicUdpSocketFd fd,
+ QuicSocketEventMask events) override;
+ ABSL_MUST_USE_RESULT bool ArtificiallyNotifyEvent(
+ QuicUdpSocketFd fd, QuicSocketEventMask events) override;
+ void RunEventLoopOnce(QuicTime::Delta default_timeout) override;
+ std::unique_ptr<QuicAlarmFactory> CreateAlarmFactory() override;
+
+ protected:
+ // Allows poll(2) calls to be mocked out in unit tests.
+ virtual int PollSyscall(pollfd* fds, nfds_t nfds, int timeout) {
+ return ::poll(fds, nfds, timeout);
+ }
+
+ private:
+ friend class QuicPollEventLoopPeer;
+
+ struct Registration {
+ QuicSocketEventMask events = 0;
+ QuicSocketEventListener* listener;
+
+ QuicSocketEventMask artificially_notify_at_next_iteration = 0;
+ };
+
+ class Alarm : public QuicAlarm {
+ public:
+ Alarm(QuicPollEventLoop* loop,
+ QuicArenaScopedPtr<QuicAlarm::Delegate> delegate);
+
+ void SetImpl() override;
+ void CancelImpl() override;
+
+ void DoFire() {
+ current_schedule_handle_.reset();
+ Fire();
+ }
+
+ private:
+ QuicPollEventLoop* loop_;
+ // Deleted when the alarm is cancelled, causing the corresponding weak_ptr
+ // in the alarm list to not be executed.
+ std::shared_ptr<Alarm*> current_schedule_handle_;
+ };
+
+ class AlarmFactory : public QuicAlarmFactory {
+ public:
+ AlarmFactory(QuicPollEventLoop* loop) : loop_(loop) {}
+
+ // QuicAlarmFactory implementation.
+ QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) override;
+ QuicArenaScopedPtr<QuicAlarm> CreateAlarm(
+ QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
+ QuicConnectionArena* arena) override;
+
+ private:
+ QuicPollEventLoop* loop_;
+ };
+
+ // Used for deferred execution of I/O callbacks.
+ struct ReadyListEntry {
+ QuicUdpSocketFd fd;
+ std::weak_ptr<Registration> registration;
+ QuicSocketEventMask events;
+ };
+
+ // We're using a linked hash map here to ensure the events are called in the
+ // registration order. This isn't strictly speaking necessary, but makes
+ // testing things easier.
+ using RegistrationMap =
+ quiche::QuicheLinkedHashMap<QuicUdpSocketFd,
+ std::shared_ptr<Registration>>;
+ // Alarms are stored as weak pointers, since the alarm can be cancelled and
+ // disappear while in the queue.
+ using AlarmList = absl::btree_multimap<QuicTime, std::weak_ptr<Alarm*>>;
+
+ // Returns the timeout for the next poll(2) call. It is typically the time at
+ // which the next alarm is supposed to activate.
+ QuicTime::Delta ComputePollTimeout(QuicTime now,
+ QuicTime::Delta default_timeout) const;
+ // Calls poll(2) with the provided timeout and dispatches the callbacks
+ // accordingly.
+ void ProcessIoEvents(QuicTime start_time, QuicTime::Delta timeout);
+ // Calls all of the alarm callbacks that are scheduled before or at |time|.
+ void ProcessAlarmsUpTo(QuicTime time);
+
+ // Adds the I/O callbacks for |fd| to the |ready_lits| as appopriate.
+ void DispatchIoEvent(std::vector<ReadyListEntry>& ready_list,
+ QuicUdpSocketFd fd, short mask); // NOLINT(runtime/int)
+ // Runs all of the callbacks on the ready list.
+ void RunReadyCallbacks(std::vector<ReadyListEntry>& ready_list);
+
+ // Calls poll() while handling EINTR. Returns the return value of poll(2)
+ // system call.
+ int PollWithRetries(absl::Span<pollfd> fds, QuicTime start_time,
+ QuicTime::Delta timeout);
+
+ const QuicClock* clock_;
+ RegistrationMap registrations_;
+ AlarmList alarms_;
+ bool has_artificial_events_pending_ = false;
+};
+
+class QUICHE_NO_EXPORT QuicPollEventLoopFactory : public QuicEventLoopFactory {
+ public:
+ static QuicPollEventLoopFactory* Get() {
+ static QuicPollEventLoopFactory* factory = new QuicPollEventLoopFactory();
+ return factory;
+ }
+
+ std::unique_ptr<QuicEventLoop> Create(QuicClock* clock) override {
+ return std::make_unique<QuicPollEventLoop>(clock);
+ }
+
+ std::string GetName() const override { return "poll(2)"; }
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_IO_QUIC_POLL_EVENT_LOOP_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop_test.cc
new file mode 100644
index 00000000000..f0e95577e1e
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/quic_poll_event_loop_test.cc
@@ -0,0 +1,342 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/core/io/quic_poll_event_loop.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <cerrno>
+#include <memory>
+#include <vector>
+
+#include "absl/memory/memory.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_alarm.h"
+#include "quiche/quic/core/quic_alarm_factory.h"
+#include "quiche/quic/core/quic_time.h"
+#include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/quic/test_tools/mock_clock.h"
+
+namespace quic {
+
+class QuicPollEventLoopPeer {
+ public:
+ static QuicTime::Delta ComputePollTimeout(const QuicPollEventLoop& loop,
+ QuicTime now,
+ QuicTime::Delta default_timeout) {
+ return loop.ComputePollTimeout(now, default_timeout);
+ }
+};
+
+} // namespace quic
+
+namespace quic::test {
+namespace {
+
+using testing::_;
+using testing::AtMost;
+using testing::ElementsAre;
+
+constexpr QuicSocketEventMask kAllEvents =
+ kSocketEventReadable | kSocketEventWritable | kSocketEventError;
+constexpr QuicTime::Delta kDefaultTimeout = QuicTime::Delta::FromSeconds(100);
+
+class MockQuicSocketEventListener : public QuicSocketEventListener {
+ public:
+ MOCK_METHOD(void, OnSocketEvent,
+ (QuicEventLoop* /*event_loop*/, QuicUdpSocketFd /*fd*/,
+ QuicSocketEventMask /*events*/),
+ (override));
+};
+
+class MockDelegate : public QuicAlarm::Delegate {
+ public:
+ QuicConnectionContext* GetConnectionContext() override { return nullptr; }
+ MOCK_METHOD(void, OnAlarm, (), (override));
+};
+
+class QuicPollEventLoopForTest : public QuicPollEventLoop {
+ public:
+ QuicPollEventLoopForTest(MockClock* clock)
+ : QuicPollEventLoop(clock), clock_(clock) {}
+
+ int PollSyscall(pollfd* fds, nfds_t nfds, int timeout) override {
+ timeouts_.push_back(timeout);
+ if (eintr_after_ != QuicTime::Delta::Infinite()) {
+ errno = EINTR;
+ clock_->AdvanceTime(eintr_after_);
+ eintr_after_ = QuicTime::Delta::Infinite();
+ return -1;
+ }
+ clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(timeout));
+ return QuicPollEventLoop::PollSyscall(fds, nfds, timeout);
+ }
+
+ void TriggerEintrAfter(QuicTime::Delta time) { eintr_after_ = time; }
+
+ const std::vector<int>& timeouts() const { return timeouts_; }
+
+ private:
+ MockClock* clock_;
+ QuicTime::Delta eintr_after_ = QuicTime::Delta::Infinite();
+ std::vector<int> timeouts_;
+};
+
+class QuicPollEventLoopTest : public QuicTest {
+ public:
+ QuicPollEventLoopTest()
+ : loop_(&clock_), factory_(loop_.CreateAlarmFactory()) {
+ int fds[2];
+ int result = ::pipe(fds);
+ QUICHE_CHECK(result >= 0) << "Failed to create a pipe, errno: " << errno;
+ read_fd_ = fds[0];
+ write_fd_ = fds[1];
+
+ QUICHE_CHECK(::fcntl(read_fd_, F_SETFL,
+ ::fcntl(read_fd_, F_GETFL) | O_NONBLOCK) == 0)
+ << "Failed to mark pipe FD non-blocking, errno: " << errno;
+ QUICHE_CHECK(::fcntl(write_fd_, F_SETFL,
+ ::fcntl(write_fd_, F_GETFL) | O_NONBLOCK) == 0)
+ << "Failed to mark pipe FD non-blocking, errno: " << errno;
+
+ clock_.AdvanceTime(10 * kDefaultTimeout);
+ }
+
+ ~QuicPollEventLoopTest() {
+ close(read_fd_);
+ close(write_fd_);
+ }
+
+ QuicTime::Delta ComputePollTimeout() {
+ return QuicPollEventLoopPeer::ComputePollTimeout(loop_, clock_.Now(),
+ kDefaultTimeout);
+ }
+
+ std::pair<std::unique_ptr<QuicAlarm>, MockDelegate*> CreateAlarm() {
+ auto delegate = std::make_unique<testing::StrictMock<MockDelegate>>();
+ MockDelegate* delegate_unowned = delegate.get();
+ auto alarm = absl::WrapUnique(factory_->CreateAlarm(delegate.release()));
+ return std::make_pair(std::move(alarm), delegate_unowned);
+ }
+
+ protected:
+ MockClock clock_;
+ QuicPollEventLoopForTest loop_;
+ std::unique_ptr<QuicAlarmFactory> factory_;
+ int read_fd_;
+ int write_fd_;
+};
+
+TEST_F(QuicPollEventLoopTest, NothingHappens) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ // Attempt double-registration.
+ EXPECT_FALSE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(4));
+ // Expect no further calls.
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(5));
+ EXPECT_THAT(loop_.timeouts(), ElementsAre(4, 5));
+}
+
+TEST_F(QuicPollEventLoopTest, RearmWriter) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable))
+ .Times(2);
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ ASSERT_TRUE(loop_.RearmSocket(write_fd_, kSocketEventWritable));
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+}
+
+TEST_F(QuicPollEventLoopTest, Readable) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
+
+ ASSERT_EQ(4, write(write_fd_, "test", 4));
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable));
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ // Expect no further calls.
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+}
+
+TEST_F(QuicPollEventLoopTest, RearmReader) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
+
+ ASSERT_EQ(4, write(write_fd_, "test", 4));
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable));
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ // Expect no further calls.
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+}
+
+TEST_F(QuicPollEventLoopTest, WriterUnblocked) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+
+ int io_result;
+ std::string data(2048, 'a');
+ do {
+ io_result = write(write_fd_, data.data(), data.size());
+ } while (io_result > 0);
+ ASSERT_EQ(errno, EAGAIN);
+
+ // Rearm and expect no immediate calls.
+ ASSERT_TRUE(loop_.RearmSocket(write_fd_, kSocketEventWritable));
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
+ do {
+ io_result = read(read_fd_, data.data(), data.size());
+ } while (io_result > 0);
+ ASSERT_EQ(errno, EAGAIN);
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+}
+
+TEST_F(QuicPollEventLoopTest, ArtificialEvent) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+ ASSERT_TRUE(loop_.ArtificiallyNotifyEvent(read_fd_, kSocketEventReadable));
+ EXPECT_EQ(ComputePollTimeout(), QuicTime::Delta::Zero());
+
+ {
+ testing::InSequence s;
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable));
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable));
+ }
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+}
+
+TEST_F(QuicPollEventLoopTest, Unregister) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
+ ASSERT_TRUE(loop_.UnregisterSocket(write_fd_));
+
+ // Expect nothing to happen.
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+
+ EXPECT_FALSE(loop_.UnregisterSocket(write_fd_));
+ EXPECT_FALSE(loop_.RearmSocket(write_fd_, kSocketEventWritable));
+ EXPECT_FALSE(loop_.ArtificiallyNotifyEvent(write_fd_, kSocketEventWritable));
+}
+
+TEST_F(QuicPollEventLoopTest, UnregisterInsideEventHandler) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
+ ASSERT_TRUE(loop_.RegisterSocket(write_fd_, kAllEvents, &listener));
+
+ EXPECT_CALL(listener, OnSocketEvent(_, read_fd_, kSocketEventReadable))
+ .WillOnce([this]() { ASSERT_TRUE(loop_.UnregisterSocket(write_fd_)); });
+ EXPECT_CALL(listener, OnSocketEvent(_, write_fd_, kSocketEventWritable))
+ .Times(0);
+ ASSERT_TRUE(loop_.ArtificiallyNotifyEvent(read_fd_, kSocketEventReadable));
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(1));
+}
+
+TEST_F(QuicPollEventLoopTest, EintrHandler) {
+ testing::StrictMock<MockQuicSocketEventListener> listener;
+ ASSERT_TRUE(loop_.RegisterSocket(read_fd_, kAllEvents, &listener));
+
+ loop_.TriggerEintrAfter(QuicTime::Delta::FromMilliseconds(25));
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
+ EXPECT_THAT(loop_.timeouts(), ElementsAre(100, 75));
+}
+
+TEST_F(QuicPollEventLoopTest, AlarmInFuture) {
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm, delegate] = CreateAlarm();
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+
+ alarm->Set(clock_.Now() + kAlarmTimeout);
+ EXPECT_EQ(ComputePollTimeout(), kAlarmTimeout);
+
+ EXPECT_CALL(*delegate, OnAlarm());
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+}
+
+TEST_F(QuicPollEventLoopTest, AlarmsInPast) {
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm1, delegate1] = CreateAlarm();
+ auto [alarm2, delegate2] = CreateAlarm();
+
+ alarm1->Set(clock_.Now() - 2 * kAlarmTimeout);
+ alarm2->Set(clock_.Now() - kAlarmTimeout);
+
+ {
+ testing::InSequence s;
+ EXPECT_CALL(*delegate1, OnAlarm());
+ EXPECT_CALL(*delegate2, OnAlarm());
+ }
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
+}
+
+TEST_F(QuicPollEventLoopTest, AlarmCancelled) {
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm, delegate] = CreateAlarm();
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+
+ alarm->Set(clock_.Now() + kAlarmTimeout);
+ alarm->Cancel();
+ alarm->Set(clock_.Now() + 2 * kAlarmTimeout);
+ EXPECT_EQ(ComputePollTimeout(), kAlarmTimeout);
+
+ EXPECT_CALL(*delegate, OnAlarm());
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
+ EXPECT_THAT(loop_.timeouts(), ElementsAre(10));
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+}
+
+TEST_F(QuicPollEventLoopTest, AlarmCancelsAnotherAlarm) {
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+
+ constexpr auto kAlarmTimeout = QuicTime::Delta::FromMilliseconds(5);
+ auto [alarm1_ptr, delegate1] = CreateAlarm();
+ auto [alarm2_ptr, delegate2] = CreateAlarm();
+
+ QuicAlarm& alarm1 = *alarm1_ptr;
+ QuicAlarm& alarm2 = *alarm2_ptr;
+ alarm1.Set(clock_.Now() - kAlarmTimeout);
+ alarm2.Set(clock_.Now() - kAlarmTimeout);
+
+ int alarms_called = 0;
+ // Since the order in which alarms are cancelled is not well-determined, make
+ // each one cancel another.
+ EXPECT_CALL(*delegate1, OnAlarm()).Times(AtMost(1)).WillOnce([&]() {
+ alarm2.Cancel();
+ ++alarms_called;
+ });
+ EXPECT_CALL(*delegate2, OnAlarm()).Times(AtMost(1)).WillOnce([&]() {
+ alarm1.Cancel();
+ ++alarms_called;
+ });
+ loop_.RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(100));
+ EXPECT_EQ(alarms_called, 1);
+ EXPECT_EQ(ComputePollTimeout(), kDefaultTimeout);
+}
+
+} // namespace
+} // namespace quic::test
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket.h b/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket.h
new file mode 100644
index 00000000000..fcc6418ac49
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket.h
@@ -0,0 +1,172 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_IO_SOCKET_H_
+#define QUICHE_QUIC_CORE_IO_SOCKET_H_
+
+#include <functional>
+#include <string>
+
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/span.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/quic/platform/api/quic_ip_address_family.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/platform/api/quiche_mem_slice.h"
+
+#if defined(_WIN32)
+#include <winsock2.h>
+#endif // defined(_WIN32)
+
+namespace quic {
+
+#if defined(_WIN32)
+using SocketFd = SOCKET;
+inline constexpr SocketFd kInvalidSocketFd = INVALID_SOCKET;
+#else
+using SocketFd = int;
+inline constexpr SocketFd kInvalidSocketFd = -1;
+#endif
+
+// A read/write socket.
+//
+// Warning regarding blocking calls: Code in the QUICHE library typically
+// handles IO on a single thread, so if making calls from that typical
+// environment, it would be problematic to make a blocking call and block that
+// single thread.
+class QUICHE_EXPORT_PRIVATE Socket {
+ public:
+ class AsyncVisitor {
+ public:
+ virtual ~AsyncVisitor() = default;
+
+ // If the operation completed without error, `data` is set to the received
+ // data.
+ virtual void ReceiveComplete(
+ absl::StatusOr<quiche::QuicheMemSlice> data) = 0;
+
+ virtual void SendComplete(absl::Status status) = 0;
+ };
+
+ virtual ~Socket() = default;
+
+ // Blocking read. Receives and returns a buffer of up to `max_size` bytes from
+ // socket. Returns status on error.
+ virtual absl::StatusOr<quiche::QuicheMemSlice> ReceiveBlocking(
+ QuicByteCount max_size) = 0;
+
+ // Asynchronous read. Receives up to `max_size` bytes from socket. If
+ // no data is synchronously available to be read, waits until some data is
+ // available or the socket is closed. On completion, calls ReceiveComplete()
+ // on the visitor, potentially before return from ReceiveAsync().
+ //
+ // After calling, the socket must not be destroyed until ReceiveComplete() is
+ // called.
+ virtual void ReceiveAsync(QuicByteCount max_size) = 0;
+
+ // Blocking write. Sends all of `data` (potentially via multiple underlying
+ // socket sends).
+ virtual absl::Status SendBlocking(std::string data) = 0;
+ virtual absl::Status SendBlocking(quiche::QuicheMemSlice data) = 0;
+
+ // Asynchronous write. Sends all of `data` (potentially via multiple
+ // underlying socket sends). On completion, calls SendComplete() on the
+ // visitor, potentially before return from SendAsync().
+ //
+ // After calling, the socket must not be destroyed until SendComplete() is
+ // called.
+ virtual void SendAsync(std::string data) = 0;
+ virtual void SendAsync(quiche::QuicheMemSlice data) = 0;
+};
+
+// Low-level platform-agnostic socket operations. Closely follows the behavior
+// of basic POSIX socket APIs, diverging mostly only to convert to/from cleaner
+// and platform-agnostic types.
+namespace socket_api {
+enum class SocketProtocol {
+ kUdp,
+ kTcp,
+};
+
+struct QUICHE_EXPORT_PRIVATE AcceptResult {
+ // Socket for interacting with the accepted connection.
+ SocketFd fd;
+
+ // Address of the connected peer.
+ QuicSocketAddress peer_address;
+};
+
+// Creates a socket with blocking or non-blocking behavior.
+absl::StatusOr<SocketFd> CreateSocket(IpAddressFamily address_family,
+ SocketProtocol protocol,
+ bool blocking = false);
+
+// Sets socket `fd` to blocking (if `blocking` true) or non-blocking (if
+// `blocking` false). Must be a change from previous state.
+absl::Status SetSocketBlocking(SocketFd fd, bool blocking);
+
+// Sets buffer sizes for socket `fd` to `size` bytes.
+absl::Status SetReceiveBufferSize(SocketFd fd, QuicByteCount size);
+absl::Status SetSendBufferSize(SocketFd fd, QuicByteCount size);
+
+// Connects socket `fd` to `peer_address`. Returns a status with
+// `absl::StatusCode::kUnavailable` iff the socket is non-blocking and the
+// connection could not be immediately completed. The socket will then complete
+// connecting asynchronously, and on becoming writable, the result can be
+// checked using GetSocketError().
+absl::Status Connect(SocketFd fd, const QuicSocketAddress& peer_address);
+
+// Gets and clears socket error information for socket `fd`. Note that returned
+// error could be either the found socket error, or unusually, an error from the
+// attempt to retrieve error information. Typically used to determine connection
+// result after asynchronous completion of a Connect() call.
+absl::Status GetSocketError(SocketFd fd);
+
+// Assign `address` to socket `fd`.
+absl::Status Bind(SocketFd fd, const QuicSocketAddress& address);
+
+// Gets the address assigned to socket `fd`.
+absl::StatusOr<QuicSocketAddress> GetSocketAddress(SocketFd fd);
+
+// Marks socket `fd` as a passive socket listening for connection requests.
+// `backlog` is the maximum number of queued connection requests. Typically
+// expected to return a status with `absl::StatusCode::InvalidArgumentError`
+// if `fd` is not a TCP socket.
+absl::Status Listen(SocketFd fd, int backlog);
+
+// Accepts an incoming connection to the listening socket `fd`. The returned
+// connection socket will be set as non-blocking iff `blocking` is false.
+// Typically expected to return a status with
+// `absl::StatusCode::InvalidArgumentError` if `fd` is not a TCP socket or not
+// listening for connections. Returns a status with
+// `absl::StatusCode::kUnavailable` iff the socket is non-blocking and no
+// incoming connection could be immediately accepted.
+absl::StatusOr<AcceptResult> Accept(SocketFd fd, bool blocking = false);
+
+// Receives data from socket `fd`. Will fill `buffer.data()` with up to
+// `buffer.size()` bytes. On success, returns a span pointing to the buffer
+// but resized to the actual number of bytes received. Returns a status with
+// `absl::StatusCode::kUnavailable` iff the socket is non-blocking and the
+// receive operation could not be immediately completed. If `peek` is true,
+// received data is not removed from the underlying socket data queue.
+absl::StatusOr<absl::Span<char>> Receive(SocketFd fd, absl::Span<char> buffer,
+ bool peek = false);
+
+// Sends some or all of the data in `buffer` to socket `fd`. On success,
+// returns a string_view pointing to the unsent remainder of the buffer (or an
+// empty string_view if all of `buffer` was successfully sent). Returns a status
+// with `absl::StatusCode::kUnavailable` iff the socket is non-blocking and the
+// send operation could not be immediately completed.
+absl::StatusOr<absl::string_view> Send(SocketFd fd, absl::string_view buffer);
+
+// Closes socket `fd`.
+absl::Status Close(SocketFd fd);
+} // namespace socket_api
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_IO_SOCKET_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_factory.h b/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_factory.h
new file mode 100644
index 00000000000..39102f1c870
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_factory.h
@@ -0,0 +1,34 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_IO_SOCKET_FACTORY_H_
+#define QUICHE_QUIC_CORE_IO_SOCKET_FACTORY_H_
+
+#include <memory>
+
+#include "quiche/quic/core/io/stream_client_socket.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/common/platform/api/quiche_export.h"
+
+namespace quic {
+
+// A factory to create objects of type Socket and derived interfaces.
+class QUICHE_EXPORT_PRIVATE SocketFactory {
+ public:
+ virtual ~SocketFactory() = default;
+
+ // Will use platform default buffer size if `receive_buffer_size` or
+ // `send_buffer_size` is zero. If `async_visitor` is null, async operations
+ // must not be called on the created socket. If `async_visitor` is non-null,
+ // it must outlive the created socket.
+ virtual std::unique_ptr<StreamClientSocket> CreateTcpClientSocket(
+ const quic::QuicSocketAddress& peer_address,
+ QuicByteCount receive_buffer_size, QuicByteCount send_buffer_size,
+ StreamClientSocket::AsyncVisitor* async_visitor) = 0;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_IO_SOCKET_FACTORY_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_posix.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_posix.cc
new file mode 100644
index 00000000000..59f286b67d7
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_posix.cc
@@ -0,0 +1,514 @@
+// Copyright 2022 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.
+#include <fcntl.h>
+#include <sys/socket.h>
+
+#include <climits>
+
+#include "absl/base/attributes.h"
+#include "absl/container/flat_hash_set.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "quiche/quic/core/io/socket.h"
+#include "quiche/quic/platform/api/quic_ip_address_family.h"
+#include "quiche/common/platform/api/quiche_logging.h"
+
+namespace quic::socket_api {
+
+namespace {
+
+int ToPlatformSocketType(SocketProtocol protocol) {
+ switch (protocol) {
+ case SocketProtocol::kUdp:
+ return SOCK_DGRAM;
+ case SocketProtocol::kTcp:
+ return SOCK_STREAM;
+ }
+
+ QUICHE_NOTREACHED();
+ return -1;
+}
+
+int ToPlatformProtocol(SocketProtocol protocol) {
+ switch (protocol) {
+ case SocketProtocol::kUdp:
+ return IPPROTO_UDP;
+ case SocketProtocol::kTcp:
+ return IPPROTO_TCP;
+ }
+
+ QUICHE_NOTREACHED();
+ return -1;
+}
+
+// Wrapper of absl::ErrnoToStatus that ensures the `unavailable_error_numbers`
+// and only those numbers result in `absl::StatusCode::kUnavailable`, converting
+// any other would-be-unavailable Statuses to `absl::StatusCode::kNotFound`.
+absl::Status ToStatus(int error_number, absl::string_view method_name,
+ absl::flat_hash_set<int> unavailable_error_numbers = {
+ EAGAIN, EWOULDBLOCK}) {
+ QUICHE_DCHECK_NE(error_number, 0);
+ QUICHE_DCHECK_NE(error_number, EINTR);
+
+ absl::Status status = absl::ErrnoToStatus(error_number, method_name);
+ QUICHE_DCHECK(!status.ok());
+
+ if (!absl::IsUnavailable(status) &&
+ unavailable_error_numbers.contains(error_number)) {
+ status = absl::UnavailableError(status.message());
+ } else if (absl::IsUnavailable(status) &&
+ !unavailable_error_numbers.contains(error_number)) {
+ status = absl::NotFoundError(status.message());
+ }
+
+ return status;
+}
+
+absl::Status SetSocketFlags(SocketFd fd, int to_add, int to_remove) {
+ QUICHE_DCHECK_GE(fd, 0);
+ QUICHE_DCHECK(to_add || to_remove);
+ QUICHE_DCHECK(!(to_add & to_remove));
+
+ int flags;
+ do {
+ flags = ::fcntl(fd, F_GETFL);
+ } while (flags < 0 && errno == EINTR);
+ if (flags < 0) {
+ absl::Status status = ToStatus(errno, "::fcntl()");
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Could not get flags for socket " << fd << " with error: " << status;
+ return status;
+ }
+
+ QUICHE_DCHECK(!(flags & to_add) || (flags & to_remove));
+
+ int fcntl_result;
+ do {
+ fcntl_result = ::fcntl(fd, F_SETFL, (flags | to_add) & ~to_remove);
+ } while (fcntl_result < 0 && errno == EINTR);
+ if (fcntl_result < 0) {
+ absl::Status status = ToStatus(errno, "::fcntl()");
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Could not set flags for socket " << fd << " with error: " << status;
+ return status;
+ }
+
+ return absl::OkStatus();
+}
+
+absl::StatusOr<QuicSocketAddress> ValidateAndConvertAddress(
+ const sockaddr_storage& addr, socklen_t addr_len) {
+ if (addr.ss_family != AF_INET && addr.ss_family != AF_INET6) {
+ QUICHE_DVLOG(1) << "Socket did not have recognized address family: "
+ << addr.ss_family;
+ return absl::UnimplementedError("Unrecognized address family.");
+ }
+
+ if ((addr.ss_family == AF_INET && addr_len != sizeof(sockaddr_in)) ||
+ (addr.ss_family == AF_INET6 && addr_len != sizeof(sockaddr_in6))) {
+ QUICHE_DVLOG(1) << "Socket did not have expected address size ("
+ << (addr.ss_family == AF_INET ? sizeof(sockaddr_in)
+ : sizeof(sockaddr_in6))
+ << "), had: " << addr_len;
+ return absl::UnimplementedError("Unhandled address size.");
+ }
+
+ return QuicSocketAddress(addr);
+}
+
+absl::StatusOr<SocketFd> CreateSocketWithFlags(IpAddressFamily address_family,
+ SocketProtocol protocol,
+ int flags) {
+ int address_family_int = ToPlatformAddressFamily(address_family);
+
+ int type_int = ToPlatformSocketType(protocol);
+ type_int |= flags;
+
+ int protocol_int = ToPlatformProtocol(protocol);
+
+ SocketFd fd;
+ do {
+ fd = ::socket(address_family_int, type_int, protocol_int);
+ } while (fd < 0 && errno == EINTR);
+
+ if (fd >= 0) {
+ return fd;
+ } else {
+ absl::Status status = ToStatus(errno, "::socket()");
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Failed to create socket with error: " << status;
+ return status;
+ }
+}
+
+absl::StatusOr<AcceptResult> AcceptInternal(SocketFd fd) {
+ QUICHE_DCHECK_GE(fd, 0);
+
+ sockaddr_storage peer_addr;
+ socklen_t peer_addr_len = sizeof(peer_addr);
+ SocketFd connection_socket;
+ do {
+ connection_socket = ::accept(
+ fd, reinterpret_cast<struct sockaddr*>(&peer_addr), &peer_addr_len);
+ } while (connection_socket < 0 && errno == EINTR);
+
+ if (connection_socket < 0) {
+ absl::Status status = ToStatus(errno, "::accept()");
+ QUICHE_DVLOG(1) << "Failed to accept connection from socket " << fd
+ << " with error: " << status;
+ return status;
+ }
+
+ absl::StatusOr<QuicSocketAddress> peer_address =
+ ValidateAndConvertAddress(peer_addr, peer_addr_len);
+
+ if (peer_address.ok()) {
+ return AcceptResult{connection_socket, peer_address.value()};
+ } else {
+ return peer_address.status();
+ }
+}
+
+#if defined(__linux__) && defined(SOCK_NONBLOCK)
+absl::StatusOr<AcceptResult> AcceptWithFlags(SocketFd fd, int flags) {
+ QUICHE_DCHECK_GE(fd, 0);
+
+ sockaddr_storage peer_addr;
+ socklen_t peer_addr_len = sizeof(peer_addr);
+ SocketFd connection_socket;
+ do {
+ connection_socket =
+ ::accept4(fd, reinterpret_cast<struct sockaddr*>(&peer_addr),
+ &peer_addr_len, flags);
+ } while (connection_socket < 0 && errno == EINTR);
+
+ if (connection_socket < 0) {
+ absl::Status status = ToStatus(errno, "::accept4()");
+ QUICHE_DVLOG(1) << "Failed to accept connection from socket " << fd
+ << " with error: " << status;
+ return status;
+ }
+
+ absl::StatusOr<QuicSocketAddress> peer_address =
+ ValidateAndConvertAddress(peer_addr, peer_addr_len);
+
+ if (peer_address.ok()) {
+ return AcceptResult{connection_socket, peer_address.value()};
+ } else {
+ return peer_address.status();
+ }
+}
+#endif // defined(__linux__) && defined(SOCK_NONBLOCK)
+
+socklen_t GetAddrlen(IpAddressFamily family) {
+ switch (family) {
+ case IpAddressFamily::IP_V4:
+ return sizeof(sockaddr_in);
+ case IpAddressFamily::IP_V6:
+ return sizeof(sockaddr_in6);
+ default:
+ QUICHE_NOTREACHED();
+ return 0;
+ }
+}
+
+absl::Status SetSockOptInt(SocketFd fd, int option, int value) {
+ QUICHE_DCHECK_GE(fd, 0);
+
+ int result;
+ do {
+ result = ::setsockopt(fd, SOL_SOCKET, option, &value, sizeof(value));
+ } while (result < 0 && errno == EINTR);
+
+ if (result >= 0) {
+ return absl::OkStatus();
+ } else {
+ absl::Status status = ToStatus(errno, "::setsockopt()");
+ QUICHE_DVLOG(1) << "Failed to set socket " << fd << " option " << option
+ << " to " << value << " with error: " << status;
+ return status;
+ }
+}
+
+} // namespace
+
+absl::StatusOr<SocketFd> CreateSocket(IpAddressFamily address_family,
+ SocketProtocol protocol, bool blocking) {
+ int flags = 0;
+#if defined(__linux__) && defined(SOCK_NONBLOCK)
+ if (!blocking) {
+ flags = SOCK_NONBLOCK;
+ }
+#endif
+
+ absl::StatusOr<SocketFd> socket =
+ CreateSocketWithFlags(address_family, protocol, flags);
+ if (!socket.ok() || blocking) {
+ return socket;
+ }
+
+#if !defined(__linux__) || !defined(SOCK_NONBLOCK)
+ // If non-blocking could not be set directly on socket creation, need to do
+ // it now.
+ absl::Status set_non_blocking_result =
+ SetSocketBlocking(socket.value(), /*blocking=*/false);
+ if (!set_non_blocking_result.ok()) {
+ QUICHE_LOG_FIRST_N(ERROR, 100) << "Failed to set socket " << socket.value()
+ << " as non-blocking on creation.";
+ if (!Close(socket.value()).ok()) {
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Failed to close socket " << socket.value()
+ << " after set-non-blocking error on creation.";
+ }
+ return set_non_blocking_result;
+ }
+#endif
+
+ return socket;
+}
+
+absl::Status SetSocketBlocking(SocketFd fd, bool blocking) {
+ if (blocking) {
+ return SetSocketFlags(fd, /*to_add=*/0, /*to_remove=*/O_NONBLOCK);
+ } else {
+ return SetSocketFlags(fd, /*to_add=*/O_NONBLOCK, /*to_remove=*/0);
+ }
+}
+
+absl::Status SetReceiveBufferSize(SocketFd fd, QuicByteCount size) {
+ QUICHE_DCHECK_GE(fd, 0);
+ QUICHE_DCHECK_LE(size, QuicByteCount{INT_MAX});
+
+ return SetSockOptInt(fd, SO_RCVBUF, static_cast<int>(size));
+}
+
+absl::Status SetSendBufferSize(SocketFd fd, QuicByteCount size) {
+ QUICHE_DCHECK_GE(fd, 0);
+ QUICHE_DCHECK_LE(size, QuicByteCount{INT_MAX});
+
+ return SetSockOptInt(fd, SO_SNDBUF, static_cast<int>(size));
+}
+
+absl::Status Connect(SocketFd fd, const QuicSocketAddress& peer_address) {
+ QUICHE_DCHECK_GE(fd, 0);
+ QUICHE_DCHECK(peer_address.IsInitialized());
+
+ sockaddr_storage addr = peer_address.generic_address();
+ socklen_t addrlen = GetAddrlen(peer_address.host().address_family());
+
+ int connect_result;
+ do {
+ connect_result = ::connect(fd, reinterpret_cast<sockaddr*>(&addr), addrlen);
+ } while (connect_result < 0 && errno == EINTR);
+
+ if (connect_result >= 0) {
+ return absl::OkStatus();
+ } else {
+ // For ::connect(), only `EINPROGRESS` indicates unavailable.
+ absl::Status status =
+ ToStatus(errno, "::connect()", /*unavailable_error_numbers=*/
+ {EINPROGRESS});
+ QUICHE_DVLOG(1) << "Failed to connect socket " << fd
+ << " to address: " << peer_address.ToString()
+ << " with error: " << status;
+ return status;
+ }
+}
+
+absl::Status GetSocketError(SocketFd fd) {
+ QUICHE_DCHECK_GE(fd, 0);
+
+ int socket_error = 0;
+ socklen_t len = sizeof(socket_error);
+ int sockopt_result;
+ do {
+ sockopt_result =
+ ::getsockopt(fd, SOL_SOCKET, SO_ERROR, &socket_error, &len);
+ } while (sockopt_result < 0 && errno == EINTR);
+
+ if (sockopt_result >= 0) {
+ if (socket_error == 0) {
+ return absl::OkStatus();
+ } else {
+ return ToStatus(socket_error, "SO_ERROR");
+ }
+ } else {
+ absl::Status status = ToStatus(errno, "::getsockopt()");
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Failed to get socket error information from socket " << fd
+ << " with error: " << status;
+ return status;
+ }
+}
+
+absl::Status Bind(SocketFd fd, const QuicSocketAddress& address) {
+ QUICHE_DCHECK_GE(fd, 0);
+ QUICHE_DCHECK(address.IsInitialized());
+
+ sockaddr_storage addr = address.generic_address();
+ socklen_t addr_len = GetAddrlen(address.host().address_family());
+
+ int result;
+ do {
+ result = ::bind(fd, reinterpret_cast<sockaddr*>(&addr), addr_len);
+ } while (result < 0 && errno == EINTR);
+
+ if (result >= 0) {
+ return absl::OkStatus();
+ } else {
+ absl::Status status = ToStatus(errno, "::bind()");
+ QUICHE_DVLOG(1) << "Failed to bind socket " << fd
+ << " to address: " << address.ToString()
+ << " with error: " << status;
+ return status;
+ }
+}
+
+absl::StatusOr<QuicSocketAddress> GetSocketAddress(SocketFd fd) {
+ QUICHE_DCHECK_GE(fd, 0);
+
+ sockaddr_storage addr;
+ socklen_t addr_len = sizeof(addr);
+
+ int result;
+ do {
+ result = ::getsockname(fd, reinterpret_cast<sockaddr*>(&addr), &addr_len);
+ } while (result < 0 && errno == EINTR);
+
+ if (result >= 0) {
+ return ValidateAndConvertAddress(addr, addr_len);
+ } else {
+ absl::Status status = ToStatus(errno, "::getsockname()");
+ QUICHE_DVLOG(1) << "Failed to get socket " << fd
+ << " name with error: " << status;
+ return status;
+ }
+}
+
+absl::Status Listen(SocketFd fd, int backlog) {
+ QUICHE_DCHECK_GE(fd, 0);
+ QUICHE_DCHECK_GT(backlog, 0);
+
+ int result;
+ do {
+ result = ::listen(fd, backlog);
+ } while (result < 0 && errno == EINTR);
+
+ if (result >= 0) {
+ return absl::OkStatus();
+ } else {
+ absl::Status status = ToStatus(errno, "::listen()");
+ QUICHE_DVLOG(1) << "Failed to mark socket: " << fd
+ << " to listen with error :" << status;
+ return status;
+ }
+}
+
+absl::StatusOr<AcceptResult> Accept(SocketFd fd, bool blocking) {
+ QUICHE_DCHECK_GE(fd, 0);
+
+#if defined(__linux__) && defined(SOCK_NONBLOCK)
+ if (!blocking) {
+ return AcceptWithFlags(fd, SOCK_NONBLOCK);
+ }
+#endif
+
+ absl::StatusOr<AcceptResult> accept_result = AcceptInternal(fd);
+ if (!accept_result.ok() || blocking) {
+ return accept_result;
+ }
+
+#if !defined(__linux__) || !defined(SOCK_NONBLOCK)
+ // If non-blocking could not be set directly on socket acceptance, need to
+ // do it now.
+ absl::Status set_non_blocking_result =
+ SetSocketBlocking(accept_result.value().fd, /*blocking=*/false);
+ if (!set_non_blocking_result.ok()) {
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Failed to set socket " << fd << " as non-blocking on acceptance.";
+ if (!Close(accept_result.value().fd).ok()) {
+ QUICHE_LOG_FIRST_N(ERROR, 100)
+ << "Failed to close socket " << accept_result.value().fd
+ << " after error setting non-blocking on acceptance.";
+ }
+ return set_non_blocking_result;
+ }
+#endif
+
+ return accept_result;
+}
+
+absl::StatusOr<absl::Span<char>> Receive(SocketFd fd, absl::Span<char> buffer,
+ bool peek) {
+ QUICHE_DCHECK_GE(fd, 0);
+ QUICHE_DCHECK(!buffer.empty());
+
+ ssize_t num_read;
+ do {
+ num_read =
+ ::recv(fd, buffer.data(), buffer.size(), /*flags=*/peek ? MSG_PEEK : 0);
+ } while (num_read < 0 && errno == EINTR);
+
+ if (num_read > 0 && static_cast<size_t>(num_read) > buffer.size()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Received more bytes (" << num_read << ") from socket " << fd
+ << " than buffer size (" << buffer.size() << ").";
+ return absl::OutOfRangeError(
+ "::recv(): Received more bytes than buffer size.");
+ } else if (num_read >= 0) {
+ return buffer.subspan(0, num_read);
+ } else {
+ absl::Status status = ToStatus(errno, "::recv()");
+ QUICHE_DVLOG(1) << "Failed to receive from socket: " << fd
+ << " with error: " << status;
+ return status;
+ }
+}
+
+absl::StatusOr<absl::string_view> Send(SocketFd fd, absl::string_view buffer) {
+ QUICHE_DCHECK_GE(fd, 0);
+ QUICHE_DCHECK(!buffer.empty());
+
+ ssize_t num_sent;
+ do {
+ num_sent = ::send(fd, buffer.data(), buffer.size(), /*flags=*/0);
+ } while (num_sent < 0 && errno == EINTR);
+
+ if (num_sent > 0 && static_cast<size_t>(num_sent) > buffer.size()) {
+ QUICHE_LOG_FIRST_N(WARNING, 100)
+ << "Sent more bytes (" << num_sent << ") to socket " << fd
+ << " than buffer size (" << buffer.size() << ").";
+ return absl::OutOfRangeError("::send(): Sent more bytes than buffer size.");
+ } else if (num_sent >= 0) {
+ return buffer.substr(num_sent);
+ } else {
+ absl::Status status = ToStatus(errno, "::send()");
+ QUICHE_DVLOG(1) << "Failed to send to socket: " << fd
+ << " with error: " << status;
+ return status;
+ }
+}
+
+absl::Status Close(SocketFd fd) {
+ QUICHE_DCHECK_GE(fd, 0);
+
+ int close_result = ::close(fd);
+
+ if (close_result >= 0) {
+ return absl::OkStatus();
+ } else if (errno == EINTR) {
+ // Ignore EINTR on close because the socket is left in an undefined state
+ // and can't be acted on again.
+ QUICHE_DVLOG(1) << "Socket " << fd << " close unspecified due to EINTR.";
+ return absl::OkStatus();
+ } else {
+ absl::Status status = ToStatus(errno, "::close()");
+ QUICHE_DVLOG(1) << "Failed to close socket: " << fd
+ << " with error: " << status;
+ return status;
+ }
+}
+
+} // namespace quic::socket_api
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_test.cc
new file mode 100644
index 00000000000..9afe0f695a1
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/socket_test.cc
@@ -0,0 +1,197 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/core/io/socket.h"
+
+#include <string>
+#include <utility>
+
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/span.h"
+#include "quiche/quic/platform/api/quic_ip_address_family.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/platform/api/quiche_test.h"
+#include "quiche/common/platform/api/quiche_test_loopback.h"
+
+namespace quic {
+namespace {
+
+using quiche::test::QuicheTest;
+using testing::Lt;
+using testing::SizeIs;
+
+SocketFd CreateTestSocket(socket_api::SocketProtocol protocol,
+ bool blocking = true) {
+ absl::StatusOr<SocketFd> socket = socket_api::CreateSocket(
+ quiche::TestLoopback().address_family(), protocol, blocking);
+
+ if (socket.ok()) {
+ return socket.value();
+ } else {
+ QUICHE_CHECK(false);
+ return kInvalidSocketFd;
+ }
+}
+
+TEST(SocketTest, CreateAndCloseSocket) {
+ QuicIpAddress localhost_address = quiche::TestLoopback();
+ absl::StatusOr<SocketFd> created_socket = socket_api::CreateSocket(
+ localhost_address.address_family(), socket_api::SocketProtocol::kUdp);
+
+ EXPECT_TRUE(created_socket.ok());
+
+ EXPECT_TRUE(socket_api::Close(created_socket.value()).ok());
+}
+
+TEST(SocketTest, SetSocketBlocking) {
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp,
+ /*blocking=*/true);
+
+ EXPECT_TRUE(socket_api::SetSocketBlocking(socket, /*blocking=*/false).ok());
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, SetReceiveBufferSize) {
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp,
+ /*blocking=*/true);
+
+ EXPECT_TRUE(socket_api::SetReceiveBufferSize(socket, /*size=*/100).ok());
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, SetSendBufferSize) {
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp,
+ /*blocking=*/true);
+
+ EXPECT_TRUE(socket_api::SetSendBufferSize(socket, /*size=*/100).ok());
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, Connect) {
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp);
+
+ // UDP, so "connecting" should succeed without any listening sockets.
+ EXPECT_TRUE(socket_api::Connect(
+ socket, QuicSocketAddress(quiche::TestLoopback(), /*port=*/0))
+ .ok());
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, GetSocketError) {
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp,
+ /*blocking=*/true);
+
+ absl::Status error = socket_api::GetSocketError(socket);
+ EXPECT_TRUE(error.ok());
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, Bind) {
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp);
+
+ EXPECT_TRUE(socket_api::Bind(
+ socket, QuicSocketAddress(quiche::TestLoopback(), /*port=*/0))
+ .ok());
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, GetSocketAddress) {
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp);
+ ASSERT_TRUE(socket_api::Bind(
+ socket, QuicSocketAddress(quiche::TestLoopback(), /*port=*/0))
+ .ok());
+
+ absl::StatusOr<QuicSocketAddress> address =
+ socket_api::GetSocketAddress(socket);
+ EXPECT_TRUE(address.ok());
+ EXPECT_TRUE(address.value().IsInitialized());
+ EXPECT_EQ(address.value().host(), quiche::TestLoopback());
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, Listen) {
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kTcp);
+ ASSERT_TRUE(socket_api::Bind(
+ socket, QuicSocketAddress(quiche::TestLoopback(), /*port=*/0))
+ .ok());
+
+ EXPECT_TRUE(socket_api::Listen(socket, /*backlog=*/5).ok());
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, Accept) {
+ // Need a non-blocking socket to avoid waiting when no connection comes.
+ SocketFd socket =
+ CreateTestSocket(socket_api::SocketProtocol::kTcp, /*blocking=*/false);
+ ASSERT_TRUE(socket_api::Bind(
+ socket, QuicSocketAddress(quiche::TestLoopback(), /*port=*/0))
+ .ok());
+ ASSERT_TRUE(socket_api::Listen(socket, /*backlog=*/5).ok());
+
+ // Nothing set up to connect, so expect kUnavailable.
+ absl::StatusOr<socket_api::AcceptResult> result = socket_api::Accept(socket);
+ ASSERT_FALSE(result.ok());
+ EXPECT_TRUE(absl::IsUnavailable(result.status()));
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, Receive) {
+ // Non-blocking to avoid waiting when no data to receive.
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp,
+ /*blocking=*/false);
+
+ std::string buffer(100, 0);
+ absl::StatusOr<absl::Span<char>> result =
+ socket_api::Receive(socket, absl::MakeSpan(buffer));
+ ASSERT_FALSE(result.ok());
+ EXPECT_TRUE(absl::IsUnavailable(result.status()));
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, Peek) {
+ // Non-blocking to avoid waiting when no data to receive.
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp,
+ /*blocking=*/false);
+
+ std::string buffer(100, 0);
+ absl::StatusOr<absl::Span<char>> result =
+ socket_api::Receive(socket, absl::MakeSpan(buffer), /*peek=*/true);
+ ASSERT_FALSE(result.ok());
+ EXPECT_TRUE(absl::IsUnavailable(result.status()));
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+TEST(SocketTest, Send) {
+ SocketFd socket = CreateTestSocket(socket_api::SocketProtocol::kUdp);
+ // UDP, so "connecting" should succeed without any listening sockets.
+ ASSERT_TRUE(socket_api::Connect(
+ socket, QuicSocketAddress(quiche::TestLoopback(), /*port=*/0))
+ .ok());
+
+ char buffer[] = {12, 34, 56, 78};
+ // Expect at least some data to be sent successfully.
+ absl::StatusOr<absl::string_view> result =
+ socket_api::Send(socket, absl::string_view(buffer, sizeof(buffer)));
+ ASSERT_TRUE(result.ok());
+ EXPECT_THAT(result.value(), SizeIs(Lt(4)));
+
+ EXPECT_TRUE(socket_api::Close(socket).ok());
+}
+
+} // namespace
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/io/stream_client_socket.h b/chromium/net/third_party/quiche/src/quiche/quic/core/io/stream_client_socket.h
new file mode 100644
index 00000000000..00f9a42a5ad
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/io/stream_client_socket.h
@@ -0,0 +1,62 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_IO_STREAM_CLIENT_SOCKET_H_
+#define QUICHE_QUIC_CORE_IO_STREAM_CLIENT_SOCKET_H_
+
+#include "absl/status/status.h"
+#include "quiche/quic/core/io/socket.h"
+#include "quiche/common/platform/api/quiche_export.h"
+
+namespace quic {
+
+// A client socket using a protocol (typically TCP) that provides
+// connection-based streams.
+//
+// Must not destroy a connected/connecting socket. If connected or connecting,
+// must call Disconnect() to disconnect or cancel the connection before
+// destruction.
+//
+// Warning regarding blocking calls: Code in the QUICHE library typically
+// handles IO on a single thread, so if making calls from that typical
+// environment, it would be problematic to make a blocking call and block that
+// single thread.
+class QUICHE_EXPORT_PRIVATE StreamClientSocket : public Socket {
+ public:
+ class AsyncVisitor : public Socket::AsyncVisitor {
+ public:
+ virtual void ConnectComplete(absl::Status status) = 0;
+ };
+
+ ~StreamClientSocket() override = default;
+
+ // Establishes a connection synchronously. Should not be called if socket has
+ // already been successfully connected without first calling Disconnect().
+ virtual absl::Status ConnectBlocking() = 0;
+
+ // Establishes a connection asynchronously. On completion, calls
+ // ConnectComplete() on the visitor, potentially before return from
+ // ConnectAsync(). Should not be called if socket has already been
+ // successfully connected without first calling Disconnect().
+ //
+ // After calling, the socket must not be destroyed until Disconnect() is
+ // called.
+ virtual void ConnectAsync() = 0;
+
+ // Disconnects a connected socket or cancels an in-progress ConnectAsync(),
+ // invoking the `ConnectComplete(absl::CancelledError())` on the visitor.
+ // After success, it is possible to call ConnectBlocking() or ConnectAsync()
+ // again to establish a new connection. Cancels any pending read or write
+ // operations, calling visitor completion methods with
+ // `absl::CancelledError()`.
+ //
+ // Typically implemented via a call to ::close(), which for TCP can result in
+ // either FIN or RST, depending on socket/platform state and undefined
+ // platform behavior.
+ virtual void Disconnect() = 0;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_IO_STREAM_CLIENT_SOCKET_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc
index 0f4766bf97e..b932b3daf54 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator.cc
@@ -8,6 +8,7 @@
#include "quiche/quic/core/qpack/qpack_decoder.h"
#include "quiche/quic/core/qpack/qpack_header_table.h"
#include "quiche/quic/platform/api/quic_bug_tracker.h"
+#include "quiche/quic/platform/api/quic_flags.h"
namespace quic {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
index b3e54be0b0d..e4847c11491 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
@@ -10,7 +10,6 @@
#include "absl/strings/string_view.h"
#include "quiche/quic/core/qpack/qpack_decoder.h"
#include "quiche/quic/platform/api/quic_test.h"
-#include "quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h"
#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
using ::testing::_;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h
index e06379537e8..9474378631c 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h
@@ -122,6 +122,16 @@ class QUIC_EXPORT_PRIVATE QpackDecoder
uint64_t known_received_count_;
};
+// QpackDecoder::EncoderStreamErrorDelegate implementation that does nothing.
+class QUIC_EXPORT_PRIVATE NoopEncoderStreamErrorDelegate
+ : public QpackDecoder::EncoderStreamErrorDelegate {
+ public:
+ ~NoopEncoderStreamErrorDelegate() override = default;
+
+ void OnEncoderStreamError(QuicErrorCode /*error_code*/,
+ absl::string_view /*error_message*/) override {}
+};
+
} // namespace quic
#endif // QUICHE_QUIC_CORE_QPACK_QPACK_DECODER_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_test.cc
index e5b8504e5f3..ecf3a178286 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder_test.cc
@@ -13,7 +13,6 @@
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h"
#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
-#include "quiche/spdy/core/spdy_header_block.h"
using ::testing::_;
using ::testing::Eq;
@@ -224,9 +223,14 @@ TEST_P(QpackDecoderTest, ValueLenExceedsLimit) {
}
TEST_P(QpackDecoderTest, LineFeedInValue) {
- EXPECT_CALL(handler_,
- OnDecodingErrorDetected(QUIC_INVALID_CHARACTER_IN_FIELD_VALUE,
- "Invalid character in field value."));
+ if (!GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream)) {
+ EXPECT_CALL(handler_,
+ OnDecodingErrorDetected(QUIC_INVALID_CHARACTER_IN_FIELD_VALUE,
+ "Invalid character in field value."));
+ } else {
+ EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("ba\nr")));
+ EXPECT_CALL(handler_, OnDecodingCompleted());
+ }
DecodeHeaderBlock(absl::HexStringToBytes("000023666f6f0462610a72"));
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.h b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.h
index a47e925c8c3..89d08b1a9f6 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder.h
@@ -20,7 +20,7 @@
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/platform/api/quic_export.h"
#include "quiche/quic/platform/api/quic_exported_stats.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -155,6 +155,16 @@ class QUIC_EXPORT_PRIVATE QpackEncoder
int header_list_count_;
};
+// QpackEncoder::DecoderStreamErrorDelegate implementation that does nothing.
+class QUIC_EXPORT_PRIVATE NoopDecoderStreamErrorDelegate
+ : public QpackEncoder::DecoderStreamErrorDelegate {
+ public:
+ ~NoopDecoderStreamErrorDelegate() override = default;
+
+ void OnDecoderStreamError(QuicErrorCode /*error_code*/, absl::string_view
+ /*error_message*/) override {}
+};
+
} // namespace quic
#endif // QUICHE_QUIC_CORE_QPACK_QPACK_ENCODER_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_test.cc
index ba3fa296b00..aa40a8ae563 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_encoder_test.cc
@@ -12,7 +12,6 @@
#include "absl/strings/string_view.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/qpack/qpack_encoder_peer.h"
-#include "quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h"
#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
using ::testing::_;
@@ -30,6 +29,17 @@ namespace {
// stream.
constexpr uint64_t kTooManyBytesBuffered = 1024 * 1024;
+// Mock QpackEncoder::DecoderStreamErrorDelegate implementation.
+class MockDecoderStreamErrorDelegate
+ : public QpackEncoder::DecoderStreamErrorDelegate {
+ public:
+ ~MockDecoderStreamErrorDelegate() override = default;
+
+ MOCK_METHOD(void, OnDecoderStreamError,
+ (QuicErrorCode error_code, absl::string_view error_message),
+ (override));
+};
+
class QpackEncoderTest : public QuicTest {
protected:
QpackEncoderTest()
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc
index 7258128e747..feea62a007c 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_progressive_decoder.cc
@@ -342,21 +342,24 @@ bool QpackProgressiveDecoder::DoPrefixInstruction() {
bool QpackProgressiveDecoder::OnHeaderDecoded(bool value_from_static_table,
absl::string_view name,
absl::string_view value) {
- // Skip test for static table entries as they are all known to be valid.
- if (!value_from_static_table) {
- // According to Section 10.3 of
- // https://quicwg.org/base-drafts/draft-ietf-quic-http.html,
- // "[...] HTTP/3 can transport field values that are not valid. While most
- // values that can be encoded will not alter field parsing, carriage return
- // (CR, ASCII 0x0d), line feed (LF, ASCII 0x0a), and the zero character
- // (NUL, ASCII 0x00) might be exploited by an attacker if they are
- // translated verbatim. Any request or response that contains a character
- // not permitted in a field value MUST be treated as malformed [...]"
- for (const auto c : value) {
- if (c == '\0' || c == '\n' || c == '\r') {
- OnError(QUIC_INVALID_CHARACTER_IN_FIELD_VALUE,
- "Invalid character in field value.");
- return false;
+ if (!GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream)) {
+ // Skip test for static table entries as they are all known to be valid.
+ if (!value_from_static_table) {
+ // According to Section 10.3 of
+ // https://quicwg.org/base-drafts/draft-ietf-quic-http.html,
+ // "[...] HTTP/3 can transport field values that are not valid. While most
+ // values that can be encoded will not alter field parsing, carriage
+ // return (CR, ASCII 0x0d), line feed (LF, ASCII 0x0a), and the zero
+ // character (NUL, ASCII 0x00) might be exploited by an attacker if they
+ // are translated verbatim. Any request or response that contains a
+ // character not permitted in a field value MUST be treated as malformed
+ // [...]"
+ for (const auto c : value) {
+ if (c == '\0' || c == '\n' || c == '\r') {
+ OnError(QUIC_INVALID_CHARACTER_IN_FIELD_VALUE,
+ "Invalid character in field value.");
+ return false;
+ }
}
}
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc
index 00a18c53eb8..147c627e284 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc
@@ -6,11 +6,12 @@
#include <tuple>
#include "absl/strings/string_view.h"
+#include "quiche/quic/core/qpack/qpack_decoder.h"
+#include "quiche/quic/core/qpack/qpack_encoder.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h"
-#include "quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h"
#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
using ::testing::Values;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.h b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.h
index cc9939abc28..e2750332a16 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/value_splitting_header_list.h
@@ -7,7 +7,7 @@
#include "absl/strings/string_view.h"
#include "quiche/quic/platform/api/quic_export.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_bandwidth.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_bandwidth.h
index 26956b21d4e..33356abc35e 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_bandwidth.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_bandwidth.h
@@ -76,7 +76,7 @@ class QUIC_EXPORT_PRIVATE QuicBandwidth {
int64_t ToKBytesPerSecond() const { return bits_per_second_ / 8000; }
- QuicByteCount ToBytesPerPeriod(QuicTime::Delta time_period) const {
+ constexpr QuicByteCount ToBytesPerPeriod(QuicTime::Delta time_period) const {
return bits_per_second_ * time_period.ToMicroseconds() / 8 /
kNumMicrosPerSecond;
}
@@ -91,7 +91,7 @@ class QUIC_EXPORT_PRIVATE QuicBandwidth {
return bits_per_second_ == Infinite().ToBitsPerSecond();
}
- QuicTime::Delta TransferTime(QuicByteCount bytes) const {
+ constexpr QuicTime::Delta TransferTime(QuicByteCount bytes) const {
if (bits_per_second_ == 0) {
return QuicTime::Delta::Zero();
}
@@ -107,9 +107,11 @@ class QUIC_EXPORT_PRIVATE QuicBandwidth {
int64_t bits_per_second_;
- friend QuicBandwidth operator+(QuicBandwidth lhs, QuicBandwidth rhs);
- friend QuicBandwidth operator-(QuicBandwidth lhs, QuicBandwidth rhs);
- friend QuicBandwidth operator*(QuicBandwidth lhs, float factor);
+ friend constexpr QuicBandwidth operator+(QuicBandwidth lhs,
+ QuicBandwidth rhs);
+ friend constexpr QuicBandwidth operator-(QuicBandwidth lhs,
+ QuicBandwidth rhs);
+ friend QuicBandwidth operator*(QuicBandwidth lhs, float rhs);
};
// Non-member relational operators for QuicBandwidth.
@@ -133,10 +135,10 @@ inline bool operator>=(QuicBandwidth lhs, QuicBandwidth rhs) {
}
// Non-member arithmetic operators for QuicBandwidth.
-inline QuicBandwidth operator+(QuicBandwidth lhs, QuicBandwidth rhs) {
+inline constexpr QuicBandwidth operator+(QuicBandwidth lhs, QuicBandwidth rhs) {
return QuicBandwidth(lhs.bits_per_second_ + rhs.bits_per_second_);
}
-inline QuicBandwidth operator-(QuicBandwidth lhs, QuicBandwidth rhs) {
+inline constexpr QuicBandwidth operator-(QuicBandwidth lhs, QuicBandwidth rhs) {
return QuicBandwidth(lhs.bits_per_second_ - rhs.bits_per_second_);
}
inline QuicBandwidth operator*(QuicBandwidth lhs, float rhs) {
@@ -146,10 +148,12 @@ inline QuicBandwidth operator*(QuicBandwidth lhs, float rhs) {
inline QuicBandwidth operator*(float lhs, QuicBandwidth rhs) {
return rhs * lhs;
}
-inline QuicByteCount operator*(QuicBandwidth lhs, QuicTime::Delta rhs) {
+inline constexpr QuicByteCount operator*(QuicBandwidth lhs,
+ QuicTime::Delta rhs) {
return lhs.ToBytesPerPeriod(rhs);
}
-inline QuicByteCount operator*(QuicTime::Delta lhs, QuicBandwidth rhs) {
+inline constexpr QuicByteCount operator*(QuicTime::Delta lhs,
+ QuicBandwidth rhs) {
return rhs * lhs;
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc
index 0269cdfddd8..553d835e20d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.cc
@@ -180,39 +180,36 @@ BufferedPacketList QuicBufferedPacketStore::DeliverPackets(
if (it != undecryptable_packets_.end()) {
packets_to_deliver = std::move(it->second);
undecryptable_packets_.erase(connection_id);
- if (GetQuicReloadableFlag(quic_deliver_initial_packets_first)) {
- QUIC_RELOADABLE_FLAG_COUNT(quic_deliver_initial_packets_first);
- std::list<BufferedPacket> initial_packets;
- std::list<BufferedPacket> other_packets;
- for (auto& packet : packets_to_deliver.buffered_packets) {
- QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
- PacketHeaderFormat unused_format;
- bool unused_version_flag;
- bool unused_use_length_prefix;
- QuicVersionLabel unused_version_label;
- ParsedQuicVersion unused_parsed_version = UnsupportedQuicVersion();
- QuicConnectionId unused_destination_connection_id;
- QuicConnectionId unused_source_connection_id;
- absl::optional<absl::string_view> unused_retry_token;
- std::string unused_detailed_error;
-
- QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
- *packet.packet, kQuicDefaultConnectionIdLength, &unused_format,
- &long_packet_type, &unused_version_flag, &unused_use_length_prefix,
- &unused_version_label, &unused_parsed_version,
- &unused_destination_connection_id, &unused_source_connection_id,
- &unused_retry_token, &unused_detailed_error);
-
- if (error_code == QUIC_NO_ERROR && long_packet_type == INITIAL) {
- initial_packets.push_back(std::move(packet));
- } else {
- other_packets.push_back(std::move(packet));
- }
+ std::list<BufferedPacket> initial_packets;
+ std::list<BufferedPacket> other_packets;
+ for (auto& packet : packets_to_deliver.buffered_packets) {
+ QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
+ PacketHeaderFormat unused_format;
+ bool unused_version_flag;
+ bool unused_use_length_prefix;
+ QuicVersionLabel unused_version_label;
+ ParsedQuicVersion unused_parsed_version = UnsupportedQuicVersion();
+ QuicConnectionId unused_destination_connection_id;
+ QuicConnectionId unused_source_connection_id;
+ absl::optional<absl::string_view> unused_retry_token;
+ std::string unused_detailed_error;
+
+ QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher(
+ *packet.packet, kQuicDefaultConnectionIdLength, &unused_format,
+ &long_packet_type, &unused_version_flag, &unused_use_length_prefix,
+ &unused_version_label, &unused_parsed_version,
+ &unused_destination_connection_id, &unused_source_connection_id,
+ &unused_retry_token, &unused_detailed_error);
+
+ if (error_code == QUIC_NO_ERROR && long_packet_type == INITIAL) {
+ initial_packets.push_back(std::move(packet));
+ } else {
+ other_packets.push_back(std::move(packet));
}
+ }
initial_packets.splice(initial_packets.end(), other_packets);
packets_to_deliver.buffered_packets = std::move(initial_packets);
- }
}
return packets_to_deliver;
}
@@ -294,9 +291,10 @@ bool QuicBufferedPacketStore::IngestPacketForTlsChloExtraction(
const QuicConnectionId& connection_id, const ParsedQuicVersion& version,
const QuicReceivedPacket& packet, std::vector<std::string>* out_alpns,
std::string* out_sni, bool* out_resumption_attempted,
- bool* out_early_data_attempted) {
+ bool* out_early_data_attempted, absl::optional<uint8_t>* tls_alert) {
QUICHE_DCHECK_NE(out_alpns, nullptr);
QUICHE_DCHECK_NE(out_sni, nullptr);
+ QUICHE_DCHECK_NE(tls_alert, nullptr);
QUICHE_DCHECK_EQ(version.handshake_protocol, PROTOCOL_TLS1_3);
auto it = undecryptable_packets_.find(connection_id);
if (it == undecryptable_packets_.end()) {
@@ -306,6 +304,7 @@ bool QuicBufferedPacketStore::IngestPacketForTlsChloExtraction(
}
it->second.tls_chlo_extractor.IngestPacket(version, packet);
if (!it->second.tls_chlo_extractor.HasParsedFullChlo()) {
+ *tls_alert = it->second.tls_chlo_extractor.tls_alert();
return false;
}
const TlsChloExtractor& tls_chlo_extractor = it->second.tls_chlo_extractor;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.h
index f3310b4c0b3..95bb737e0ff 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store.h
@@ -119,13 +119,13 @@ class QUIC_NO_EXPORT QuicBufferedPacketStore {
// |out_resumption_attempted| is populated if the CHLO has the
// 'pre_shared_key' TLS extension. |out_early_data_attempted| is populated if
// the CHLO has the 'early_data' TLS extension.
- bool IngestPacketForTlsChloExtraction(const QuicConnectionId& connection_id,
- const ParsedQuicVersion& version,
- const QuicReceivedPacket& packet,
- std::vector<std::string>* out_alpns,
- std::string* out_sni,
- bool* out_resumption_attempted,
- bool* out_early_data_attempted);
+ // When this returns false, and an unrecoverable error happened due to a TLS
+ // alert, |*tls_alert| will be set to the alert value.
+ bool IngestPacketForTlsChloExtraction(
+ const QuicConnectionId& connection_id, const ParsedQuicVersion& version,
+ const QuicReceivedPacket& packet, std::vector<std::string>* out_alpns,
+ std::string* out_sni, bool* out_resumption_attempted,
+ bool* out_early_data_attempted, absl::optional<uint8_t>* tls_alert);
// Returns the list of buffered packets for |connection_id| and removes them
// from the store. Returns an empty list if no early arrived packets for this
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store_test.cc
index 012ae6e4fad..3b3230077aa 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_buffered_packet_store_test.cc
@@ -13,7 +13,6 @@
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_versions.h"
-#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/first_flight.h"
#include "quiche/quic/test_tools/mock_clock.h"
@@ -468,6 +467,7 @@ TEST_F(QuicBufferedPacketStoreTest, IngestPacketForTlsChloExtraction) {
bool resumption_attempted = false;
bool early_data_attempted = false;
QuicConfig config;
+ absl::optional<uint8_t> tls_alert;
EXPECT_FALSE(store_.HasBufferedPackets(connection_id));
store_.EnqueuePacket(connection_id, false, packet_, self_address_,
@@ -477,7 +477,7 @@ TEST_F(QuicBufferedPacketStoreTest, IngestPacketForTlsChloExtraction) {
// The packet in 'packet_' is not a TLS CHLO packet.
EXPECT_FALSE(store_.IngestPacketForTlsChloExtraction(
connection_id, valid_version_, packet_, &alpns, &sni,
- &resumption_attempted, &early_data_attempted));
+ &resumption_attempted, &early_data_attempted, &tls_alert));
store_.DiscardPackets(connection_id);
@@ -498,10 +498,10 @@ TEST_F(QuicBufferedPacketStoreTest, IngestPacketForTlsChloExtraction) {
EXPECT_TRUE(store_.HasBufferedPackets(connection_id));
EXPECT_FALSE(store_.IngestPacketForTlsChloExtraction(
connection_id, valid_version_, *packets[0], &alpns, &sni,
- &resumption_attempted, &early_data_attempted));
+ &resumption_attempted, &early_data_attempted, &tls_alert));
EXPECT_TRUE(store_.IngestPacketForTlsChloExtraction(
connection_id, valid_version_, *packets[1], &alpns, &sni,
- &resumption_attempted, &early_data_attempted));
+ &resumption_attempted, &early_data_attempted, &tls_alert));
EXPECT_THAT(alpns, ElementsAre(AlpnForVersion(valid_version_)));
EXPECT_EQ(sni, TestHostname());
@@ -588,13 +588,11 @@ TEST_F(QuicBufferedPacketStoreTest, DeliverInitialPacketsFirst) {
&unused_retry_token, &unused_detailed_error);
EXPECT_THAT(error_code, IsQuicNoError());
- if (GetQuicReloadableFlag(quic_deliver_initial_packets_first)) {
- // INITIAL packets should not follow a non-INITIAL packet.
- EXPECT_THAT(long_packet_type,
- Conditional(previous_packet_type == INITIAL,
- A<QuicLongHeaderType>(), Ne(INITIAL)));
- previous_packet_type = long_packet_type;
- }
+ // INITIAL packets should not follow a non-INITIAL packet.
+ EXPECT_THAT(long_packet_type,
+ Conditional(previous_packet_type == INITIAL,
+ A<QuicLongHeaderType>(), Ne(INITIAL)));
+ previous_packet_type = long_packet_type;
}
}
} // namespace
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_chaos_protector_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_chaos_protector_test.cc
index 95c073ae44e..92d3af9a20f 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_chaos_protector_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_chaos_protector_test.cc
@@ -87,8 +87,9 @@ class QuicChaosProtectorTest : public QuicTestWithParam<ParsedQuicVersion>,
header_.packet_number = QuicPacketNumber(1);
header_.form = IETF_QUIC_LONG_HEADER_PACKET;
header_.long_packet_type = INITIAL;
- header_.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
- header_.length_length = kQuicDefaultLongHeaderLengthLength;
+ header_.retry_token_length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ header_.length_length = quiche::kQuicheDefaultLongHeaderLengthLength;
// Setup validation framer.
validation_framer_.framer()->SetInitialObfuscators(
header_.destination_connection_id);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_config.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_config.cc
index c48001ac907..04aa19644df 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_config.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_config.cc
@@ -147,9 +147,9 @@ uint64_t QuicFixedUint62::GetSendValue() const {
}
void QuicFixedUint62::SetSendValue(uint64_t value) {
- if (value > kVarInt62MaxValue) {
+ if (value > quiche::kVarInt62MaxValue) {
QUIC_BUG(quic_bug_10575_3) << "QuicFixedUint62 invalid value " << value;
- value = kVarInt62MaxValue;
+ value = quiche::kVarInt62MaxValue;
}
has_send_value_ = true;
send_value_ = value;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.cc
index 92db72835af..7e780f2c24c 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.cc
@@ -8,6 +8,7 @@
#include <sys/types.h>
#include <algorithm>
+#include <cstdint>
#include <iterator>
#include <limits>
#include <memory>
@@ -36,6 +37,7 @@
#include "quiche/quic/core/quic_packet_writer.h"
#include "quiche/quic/core/quic_packets.h"
#include "quiche/quic/core/quic_path_validator.h"
+#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_utils.h"
#include "quiche/quic/platform/api/quic_bug_tracker.h"
@@ -175,6 +177,9 @@ class DiscardZeroRttDecryptionKeysAlarmDelegate
QUICHE_DCHECK(connection_->connected());
QUIC_DLOG(INFO) << "0-RTT discard alarm fired";
connection_->RemoveDecrypter(ENCRYPTION_ZERO_RTT);
+ if (GetQuicRestartFlag(quic_map_original_connection_ids2)) {
+ connection_->RetireOriginalDestinationConnectionId();
+ }
}
};
@@ -321,7 +326,7 @@ QuicConnection::QuicConnection(
blackhole_detector_(this, &arena_, alarm_factory_, &context_),
idle_network_detector_(this, clock_->ApproximateNow(), &arena_,
alarm_factory_, &context_),
- path_validator_(alarm_factory_, &arena_, this, random_generator_,
+ path_validator_(alarm_factory_, &arena_, this, random_generator_, clock_,
&context_),
ping_manager_(perspective, this, &arena_, alarm_factory_, &context_) {
QUICHE_DCHECK(perspective_ == Perspective::IS_CLIENT ||
@@ -519,9 +524,6 @@ void QuicConnection::SetFromConfig(const QuicConfig& config) {
} else {
SetNetworkTimeouts(config.max_time_before_crypto_handshake(),
config.max_idle_time_before_crypto_handshake());
- if (config.HasClientRequestedIndependentOption(kNCHP, perspective_)) {
- packet_creator_.set_chaos_protection_enabled(false);
- }
}
if (version().HasIetfQuicFrames() &&
@@ -562,21 +564,23 @@ void QuicConnection::SetFromConfig(const QuicConfig& config) {
if (config.HasClientSentConnectionOption(kNBHD, perspective_)) {
blackhole_detection_disabled_ = true;
}
- if (config.HasClientSentConnectionOption(k2RTO, perspective_)) {
- QUIC_CODE_COUNT(quic_2rto_blackhole_detection);
- num_rtos_for_blackhole_detection_ = 2;
- }
- if (config.HasClientSentConnectionOption(k3RTO, perspective_)) {
- QUIC_CODE_COUNT(quic_3rto_blackhole_detection);
- num_rtos_for_blackhole_detection_ = 3;
- }
- if (config.HasClientSentConnectionOption(k4RTO, perspective_)) {
- QUIC_CODE_COUNT(quic_4rto_blackhole_detection);
- num_rtos_for_blackhole_detection_ = 4;
- }
- if (config.HasClientSentConnectionOption(k6RTO, perspective_)) {
- QUIC_CODE_COUNT(quic_6rto_blackhole_detection);
- num_rtos_for_blackhole_detection_ = 6;
+ if (!sent_packet_manager_.remove_blackhole_detection_experiments()) {
+ if (config.HasClientSentConnectionOption(k2RTO, perspective_)) {
+ QUIC_CODE_COUNT(quic_2rto_blackhole_detection);
+ num_rtos_for_blackhole_detection_ = 2;
+ }
+ if (config.HasClientSentConnectionOption(k3RTO, perspective_)) {
+ QUIC_CODE_COUNT(quic_3rto_blackhole_detection);
+ num_rtos_for_blackhole_detection_ = 3;
+ }
+ if (config.HasClientSentConnectionOption(k4RTO, perspective_)) {
+ QUIC_CODE_COUNT(quic_4rto_blackhole_detection);
+ num_rtos_for_blackhole_detection_ = 4;
+ }
+ if (config.HasClientSentConnectionOption(k6RTO, perspective_)) {
+ QUIC_CODE_COUNT(quic_6rto_blackhole_detection);
+ num_rtos_for_blackhole_detection_ = 6;
+ }
}
}
@@ -965,13 +969,21 @@ void QuicConnection::SetOriginalDestinationConnectionId(
default_path_.server_connection_id;
}
-QuicConnectionId QuicConnection::GetOriginalDestinationConnectionId() {
+QuicConnectionId QuicConnection::GetOriginalDestinationConnectionId() const {
if (original_destination_connection_id_.has_value()) {
return original_destination_connection_id_.value();
}
return default_path_.server_connection_id;
}
+void QuicConnection::RetireOriginalDestinationConnectionId() {
+ if (original_destination_connection_id_.has_value()) {
+ visitor_->OnServerConnectionIdRetired(*original_destination_connection_id_);
+ QUIC_RESTART_FLAG_COUNT_N(quic_map_original_connection_ids2, 3, 4);
+ original_destination_connection_id_.reset();
+ }
+}
+
bool QuicConnection::ValidateServerConnectionId(
const QuicPacketHeader& header) const {
if (perspective_ == Perspective::IS_CLIENT &&
@@ -1035,10 +1047,14 @@ bool QuicConnection::OnUnauthenticatedPublicHeader(
if (debug_visitor_ != nullptr) {
debug_visitor_->OnIncorrectConnectionId(server_connection_id);
}
- // If this is a server, the dispatcher routes each packet to the
- // QuicConnection responsible for the packet's connection ID. So if control
- // arrives here and this is a server, the dispatcher must be malfunctioning.
- QUICHE_DCHECK_NE(Perspective::IS_SERVER, perspective_);
+ // The only way for a connection to get a packet with an invalid connection
+ // ID is if quic_map_original_connection_ids2 is false and a packet
+ // arrives with a connection ID that is deterministically replaced with one
+ // that the connection owns, but is different from
+ // original_destination_connection_id_.
+ if (GetQuicRestartFlag(quic_map_original_connection_ids2)) {
+ QUICHE_DCHECK_NE(Perspective::IS_SERVER, perspective_);
+ }
return false;
}
@@ -3235,7 +3251,7 @@ bool QuicConnection::CanWrite(HasRetransmittableData retransmittable) {
return true;
}
- if (LimitedByAmplificationFactor()) {
+ if (LimitedByAmplificationFactor(packet_creator_.max_packet_length())) {
// Server is constrained by the amplification restriction.
QUIC_CODE_COUNT(quic_throttled_by_amplification_limit);
QUIC_DVLOG(1) << ENDPOINT
@@ -3655,10 +3671,24 @@ bool QuicConnection::WritePacket(SerializedPacket* packet) {
sent_packet_manager_.GetLeastPacketAwaitedByPeer(encryption_level_),
sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length()));
- stats_.bytes_sent += result.bytes_written;
+ stats_.bytes_sent += encrypted_length;
++stats_.packets_sent;
+
+ QuicByteCount bytes_not_retransmitted =
+ packet->bytes_not_retransmitted.value_or(0);
if (packet->transmission_type != NOT_RETRANSMISSION) {
- stats_.bytes_retransmitted += result.bytes_written;
+ if (static_cast<uint64_t>(encrypted_length) < bytes_not_retransmitted) {
+ QUIC_BUG(quic_packet_bytes_written_lt_bytes_not_retransmitted)
+ << "Total bytes written to the packet should be larger than the "
+ "bytes in not-retransmitted frames. Bytes written: "
+ << encrypted_length
+ << ", bytes not retransmitted: " << bytes_not_retransmitted;
+ } else {
+ // bytes_retransmitted includes packet's headers and encryption
+ // overhead.
+ stats_.bytes_retransmitted +=
+ (encrypted_length - bytes_not_retransmitted);
+ }
++stats_.packets_retransmitted;
}
@@ -4722,7 +4752,7 @@ void QuicConnection::SetRetransmissionAlarm() {
pending_retransmission_alarm_ = true;
return;
}
- if (LimitedByAmplificationFactor()) {
+ if (LimitedByAmplificationFactor(packet_creator_.max_packet_length())) {
// Do not set retransmission timer if connection is anti-amplification limit
// throttled. Otherwise, nothing can be sent when timer fires.
retransmission_alarm_->Cancel();
@@ -4827,6 +4857,14 @@ QuicConnection::ScopedPacketFlusher::~ScopedPacketFlusher() {
connection_->FlushCoalescedPacket();
}
connection_->FlushPackets();
+ if (GetQuicReloadableFlag(
+ quic_packet_flusher_check_connected_after_flush_packets)) {
+ QUIC_RELOADABLE_FLAG_COUNT(
+ quic_packet_flusher_check_connected_after_flush_packets);
+ if (!connection_->connected()) {
+ return;
+ }
+ }
if (!handshake_packet_sent_ && connection_->handshake_packet_sent_) {
// This would cause INITIAL key to be dropped. Drop keys here to avoid
// missing the write keys in the middle of writing.
@@ -5829,7 +5867,9 @@ void QuicConnection::SendAllPendingAcks() {
if (!flushed) {
// Connection is write blocked.
QUIC_BUG_IF(quic_bug_12714_33,
- !writer_->IsWriteBlocked() && !LimitedByAmplificationFactor())
+ !writer_->IsWriteBlocked() &&
+ !LimitedByAmplificationFactor(
+ packet_creator_.max_packet_length()))
<< "Writer not blocked and not throttled by amplification factor, "
"but ACK not flushed for packet space:"
<< i;
@@ -5946,36 +5986,48 @@ bool QuicConnection::FlushCoalescedPacket() {
}
QUIC_DVLOG(1) << ENDPOINT << "Sending coalesced packet "
<< coalesced_packet_.ToString(length);
-
- if (!buffered_packets_.empty() || HandleWriteBlocked()) {
+ if (GetQuicReloadableFlag(
+ quic_fix_bytes_accounting_for_buffered_coalesced_packets)) {
+ QUIC_RELOADABLE_FLAG_COUNT(
+ quic_fix_bytes_accounting_for_buffered_coalesced_packets);
+ }
+ const size_t padding_size =
+ length - std::min<size_t>(length, coalesced_packet_.length());
+ // Buffer coalesced packet if padding + bytes_sent exceeds amplifcation limit.
+ if (!buffered_packets_.empty() || HandleWriteBlocked() ||
+ (enforce_strict_amplification_factor_ &&
+ LimitedByAmplificationFactor(padding_size))) {
QUIC_DVLOG(1) << ENDPOINT
<< "Buffering coalesced packet of len: " << length;
buffered_packets_.emplace_back(
buffer, static_cast<QuicPacketLength>(length),
coalesced_packet_.self_address(), coalesced_packet_.peer_address());
- return true;
- }
-
- WriteResult result = writer_->WritePacket(
- buffer, length, coalesced_packet_.self_address().host(),
- coalesced_packet_.peer_address(), per_packet_options_);
- if (IsWriteError(result.status)) {
- OnWriteError(result.error_code);
- return false;
- }
- if (IsWriteBlockedStatus(result.status)) {
- visitor_->OnWriteBlocked();
- if (result.status != WRITE_STATUS_BLOCKED_DATA_BUFFERED) {
- QUIC_DVLOG(1) << ENDPOINT
- << "Buffering coalesced packet of len: " << length;
- buffered_packets_.emplace_back(
- buffer, static_cast<QuicPacketLength>(length),
- coalesced_packet_.self_address(), coalesced_packet_.peer_address());
+ if (!GetQuicReloadableFlag(
+ quic_fix_bytes_accounting_for_buffered_coalesced_packets) &&
+ !enforce_strict_amplification_factor_) {
+ return true;
+ }
+ } else {
+ WriteResult result = writer_->WritePacket(
+ buffer, length, coalesced_packet_.self_address().host(),
+ coalesced_packet_.peer_address(), per_packet_options_);
+ if (IsWriteError(result.status)) {
+ OnWriteError(result.error_code);
+ return false;
+ }
+ if (IsWriteBlockedStatus(result.status)) {
+ visitor_->OnWriteBlocked();
+ if (result.status != WRITE_STATUS_BLOCKED_DATA_BUFFERED) {
+ QUIC_DVLOG(1) << ENDPOINT
+ << "Buffering coalesced packet of len: " << length;
+ buffered_packets_.emplace_back(
+ buffer, static_cast<QuicPacketLength>(length),
+ coalesced_packet_.self_address(), coalesced_packet_.peer_address());
+ }
}
}
// Account for added padding.
if (length > coalesced_packet_.length()) {
- size_t padding_size = length - coalesced_packet_.length();
if (IsDefaultPath(coalesced_packet_.self_address(),
coalesced_packet_.peer_address())) {
if (EnforceAntiAmplificationLimit()) {
@@ -6076,9 +6128,10 @@ bool QuicConnection::EnforceAntiAmplificationLimit() const {
// TODO(danzh) Pass in path object or its reference of some sort to use this
// method to check anti-amplification limit on non-default path.
-bool QuicConnection::LimitedByAmplificationFactor() const {
+bool QuicConnection::LimitedByAmplificationFactor(QuicByteCount bytes) const {
return EnforceAntiAmplificationLimit() &&
- default_path_.bytes_sent_before_address_validation >=
+ (default_path_.bytes_sent_before_address_validation +
+ (enforce_strict_amplification_factor_ ? bytes : 0)) >=
anti_amplification_factor_ *
default_path_.bytes_received_before_address_validation;
}
@@ -6373,11 +6426,12 @@ bool QuicConnection::SendNewConnectionId(
return connected_;
}
-void QuicConnection::OnNewConnectionIdIssued(
+bool QuicConnection::MaybeReserveConnectionId(
const QuicConnectionId& connection_id) {
if (perspective_ == Perspective::IS_SERVER) {
- visitor_->OnServerConnectionIdIssued(connection_id);
+ return visitor_->MaybeReserveConnectionId(connection_id);
}
+ return true;
}
void QuicConnection::OnSelfIssuedConnectionIdRetired(
@@ -6424,11 +6478,35 @@ QuicTime QuicConnection::GetNetworkBlackholeDeadline() const {
return QuicTime::Zero();
}
QUICHE_DCHECK_LT(0u, num_rtos_for_blackhole_detection_);
+ if (sent_packet_manager_.remove_blackhole_detection_experiments()) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_remove_blackhole_detection_experiments);
+ const QuicTime::Delta blackhole_delay =
+ sent_packet_manager_.GetNetworkBlackholeDelay(
+ num_rtos_for_blackhole_detection_);
+ if (!ShouldDetectPathDegrading()) {
+ return clock_->ApproximateNow() + blackhole_delay;
+ }
+ return clock_->ApproximateNow() +
+ CalculateNetworkBlackholeDelay(
+ blackhole_delay, sent_packet_manager_.GetPathDegradingDelay(),
+ sent_packet_manager_.GetPtoDelay());
+ }
return clock_->ApproximateNow() +
sent_packet_manager_.GetNetworkBlackholeDelay(
num_rtos_for_blackhole_detection_);
}
+// static
+QuicTime::Delta QuicConnection::CalculateNetworkBlackholeDelay(
+ QuicTime::Delta blackhole_delay, QuicTime::Delta path_degrading_delay,
+ QuicTime::Delta pto_delay) {
+ const QuicTime::Delta min_delay = path_degrading_delay + pto_delay * 2;
+ if (blackhole_delay < min_delay) {
+ QUIC_CODE_COUNT(quic_extending_short_blackhole_delay);
+ }
+ return std::max(min_delay, blackhole_delay);
+}
+
bool QuicConnection::ShouldDetectBlackhole() const {
if (!connected_ || blackhole_detection_disabled_) {
return false;
@@ -6840,27 +6918,28 @@ std::vector<QuicConnectionId> QuicConnection::GetActiveServerConnectionIds()
QUICHE_DCHECK(version().HasIetfQuicFrames());
result = self_issued_cid_manager_->GetUnretiredConnectionIds();
}
- if (GetQuicReloadableFlag(
- quic_consider_original_connection_id_as_active_pre_handshake)) {
- QUIC_RELOADABLE_FLAG_COUNT(
- quic_consider_original_connection_id_as_active_pre_handshake);
- if (!IsHandshakeComplete() &&
- original_destination_connection_id_.has_value()) {
- // Consider original_destination_connection_id_ as active before handshake
- // completes.
- if (std::find(result.begin(), result.end(),
- original_destination_connection_id_.value()) !=
- result.end()) {
- QUIC_BUG(quic_unexpected_original_destination_connection_id)
- << "original_destination_connection_id: "
- << original_destination_connection_id_.value()
- << " is unexpectedly in active "
- "list";
- } else {
- result.insert(result.end(),
- original_destination_connection_id_.value());
- }
- QUIC_CODE_COUNT(quic_active_original_connection_id_pre_handshake);
+ if (!original_destination_connection_id_.has_value()) {
+ return result;
+ }
+ bool add_original_connection_id = false;
+ if (GetQuicRestartFlag(quic_map_original_connection_ids2)) {
+ QUIC_RESTART_FLAG_COUNT_N(quic_map_original_connection_ids2, 4, 4);
+ add_original_connection_id = true;
+ } else if (!IsHandshakeComplete()) {
+ QUIC_CODE_COUNT(quic_active_original_connection_id_pre_handshake);
+ add_original_connection_id = true;
+ }
+ if (add_original_connection_id) {
+ if (std::find(result.begin(), result.end(),
+ original_destination_connection_id_.value()) !=
+ result.end()) {
+ QUIC_BUG(quic_unexpected_original_destination_connection_id)
+ << "original_destination_connection_id: "
+ << original_destination_connection_id_.value()
+ << " is unexpectedly in active "
+ "list";
+ } else {
+ result.insert(result.end(), original_destination_connection_id_.value());
}
}
return result;
@@ -6887,7 +6966,7 @@ void QuicConnection::CreateConnectionIdManager() {
void QuicConnection::QuicBugIfHasPendingFrames(QuicStreamId id) const {
QUIC_BUG_IF(quic_has_pending_frames_unexpectedly,
- packet_creator_.HasPendingStreamFramesOfStream(id))
+ connected_ && packet_creator_.HasPendingStreamFramesOfStream(id))
<< "Stream " << id
<< " has pending frames unexpectedly. Received packet info: "
<< last_received_packet_info_;
@@ -7039,9 +7118,10 @@ QuicConnection::ReversePathValidationResultDelegate::
connection_->active_effective_peer_migration_type_) {}
void QuicConnection::ReversePathValidationResultDelegate::
- OnPathValidationSuccess(
- std::unique_ptr<QuicPathValidationContext> context) {
- QUIC_DLOG(INFO) << "Successfully validated new path " << *context;
+ OnPathValidationSuccess(std::unique_ptr<QuicPathValidationContext> context,
+ QuicTime start_time) {
+ QUIC_DLOG(INFO) << "Successfully validated new path " << *context
+ << ", validation started at " << start_time;
if (connection_->IsDefaultPath(context->self_address(),
context->peer_address())) {
QUIC_CODE_COUNT_N(quic_kick_off_client_address_validation, 3, 6);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.h
index aab56b75837..5daf2bfb75a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection.h
@@ -164,8 +164,9 @@ class QUIC_EXPORT_PRIVATE QuicConnectionVisitorInterface {
// Called to send a RETIRE_CONNECTION_ID frame.
virtual void SendRetireConnectionId(uint64_t sequence_number) = 0;
- // Called when server starts to use a server issued connection ID.
- virtual void OnServerConnectionIdIssued(
+ // Called when server starts to use a server issued connection ID. Returns
+ // true if this connection ID hasn't been used by another connection.
+ virtual bool MaybeReserveConnectionId(
const QuicConnectionId& server_connection_id) = 0;
// Called when server stops to use a server issued connection ID.
@@ -718,7 +719,7 @@ class QUIC_EXPORT_PRIVATE QuicConnection
// QuicConnectionIdManagerVisitorInterface
void OnPeerIssuedConnectionIdRetired() override;
bool SendNewConnectionId(const QuicNewConnectionIdFrame& frame) override;
- void OnNewConnectionIdIssued(const QuicConnectionId& connection_id) override;
+ bool MaybeReserveConnectionId(const QuicConnectionId& connection_id) override;
void OnSelfIssuedConnectionIdRetired(
const QuicConnectionId& connection_id) override;
@@ -1080,7 +1081,11 @@ class QUIC_EXPORT_PRIVATE QuicConnection
const QuicConnectionId& original_destination_connection_id);
// Returns the original destination connection ID used for this connection.
- QuicConnectionId GetOriginalDestinationConnectionId();
+ QuicConnectionId GetOriginalDestinationConnectionId() const;
+
+ // Tells the visitor the serverside connection is no longer expecting packets
+ // with the client-generated destination connection ID.
+ void RetireOriginalDestinationConnectionId();
// Called when ACK alarm goes off. Sends ACKs of those packet number spaces
// which have expired ACK timeout. Only used when this connection supports
@@ -1230,6 +1235,11 @@ class QUIC_EXPORT_PRIVATE QuicConnection
return quic_bug_10511_43_error_detail_;
}
+ // Ensures the network blackhole delay is longer than path degrading delay.
+ static QuicTime::Delta CalculateNetworkBlackholeDelay(
+ QuicTime::Delta blackhole_delay, QuicTime::Delta path_degrading_delay,
+ QuicTime::Delta pto_delay);
+
protected:
// Calls cancel() on all the alarms owned by this connection.
void CancelAllAlarms();
@@ -1457,7 +1467,8 @@ class QUIC_EXPORT_PRIVATE QuicConnection
const QuicSocketAddress& direct_peer_address);
void OnPathValidationSuccess(
- std::unique_ptr<QuicPathValidationContext> context) override;
+ std::unique_ptr<QuicPathValidationContext> context,
+ QuicTime start_time) override;
void OnPathValidationFailure(
std::unique_ptr<QuicPathValidationContext> context) override;
@@ -1703,7 +1714,9 @@ class QUIC_EXPORT_PRIVATE QuicConnection
QuicPacketNumber GetLargestAckedPacket() const;
// Whether connection is limited by amplification factor.
- bool LimitedByAmplificationFactor() const;
+ // If enforce_strict_amplification_factor_ is true, this will return true if
+ // connection is amplification limited after sending |bytes|.
+ bool LimitedByAmplificationFactor(QuicByteCount bytes) const;
// Called before sending a packet to get packet send time and to set the
// release time delay in |per_packet_options_|. Return the time when the
@@ -2234,6 +2247,11 @@ class QUIC_EXPORT_PRIVATE QuicConnection
bool only_send_probing_frames_on_alternative_path_ =
GetQuicReloadableFlag(quic_not_bundle_ack_on_alternative_path);
+
+ // If true, throttle sending if next created packet will exceed amplification
+ // limit.
+ const bool enforce_strict_amplification_factor_ =
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor);
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc
index 46ff85f3f1b..17f7a725cd3 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.cc
@@ -10,6 +10,7 @@
#include "quiche/quic/core/quic_connection_id.h"
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/core/quic_utils.h"
+#include "quiche/quic/platform/api/quic_flag_utils.h"
#include "quiche/common/platform/api/quiche_logging.h"
namespace quic {
@@ -298,14 +299,28 @@ QuicConnectionId QuicSelfIssuedConnectionIdManager::GenerateNewConnectionId(
return QuicUtils::CreateReplacementConnectionId(old_connection_id);
}
-QuicNewConnectionIdFrame
-QuicSelfIssuedConnectionIdManager::IssueNewConnectionId() {
+absl::optional<QuicNewConnectionIdFrame>
+QuicSelfIssuedConnectionIdManager::MaybeIssueNewConnectionId() {
+ const bool check_cid_collision_when_issue_new_cid =
+ GetQuicReloadableFlag(quic_check_cid_collision_when_issue_new_cid);
+ QuicConnectionId new_cid = GenerateNewConnectionId(last_connection_id_);
+ if (check_cid_collision_when_issue_new_cid) {
+ QUIC_RELOADABLE_FLAG_COUNT_N(quic_check_cid_collision_when_issue_new_cid, 1,
+ 2);
+ if (!visitor_->MaybeReserveConnectionId(new_cid)) {
+ QUIC_RELOADABLE_FLAG_COUNT_N(quic_check_cid_collision_when_issue_new_cid,
+ 2, 2);
+ return {};
+ }
+ }
QuicNewConnectionIdFrame frame;
- frame.connection_id = GenerateNewConnectionId(last_connection_id_);
+ frame.connection_id = new_cid;
frame.sequence_number = next_connection_id_sequence_number_++;
frame.stateless_reset_token =
QuicUtils::GenerateStatelessResetToken(frame.connection_id);
- visitor_->OnNewConnectionIdIssued(frame.connection_id);
+ if (!check_cid_collision_when_issue_new_cid) {
+ visitor_->MaybeReserveConnectionId(frame.connection_id);
+ }
active_connection_ids_.emplace_back(frame.connection_id,
frame.sequence_number);
frame.retire_prior_to = active_connection_ids_.front().second;
@@ -313,10 +328,10 @@ QuicSelfIssuedConnectionIdManager::IssueNewConnectionId() {
return frame;
}
-QuicNewConnectionIdFrame
-QuicSelfIssuedConnectionIdManager::IssueNewConnectionIdForPreferredAddress() {
- QuicNewConnectionIdFrame frame = IssueNewConnectionId();
- QUICHE_DCHECK_EQ(frame.sequence_number, 1u);
+absl::optional<QuicNewConnectionIdFrame> QuicSelfIssuedConnectionIdManager::
+ MaybeIssueNewConnectionIdForPreferredAddress() {
+ absl::optional<QuicNewConnectionIdFrame> frame = MaybeIssueNewConnectionId();
+ QUICHE_DCHECK(!frame.has_value() || (frame->sequence_number == 1u));
return frame;
}
@@ -406,8 +421,12 @@ void QuicSelfIssuedConnectionIdManager::RetireConnectionId() {
void QuicSelfIssuedConnectionIdManager::MaybeSendNewConnectionIds() {
while (active_connection_ids_.size() < active_connection_id_limit_) {
- QuicNewConnectionIdFrame frame = IssueNewConnectionId();
- if (!visitor_->SendNewConnectionId(frame)) {
+ absl::optional<QuicNewConnectionIdFrame> frame =
+ MaybeIssueNewConnectionId();
+ if (!frame.has_value()) {
+ break;
+ }
+ if (!visitor_->SendNewConnectionId(*frame)) {
break;
}
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.h
index 501310b1ee8..7f271e20cae 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager.h
@@ -47,7 +47,7 @@ class QUIC_EXPORT_PRIVATE QuicConnectionIdManagerVisitorInterface {
virtual ~QuicConnectionIdManagerVisitorInterface() = default;
virtual void OnPeerIssuedConnectionIdRetired() = 0;
virtual bool SendNewConnectionId(const QuicNewConnectionIdFrame& frame) = 0;
- virtual void OnNewConnectionIdIssued(
+ virtual bool MaybeReserveConnectionId(
const QuicConnectionId& connection_id) = 0;
virtual void OnSelfIssuedConnectionIdRetired(
const QuicConnectionId& connection_id) = 0;
@@ -130,7 +130,8 @@ class QUIC_EXPORT_PRIVATE QuicSelfIssuedConnectionIdManager {
virtual ~QuicSelfIssuedConnectionIdManager();
- QuicNewConnectionIdFrame IssueNewConnectionIdForPreferredAddress();
+ absl::optional<QuicNewConnectionIdFrame>
+ MaybeIssueNewConnectionIdForPreferredAddress();
QuicErrorCode OnRetireConnectionIdFrame(
const QuicRetireConnectionIdFrame& frame, QuicTime::Delta pto_delay,
@@ -164,7 +165,8 @@ class QUIC_EXPORT_PRIVATE QuicSelfIssuedConnectionIdManager {
private:
friend class test::QuicConnectionIdManagerPeer;
- QuicNewConnectionIdFrame IssueNewConnectionId();
+ // Issue a new connection ID. Can return nullopt.
+ absl::optional<QuicNewConnectionIdFrame> MaybeIssueNewConnectionId();
// This should be set to the min of:
// (1) # of active connection IDs that peer can maintain.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager_test.cc
index 1c2657dc581..dbd239f026d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_manager_test.cc
@@ -64,8 +64,10 @@ class TestPeerIssuedConnectionIdManagerVisitor
bool SendNewConnectionId(const QuicNewConnectionIdFrame& /*frame*/) override {
return false;
}
- void OnNewConnectionIdIssued(
- const QuicConnectionId& /*connection_id*/) override {}
+ bool MaybeReserveConnectionId(const QuicConnectionId&) override {
+ return false;
+ }
+
void OnSelfIssuedConnectionIdRetired(
const QuicConnectionId& /*connection_id*/) override {}
@@ -522,7 +524,7 @@ class TestSelfIssuedConnectionIdManagerVisitor
MOCK_METHOD(bool, SendNewConnectionId,
(const QuicNewConnectionIdFrame& frame), (override));
- MOCK_METHOD(void, OnNewConnectionIdIssued,
+ MOCK_METHOD(bool, MaybeReserveConnectionId,
(const QuicConnectionId& connection_id), (override));
MOCK_METHOD(void, OnSelfIssuedConnectionIdRetired,
(const QuicConnectionId& connection_id), (override));
@@ -568,7 +570,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
QuicConnectionId cid5 = cid_manager_.GenerateNewConnectionId(cid4);
// Sends CID #1 to peer.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid1));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid1))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_,
SendNewConnectionId(ExpectedNewConnectionIdFrame(cid1, 1u, 0u)))
.WillOnce(Return(true));
@@ -578,7 +581,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
// Peer retires CID #0;
// Sends CID #2 and asks peer to retire CIDs prior to #1.
// Outcome: (#1, #2) are active.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid2));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid2))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_,
SendNewConnectionId(ExpectedNewConnectionIdFrame(cid2, 2u, 1u)))
.WillOnce(Return(true));
@@ -593,7 +597,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
// Peer retires CID #1;
// Sends CID #3 and asks peer to retire CIDs prior to #2.
// Outcome: (#2, #3) are active.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid3));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid3))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_,
SendNewConnectionId(ExpectedNewConnectionIdFrame(cid3, 3u, 2u)))
.WillOnce(Return(true));
@@ -608,7 +613,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
// Peer retires CID #2;
// Sends CID #4 and asks peer to retire CIDs prior to #3.
// Outcome: (#3, #4) are active.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid4));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid4))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_,
SendNewConnectionId(ExpectedNewConnectionIdFrame(cid4, 4u, 3u)))
.WillOnce(Return(true));
@@ -623,7 +629,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
// Peer retires CID #3;
// Sends CID #5 and asks peer to retire CIDs prior to #4.
// Outcome: (#4, #5) are active.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid5));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid5))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_,
SendNewConnectionId(ExpectedNewConnectionIdFrame(cid5, 5u, 4u)))
.WillOnce(Return(true));
@@ -644,7 +651,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
QuicConnectionId cid4 = cid_manager_.GenerateNewConnectionId(cid3);
// Sends CID #1 to peer.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid1));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid1))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_,
SendNewConnectionId(ExpectedNewConnectionIdFrame(cid1, 1u, 0u)))
.WillOnce(Return(true));
@@ -654,7 +662,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
// Peer retires CID #1;
// Sends CID #2 and asks peer to retire CIDs prior to #0.
// Outcome: (#0, #2) are active.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid2));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid2))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_,
SendNewConnectionId(ExpectedNewConnectionIdFrame(cid2, 2u, 0u)))
.WillOnce(Return(true));
@@ -678,7 +687,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
// Peer retires CID #0;
// Sends CID #3 and asks peer to retire CIDs prior to #2.
// Outcome: (#2, #3) are active.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid3));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid3))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_,
SendNewConnectionId(ExpectedNewConnectionIdFrame(cid3, 3u, 2u)))
.WillOnce(Return(true));
@@ -693,7 +703,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
// Peer retires CID #3;
// Sends CID #4 and asks peer to retire CIDs prior to #2.
// Outcome: (#2, #4) are active.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid4));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid4))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_,
SendNewConnectionId(ExpectedNewConnectionIdFrame(cid4, 4u, 2u)))
.WillOnce(Return(true));
@@ -720,7 +731,9 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
QuicConnectionId cid1 = cid_manager_.GenerateNewConnectionId(cid0);
QuicConnectionId cid2 = cid_manager_.GenerateNewConnectionId(cid1);
QuicConnectionId cid3 = cid_manager_.GenerateNewConnectionId(cid2);
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(_)).Times(3);
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(_))
+ .Times(3)
+ .WillRepeatedly(Return(true));
EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_))
.Times(3)
.WillRepeatedly(Return(true));
@@ -777,7 +790,9 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
QuicConnectionId cid1 = cid_manager_.GenerateNewConnectionId(cid0);
QuicConnectionId cid2 = cid_manager_.GenerateNewConnectionId(cid1);
QuicConnectionId cid3 = cid_manager_.GenerateNewConnectionId(cid2);
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(_)).Times(3);
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(_))
+ .Times(3)
+ .WillRepeatedly(Return(true));
EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_))
.Times(3)
.WillRepeatedly(Return(true));
@@ -834,7 +849,9 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
QuicConnectionId cid2 = cid_manager_.GenerateNewConnectionId(cid1);
QuicConnectionId cid3 = cid_manager_.GenerateNewConnectionId(cid2);
QuicConnectionId cid;
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(_)).Times(3);
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(_))
+ .Times(3)
+ .WillRepeatedly(Return(true));
EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_))
.Times(3)
.WillRepeatedly(Return(true));
@@ -893,7 +910,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
QuicConnectionId cid1 = cid_manager_.GenerateNewConnectionId(cid0);
// CID #1 is sent to peer.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(_)).Times(1);
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_))
.WillOnce(Return(true));
cid_manager_.MaybeSendNewConnectionIds();
@@ -909,7 +927,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
TEST_F(QuicSelfIssuedConnectionIdManagerTest,
ErrorWhenTooManyConnectionIdWaitingToBeRetired) {
// CID #0 & #1 are issued.
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(_));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_))
.WillOnce(Return(true));
cid_manager_.MaybeSendNewConnectionIds();
@@ -918,7 +937,8 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
QuicConnectionId last_connection_id =
cid_manager_.GenerateNewConnectionId(initial_connection_id_);
for (int i = 0; i < 8; ++i) {
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(_));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Return(true));
EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_));
QuicRetireConnectionIdFrame retire_cid_frame;
retire_cid_frame.sequence_number = i;
@@ -937,17 +957,60 @@ TEST_F(QuicSelfIssuedConnectionIdManagerTest,
IsError(QUIC_TOO_MANY_CONNECTION_ID_WAITING_TO_RETIRE));
}
+TEST_F(QuicSelfIssuedConnectionIdManagerTest, CannotIssueNewCidDueToVisitor) {
+ QuicConnectionId cid0 = initial_connection_id_;
+ QuicConnectionId cid1 = cid_manager_.GenerateNewConnectionId(cid0);
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid1))
+ .WillOnce(Return(false));
+ if (GetQuicReloadableFlag(quic_check_cid_collision_when_issue_new_cid)) {
+ EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_)).Times(0);
+ } else {
+ EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_)).Times(1);
+ }
+ cid_manager_.MaybeSendNewConnectionIds();
+}
+
+TEST_F(QuicSelfIssuedConnectionIdManagerTest,
+ CannotIssueNewCidUponRetireConnectionIdDueToVisitor) {
+ QuicConnectionId cid0 = initial_connection_id_;
+ QuicConnectionId cid1 = cid_manager_.GenerateNewConnectionId(cid0);
+ QuicConnectionId cid2 = cid_manager_.GenerateNewConnectionId(cid1);
+ // CID #0 & #1 are issued.
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid1))
+ .WillOnce(Return(true));
+ EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_))
+ .WillOnce(Return(true));
+ cid_manager_.MaybeSendNewConnectionIds();
+
+ // CID #2 is not issued.
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid2))
+ .WillOnce(Return(false));
+ if (GetQuicReloadableFlag(quic_check_cid_collision_when_issue_new_cid)) {
+ EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_)).Times(0);
+ } else {
+ EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_)).Times(1);
+ }
+ QuicRetireConnectionIdFrame retire_cid_frame;
+ retire_cid_frame.sequence_number = 1;
+ ASSERT_THAT(cid_manager_.OnRetireConnectionIdFrame(
+ retire_cid_frame, pto_delay_, &error_details_),
+ IsQuicNoError());
+}
+
TEST_F(QuicSelfIssuedConnectionIdManagerTest,
DoNotIssueConnectionIdVoluntarilyIfOneHasIssuedForPerferredAddress) {
QuicConnectionId cid0 = initial_connection_id_;
QuicConnectionId cid1 = cid_manager_.GenerateNewConnectionId(cid0);
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(cid1));
- ASSERT_THAT(cid_manager_.IssueNewConnectionIdForPreferredAddress(),
- ExpectedNewConnectionIdFrame(cid1, 1u, 0u));
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(cid1))
+ .WillOnce(Return(true));
+ absl::optional<QuicNewConnectionIdFrame> new_cid_frame =
+ cid_manager_.MaybeIssueNewConnectionIdForPreferredAddress();
+ ASSERT_TRUE(new_cid_frame.has_value());
+ ASSERT_THAT(*new_cid_frame, ExpectedNewConnectionIdFrame(cid1, 1u, 0u));
EXPECT_THAT(cid_manager_.GetUnretiredConnectionIds(),
ElementsAre(cid0, cid1));
- EXPECT_CALL(cid_manager_visitor_, OnNewConnectionIdIssued(_)).Times(0);
+ EXPECT_CALL(cid_manager_visitor_, MaybeReserveConnectionId(_)).Times(0);
EXPECT_CALL(cid_manager_visitor_, SendNewConnectionId(_)).Times(0);
cid_manager_.MaybeSendNewConnectionIds();
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_test.cc
index ff845387b5e..dca05203bf3 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_connection_test.cc
@@ -240,10 +240,19 @@ class TestConnection : public QuicConnection {
absl::string_view data,
QuicStreamOffset offset,
StreamSendingState state) {
+ return SaveAndSendStreamData(id, data, offset, state, NOT_RETRANSMISSION);
+ }
+
+ QuicConsumedData SaveAndSendStreamData(QuicStreamId id,
+ absl::string_view data,
+ QuicStreamOffset offset,
+ StreamSendingState state,
+ TransmissionType transmission_type) {
ScopedPacketFlusher flusher(this);
producer_.SaveStreamData(id, data);
if (notifier_ != nullptr) {
- return notifier_->WriteOrBufferData(id, data.length(), state);
+ return notifier_->WriteOrBufferData(id, data.length(), state,
+ transmission_type);
}
return QuicConnection::SendStreamData(id, data.length(), offset, state);
}
@@ -1110,9 +1119,10 @@ class QuicConnectionTest : public QuicTestWithParam<TestParams> {
header.long_packet_type = EncryptionlevelToLongHeaderType(level);
if (QuicVersionHasLongHeaderLengths(
peer_framer_.version().transport_version)) {
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
if (header.long_packet_type == INITIAL) {
- header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ header.retry_token_length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
}
}
@@ -1700,7 +1710,8 @@ TEST_P(QuicConnectionTest, PeerPortChangeAtServer) {
TEST_P(QuicConnectionTest, PeerIpAddressChangeAtServer) {
set_perspective(Perspective::IS_SERVER);
- if (!connection_.validate_client_address()) {
+ if (!connection_.validate_client_address() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
@@ -1857,9 +1868,11 @@ TEST_P(QuicConnectionTest, PeerIpAddressChangeAtServerWithMissingConnectionId) {
QuicConnectionPeer::SetAddressValidated(&connection_);
// Sends new server CID to client.
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_))
- .WillOnce(
- Invoke([&](const QuicConnectionId& cid) { server_cid1 = cid; }));
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Invoke([&](const QuicConnectionId& cid) {
+ server_cid1 = cid;
+ return true;
+ }));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
connection_.OnHandshakeComplete();
@@ -1894,6 +1907,9 @@ TEST_P(QuicConnectionTest, PeerIpAddressChangeAtServerWithMissingConnectionId) {
QuicFrames frames2;
frames2.push_back(QuicFrame(frame2_));
+ if (GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
+ frames2.push_back(QuicFrame(QuicPaddingFrame(-1)));
+ }
ProcessFramesPacketWithAddresses(frames2, kSelfAddress, kNewPeerAddress,
ENCRYPTION_FORWARD_SECURE);
EXPECT_EQ(kNewPeerAddress, connection_.peer_address());
@@ -1915,6 +1931,9 @@ TEST_P(QuicConnectionTest, PeerIpAddressChangeAtServerWithMissingConnectionId) {
}
TEST_P(QuicConnectionTest, EffectivePeerAddressChangeAtServer) {
+ if (GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
+ return;
+ }
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
EXPECT_EQ(Perspective::IS_SERVER, connection_.perspective());
@@ -2048,8 +2067,11 @@ TEST_P(QuicConnectionTest, ConnectionMigrationWithPendingPaddingBytes) {
// Sends new server CID to client.
QuicConnectionId new_cid;
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_))
- .WillOnce(Invoke([&](const QuicConnectionId& cid) { new_cid = cid; }));
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Invoke([&](const QuicConnectionId& cid) {
+ new_cid = cid;
+ return true;
+ }));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
// Discard INITIAL key.
connection_.RemoveEncrypter(ENCRYPTION_INITIAL);
@@ -2088,7 +2110,8 @@ TEST_P(QuicConnectionTest, ConnectionMigrationWithPendingPaddingBytes) {
TEST_P(QuicConnectionTest,
ReversePathValidationResponseReceivedFromUnexpectedPeerAddress) {
set_perspective(Perspective::IS_SERVER);
- if (!connection_.connection_migration_use_new_cid()) {
+ if (!connection_.connection_migration_use_new_cid() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
@@ -2102,8 +2125,11 @@ TEST_P(QuicConnectionTest,
// Sends new server CID to client.
QuicConnectionId new_cid;
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_))
- .WillOnce(Invoke([&](const QuicConnectionId& cid) { new_cid = cid; }));
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Invoke([&](const QuicConnectionId& cid) {
+ new_cid = cid;
+ return true;
+ }));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
// Discard INITIAL key.
connection_.RemoveEncrypter(ENCRYPTION_INITIAL);
@@ -2167,9 +2193,11 @@ TEST_P(QuicConnectionTest, ReversePathValidationFailureAtServer) {
QuicConnectionId server_cid0 = connection_.connection_id();
QuicConnectionId server_cid1;
// Sends new server CID to client.
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_))
- .WillOnce(
- Invoke([&](const QuicConnectionId& cid) { server_cid1 = cid; }));
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Invoke([&](const QuicConnectionId& cid) {
+ server_cid1 = cid;
+ return true;
+ }));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
connection_.OnHandshakeComplete();
// Receives new client CID from client.
@@ -2401,7 +2429,8 @@ class TestValidationResultDelegate : public QuicPathValidator::ResultDelegate {
expected_peer_address_(expected_peer_address),
success_(success) {}
void OnPathValidationSuccess(
- std::unique_ptr<QuicPathValidationContext> context) override {
+ std::unique_ptr<QuicPathValidationContext> context,
+ QuicTime /*start_time*/) override {
EXPECT_EQ(expected_self_address_, context->self_address());
EXPECT_EQ(expected_peer_address_, context->peer_address());
*success_ = true;
@@ -2865,8 +2894,8 @@ TEST_P(QuicConnectionTest, IncreaseServerMaxPacketSize) {
if (QuicVersionHasLongHeaderLengths(
peer_framer_.version().transport_version)) {
header.long_packet_type = INITIAL;
- header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
QuicFrames frames;
@@ -2913,8 +2942,8 @@ TEST_P(QuicConnectionTest, IncreaseServerMaxPacketSizeWhileWriterLimited) {
if (QuicVersionHasLongHeaderLengths(
peer_framer_.version().transport_version)) {
header.long_packet_type = INITIAL;
- header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
QuicFrames frames;
@@ -3545,6 +3574,86 @@ TEST_P(QuicConnectionTest, RecordSentTimeBeforePacketSent) {
<< ". Actual time = " << actual_recorded_send_time.ToDebuggingValue();
}
+TEST_P(QuicConnectionTest, ConnectionStatsRetransmission_WithRetransmissions) {
+ // Send two stream frames in 1 packet by queueing them.
+ connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+
+ {
+ QuicConnection::ScopedPacketFlusher flusher(&connection_);
+ connection_.SaveAndSendStreamData(
+ GetNthClientInitiatedStreamId(1, connection_.transport_version()),
+ "helloworld", 0, NO_FIN, PTO_RETRANSMISSION);
+ connection_.SaveAndSendStreamData(
+ GetNthClientInitiatedStreamId(2, connection_.transport_version()),
+ "helloworld", 0, NO_FIN, LOSS_RETRANSMISSION);
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
+ }
+
+ EXPECT_EQ(0u, connection_.NumQueuedPackets());
+ EXPECT_FALSE(connection_.HasQueuedData());
+
+ EXPECT_EQ(2u, writer_->frame_count());
+ for (auto& frame : writer_->stream_frames()) {
+ EXPECT_EQ(frame->data_length, 10u);
+ }
+
+ ASSERT_EQ(connection_.GetStats().packets_retransmitted, 1u);
+ ASSERT_GE(connection_.GetStats().bytes_retransmitted, 20u);
+}
+
+TEST_P(QuicConnectionTest, ConnectionStatsRetransmission_WithMixedFrames) {
+ // Send two stream frames in 1 packet by queueing them.
+ connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+
+ {
+ QuicConnection::ScopedPacketFlusher flusher(&connection_);
+ // First frame is retransmission. Second is NOT_RETRANSMISSION but the
+ // packet retains the PTO_RETRANSMISSION type.
+ connection_.SaveAndSendStreamData(
+ GetNthClientInitiatedStreamId(1, connection_.transport_version()),
+ "helloworld", 0, NO_FIN, PTO_RETRANSMISSION);
+ connection_.SaveAndSendStreamData(
+ GetNthClientInitiatedStreamId(2, connection_.transport_version()),
+ "helloworld", 0, NO_FIN, NOT_RETRANSMISSION);
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
+ }
+
+ EXPECT_EQ(0u, connection_.NumQueuedPackets());
+ EXPECT_FALSE(connection_.HasQueuedData());
+
+ EXPECT_EQ(2u, writer_->frame_count());
+ for (auto& frame : writer_->stream_frames()) {
+ EXPECT_EQ(frame->data_length, 10u);
+ }
+
+ ASSERT_EQ(connection_.GetStats().packets_retransmitted, 1u);
+ ASSERT_GE(connection_.GetStats().bytes_retransmitted, 10u);
+}
+
+TEST_P(QuicConnectionTest, ConnectionStatsRetransmission_NoRetransmission) {
+ // Send two stream frames in 1 packet by queueing them.
+ connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+
+ {
+ QuicConnection::ScopedPacketFlusher flusher(&connection_);
+ // Both frames are NOT_RETRANSMISSION
+ connection_.SaveAndSendStreamData(
+ GetNthClientInitiatedStreamId(1, connection_.transport_version()),
+ "helloworld", 0, NO_FIN, NOT_RETRANSMISSION);
+ connection_.SaveAndSendStreamData(
+ GetNthClientInitiatedStreamId(2, connection_.transport_version()),
+ "helloworld", 0, NO_FIN, NOT_RETRANSMISSION);
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
+ }
+
+ EXPECT_EQ(0u, connection_.NumQueuedPackets());
+ EXPECT_FALSE(connection_.HasQueuedData());
+
+ EXPECT_EQ(2u, writer_->frame_count());
+ ASSERT_EQ(connection_.GetStats().packets_retransmitted, 0u);
+ ASSERT_EQ(connection_.GetStats().bytes_retransmitted, 0u);
+}
+
TEST_P(QuicConnectionTest, FramePacking) {
// Send two stream frames in 1 packet by queueing them.
connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
@@ -7513,6 +7622,7 @@ TEST_P(QuicConnectionTest, MultipleCallsToCloseConnection) {
TEST_P(QuicConnectionTest, ServerReceivesChloOnNonCryptoStream) {
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
+ QuicConnectionPeer::SetAddressValidated(&connection_);
CryptoHandshakeMessage message;
CryptoFramer framer;
@@ -7739,6 +7849,9 @@ TEST_P(QuicConnectionTest, DoNotPadServerInitialConnectionClose) {
return;
}
set_perspective(Perspective::IS_SERVER);
+ // Receives packet 1000 in initial data.
+ EXPECT_CALL(visitor_, OnCryptoFrame(_)).Times(1);
+ ProcessCryptoPacketAtLevel(1000, ENCRYPTION_INITIAL);
if (version().handshake_protocol == PROTOCOL_TLS1_3) {
EXPECT_CALL(visitor_, BeforeConnectionCloseSent());
@@ -9445,7 +9558,8 @@ TEST_P(QuicConnectionTest, DeprecateHandshakeMode) {
}
TEST_P(QuicConnectionTest, AntiAmplificationLimit) {
- if (!connection_.version().SupportsAntiAmplificationLimit()) {
+ if (!connection_.version().SupportsAntiAmplificationLimit() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
EXPECT_CALL(visitor_, OnCryptoFrame(_)).Times(AnyNumber());
@@ -9501,7 +9615,8 @@ TEST_P(QuicConnectionTest, AntiAmplificationLimit) {
}
TEST_P(QuicConnectionTest, 3AntiAmplificationLimit) {
- if (!connection_.version().SupportsAntiAmplificationLimit()) {
+ if (!connection_.version().SupportsAntiAmplificationLimit() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
EXPECT_CALL(visitor_, OnCryptoFrame(_)).Times(AnyNumber());
@@ -9569,7 +9684,8 @@ TEST_P(QuicConnectionTest, 3AntiAmplificationLimit) {
}
TEST_P(QuicConnectionTest, 10AntiAmplificationLimit) {
- if (!connection_.version().SupportsAntiAmplificationLimit()) {
+ if (!connection_.version().SupportsAntiAmplificationLimit() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
EXPECT_CALL(visitor_, OnCryptoFrame(_)).Times(AnyNumber());
@@ -9774,7 +9890,8 @@ TEST_P(QuicConnectionTest, SendCoalescedPackets) {
TEST_P(QuicConnectionTest, FailToCoalescePacket) {
// EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
if (!IsDefaultTestConfiguration() ||
- !connection_.version().CanSendCoalescedPackets()) {
+ !connection_.version().CanSendCoalescedPackets() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
@@ -9782,7 +9899,10 @@ TEST_P(QuicConnectionTest, FailToCoalescePacket) {
use_tagging_decrypter();
auto test_body = [&] {
- EXPECT_CALL(visitor_, OnHandshakePacketSent());
+ if (!GetQuicReloadableFlag(
+ quic_packet_flusher_check_connected_after_flush_packets)) {
+ EXPECT_CALL(visitor_, OnHandshakePacketSent());
+ }
EXPECT_CALL(visitor_,
OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF))
@@ -10554,7 +10674,8 @@ TEST_P(QuicConnectionTest, ClientOnlyBlackholeDetectionServer) {
}
TEST_P(QuicConnectionTest, 2RtoBlackholeDetection) {
- if (!GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2)) {
+ if (!GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2) ||
+ GetQuicReloadableFlag(quic_remove_blackhole_detection_experiments)) {
return;
}
QuicConfig config;
@@ -10581,7 +10702,8 @@ TEST_P(QuicConnectionTest, 2RtoBlackholeDetection) {
}
TEST_P(QuicConnectionTest, 3RtoBlackholeDetection) {
- if (!GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2)) {
+ if (!GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2) ||
+ GetQuicReloadableFlag(quic_remove_blackhole_detection_experiments)) {
return;
}
QuicConfig config;
@@ -10608,7 +10730,8 @@ TEST_P(QuicConnectionTest, 3RtoBlackholeDetection) {
}
TEST_P(QuicConnectionTest, 4RtoBlackholeDetection) {
- if (!GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2)) {
+ if (!GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2) ||
+ GetQuicReloadableFlag(quic_remove_blackhole_detection_experiments)) {
return;
}
QuicConfig config;
@@ -10635,7 +10758,8 @@ TEST_P(QuicConnectionTest, 4RtoBlackholeDetection) {
}
TEST_P(QuicConnectionTest, 6RtoBlackholeDetection) {
- if (!GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2)) {
+ if (!GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2) ||
+ GetQuicReloadableFlag(quic_remove_blackhole_detection_experiments)) {
return;
}
QuicConfig config;
@@ -11813,6 +11937,7 @@ TEST_P(QuicConnectionTest, ReceiveStreamFrameBeforePathChallenge) {
frames.push_back(QuicFrame(frame1_));
QuicPathFrameBuffer path_frame_buffer{0, 1, 2, 3, 4, 5, 6, 7};
frames.push_back(QuicFrame(QuicPathChallengeFrame(0, path_frame_buffer)));
+ frames.push_back(QuicFrame(QuicPaddingFrame(-1)));
const QuicSocketAddress kNewPeerAddress(QuicIpAddress::Loopback4(),
/*port=*/23456);
@@ -13219,9 +13344,11 @@ TEST_P(QuicConnectionTest, PathChallengeBeforePeerIpAddressChangeAtServer) {
QuicConnectionId client_cid1 = TestConnectionId(2);
QuicConnectionId server_cid1;
// Sends new server CID to client.
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_))
- .WillOnce(
- Invoke([&](const QuicConnectionId& cid) { server_cid1 = cid; }));
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Invoke([&](const QuicConnectionId& cid) {
+ server_cid1 = cid;
+ return true;
+ }));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
connection_.MaybeSendConnectionIdToClient();
// Receives new client CID from client.
@@ -13365,9 +13492,11 @@ TEST_P(QuicConnectionTest,
QuicConnectionId server_cid0 = connection_.connection_id();
QuicConnectionId server_cid1;
// Sends new server CID to client.
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_))
- .WillOnce(
- Invoke([&](const QuicConnectionId& cid) { server_cid1 = cid; }));
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Invoke([&](const QuicConnectionId& cid) {
+ server_cid1 = cid;
+ return true;
+ }));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
connection_.MaybeSendConnectionIdToClient();
auto* packet_creator = QuicConnectionPeer::GetPacketCreator(&connection_);
@@ -13484,9 +13613,11 @@ TEST_P(QuicConnectionTest, NoNonProbingFrameOnAlternativePath) {
QuicConnectionId client_cid1 = TestConnectionId(2);
QuicConnectionId server_cid1;
// Sends new server CID to client.
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_))
- .WillOnce(
- Invoke([&](const QuicConnectionId& cid) { server_cid1 = cid; }));
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
+ .WillOnce(Invoke([&](const QuicConnectionId& cid) {
+ server_cid1 = cid;
+ return true;
+ }));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
connection_.MaybeSendConnectionIdToClient();
// Receives new client CID from client.
@@ -13586,6 +13717,27 @@ TEST_P(QuicConnectionTest, NoNonProbingFrameOnAlternativePath) {
}
}
+TEST_P(QuicConnectionTest, DoNotIssueNewCidIfVisitorSaysNo) {
+ set_perspective(Perspective::IS_SERVER);
+ if (!connection_.connection_migration_use_new_cid()) {
+ return;
+ }
+
+ connection_.CreateConnectionIdManager();
+
+ QuicConnectionId server_cid0 = connection_.connection_id();
+ QuicConnectionId client_cid1 = TestConnectionId(2);
+ QuicConnectionId server_cid1;
+ // Sends new server CID to client.
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_)).WillOnce(Return(false));
+ if (GetQuicReloadableFlag(quic_check_cid_collision_when_issue_new_cid)) {
+ EXPECT_CALL(visitor_, SendNewConnectionId(_)).Times(0);
+ } else {
+ EXPECT_CALL(visitor_, SendNewConnectionId(_)).Times(1);
+ }
+ connection_.MaybeSendConnectionIdToClient();
+}
+
TEST_P(QuicConnectionTest,
ProbedOnAnotherPathAfterPeerIpAddressChangeAtServer) {
PathProbeTestInit(Perspective::IS_SERVER);
@@ -14121,7 +14273,7 @@ TEST_P(QuicConnectionTest, RetireConnectionIdFrameResultsInError) {
set_perspective(Perspective::IS_SERVER);
connection_.CreateConnectionIdManager();
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_));
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
connection_.MaybeSendConnectionIdToClient();
@@ -14154,7 +14306,9 @@ TEST_P(QuicConnectionTest,
QuicRetireConnectionIdFrame frame;
frame.sequence_number = 0u;
if (connection_.connection_migration_use_new_cid()) {
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_)).Times(2);
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
+ .Times(2)
+ .WillRepeatedly(Return(true));
EXPECT_CALL(visitor_, SendNewConnectionId(_)).Times(2);
}
EXPECT_TRUE(connection_.OnRetireConnectionIdFrame(frame));
@@ -14174,8 +14328,9 @@ TEST_P(QuicConnectionTest, ServerRetireSelfIssuedConnectionId) {
set_perspective(Perspective::IS_SERVER);
connection_.CreateConnectionIdManager();
QuicConnectionId recorded_cid;
- auto cid_recorder = [&recorded_cid](const QuicConnectionId& cid) {
+ auto cid_recorder = [&recorded_cid](const QuicConnectionId& cid) -> bool {
recorded_cid = cid;
+ return true;
};
QuicConnectionId cid0 = connection_id_;
QuicConnectionId cid1;
@@ -14184,7 +14339,7 @@ TEST_P(QuicConnectionTest, ServerRetireSelfIssuedConnectionId) {
EXPECT_EQ(connection_.GetOneActiveServerConnectionId(), cid0);
connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_))
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
.WillOnce(Invoke(cid_recorder));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
connection_.MaybeSendConnectionIdToClient();
@@ -14215,7 +14370,7 @@ TEST_P(QuicConnectionTest, ServerRetireSelfIssuedConnectionId) {
// Packet2 with RetireConnectionId frame trigers sending NewConnectionId
// immediately.
- EXPECT_CALL(visitor_, OnServerConnectionIdIssued(_))
+ EXPECT_CALL(visitor_, MaybeReserveConnectionId(_))
.WillOnce(Invoke(cid_recorder));
EXPECT_CALL(visitor_, SendNewConnectionId(_));
peer_creator_.SetServerConnectionId(cid1);
@@ -14364,7 +14519,8 @@ TEST_P(QuicConnectionTest, ShouldGeneratePacketBlockedByMissingConnectionId) {
// Regression test for b/182571515
TEST_P(QuicConnectionTest, LostDataThenGetAcknowledged) {
set_perspective(Perspective::IS_SERVER);
- if (!connection_.validate_client_address()) {
+ if (!connection_.validate_client_address() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
@@ -14787,7 +14943,8 @@ TEST_P(QuicConnectionTest, ReceivedChloAndAck) {
// Regression test for b/201643321.
TEST_P(QuicConnectionTest, FailedToRetransmitShlo) {
- if (!version().HasIetfQuicFrames()) {
+ if (!version().HasIetfQuicFrames() ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
return;
}
set_perspective(Perspective::IS_SERVER);
@@ -15316,6 +15473,145 @@ TEST_P(QuicConnectionTest, EarliestSentTimeNotInitializedWhenPtoFires) {
EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
}
+TEST_P(QuicConnectionTest, CalculateNetworkBlackholeDelay) {
+ if (!IsDefaultTestConfiguration()) {
+ return;
+ }
+
+ const QuicTime::Delta kOneSec = QuicTime::Delta::FromSeconds(1);
+ const QuicTime::Delta kTwoSec = QuicTime::Delta::FromSeconds(2);
+ const QuicTime::Delta kFourSec = QuicTime::Delta::FromSeconds(4);
+
+ // Normal case: blackhole_delay longer than path_degrading_delay +
+ // 2*pto_delay.
+ EXPECT_EQ(QuicConnection::CalculateNetworkBlackholeDelay(kFourSec, kOneSec,
+ kOneSec),
+ kFourSec);
+
+ EXPECT_EQ(QuicConnection::CalculateNetworkBlackholeDelay(kFourSec, kOneSec,
+ kTwoSec),
+ QuicTime::Delta::FromSeconds(5));
+}
+
+TEST_P(QuicConnectionTest, FixBytesAccountingForBufferedCoalescedPackets) {
+ if (!connection_.version().CanSendCoalescedPackets()) {
+ return;
+ }
+ connection_.SetEncrypter(ENCRYPTION_INITIAL,
+ std::make_unique<TaggingEncrypter>(0x01));
+ // Write is blocked.
+ EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AnyNumber());
+ writer_->SetWriteBlocked();
+ connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
+ QuicConnectionPeer::SendPing(&connection_);
+ const QuicConnectionStats& stats = connection_.GetStats();
+ if (GetQuicReloadableFlag(
+ quic_fix_bytes_accounting_for_buffered_coalesced_packets) ||
+ GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
+ // Verify padding is accounted.
+ EXPECT_EQ(stats.bytes_sent, connection_.max_packet_length());
+ } else {
+ EXPECT_LT(stats.bytes_sent, connection_.max_packet_length());
+ }
+}
+
+TEST_P(QuicConnectionTest, StrictAntiAmplificationLimit) {
+ if (!connection_.version().SupportsAntiAmplificationLimit()) {
+ return;
+ }
+ EXPECT_CALL(visitor_, OnHandshakePacketSent()).Times(AnyNumber());
+ set_perspective(Perspective::IS_SERVER);
+ use_tagging_decrypter();
+ connection_.SetEncrypter(ENCRYPTION_INITIAL,
+ std::make_unique<TaggingEncrypter>(0x01));
+ connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
+ // Verify no data can be sent at the beginning because bytes received is 0.
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
+ connection_.SendCryptoDataWithString("foo", 0);
+ EXPECT_FALSE(connection_.CanWrite(HAS_RETRANSMITTABLE_DATA));
+ EXPECT_FALSE(connection_.CanWrite(NO_RETRANSMITTABLE_DATA));
+ EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
+
+ const size_t anti_amplification_factor =
+ GetQuicFlag(FLAGS_quic_anti_amplification_factor);
+ // Receives packet 1.
+ EXPECT_CALL(visitor_, OnCryptoFrame(_)).Times(1);
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
+ .Times(anti_amplification_factor);
+ ProcessCryptoPacketAtLevel(1, ENCRYPTION_INITIAL);
+ connection_.SetEncrypter(ENCRYPTION_HANDSHAKE,
+ std::make_unique<TaggingEncrypter>(0x02));
+ connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE,
+ std::make_unique<TaggingEncrypter>(0x03));
+
+ for (size_t i = 1; i < anti_amplification_factor - 1; ++i) {
+ connection_.SendCryptoDataWithString("foo", i * 3);
+ }
+ // Send an addtion packet with max_packet_size - 1.
+ connection_.SetMaxPacketLength(connection_.max_packet_length() - 1);
+ connection_.SendCryptoDataWithString("bar",
+ (anti_amplification_factor - 1) * 3);
+ EXPECT_LT(writer_->total_bytes_written(),
+ anti_amplification_factor *
+ QuicConnectionPeer::BytesReceivedOnDefaultPath(&connection_));
+ if (GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
+ // 3 connection closes which will be buffered.
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
+ // Verify retransmission alarm is not set.
+ EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
+ } else {
+ // Crypto + 3 connection closes.
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(4);
+ EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
+ }
+ // Try to send another packet with max_packet_size.
+ connection_.SetMaxPacketLength(connection_.max_packet_length() + 1);
+ connection_.SendCryptoDataWithString("bar", anti_amplification_factor * 3);
+ EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
+ // Close connection.
+ EXPECT_CALL(visitor_, BeforeConnectionCloseSent());
+ EXPECT_CALL(visitor_, OnConnectionClosed(_, _));
+ connection_.CloseConnection(
+ QUIC_INTERNAL_ERROR, "error",
+ ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
+ EXPECT_EQ(0u, connection_.NumQueuedPackets());
+ if (GetQuicFlag(FLAGS_quic_enforce_strict_amplification_factor)) {
+ EXPECT_LT(writer_->total_bytes_written(),
+ anti_amplification_factor *
+ QuicConnectionPeer::BytesReceivedOnDefaultPath(&connection_));
+ } else {
+ EXPECT_LT(writer_->total_bytes_written(),
+ (anti_amplification_factor + 2) *
+ QuicConnectionPeer::BytesReceivedOnDefaultPath(&connection_));
+ EXPECT_GT(writer_->total_bytes_written(),
+ (anti_amplification_factor + 1) *
+ QuicConnectionPeer::BytesReceivedOnDefaultPath(&connection_));
+ }
+}
+
+TEST_P(QuicConnectionTest, OriginalConnectionId) {
+ set_perspective(Perspective::IS_SERVER);
+ EXPECT_FALSE(connection_.GetDiscardZeroRttDecryptionKeysAlarm()->IsSet());
+ EXPECT_EQ(connection_.GetOriginalDestinationConnectionId(),
+ connection_.connection_id());
+ QuicConnectionId original({0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08});
+ connection_.SetOriginalDestinationConnectionId(original);
+ EXPECT_EQ(original, connection_.GetOriginalDestinationConnectionId());
+ // Send a 1-RTT packet to start the DiscardZeroRttDecryptionKeys timer.
+ EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1);
+ ProcessDataPacketAtLevel(1, false, ENCRYPTION_FORWARD_SECURE);
+ if (GetQuicRestartFlag(quic_map_original_connection_ids2) &&
+ connection_.version().UsesTls()) {
+ EXPECT_TRUE(connection_.GetDiscardZeroRttDecryptionKeysAlarm()->IsSet());
+ EXPECT_CALL(visitor_, OnServerConnectionIdRetired(original));
+ connection_.GetDiscardZeroRttDecryptionKeysAlarm()->Fire();
+ EXPECT_EQ(connection_.GetOriginalDestinationConnectionId(),
+ connection_.connection_id());
+ } else {
+ EXPECT_EQ(connection_.GetOriginalDestinationConnectionId(), original);
+ }
+}
+
} // namespace
} // namespace test
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_constants.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_constants.h
index 6f89ec1ac00..46af2e8fa8e 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_constants.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_constants.h
@@ -18,106 +18,114 @@
namespace quic {
// Simple time constants.
-const uint64_t kNumSecondsPerMinute = 60;
-const uint64_t kNumSecondsPerHour = kNumSecondsPerMinute * 60;
-const uint64_t kNumSecondsPerWeek = kNumSecondsPerHour * 24 * 7;
-const uint64_t kNumMillisPerSecond = 1000;
-const uint64_t kNumMicrosPerMilli = 1000;
-const uint64_t kNumMicrosPerSecond = kNumMicrosPerMilli * kNumMillisPerSecond;
+inline constexpr uint64_t kNumSecondsPerMinute = 60;
+inline constexpr uint64_t kNumSecondsPerHour = kNumSecondsPerMinute * 60;
+inline constexpr uint64_t kNumSecondsPerWeek = kNumSecondsPerHour * 24 * 7;
+inline constexpr uint64_t kNumMillisPerSecond = 1000;
+inline constexpr uint64_t kNumMicrosPerMilli = 1000;
+inline constexpr uint64_t kNumMicrosPerSecond =
+ kNumMicrosPerMilli * kNumMillisPerSecond;
// Default number of connections for N-connection emulation.
-const uint32_t kDefaultNumConnections = 2;
+inline constexpr uint32_t kDefaultNumConnections = 2;
// Default initial maximum size in bytes of a QUIC packet.
-const QuicByteCount kDefaultMaxPacketSize = 1250;
+inline constexpr QuicByteCount kDefaultMaxPacketSize = 1250;
// Default initial maximum size in bytes of a QUIC packet for servers.
-const QuicByteCount kDefaultServerMaxPacketSize = 1000;
+inline constexpr QuicByteCount kDefaultServerMaxPacketSize = 1000;
// Maximum transmission unit on Ethernet.
-const QuicByteCount kEthernetMTU = 1500;
+inline constexpr QuicByteCount kEthernetMTU = 1500;
// The maximum packet size of any QUIC packet over IPv6, based on ethernet's max
// size, minus the IP and UDP headers. IPv6 has a 40 byte header, UDP adds an
// additional 8 bytes. This is a total overhead of 48 bytes. Ethernet's
// max packet size is 1500 bytes, 1500 - 48 = 1452.
-const QuicByteCount kMaxV6PacketSize = 1452;
+inline constexpr QuicByteCount kMaxV6PacketSize = 1452;
// The maximum packet size of any QUIC packet over IPv4.
// 1500(Ethernet) - 20(IPv4 header) - 8(UDP header) = 1472.
-const QuicByteCount kMaxV4PacketSize = 1472;
+inline constexpr QuicByteCount kMaxV4PacketSize = 1472;
// The maximum incoming packet size allowed.
-const QuicByteCount kMaxIncomingPacketSize = kMaxV4PacketSize;
+inline constexpr QuicByteCount kMaxIncomingPacketSize = kMaxV4PacketSize;
// The maximum outgoing packet size allowed.
-const QuicByteCount kMaxOutgoingPacketSize = kMaxV6PacketSize;
+inline constexpr QuicByteCount kMaxOutgoingPacketSize = kMaxV6PacketSize;
// ETH_MAX_MTU - MAX(sizeof(iphdr), sizeof(ip6_hdr)) - sizeof(udphdr).
-const QuicByteCount kMaxGsoPacketSize = 65535 - 40 - 8;
+inline constexpr QuicByteCount kMaxGsoPacketSize = 65535 - 40 - 8;
// The maximal IETF DATAGRAM frame size we'll accept. Choosing 2^16 ensures
// that it is greater than the biggest frame we could ever fit in a QUIC packet.
-const QuicByteCount kMaxAcceptedDatagramFrameSize = 65536;
+inline constexpr QuicByteCount kMaxAcceptedDatagramFrameSize = 65536;
// Default value of the max_packet_size transport parameter if it is not
// transmitted.
-const QuicByteCount kDefaultMaxPacketSizeTransportParam = 65527;
+inline constexpr QuicByteCount kDefaultMaxPacketSizeTransportParam = 65527;
// Default maximum packet size used in the Linux TCP implementation.
// Used in QUIC for congestion window computations in bytes.
-const QuicByteCount kDefaultTCPMSS = 1460;
-const QuicByteCount kMaxSegmentSize = kDefaultTCPMSS;
+inline constexpr QuicByteCount kDefaultTCPMSS = 1460;
+inline constexpr QuicByteCount kMaxSegmentSize = kDefaultTCPMSS;
// The minimum size of a packet which can elicit a version negotiation packet,
// as per section 8.1 of the QUIC spec.
-const QuicByteCount kMinPacketSizeForVersionNegotiation = 1200;
+inline constexpr QuicByteCount kMinPacketSizeForVersionNegotiation = 1200;
// We match SPDY's use of 32 (since we'd compete with SPDY).
-const QuicPacketCount kInitialCongestionWindow = 32;
+inline constexpr QuicPacketCount kInitialCongestionWindow = 32;
// Do not allow initial congestion window to be greater than 200 packets.
-const QuicPacketCount kMaxInitialCongestionWindow = 200;
+inline constexpr QuicPacketCount kMaxInitialCongestionWindow = 200;
// Do not allow initial congestion window to be smaller than 10 packets.
-const QuicPacketCount kMinInitialCongestionWindow = 10;
+inline constexpr QuicPacketCount kMinInitialCongestionWindow = 10;
// Minimum size of initial flow control window, for both stream and session.
// This is only enforced when version.AllowsLowFlowControlLimits() is false.
-const QuicByteCount kMinimumFlowControlSendWindow = 16 * 1024; // 16 KB
+inline constexpr QuicByteCount kMinimumFlowControlSendWindow =
+ 16 * 1024; // 16 KB
// Default size of initial flow control window, for both stream and session.
-const QuicByteCount kDefaultFlowControlSendWindow = 16 * 1024; // 16 KB
+inline constexpr QuicByteCount kDefaultFlowControlSendWindow =
+ 16 * 1024; // 16 KB
// Maximum flow control receive window limits for connection and stream.
-const QuicByteCount kStreamReceiveWindowLimit = 16 * 1024 * 1024; // 16 MB
-const QuicByteCount kSessionReceiveWindowLimit = 24 * 1024 * 1024; // 24 MB
+inline constexpr QuicByteCount kStreamReceiveWindowLimit =
+ 16 * 1024 * 1024; // 16 MB
+inline constexpr QuicByteCount kSessionReceiveWindowLimit =
+ 24 * 1024 * 1024; // 24 MB
// Minimum size of the CWND, in packets, when doing bandwidth resumption.
-const QuicPacketCount kMinCongestionWindowForBandwidthResumption = 10;
+inline constexpr QuicPacketCount kMinCongestionWindowForBandwidthResumption =
+ 10;
// Default size of the socket receive buffer in bytes.
-const QuicByteCount kDefaultSocketReceiveBuffer = 1024 * 1024;
+inline constexpr QuicByteCount kDefaultSocketReceiveBuffer = 1024 * 1024;
// The lower bound of an untrusted initial rtt value.
-const uint32_t kMinUntrustedInitialRoundTripTimeUs = 10 * kNumMicrosPerMilli;
+inline constexpr uint32_t kMinUntrustedInitialRoundTripTimeUs =
+ 10 * kNumMicrosPerMilli;
// The lower bound of a trusted initial rtt value.
-const uint32_t kMinTrustedInitialRoundTripTimeUs = 5 * kNumMicrosPerMilli;
+inline constexpr uint32_t kMinTrustedInitialRoundTripTimeUs =
+ 5 * kNumMicrosPerMilli;
// Don't allow a client to suggest an RTT longer than 1 second.
-const uint32_t kMaxInitialRoundTripTimeUs = kNumMicrosPerSecond;
+inline constexpr uint32_t kMaxInitialRoundTripTimeUs = kNumMicrosPerSecond;
// Maximum number of open streams per connection.
-const size_t kDefaultMaxStreamsPerConnection = 100;
+inline constexpr size_t kDefaultMaxStreamsPerConnection = 100;
// Number of bytes reserved for public flags in the packet header.
-const size_t kPublicFlagsSize = 1;
+inline constexpr size_t kPublicFlagsSize = 1;
// Number of bytes reserved for version number in the packet header.
-const size_t kQuicVersionSize = 4;
+inline constexpr size_t kQuicVersionSize = 4;
// Minimum number of active connection IDs that an end point can maintain.
-const uint32_t kMinNumOfActiveConnectionIds = 2;
+inline constexpr uint32_t kMinNumOfActiveConnectionIds = 2;
// Length of the retry integrity tag in bytes.
// https://tools.ietf.org/html/draft-ietf-quic-transport-25#section-17.2.5
-const size_t kRetryIntegrityTagLength = 16;
+inline constexpr size_t kRetryIntegrityTagLength = 16;
// By default, UnackedPacketsMap allocates buffer of 64 after the first packet
// is added.
-const int kDefaultUnackedPacketsInitialCapacity = 64;
+inline constexpr int kDefaultUnackedPacketsInitialCapacity = 64;
// Signifies that the QuicPacket will contain version of the protocol.
-const bool kIncludeVersion = true;
+inline constexpr bool kIncludeVersion = true;
// Signifies that the QuicPacket will include a diversification nonce.
-const bool kIncludeDiversificationNonce = true;
+inline constexpr bool kIncludeDiversificationNonce = true;
// Header key used to identify final offset on data stream when sending HTTP/2
// trailing headers over QUIC.
@@ -126,40 +134,40 @@ QUIC_EXPORT_PRIVATE extern const char* const kFinalOffsetHeaderKey;
// Default maximum delayed ack time, in ms.
// Uses a 25ms delayed ack timer. Helps with better signaling
// in low-bandwidth (< ~384 kbps), where an ack is sent per packet.
-const int64_t kDefaultDelayedAckTimeMs = 25;
+inline constexpr int64_t kDefaultDelayedAckTimeMs = 25;
// Default minimum delayed ack time, in ms (used only for sender control of ack
// frequency).
-const uint32_t kDefaultMinAckDelayTimeMs = 5;
+inline constexpr uint32_t kDefaultMinAckDelayTimeMs = 5;
// Default shift of the ACK delay in the IETF QUIC ACK frame.
-const uint32_t kDefaultAckDelayExponent = 3;
+inline constexpr uint32_t kDefaultAckDelayExponent = 3;
// Minimum tail loss probe time in ms.
-static const int64_t kMinTailLossProbeTimeoutMs = 10;
+inline constexpr int64_t kMinTailLossProbeTimeoutMs = 10;
// The timeout before the handshake succeeds.
-const int64_t kInitialIdleTimeoutSecs = 5;
+inline constexpr int64_t kInitialIdleTimeoutSecs = 5;
// The maximum idle timeout that can be negotiated.
-const int64_t kMaximumIdleTimeoutSecs = 60 * 10; // 10 minutes.
+inline constexpr int64_t kMaximumIdleTimeoutSecs = 60 * 10; // 10 minutes.
// The default timeout for a connection until the crypto handshake succeeds.
-const int64_t kMaxTimeForCryptoHandshakeSecs = 10; // 10 secs.
+inline constexpr int64_t kMaxTimeForCryptoHandshakeSecs = 10; // 10 secs.
// Default limit on the number of undecryptable packets the connection buffers
// before the CHLO/SHLO arrive.
-const size_t kDefaultMaxUndecryptablePackets = 10;
+inline constexpr size_t kDefaultMaxUndecryptablePackets = 10;
// Default ping timeout.
-const int64_t kPingTimeoutSecs = 15; // 15 secs.
+inline constexpr int64_t kPingTimeoutSecs = 15; // 15 secs.
// Minimum number of RTTs between Server Config Updates (SCUP) sent to client.
-const int kMinIntervalBetweenServerConfigUpdatesRTTs = 10;
+inline constexpr int kMinIntervalBetweenServerConfigUpdatesRTTs = 10;
// Minimum time between Server Config Updates (SCUP) sent to client.
-const int kMinIntervalBetweenServerConfigUpdatesMs = 1000;
+inline constexpr int kMinIntervalBetweenServerConfigUpdatesMs = 1000;
// Minimum number of packets between Server Config Updates (SCUP).
-const int kMinPacketsBetweenServerConfigUpdates = 100;
+inline constexpr int kMinPacketsBetweenServerConfigUpdates = 100;
// The number of open streams that a server will accept is set to be slightly
// larger than the negotiated limit. Immediately closing the connection if the
@@ -167,31 +175,32 @@ const int kMinPacketsBetweenServerConfigUpdates = 100;
// a FIN that was lost, and simultaneously opened a new stream. The number of
// streams a server accepts is a fixed increment over the negotiated limit, or a
// percentage increase, whichever is larger.
-const float kMaxStreamsMultiplier = 1.1f;
-const int kMaxStreamsMinimumIncrement = 10;
+inline constexpr float kMaxStreamsMultiplier = 1.1f;
+inline constexpr int kMaxStreamsMinimumIncrement = 10;
// Available streams are ones with IDs less than the highest stream that has
// been opened which have neither been opened or reset. The limit on the number
// of available streams is 10 times the limit on the number of open streams.
-const int kMaxAvailableStreamsMultiplier = 10;
+inline constexpr int kMaxAvailableStreamsMultiplier = 10;
// Track the number of promises that are not yet claimed by a
// corresponding get. This must be smaller than
// kMaxAvailableStreamsMultiplier, because RST on a promised stream my
// create available streams entries.
-const int kMaxPromisedStreamsMultiplier = kMaxAvailableStreamsMultiplier - 1;
+inline constexpr int kMaxPromisedStreamsMultiplier =
+ kMaxAvailableStreamsMultiplier - 1;
// The 1st PTO is armed with max of earliest in flight sent time + PTO
// delay and kFirstPtoSrttMultiplier * srtt from last in flight packet.
-const float kFirstPtoSrttMultiplier = 1.5;
+inline constexpr float kFirstPtoSrttMultiplier = 1.5;
// The multiplier of RTT variation when calculating PTO timeout.
-const int kPtoRttvarMultiplier = 2;
+inline constexpr int kPtoRttvarMultiplier = 2;
// TCP RFC calls for 1 second RTO however Linux differs from this default and
// define the minimum RTO to 200ms, we will use the same until we have data to
// support a higher or lower value.
-static const int64_t kMinRetransmissionTimeMs = 200;
+inline constexpr const int64_t kMinRetransmissionTimeMs = 200;
// The delayed ack time must not be greater than half the min RTO.
static_assert(kDefaultDelayedAckTimeMs <= kMinRetransmissionTimeMs / 2,
"Delayed ack time must be less than or equal half the MinRTO");
@@ -205,98 +214,101 @@ static_assert(kDefaultDelayedAckTimeMs <= kMinRetransmissionTimeMs / 2,
// uint64_t value;
// if (exponent == 0) value = mantissa;
// else value = (mantissa | 1 << 11) << (exponent - 1)
-const int kUFloat16ExponentBits = 5;
-const int kUFloat16MaxExponent = (1 << kUFloat16ExponentBits) - 2; // 30
-const int kUFloat16MantissaBits = 16 - kUFloat16ExponentBits; // 11
-const int kUFloat16MantissaEffectiveBits = kUFloat16MantissaBits + 1; // 12
-const uint64_t kUFloat16MaxValue = // 0x3FFC0000000
+inline constexpr int kUFloat16ExponentBits = 5;
+inline constexpr int kUFloat16MaxExponent =
+ (1 << kUFloat16ExponentBits) - 2; // 30
+inline constexpr int kUFloat16MantissaBits = 16 - kUFloat16ExponentBits; // 11
+inline constexpr int kUFloat16MantissaEffectiveBits =
+ kUFloat16MantissaBits + 1; // 12
+inline constexpr uint64_t kUFloat16MaxValue = // 0x3FFC0000000
((UINT64_C(1) << kUFloat16MantissaEffectiveBits) - 1)
<< kUFloat16MaxExponent;
// kDiversificationNonceSize is the size, in bytes, of the nonce that a server
// may set in the packet header to ensure that its INITIAL keys are not
// duplicated.
-const size_t kDiversificationNonceSize = 32;
+inline constexpr size_t kDiversificationNonceSize = 32;
// The largest gap in packets we'll accept without closing the connection.
// This will likely have to be tuned.
-const QuicPacketCount kMaxPacketGap = 5000;
+inline constexpr QuicPacketCount kMaxPacketGap = 5000;
// The max number of sequence number intervals that
// QuicPeerIssuedConnetionIdManager can maintain.
-const size_t kMaxNumConnectionIdSequenceNumberIntervals = 20;
+inline constexpr size_t kMaxNumConnectionIdSequenceNumberIntervals = 20;
// The maximum number of random padding bytes to add.
-const QuicByteCount kMaxNumRandomPaddingBytes = 256;
+inline constexpr QuicByteCount kMaxNumRandomPaddingBytes = 256;
// The size of stream send buffer data slice size in bytes. A data slice is
// piece of stream data stored in contiguous memory, and a stream frame can
// contain data from multiple data slices.
-const QuicByteCount kQuicStreamSendBufferSliceSize = 4 * 1024;
+inline constexpr QuicByteCount kQuicStreamSendBufferSliceSize = 4 * 1024;
// For When using Random Initial Packet Numbers, they can start
// anyplace in the range 1...((2^31)-1) or 0x7fffffff
QUIC_EXPORT_PRIVATE QuicPacketNumber MaxRandomInitialPacketNumber();
// Used to represent an invalid or no control frame id.
-const QuicControlFrameId kInvalidControlFrameId = 0;
+inline constexpr QuicControlFrameId kInvalidControlFrameId = 0;
// The max length a stream can have.
-const QuicByteCount kMaxStreamLength = (UINT64_C(1) << 62) - 1;
+inline constexpr QuicByteCount kMaxStreamLength = (UINT64_C(1) << 62) - 1;
// The max value that can be encoded using IETF Var Ints.
-const uint64_t kMaxIetfVarInt = UINT64_C(0x3fffffffffffffff);
+inline constexpr uint64_t kMaxIetfVarInt = UINT64_C(0x3fffffffffffffff);
// The maximum stream id value that is supported - (2^32)-1
-const QuicStreamId kMaxQuicStreamId = 0xffffffff;
+inline constexpr QuicStreamId kMaxQuicStreamId = 0xffffffff;
// The maximum value that can be stored in a 32-bit QuicStreamCount.
-const QuicStreamCount kMaxQuicStreamCount = 0xffffffff;
+inline constexpr QuicStreamCount kMaxQuicStreamCount = 0xffffffff;
// Number of bytes reserved for packet header type.
-const size_t kPacketHeaderTypeSize = 1;
+inline constexpr size_t kPacketHeaderTypeSize = 1;
// Number of bytes reserved for connection ID length.
-const size_t kConnectionIdLengthSize = 1;
+inline constexpr size_t kConnectionIdLengthSize = 1;
// Minimum length of random bytes in IETF stateless reset packet.
-const size_t kMinRandomBytesLengthInStatelessReset = 24;
+inline constexpr size_t kMinRandomBytesLengthInStatelessReset = 24;
// Maximum length allowed for the token in a NEW_TOKEN frame.
-const size_t kMaxNewTokenTokenLength = 0xffff;
+inline constexpr size_t kMaxNewTokenTokenLength = 0xffff;
// The prefix used by a source address token in a NEW_TOKEN frame.
-const uint8_t kAddressTokenPrefix = 0;
+inline constexpr uint8_t kAddressTokenPrefix = 0;
// Default initial rtt used before any samples are received.
-const int kInitialRttMs = 100;
+inline constexpr int kInitialRttMs = 100;
// Default threshold of packet reordering before a packet is declared lost.
-static const QuicPacketCount kDefaultPacketReorderingThreshold = 3;
+inline constexpr QuicPacketCount kDefaultPacketReorderingThreshold = 3;
// Default fraction (1/4) of an RTT the algorithm waits before determining a
// packet is lost due to early retransmission by time based loss detection.
-static const int kDefaultLossDelayShift = 2;
+inline constexpr int kDefaultLossDelayShift = 2;
// Default fraction (1/8) of an RTT when doing IETF loss detection.
-static const int kDefaultIetfLossDelayShift = 3;
+inline constexpr int kDefaultIetfLossDelayShift = 3;
// Maximum number of retransmittable packets received before sending an ack.
-const QuicPacketCount kDefaultRetransmittablePacketsBeforeAck = 2;
+inline constexpr QuicPacketCount kDefaultRetransmittablePacketsBeforeAck = 2;
// Wait for up to 10 retransmittable packets before sending an ack.
-const QuicPacketCount kMaxRetransmittablePacketsBeforeAck = 10;
+inline constexpr QuicPacketCount kMaxRetransmittablePacketsBeforeAck = 10;
// Minimum number of packets received before ack decimation is enabled.
// This intends to avoid the beginning of slow start, when CWNDs may be
// rapidly increasing.
-const QuicPacketCount kMinReceivedBeforeAckDecimation = 100;
+inline constexpr QuicPacketCount kMinReceivedBeforeAckDecimation = 100;
// One quarter RTT delay when doing ack decimation.
-const float kAckDecimationDelay = 0.25;
+inline constexpr float kAckDecimationDelay = 0.25;
// The default alarm granularity assumed by QUIC code.
-const QuicTime::Delta kAlarmGranularity = QuicTime::Delta::FromMilliseconds(1);
+inline constexpr QuicTime::Delta kAlarmGranularity =
+ QuicTime::Delta::FromMilliseconds(1);
// Maximum number of unretired connection IDs a connection can have.
-const size_t kMaxNumConnectonIdsInUse = 10u;
+inline constexpr size_t kMaxNumConnectonIdsInUse = 10u;
// Packet number of first sending packet of a connection. Please note, this
// cannot be used as first received packet because peer can choose its starting
@@ -307,9 +319,7 @@ QUIC_EXPORT_PRIVATE QuicPacketNumber FirstSendingPacketNumber();
QUIC_EXPORT_PRIVATE extern const char* const kEPIDGoogleFrontEnd;
QUIC_EXPORT_PRIVATE extern const char* const kEPIDGoogleFrontEnd0;
-enum : uint64_t {
- kHttpDatagramStreamIdDivisor = 4,
-};
+inline constexpr uint64_t kHttpDatagramStreamIdDivisor = 4;
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager.cc
index 1553cc8fb8d..cc231b1567d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_control_frame_manager.cc
@@ -85,14 +85,8 @@ void QuicControlFrameManager::WriteOrBufferWindowUpdate(
void QuicControlFrameManager::WriteOrBufferBlocked(
QuicStreamId id, QuicStreamOffset byte_offset) {
QUIC_DVLOG(1) << "Writing BLOCKED_FRAME";
- if (GetQuicReloadableFlag(quic_include_offset_in_blocked_frames)) {
- QUIC_RELOADABLE_FLAG_COUNT(quic_include_offset_in_blocked_frames);
- WriteOrBufferQuicFrame(
- QuicFrame(QuicBlockedFrame(++last_control_frame_id_, id, byte_offset)));
- } else {
- WriteOrBufferQuicFrame(
- QuicFrame(QuicBlockedFrame(++last_control_frame_id_, id, 0)));
- }
+ WriteOrBufferQuicFrame(
+ QuicFrame(QuicBlockedFrame(++last_control_frame_id_, id, byte_offset)));
}
void QuicControlFrameManager::WriteOrBufferStreamsBlocked(QuicStreamCount count,
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc
index c85b9abf950..45f53516743 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.cc
@@ -10,7 +10,6 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "quiche/quic/core/crypto/crypto_handshake.h"
-#include "quiche/quic/core/crypto/crypto_utils.h"
#include "quiche/quic/core/frames/quic_crypto_frame.h"
#include "quiche/quic/core/quic_connection.h"
#include "quiche/quic/core/quic_error_codes.h"
@@ -50,13 +49,13 @@ QuicByteCount QuicCryptoStream::CryptoMessageFramingOverhead(
QuicTransportVersion version, QuicConnectionId connection_id) {
QUICHE_DCHECK(
QuicUtils::IsConnectionIdValidForVersion(connection_id, version));
- QuicVariableLengthIntegerLength retry_token_length_length =
- VARIABLE_LENGTH_INTEGER_LENGTH_1;
- QuicVariableLengthIntegerLength length_length =
- VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ quiche::QuicheVariableLengthIntegerLength length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
if (!QuicVersionHasLongHeaderLengths(version)) {
- retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
- length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
}
return QuicPacketCreator::StreamFramePacketOverhead(
version, static_cast<QuicConnectionIdLength>(connection_id.length()),
@@ -166,7 +165,8 @@ void QuicCryptoStream::WriteCryptoData(EncryptionLevel level,
<< absl::StrCat("Too much data for crypto send buffer with level: ",
EncryptionLevelToString(level),
", current_buffer_size: ", current_buffer_size,
- ", data length: ", data.length());
+ ", data length: ", data.length(),
+ ", SNI: ", crypto_negotiated_params().sni);
OnUnrecoverableError(QUIC_INTERNAL_ERROR,
"Too much data for crypto send buffer");
return;
@@ -385,6 +385,11 @@ uint64_t QuicCryptoStream::BytesReadOnLevel(EncryptionLevel level) const {
.sequencer.NumBytesConsumed();
}
+uint64_t QuicCryptoStream::BytesSentOnLevel(EncryptionLevel level) const {
+ return substreams_[QuicUtils::GetPacketNumberSpace(level)]
+ .send_buffer.stream_bytes_written();
+}
+
bool QuicCryptoStream::WriteCryptoFrame(EncryptionLevel level,
QuicStreamOffset offset,
QuicByteCount data_length,
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.h
index 6d29d4b73ad..0be31858c89 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.h
@@ -200,6 +200,10 @@ class QUIC_EXPORT_PRIVATE QuicCryptoStream : public QuicStream {
// the peer in CRYPTO frames at a particular encryption level.
QuicByteCount BytesReadOnLevel(EncryptionLevel level) const;
+ // Returns the number of bytes of handshake data that have been sent to
+ // the peer in CRYPTO frames at a particular encryption level.
+ QuicByteCount BytesSentOnLevel(EncryptionLevel level) const;
+
// Writes |data_length| of data of a crypto frame to |writer|. The data
// written is from the send buffer for encryption level |level| and starts at
// |offset|.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.cc
index 1a06057e9b2..aa8b278ec01 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.cc
@@ -83,93 +83,5 @@ bool QuicDataReader::ReadLengthPrefixedConnectionId(
return ReadConnectionId(connection_id, connection_id_length);
}
-QuicVariableLengthIntegerLength QuicDataReader::PeekVarInt62Length() {
- QUICHE_DCHECK_EQ(endianness(), quiche::NETWORK_BYTE_ORDER);
- const unsigned char* next =
- reinterpret_cast<const unsigned char*>(data() + pos());
- if (BytesRemaining() == 0) {
- return VARIABLE_LENGTH_INTEGER_LENGTH_0;
- }
- return static_cast<QuicVariableLengthIntegerLength>(
- 1 << ((*next & 0b11000000) >> 6));
-}
-
-// Read an IETF/QUIC formatted 62-bit Variable Length Integer.
-//
-// Performance notes
-//
-// Measurements and experiments showed that unrolling the four cases
-// like this and dereferencing next_ as we do (*(next_+n) --- and then
-// doing a single pos_+=x at the end) gains about 10% over making a
-// loop and dereferencing next_ such as *(next_++)
-//
-// Using a register for pos_ was not helpful.
-//
-// Branches are ordered to increase the likelihood of the first being
-// taken.
-//
-// Low-level optimization is useful here because this function will be
-// called frequently, leading to outsize benefits.
-bool QuicDataReader::ReadVarInt62(uint64_t* result) {
- QUICHE_DCHECK_EQ(endianness(), quiche::NETWORK_BYTE_ORDER);
-
- size_t remaining = BytesRemaining();
- const unsigned char* next =
- reinterpret_cast<const unsigned char*>(data() + pos());
- if (remaining != 0) {
- switch (*next & 0xc0) {
- case 0xc0:
- // Leading 0b11...... is 8 byte encoding
- if (remaining >= 8) {
- *result = (static_cast<uint64_t>((*(next)) & 0x3f) << 56) +
- (static_cast<uint64_t>(*(next + 1)) << 48) +
- (static_cast<uint64_t>(*(next + 2)) << 40) +
- (static_cast<uint64_t>(*(next + 3)) << 32) +
- (static_cast<uint64_t>(*(next + 4)) << 24) +
- (static_cast<uint64_t>(*(next + 5)) << 16) +
- (static_cast<uint64_t>(*(next + 6)) << 8) +
- (static_cast<uint64_t>(*(next + 7)) << 0);
- AdvancePos(8);
- return true;
- }
- return false;
-
- case 0x80:
- // Leading 0b10...... is 4 byte encoding
- if (remaining >= 4) {
- *result = (((*(next)) & 0x3f) << 24) + (((*(next + 1)) << 16)) +
- (((*(next + 2)) << 8)) + (((*(next + 3)) << 0));
- AdvancePos(4);
- return true;
- }
- return false;
-
- case 0x40:
- // Leading 0b01...... is 2 byte encoding
- if (remaining >= 2) {
- *result = (((*(next)) & 0x3f) << 8) + (*(next + 1));
- AdvancePos(2);
- return true;
- }
- return false;
-
- case 0x00:
- // Leading 0b00...... is 1 byte encoding
- *result = (*next) & 0x3f;
- AdvancePos(1);
- return true;
- }
- }
- return false;
-}
-
-bool QuicDataReader::ReadStringPieceVarInt62(absl::string_view* result) {
- uint64_t result_length;
- if (!ReadVarInt62(&result_length)) {
- return false;
- }
- return ReadStringPiece(result, result_length);
-}
-
#undef ENDPOINT // undef for jumbo builds
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.h
index 0a67df8767f..0a907e0208f 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_reader.h
@@ -62,29 +62,6 @@ class QUIC_EXPORT_PRIVATE QuicDataReader : public quiche::QuicheDataReader {
// Forwards the internal iterator on success.
// Returns true on success, false otherwise.
bool ReadLengthPrefixedConnectionId(QuicConnectionId* connection_id);
-
- // Returns the length in bytes of a variable length integer based on the next
- // two bits available. Returns 1, 2, 4, or 8 on success, and 0 on failure.
- QuicVariableLengthIntegerLength PeekVarInt62Length();
-
- // Read an IETF-encoded Variable Length Integer and place the result
- // in |*result|.
- // Returns true if it works, false if not. The only error is that
- // there is not enough in the buffer to read the number.
- // If there is an error, |*result| is not altered.
- // Numbers are encoded per the rules in draft-ietf-quic-transport-10.txt
- // and that the integers in the range 0 ... (2^62)-1.
- bool ReadVarInt62(uint64_t* result);
-
- // Reads a string prefixed with a Variable Length integer length into the
- // given output parameter.
- //
- // NOTE: Does not copy but rather references strings in the underlying buffer.
- // This should be kept in mind when handling memory management!
- //
- // Forwards the internal iterator on success.
- // Returns true on success, false otherwise.
- bool ReadStringPieceVarInt62(absl::string_view* result);
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.cc
index 4fbd3b69e03..09f1923052b 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.cc
@@ -102,157 +102,4 @@ bool QuicDataWriter::WriteInsecureRandomBytes(QuicRandom* random,
return true;
}
-// Converts a uint64_t into an IETF/Quic formatted Variable Length
-// Integer. IETF Variable Length Integers have 62 significant bits, so
-// the value to write must be in the range of 0..(2^62)-1.
-//
-// Performance notes
-//
-// Measurements and experiments showed that unrolling the four cases
-// like this and dereferencing next_ as we do (*(next_+n)) gains about
-// 10% over making a loop and dereferencing it as *(next_++)
-//
-// Using a register for next didn't help.
-//
-// Branches are ordered to increase the likelihood of the first being
-// taken.
-//
-// Low-level optimization is useful here because this function will be
-// called frequently, leading to outsize benefits.
-bool QuicDataWriter::WriteVarInt62(uint64_t value) {
- QUICHE_DCHECK_EQ(endianness(), quiche::NETWORK_BYTE_ORDER);
-
- size_t remaining_bytes = remaining();
- char* next = buffer() + length();
-
- if ((value & kVarInt62ErrorMask) == 0) {
- // We know the high 2 bits are 0 so |value| is legal.
- // We can do the encoding.
- if ((value & kVarInt62Mask8Bytes) != 0) {
- // Someplace in the high-4 bytes is a 1-bit. Do an 8-byte
- // encoding.
- if (remaining_bytes >= 8) {
- *(next + 0) = ((value >> 56) & 0x3f) + 0xc0;
- *(next + 1) = (value >> 48) & 0xff;
- *(next + 2) = (value >> 40) & 0xff;
- *(next + 3) = (value >> 32) & 0xff;
- *(next + 4) = (value >> 24) & 0xff;
- *(next + 5) = (value >> 16) & 0xff;
- *(next + 6) = (value >> 8) & 0xff;
- *(next + 7) = value & 0xff;
- IncreaseLength(8);
- return true;
- }
- return false;
- }
- // The high-order-4 bytes are all 0, check for a 1, 2, or 4-byte
- // encoding
- if ((value & kVarInt62Mask4Bytes) != 0) {
- // The encoding will not fit into 2 bytes, Do a 4-byte
- // encoding.
- if (remaining_bytes >= 4) {
- *(next + 0) = ((value >> 24) & 0x3f) + 0x80;
- *(next + 1) = (value >> 16) & 0xff;
- *(next + 2) = (value >> 8) & 0xff;
- *(next + 3) = value & 0xff;
- IncreaseLength(4);
- return true;
- }
- return false;
- }
- // The high-order bits are all 0. Check to see if the number
- // can be encoded as one or two bytes. One byte encoding has
- // only 6 significant bits (bits 0xffffffff ffffffc0 are all 0).
- // Two byte encoding has more than 6, but 14 or less significant
- // bits (bits 0xffffffff ffffc000 are 0 and 0x00000000 00003fc0
- // are not 0)
- if ((value & kVarInt62Mask2Bytes) != 0) {
- // Do 2-byte encoding
- if (remaining_bytes >= 2) {
- *(next + 0) = ((value >> 8) & 0x3f) + 0x40;
- *(next + 1) = (value)&0xff;
- IncreaseLength(2);
- return true;
- }
- return false;
- }
- if (remaining_bytes >= 1) {
- // Do 1-byte encoding
- *next = (value & 0x3f);
- IncreaseLength(1);
- return true;
- }
- return false;
- }
- // Can not encode, high 2 bits not 0
- return false;
-}
-
-bool QuicDataWriter::WriteVarInt62(
- uint64_t value, QuicVariableLengthIntegerLength write_length) {
- QUICHE_DCHECK_EQ(endianness(), quiche::NETWORK_BYTE_ORDER);
-
- size_t remaining_bytes = remaining();
- if (remaining_bytes < write_length) {
- return false;
- }
-
- const QuicVariableLengthIntegerLength min_length = GetVarInt62Len(value);
- if (write_length < min_length) {
- QUIC_BUG(quic_bug_10347_1) << "Cannot write value " << value
- << " with write_length " << write_length;
- return false;
- }
- if (write_length == min_length) {
- return WriteVarInt62(value);
- }
-
- if (write_length == VARIABLE_LENGTH_INTEGER_LENGTH_2) {
- return WriteUInt8(0b01000000) && WriteUInt8(value);
- }
- if (write_length == VARIABLE_LENGTH_INTEGER_LENGTH_4) {
- return WriteUInt8(0b10000000) && WriteUInt8(0) && WriteUInt16(value);
- }
- if (write_length == VARIABLE_LENGTH_INTEGER_LENGTH_8) {
- return WriteUInt8(0b11000000) && WriteUInt8(0) && WriteUInt16(0) &&
- WriteUInt32(value);
- }
-
- QUIC_BUG(quic_bug_10347_2)
- << "Invalid write_length " << static_cast<int>(write_length);
- return false;
-}
-
-// static
-QuicVariableLengthIntegerLength QuicDataWriter::GetVarInt62Len(uint64_t value) {
- if ((value & kVarInt62ErrorMask) != 0) {
- QUIC_BUG(quic_bug_10347_3) << "Attempted to encode a value, " << value
- << ", that is too big for VarInt62";
- return VARIABLE_LENGTH_INTEGER_LENGTH_0;
- }
- if ((value & kVarInt62Mask8Bytes) != 0) {
- return VARIABLE_LENGTH_INTEGER_LENGTH_8;
- }
- if ((value & kVarInt62Mask4Bytes) != 0) {
- return VARIABLE_LENGTH_INTEGER_LENGTH_4;
- }
- if ((value & kVarInt62Mask2Bytes) != 0) {
- return VARIABLE_LENGTH_INTEGER_LENGTH_2;
- }
- return VARIABLE_LENGTH_INTEGER_LENGTH_1;
-}
-
-bool QuicDataWriter::WriteStringPieceVarInt62(
- const absl::string_view& string_piece) {
- if (!WriteVarInt62(string_piece.size())) {
- return false;
- }
- if (!string_piece.empty()) {
- if (!WriteBytes(string_piece.data(), string_piece.size())) {
- return false;
- }
- }
- return true;
-}
-
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.h
index b1cd198d16e..c96b3b7ea40 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer.h
@@ -18,19 +18,6 @@ namespace quic {
class QuicRandom;
-// Maximum value that can be properly encoded using VarInt62 coding.
-const uint64_t kVarInt62MaxValue = UINT64_C(0x3fffffffffffffff);
-
-// VarInt62 encoding masks
-// If a uint64_t anded with a mask is not 0 then the value is encoded
-// using that length (or is too big, in the case of kVarInt62ErrorMask).
-// Values must be checked in order (error, 8-, 4-, and then 2- bytes)
-// and if none are non-0, the value is encoded in 1 byte.
-const uint64_t kVarInt62ErrorMask = UINT64_C(0xc000000000000000);
-const uint64_t kVarInt62Mask8Bytes = UINT64_C(0x3fffffffc0000000);
-const uint64_t kVarInt62Mask4Bytes = UINT64_C(0x000000003fffc000);
-const uint64_t kVarInt62Mask2Bytes = UINT64_C(0x0000000000003fc0);
-
// This class provides facilities for packing QUIC data.
//
// The QuicDataWriter supports appending primitive values (int, string, etc)
@@ -52,31 +39,6 @@ class QUIC_EXPORT_PRIVATE QuicDataWriter : public quiche::QuicheDataWriter {
// Methods for adding to the payload. These values are appended to the end
// of the QuicDataWriter payload.
- // Write an unsigned-integer value per the IETF QUIC/Variable Length
- // Integer encoding rules (see draft-ietf-quic-transport-08.txt).
- // IETF Variable Length Integers have 62 significant bits, so the
- // value to write must be in the range of 0...(2^62)-1. Returns
- // false if the value is out of range or if there is no room in the
- // buffer.
- bool WriteVarInt62(uint64_t value);
-
- // Same as WriteVarInt62(uint64_t), but forces an encoding size to write to.
- // This is not as optimized as WriteVarInt62(uint64_t).
- // Returns false if the value does not fit in the specified write_length or if
- // there is no room in the buffer.
- bool WriteVarInt62(uint64_t value,
- QuicVariableLengthIntegerLength write_length);
-
- // Writes a string piece as a consecutive length/content pair. The
- // length is VarInt62 encoded.
- bool WriteStringPieceVarInt62(const absl::string_view& string_piece);
-
- // Utility function to return the number of bytes needed to encode
- // the given value using IETF VarInt62 encoding. Returns the number
- // of bytes required to encode the given integer or 0 if the value
- // is too large to encode.
- static QuicVariableLengthIntegerLength GetVarInt62Len(uint64_t value);
-
// Write unsigned floating point corresponding to the value. Large values are
// clamped to the maximum representable (kUFloat16MaxValue). Values that can
// not be represented directly are rounded down.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer_test.cc
index 5d20c84e336..9d454e93abf 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_data_writer_test.cc
@@ -666,416 +666,12 @@ TEST_P(QuicDataWriterTest, WriteBytes) {
}
}
-const int kVarIntBufferLength = 1024;
-
-// Encodes and then decodes a specified value, checks that the
-// value that was encoded is the same as the decoded value, the length
-// is correct, and that after decoding, all data in the buffer has
-// been consumed..
-// Returns true if everything works, false if not.
-bool EncodeDecodeValue(uint64_t value_in, char* buffer, size_t size_of_buffer) {
- // Init the buffer to all 0, just for cleanliness. Makes for better
- // output if, in debugging, we need to dump out the buffer.
- memset(buffer, 0, size_of_buffer);
- // make a writer. Note that for IETF encoding
- // we do not care about endianness... It's always big-endian,
- // but the c'tor expects to be told what endianness is in force...
- QuicDataWriter writer(size_of_buffer, buffer,
- quiche::Endianness::NETWORK_BYTE_ORDER);
-
- // Try to write the value.
- if (writer.WriteVarInt62(value_in) != true) {
- return false;
- }
- // Look at the value we encoded. Determine how much should have been
- // used based on the value, and then check the state of the writer
- // to see that it matches.
- size_t expected_length = 0;
- if (value_in <= 0x3f) {
- expected_length = 1;
- } else if (value_in <= 0x3fff) {
- expected_length = 2;
- } else if (value_in <= 0x3fffffff) {
- expected_length = 4;
- } else {
- expected_length = 8;
- }
- if (writer.length() != expected_length) {
- return false;
- }
-
- // set up a reader, just the length we've used, no more, no less.
- QuicDataReader reader(buffer, expected_length,
- quiche::Endianness::NETWORK_BYTE_ORDER);
- uint64_t value_out;
-
- if (reader.ReadVarInt62(&value_out) == false) {
- return false;
- }
- if (value_in != value_out) {
- return false;
- }
- // We only write one value so there had better be nothing left to read
- return reader.IsDoneReading();
-}
-
-// Test that 8-byte-encoded Variable Length Integers are properly laid
-// out in the buffer.
-TEST_P(QuicDataWriterTest, VarInt8Layout) {
- char buffer[1024];
-
- // Check that the layout of bytes in the buffer is correct. Bytes
- // are always encoded big endian...
- memset(buffer, 0, sizeof(buffer));
- QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x3142f3e4d5c6b7a8)));
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 0)),
- (0x31 + 0xc0)); // 0xc0 for encoding
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 1)), 0x42);
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 2)), 0xf3);
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 3)), 0xe4);
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 4)), 0xd5);
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 5)), 0xc6);
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 6)), 0xb7);
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 7)), 0xa8);
-}
-
-// Test that 4-byte-encoded Variable Length Integers are properly laid
-// out in the buffer.
-TEST_P(QuicDataWriterTest, VarInt4Layout) {
- char buffer[1024];
-
- // Check that the layout of bytes in the buffer is correct. Bytes
- // are always encoded big endian...
- memset(buffer, 0, sizeof(buffer));
- QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- EXPECT_TRUE(writer.WriteVarInt62(0x3243f4e5));
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 0)),
- (0x32 + 0x80)); // 0x80 for encoding
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 1)), 0x43);
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 2)), 0xf4);
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 3)), 0xe5);
-}
-
-// Test that 2-byte-encoded Variable Length Integers are properly laid
-// out in the buffer.
-TEST_P(QuicDataWriterTest, VarInt2Layout) {
- char buffer[1024];
-
- // Check that the layout of bytes in the buffer is correct. Bytes
- // are always encoded big endian...
- memset(buffer, 0, sizeof(buffer));
- QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- EXPECT_TRUE(writer.WriteVarInt62(0x3647));
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 0)),
- (0x36 + 0x40)); // 0x40 for encoding
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 1)), 0x47);
-}
-
-// Test that 1-byte-encoded Variable Length Integers are properly laid
-// out in the buffer.
-TEST_P(QuicDataWriterTest, VarInt1Layout) {
- char buffer[1024];
-
- // Check that the layout of bytes in the buffer
- // is correct. Bytes are always encoded big endian...
- memset(buffer, 0, sizeof(buffer));
- QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- EXPECT_TRUE(writer.WriteVarInt62(0x3f));
- EXPECT_EQ(static_cast<unsigned char>(*(writer.data() + 0)), 0x3f);
-}
-
-// Test certain, targeted, values that are expected to succeed:
-// 0, 1,
-// 0x3e, 0x3f, 0x40, 0x41 (around the 1-2 byte transitions)
-// 0x3ffe, 0x3fff, 0x4000, 0x4001 (the 2-4 byte transition)
-// 0x3ffffffe, 0x3fffffff, 0x40000000, 0x40000001 (the 4-8 byte
-// transition)
-// 0x3ffffffffffffffe, 0x3fffffffffffffff, (the highest valid values)
-// 0xfe, 0xff, 0x100, 0x101,
-// 0xfffe, 0xffff, 0x10000, 0x10001,
-// 0xfffffe, 0xffffff, 0x1000000, 0x1000001,
-// 0xfffffffe, 0xffffffff, 0x100000000, 0x100000001,
-// 0xfffffffffe, 0xffffffffff, 0x10000000000, 0x10000000001,
-// 0xfffffffffffe, 0xffffffffffff, 0x1000000000000, 0x1000000000001,
-// 0xfffffffffffffe, 0xffffffffffffff, 0x100000000000000, 0x100000000000001,
-TEST_P(QuicDataWriterTest, VarIntGoodTargetedValues) {
- char buffer[kVarIntBufferLength];
- uint64_t passing_values[] = {
- 0,
- 1,
- 0x3e,
- 0x3f,
- 0x40,
- 0x41,
- 0x3ffe,
- 0x3fff,
- 0x4000,
- 0x4001,
- 0x3ffffffe,
- 0x3fffffff,
- 0x40000000,
- 0x40000001,
- 0x3ffffffffffffffe,
- 0x3fffffffffffffff,
- 0xfe,
- 0xff,
- 0x100,
- 0x101,
- 0xfffe,
- 0xffff,
- 0x10000,
- 0x10001,
- 0xfffffe,
- 0xffffff,
- 0x1000000,
- 0x1000001,
- 0xfffffffe,
- 0xffffffff,
- 0x100000000,
- 0x100000001,
- 0xfffffffffe,
- 0xffffffffff,
- 0x10000000000,
- 0x10000000001,
- 0xfffffffffffe,
- 0xffffffffffff,
- 0x1000000000000,
- 0x1000000000001,
- 0xfffffffffffffe,
- 0xffffffffffffff,
- 0x100000000000000,
- 0x100000000000001,
- };
- for (uint64_t test_val : passing_values) {
- EXPECT_TRUE(
- EncodeDecodeValue(test_val, static_cast<char*>(buffer), sizeof(buffer)))
- << " encode/decode of " << test_val << " failed";
- }
-}
-//
-// Test certain, targeted, values where failure is expected (the
-// values are invalid w.r.t. IETF VarInt encoding):
-// 0x4000000000000000, 0x4000000000000001, ( Just above max allowed value)
-// 0xfffffffffffffffe, 0xffffffffffffffff, (should fail)
-TEST_P(QuicDataWriterTest, VarIntBadTargetedValues) {
- char buffer[kVarIntBufferLength];
- uint64_t failing_values[] = {
- 0x4000000000000000,
- 0x4000000000000001,
- 0xfffffffffffffffe,
- 0xffffffffffffffff,
- };
- for (uint64_t test_val : failing_values) {
- EXPECT_FALSE(
- EncodeDecodeValue(test_val, static_cast<char*>(buffer), sizeof(buffer)))
- << " encode/decode of " << test_val << " succeeded, but was an "
- << "invalid value";
- }
-}
-
// Following tests all try to fill the buffer with multiple values,
// go one value more than the buffer can accommodate, then read
// the successfully encoded values, and try to read the unsuccessfully
// encoded value. The following is the number of values to encode.
const int kMultiVarCount = 1000;
-// Test writing & reading multiple 8-byte-encoded varints
-TEST_P(QuicDataWriterTest, MultiVarInt8) {
- uint64_t test_val;
- char buffer[8 * kMultiVarCount];
- memset(buffer, 0, sizeof(buffer));
- QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- // Put N values into the buffer. Adding i to the value ensures that
- // each value is different so we can detect if we overwrite values,
- // or read the same value over and over.
- for (int i = 0; i < kMultiVarCount; i++) {
- EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x3142f3e4d5c6b7a8) + i));
- }
- EXPECT_EQ(writer.length(), 8u * kMultiVarCount);
-
- // N+1st should fail, the buffer is full.
- EXPECT_FALSE(writer.WriteVarInt62(UINT64_C(0x3142f3e4d5c6b7a8)));
-
- // Now we should be able to read out the N values that were
- // successfully encoded.
- QuicDataReader reader(buffer, sizeof(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- for (int i = 0; i < kMultiVarCount; i++) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, (UINT64_C(0x3142f3e4d5c6b7a8) + i));
- }
- // And the N+1st should fail.
- EXPECT_FALSE(reader.ReadVarInt62(&test_val));
-}
-
-// Test writing & reading multiple 4-byte-encoded varints
-TEST_P(QuicDataWriterTest, MultiVarInt4) {
- uint64_t test_val;
- char buffer[4 * kMultiVarCount];
- memset(buffer, 0, sizeof(buffer));
- QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- // Put N values into the buffer. Adding i to the value ensures that
- // each value is different so we can detect if we overwrite values,
- // or read the same value over and over.
- for (int i = 0; i < kMultiVarCount; i++) {
- EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x3142f3e4) + i));
- }
- EXPECT_EQ(writer.length(), 4u * kMultiVarCount);
-
- // N+1st should fail, the buffer is full.
- EXPECT_FALSE(writer.WriteVarInt62(UINT64_C(0x3142f3e4)));
-
- // Now we should be able to read out the N values that were
- // successfully encoded.
- QuicDataReader reader(buffer, sizeof(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- for (int i = 0; i < kMultiVarCount; i++) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, (UINT64_C(0x3142f3e4) + i));
- }
- // And the N+1st should fail.
- EXPECT_FALSE(reader.ReadVarInt62(&test_val));
-}
-
-// Test writing & reading multiple 2-byte-encoded varints
-TEST_P(QuicDataWriterTest, MultiVarInt2) {
- uint64_t test_val;
- char buffer[2 * kMultiVarCount];
- memset(buffer, 0, sizeof(buffer));
- QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- // Put N values into the buffer. Adding i to the value ensures that
- // each value is different so we can detect if we overwrite values,
- // or read the same value over and over.
- for (int i = 0; i < kMultiVarCount; i++) {
- EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x3142) + i));
- }
- EXPECT_EQ(writer.length(), 2u * kMultiVarCount);
-
- // N+1st should fail, the buffer is full.
- EXPECT_FALSE(writer.WriteVarInt62(UINT64_C(0x3142)));
-
- // Now we should be able to read out the N values that were
- // successfully encoded.
- QuicDataReader reader(buffer, sizeof(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- for (int i = 0; i < kMultiVarCount; i++) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, (UINT64_C(0x3142) + i));
- }
- // And the N+1st should fail.
- EXPECT_FALSE(reader.ReadVarInt62(&test_val));
-}
-
-// Test writing & reading multiple 1-byte-encoded varints
-TEST_P(QuicDataWriterTest, MultiVarInt1) {
- uint64_t test_val;
- char buffer[1 * kMultiVarCount];
- memset(buffer, 0, sizeof(buffer));
- QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- // Put N values into the buffer. Adding i to the value ensures that
- // each value is different so we can detect if we overwrite values,
- // or read the same value over and over. &0xf ensures we do not
- // overflow the max value for single-byte encoding.
- for (int i = 0; i < kMultiVarCount; i++) {
- EXPECT_TRUE(writer.WriteVarInt62(UINT64_C(0x30) + (i & 0xf)));
- }
- EXPECT_EQ(writer.length(), 1u * kMultiVarCount);
-
- // N+1st should fail, the buffer is full.
- EXPECT_FALSE(writer.WriteVarInt62(UINT64_C(0x31)));
-
- // Now we should be able to read out the N values that were
- // successfully encoded.
- QuicDataReader reader(buffer, sizeof(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
- for (int i = 0; i < kMultiVarCount; i++) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, (UINT64_C(0x30) + (i & 0xf)));
- }
- // And the N+1st should fail.
- EXPECT_FALSE(reader.ReadVarInt62(&test_val));
-}
-
-// Test writing varints with a forced length.
-TEST_P(QuicDataWriterTest, VarIntFixedLength) {
- char buffer[90];
- memset(buffer, 0, sizeof(buffer));
- QuicDataWriter writer(sizeof(buffer), static_cast<char*>(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
-
- writer.WriteVarInt62(1, VARIABLE_LENGTH_INTEGER_LENGTH_1);
- writer.WriteVarInt62(1, VARIABLE_LENGTH_INTEGER_LENGTH_2);
- writer.WriteVarInt62(1, VARIABLE_LENGTH_INTEGER_LENGTH_4);
- writer.WriteVarInt62(1, VARIABLE_LENGTH_INTEGER_LENGTH_8);
-
- writer.WriteVarInt62(63, VARIABLE_LENGTH_INTEGER_LENGTH_1);
- writer.WriteVarInt62(63, VARIABLE_LENGTH_INTEGER_LENGTH_2);
- writer.WriteVarInt62(63, VARIABLE_LENGTH_INTEGER_LENGTH_4);
- writer.WriteVarInt62(63, VARIABLE_LENGTH_INTEGER_LENGTH_8);
-
- writer.WriteVarInt62(64, VARIABLE_LENGTH_INTEGER_LENGTH_2);
- writer.WriteVarInt62(64, VARIABLE_LENGTH_INTEGER_LENGTH_4);
- writer.WriteVarInt62(64, VARIABLE_LENGTH_INTEGER_LENGTH_8);
-
- writer.WriteVarInt62(16383, VARIABLE_LENGTH_INTEGER_LENGTH_2);
- writer.WriteVarInt62(16383, VARIABLE_LENGTH_INTEGER_LENGTH_4);
- writer.WriteVarInt62(16383, VARIABLE_LENGTH_INTEGER_LENGTH_8);
-
- writer.WriteVarInt62(16384, VARIABLE_LENGTH_INTEGER_LENGTH_4);
- writer.WriteVarInt62(16384, VARIABLE_LENGTH_INTEGER_LENGTH_8);
-
- writer.WriteVarInt62(1073741823, VARIABLE_LENGTH_INTEGER_LENGTH_4);
- writer.WriteVarInt62(1073741823, VARIABLE_LENGTH_INTEGER_LENGTH_8);
-
- writer.WriteVarInt62(1073741824, VARIABLE_LENGTH_INTEGER_LENGTH_8);
-
- QuicDataReader reader(buffer, sizeof(buffer),
- quiche::Endianness::NETWORK_BYTE_ORDER);
-
- uint64_t test_val = 0;
- for (int i = 0; i < 4; ++i) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, 1u);
- }
- for (int i = 0; i < 4; ++i) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, 63u);
- }
-
- for (int i = 0; i < 3; ++i) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, 64u);
- }
- for (int i = 0; i < 3; ++i) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, 16383u);
- }
-
- for (int i = 0; i < 2; ++i) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, 16384u);
- }
- for (int i = 0; i < 2; ++i) {
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, 1073741823u);
- }
-
- EXPECT_TRUE(reader.ReadVarInt62(&test_val));
- EXPECT_EQ(test_val, 1073741824u);
-
- // We are at the end of the buffer so this should fail.
- EXPECT_FALSE(reader.ReadVarInt62(&test_val));
-}
-
// Test encoding/decoding stream-id values.
void EncodeDecodeStreamId(uint64_t value_in) {
char buffer[1 * kMultiVarCount];
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_clock.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_clock.cc
new file mode 100644
index 00000000000..1418efbddef
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_clock.cc
@@ -0,0 +1,31 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/core/quic_default_clock.h"
+
+#include "absl/time/clock.h"
+
+namespace quic {
+
+QuicDefaultClock* QuicDefaultClock::Get() {
+ static QuicDefaultClock* clock = new QuicDefaultClock();
+ return clock;
+}
+
+QuicTime QuicDefaultClock::ApproximateNow() const { return Now(); }
+
+QuicTime QuicDefaultClock::Now() const {
+ return CreateTimeFromMicroseconds(absl::GetCurrentTimeNanos() / 1000);
+}
+
+QuicWallTime QuicDefaultClock::WallNow() const {
+ return QuicWallTime::FromUNIXMicroseconds(absl::GetCurrentTimeNanos() / 1000);
+}
+
+QuicTime QuicDefaultClock::ConvertWallTimeToQuicTime(
+ const QuicWallTime& walltime) const {
+ return CreateTimeFromMicroseconds(walltime.ToUNIXMicroseconds());
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_clock.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_clock.h
new file mode 100644
index 00000000000..96fec754ddc
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_clock.h
@@ -0,0 +1,34 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_QUIC_DEFAULT_CLOCK_H_
+#define QUICHE_QUIC_CORE_QUIC_DEFAULT_CLOCK_H_
+
+#include "quiche/quic/core/quic_clock.h"
+#include "quiche/quic/core/quic_time.h"
+#include "quiche/quic/platform/api/quic_export.h"
+
+namespace quic {
+
+// A QuicClock based on Abseil time API. Thread-safe.
+class QUIC_EXPORT_PRIVATE QuicDefaultClock : public QuicClock {
+ public:
+ // Provides a single default stateless instance of QuicDefaultClock.
+ static QuicDefaultClock* Get();
+
+ explicit QuicDefaultClock() = default;
+ QuicDefaultClock(const QuicDefaultClock&) = delete;
+ QuicDefaultClock& operator=(const QuicDefaultClock&) = delete;
+
+ // QuicClock implementation.
+ QuicTime ApproximateNow() const override;
+ QuicTime Now() const override;
+ QuicWallTime WallNow() const override;
+ QuicTime ConvertWallTimeToQuicTime(
+ const QuicWallTime& walltime) const override;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_QUIC_DEFAULT_CLOCK_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_connection_helper.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_connection_helper.h
new file mode 100644
index 00000000000..3a10b43319c
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_default_connection_helper.h
@@ -0,0 +1,49 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CORE_QUIC_DEFAULT_CONNECTION_HELPER_H_
+#define QUICHE_QUIC_CORE_QUIC_DEFAULT_CONNECTION_HELPER_H_
+
+#include "quiche/quic/core/crypto/quic_random.h"
+#include "quiche/quic/core/quic_connection.h"
+#include "quiche/quic/core/quic_default_clock.h"
+#include "quiche/common/simple_buffer_allocator.h"
+
+namespace quic {
+
+// A default implementation of QuicConnectionHelperInterface. Thread-safe.
+class QUIC_EXPORT_PRIVATE QuicDefaultConnectionHelper
+ : public QuicConnectionHelperInterface {
+ public:
+ static QuicDefaultConnectionHelper* Get() {
+ static QuicDefaultConnectionHelper* helper =
+ new QuicDefaultConnectionHelper();
+ return helper;
+ }
+
+ // Creates a helper that uses the default allocator.
+ QuicDefaultConnectionHelper() : QuicDefaultConnectionHelper(nullptr) {}
+ // If |allocator| is nullptr, the default one is used.
+ QuicDefaultConnectionHelper(
+ std::unique_ptr<quiche::QuicheBufferAllocator> allocator)
+ : allocator_(std::move(allocator)) {}
+
+ QuicDefaultConnectionHelper(const QuicDefaultConnectionHelper&) = delete;
+ QuicDefaultConnectionHelper& operator=(const QuicDefaultConnectionHelper&) =
+ delete;
+
+ const QuicClock* GetClock() const override { return QuicDefaultClock::Get(); }
+ QuicRandom* GetRandomGenerator() override {
+ return QuicRandom::GetInstance();
+ }
+ quiche::QuicheBufferAllocator* GetStreamSendBufferAllocator() override {
+ return allocator_ ? allocator_.get() : quiche::SimpleBufferAllocator::Get();
+ }
+
+ private:
+ std::unique_ptr<quiche::QuicheBufferAllocator> allocator_;
+};
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_QUIC_DEFAULT_CONNECTION_HELPER_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc
index 9166a931397..6a0c8ec248f 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.cc
@@ -26,6 +26,7 @@
#include "quiche/quic/platform/api/quic_flag_utils.h"
#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_logging.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/platform/api/quic_stack_trace.h"
#include "quiche/common/quiche_text_utils.h"
@@ -255,6 +256,7 @@ bool MaybeHandleLegacyVersionEncapsulation(
QuicDispatcher* dispatcher,
std::string legacy_version_encapsulation_inner_packet,
const ReceivedPacketInfo& packet_info) {
+ QUICHE_DCHECK(!GetQuicRestartFlag(quic_disable_legacy_version_encapsulation));
if (legacy_version_encapsulation_inner_packet.empty()) {
// This CHLO did not contain the Legacy Version Encapsulation tag.
return false;
@@ -357,6 +359,10 @@ QuicDispatcher::QuicDispatcher(
<< "Trying to create dispatcher without any supported versions";
QUIC_DLOG(INFO) << "Created QuicDispatcher with versions: "
<< ParsedQuicVersionVectorToString(GetSupportedVersions());
+ if (send_connection_close_for_tls_alerts_) {
+ QUIC_RESTART_FLAG_COUNT_N(
+ quic_dispatcher_send_connection_close_for_tls_alerts, 1, 3);
+ }
}
QuicDispatcher::~QuicDispatcher() {
@@ -587,16 +593,21 @@ bool QuicDispatcher::MaybeDispatchPacket(
packet_info.version == LegacyVersionForEncapsulation()) {
// This packet is using the Legacy Version Encapsulation version but the
// corresponding session isn't, attempt extraction of inner packet.
- ChloAlpnSniExtractor alpn_extractor;
- if (ChloExtractor::Extract(packet_info.packet, packet_info.version,
- config_->create_session_tag_indicators(),
- &alpn_extractor,
- server_connection_id.length())) {
- if (MaybeHandleLegacyVersionEncapsulation(
- this,
- alpn_extractor.ConsumeLegacyVersionEncapsulationInnerPacket(),
- packet_info)) {
- return true;
+ if (GetQuicRestartFlag(quic_disable_legacy_version_encapsulation)) {
+ QUIC_CODE_COUNT(
+ quic_disable_legacy_version_encapsulation_dispatch_packet);
+ } else {
+ ChloAlpnSniExtractor alpn_extractor;
+ if (ChloExtractor::Extract(packet_info.packet, packet_info.version,
+ config_->create_session_tag_indicators(),
+ &alpn_extractor,
+ server_connection_id.length())) {
+ if (MaybeHandleLegacyVersionEncapsulation(
+ this,
+ alpn_extractor.ConsumeLegacyVersionEncapsulationInnerPacket(),
+ packet_info)) {
+ return true;
+ }
}
}
}
@@ -604,13 +615,18 @@ bool QuicDispatcher::MaybeDispatchPacket(
packet_info.peer_address, packet_info.packet);
return true;
}
- if (packet_info.version.IsKnown()) {
+ if (packet_info.version.IsKnown() &&
+ !GetQuicRestartFlag(quic_map_original_connection_ids2)) {
// We did not find the connection ID, check if we've replaced it.
// This is only performed for supported versions because packets with
// unsupported versions can flow through this function in order to send
// a version negotiation packet, but we know that their connection ID
// did not get replaced since that is performed on connection creation,
// and that only happens for known verions.
+ // There is no need to perform this check if
+ // |reference_counted_session_map_| is storing original connection IDs
+ // separately. It can be counterproductive to do this check if that
+ // consumes a nonce or generates a random connection ID.
QuicConnectionId replaced_connection_id = MaybeReplaceServerConnectionId(
server_connection_id, packet_info.version);
if (replaced_connection_id != server_connection_id) {
@@ -710,29 +726,63 @@ void QuicDispatcher::ProcessHeader(ReceivedPacketInfo* packet_info) {
// Packet's connection ID is unknown. Apply the validity checks.
QuicPacketFate fate = ValidityChecks(*packet_info);
+ // |connection_close_error_code| is used if the final packet fate is
+ // kFateTimeWait.
+ QuicErrorCode connection_close_error_code = QUIC_HANDSHAKE_FAILED;
+
+ // If a fatal TLS alert was received when extracting Client Hello,
+ // |tls_alert_error_detail| will be set and will be used as the error_details
+ // of the connection close.
+ std::string tls_alert_error_detail;
+
if (fate == kFateProcess) {
- absl::optional<ParsedClientHello> parsed_chlo =
+ ExtractChloResult extract_chlo_result =
TryExtractChloOrBufferEarlyPacket(*packet_info);
- if (!parsed_chlo.has_value()) {
+ auto& parsed_chlo = extract_chlo_result.parsed_chlo;
+
+ if (send_connection_close_for_tls_alerts_ &&
+ extract_chlo_result.tls_alert.has_value()) {
+ QUIC_RESTART_FLAG_COUNT_N(
+ quic_dispatcher_send_connection_close_for_tls_alerts, 2, 3);
+ QUIC_BUG_IF(quic_dispatcher_parsed_chlo_and_tls_alert_coexist_1,
+ parsed_chlo.has_value())
+ << "parsed_chlo and tls_alert should not be set at the same time.";
+ // Fatal TLS alert when parsing Client Hello.
+ fate = kFateTimeWait;
+ uint8_t tls_alert = *extract_chlo_result.tls_alert;
+ connection_close_error_code = TlsAlertToQuicErrorCode(tls_alert);
+ tls_alert_error_detail =
+ absl::StrCat("TLS handshake failure (",
+ EncryptionLevelToString(ENCRYPTION_INITIAL), ") ",
+ static_cast<int>(tls_alert), ": ",
+ SSL_alert_desc_string_long(tls_alert));
+ } else if (!parsed_chlo.has_value()) {
// Client Hello incomplete. Packet has been buffered or (rarely) dropped.
return;
- }
+ } else {
+ // Client Hello fully received.
+ fate = ValidityChecksOnFullChlo(*packet_info, *parsed_chlo);
- // Client Hello fully received.
- fate = ValidityChecksOnFullChlo(*packet_info, *parsed_chlo);
+ if (fate == kFateProcess) {
+ QUICHE_DCHECK(
+ parsed_chlo->legacy_version_encapsulation_inner_packet.empty() ||
+ !packet_info->version.UsesTls());
+ if (GetQuicRestartFlag(quic_disable_legacy_version_encapsulation)) {
+ if (!parsed_chlo->legacy_version_encapsulation_inner_packet.empty()) {
+ QUIC_CODE_COUNT(
+ quic_disable_legacy_version_encapsulation_process_header);
+ }
+ } else {
+ if (MaybeHandleLegacyVersionEncapsulation(
+ this, parsed_chlo->legacy_version_encapsulation_inner_packet,
+ *packet_info)) {
+ return;
+ }
+ }
- if (fate == kFateProcess) {
- QUICHE_DCHECK(
- parsed_chlo->legacy_version_encapsulation_inner_packet.empty() ||
- !packet_info->version.UsesTls());
- if (MaybeHandleLegacyVersionEncapsulation(
- this, parsed_chlo->legacy_version_encapsulation_inner_packet,
- *packet_info)) {
+ ProcessChlo(*std::move(parsed_chlo), packet_info);
return;
}
-
- ProcessChlo(*std::move(parsed_chlo), packet_info);
- return;
}
}
@@ -741,16 +791,19 @@ void QuicDispatcher::ProcessHeader(ReceivedPacketInfo* packet_info) {
// kFateProcess have been processed above.
QUIC_BUG(quic_dispatcher_bad_packet_fate) << fate;
break;
- case kFateTimeWait:
+ case kFateTimeWait: {
// Add this connection_id to the time-wait state, to safely reject
// future packets.
QUIC_DLOG(INFO) << "Adding connection ID " << server_connection_id
<< " to time-wait list.";
QUIC_CODE_COUNT(quic_reject_fate_time_wait);
+ const std::string& connection_close_error_detail =
+ tls_alert_error_detail.empty() ? "Reject connection"
+ : tls_alert_error_detail;
StatelesslyTerminateConnection(
server_connection_id, packet_info->form, packet_info->version_flag,
packet_info->use_length_prefix, packet_info->version,
- QUIC_HANDSHAKE_FAILED, "Reject connection",
+ connection_close_error_code, connection_close_error_detail,
quic::QuicTimeWaitListManager::SEND_STATELESS_RESET);
QUICHE_DCHECK(time_wait_list_manager_->IsConnectionIdInTimeWait(
@@ -761,15 +814,16 @@ void QuicDispatcher::ProcessHeader(ReceivedPacketInfo* packet_info) {
GetPerPacketContext());
buffered_packets_.DiscardPackets(server_connection_id);
- break;
+ } break;
case kFateDrop:
break;
}
}
-absl::optional<ParsedClientHello>
+QuicDispatcher::ExtractChloResult
QuicDispatcher::TryExtractChloOrBufferEarlyPacket(
const ReceivedPacketInfo& packet_info) {
+ ExtractChloResult result;
if (packet_info.version.UsesTls()) {
bool has_full_tls_chlo = false;
std::string sni;
@@ -782,7 +836,7 @@ QuicDispatcher::TryExtractChloOrBufferEarlyPacket(
has_full_tls_chlo = buffered_packets_.IngestPacketForTlsChloExtraction(
packet_info.destination_connection_id, packet_info.version,
packet_info.packet, &alpns, &sni, &resumption_attempted,
- &early_data_attempted);
+ &early_data_attempted, &result.tls_alert);
} else {
// If we do not have a BufferedPacketList for this connection ID,
// create a single-use one to check whether this packet contains a
@@ -796,17 +850,29 @@ QuicDispatcher::TryExtractChloOrBufferEarlyPacket(
sni = tls_chlo_extractor.server_name();
resumption_attempted = tls_chlo_extractor.resumption_attempted();
early_data_attempted = tls_chlo_extractor.early_data_attempted();
+ } else {
+ result.tls_alert = tls_chlo_extractor.tls_alert();
}
}
+
+ if (send_connection_close_for_tls_alerts_ && result.tls_alert.has_value()) {
+ QUIC_RESTART_FLAG_COUNT_N(
+ quic_dispatcher_send_connection_close_for_tls_alerts, 3, 3);
+ QUIC_BUG_IF(quic_dispatcher_parsed_chlo_and_tls_alert_coexist_2,
+ has_full_tls_chlo)
+ << "parsed_chlo and tls_alert should not be set at the same time.";
+ return result;
+ }
+
if (!has_full_tls_chlo) {
// This packet does not contain a full CHLO. It could be a 0-RTT
// packet that arrived before the CHLO (due to loss or reordering),
// or it could be a fragment of a multi-packet CHLO.
BufferEarlyPacket(packet_info);
- return absl::nullopt;
+ return result;
}
- ParsedClientHello parsed_chlo;
+ ParsedClientHello& parsed_chlo = result.parsed_chlo.emplace();
parsed_chlo.sni = std::move(sni);
parsed_chlo.alpns = std::move(alpns);
if (packet_info.retry_token.has_value()) {
@@ -814,7 +880,7 @@ QuicDispatcher::TryExtractChloOrBufferEarlyPacket(
}
parsed_chlo.resumption_attempted = resumption_attempted;
parsed_chlo.early_data_attempted = early_data_attempted;
- return parsed_chlo;
+ return result;
}
ChloAlpnSniExtractor alpn_extractor;
@@ -825,7 +891,7 @@ QuicDispatcher::TryExtractChloOrBufferEarlyPacket(
packet_info.destination_connection_id.length())) {
// Buffer non-CHLO packets.
BufferEarlyPacket(packet_info);
- return absl::nullopt;
+ return result;
}
// We only apply this check for versions that do not use the IETF
@@ -838,16 +904,16 @@ QuicDispatcher::TryExtractChloOrBufferEarlyPacket(
QUIC_DVLOG(1) << "Dropping CHLO packet which is too short, length: "
<< packet_info.packet.length();
QUIC_CODE_COUNT(quic_drop_small_chlo_packets);
- return absl::nullopt;
+ return result;
}
- ParsedClientHello parsed_chlo;
+ ParsedClientHello& parsed_chlo = result.parsed_chlo.emplace();
parsed_chlo.legacy_version_encapsulation_inner_packet =
alpn_extractor.ConsumeLegacyVersionEncapsulationInnerPacket();
parsed_chlo.sni = alpn_extractor.ConsumeSni();
parsed_chlo.uaid = alpn_extractor.ConsumeUaid();
parsed_chlo.alpns = {alpn_extractor.ConsumeAlpn()};
- return parsed_chlo;
+ return result;
}
std::string QuicDispatcher::SelectAlpn(const std::vector<std::string>& alpns) {
@@ -1051,15 +1117,13 @@ void QuicDispatcher::OnConnectionClosed(QuicConnectionId server_connection_id,
<< ", with details: " << error_details;
QuicConnection* connection = it->second->connection();
- if (ShouldDestroySessionAsynchronously()) {
- // Set up alarm to fire immediately to bring destruction of this session
- // out of current call stack.
- if (closed_session_list_.empty()) {
- delete_sessions_alarm_->Update(helper()->GetClock()->ApproximateNow(),
- QuicTime::Delta::Zero());
- }
- closed_session_list_.push_back(std::move(it->second));
+ // Set up alarm to fire immediately to bring destruction of this session
+ // out of current call stack.
+ if (closed_session_list_.empty()) {
+ delete_sessions_alarm_->Update(helper()->GetClock()->ApproximateNow(),
+ QuicTime::Delta::Zero());
}
+ closed_session_list_.push_back(std::move(it->second));
CleanUpSession(it->first, connection, error, error_details, source);
for (const QuicConnectionId& cid :
connection->GetActiveServerConnectionIds()) {
@@ -1088,7 +1152,7 @@ void QuicDispatcher::OnRstStreamReceived(const QuicRstStreamFrame& /*frame*/) {}
void QuicDispatcher::OnStopSendingReceived(
const QuicStopSendingFrame& /*frame*/) {}
-void QuicDispatcher::OnNewConnectionIdSent(
+bool QuicDispatcher::TryAddNewConnectionId(
const QuicConnectionId& server_connection_id,
const QuicConnectionId& new_connection_id) {
auto it = reference_counted_session_map_.find(server_connection_id);
@@ -1097,13 +1161,16 @@ void QuicDispatcher::OnNewConnectionIdSent(
<< "Couldn't locate the session that issues the connection ID in "
"reference_counted_session_map_. server_connection_id:"
<< server_connection_id << " new_connection_id: " << new_connection_id;
- return;
+ return false;
}
// Count new connection ID added to the dispatcher map.
QUIC_RELOADABLE_FLAG_COUNT_N(quic_connection_migration_use_new_cid_v2, 6, 6);
auto insertion_result = reference_counted_session_map_.insert(
std::make_pair(new_connection_id, it->second));
- QUICHE_DCHECK(insertion_result.second);
+ if (!insertion_result.second) {
+ QUIC_CODE_COUNT(quic_cid_already_in_session_map);
+ }
+ return insertion_result.second;
}
void QuicDispatcher::OnConnectionIdRetired(
@@ -1211,32 +1278,16 @@ void QuicDispatcher::ProcessBufferedChlos(size_t max_connections_to_create) {
<< server_connection_id;
continue;
}
- const ParsedClientHello& parsed_chlo = *packet_list.parsed_chlo;
- QuicConnectionId original_connection_id = server_connection_id;
- server_connection_id = MaybeReplaceServerConnectionId(server_connection_id,
- packet_list.version);
- std::string alpn = SelectAlpn(parsed_chlo.alpns);
- std::unique_ptr<QuicSession> session = CreateQuicSession(
- server_connection_id, packets.front().self_address,
- packets.front().peer_address, alpn, packet_list.version, parsed_chlo);
- if (original_connection_id != server_connection_id) {
- session->connection()->SetOriginalDestinationConnectionId(
- original_connection_id);
- }
- QUIC_DLOG(INFO) << "Created new session for " << server_connection_id;
-
- auto insertion_result = reference_counted_session_map_.insert(
- std::make_pair(server_connection_id,
- std::shared_ptr<QuicSession>(std::move(session))));
- if (!insertion_result.second) {
- QUIC_BUG(quic_bug_12724_5)
- << "Tried to add a session to session_map with existing connection "
- "id: "
- << server_connection_id;
- } else {
- ++num_sessions_in_session_map_;
+ auto session_ptr = QuicDispatcher::CreateSessionFromChlo(
+ server_connection_id, *packet_list.parsed_chlo, packet_list.version,
+ packets.front().self_address, packets.front().peer_address);
+ if (session_ptr != nullptr) {
+ DeliverPacketsToSession(packets, session_ptr.get());
+ if (server_connection_id != session_ptr->connection_id() &&
+ GetQuicRestartFlag(quic_map_original_connection_ids2)) {
+ QUIC_RESTART_FLAG_COUNT_N(quic_map_original_connection_ids2, 1, 4);
+ }
}
- DeliverPacketsToSession(packets, insertion_result.first->second.get());
}
}
@@ -1244,13 +1295,6 @@ bool QuicDispatcher::HasChlosBuffered() const {
return buffered_packets_.HasChlosBuffered();
}
-bool QuicDispatcher::ShouldCreateOrBufferPacketForConnection(
- const ReceivedPacketInfo& packet_info) {
- QUIC_VLOG(1) << "Received packet from new connection "
- << packet_info.destination_connection_id;
- return true;
-}
-
// Return true if there is any packet buffered in the store.
bool QuicDispatcher::HasBufferedPackets(QuicConnectionId server_connection_id) {
return buffered_packets_.HasBufferedPackets(server_connection_id);
@@ -1268,13 +1312,6 @@ QuicTimeWaitListManager* QuicDispatcher::CreateQuicTimeWaitListManager() {
}
void QuicDispatcher::BufferEarlyPacket(const ReceivedPacketInfo& packet_info) {
- bool is_new_connection = !buffered_packets_.HasBufferedPackets(
- packet_info.destination_connection_id);
- if (is_new_connection &&
- !ShouldCreateOrBufferPacketForConnection(packet_info)) {
- return;
- }
-
EnqueuePacketResult rs = buffered_packets_.EnqueuePacket(
packet_info.destination_connection_id,
packet_info.form != GOOGLE_QUIC_PACKET, packet_info.packet,
@@ -1287,11 +1324,6 @@ void QuicDispatcher::BufferEarlyPacket(const ReceivedPacketInfo& packet_info) {
void QuicDispatcher::ProcessChlo(ParsedClientHello parsed_chlo,
ReceivedPacketInfo* packet_info) {
- if (!buffered_packets_.HasBufferedPackets(
- packet_info->destination_connection_id) &&
- !ShouldCreateOrBufferPacketForConnection(*packet_info)) {
- return;
- }
if (GetQuicFlag(FLAGS_quic_allow_chlo_buffering) &&
new_sessions_allowed_per_event_loop_ <= 0) {
// Can't create new session any more. Wait till next event loop.
@@ -1308,50 +1340,25 @@ void QuicDispatcher::ProcessChlo(ParsedClientHello parsed_chlo,
return;
}
- QuicConnectionId original_connection_id =
- packet_info->destination_connection_id;
- packet_info->destination_connection_id = MaybeReplaceServerConnectionId(
- original_connection_id, packet_info->version);
- // Creates a new session and process all buffered packets for this connection.
- std::string alpn = SelectAlpn(parsed_chlo.alpns);
- std::unique_ptr<QuicSession> session = CreateQuicSession(
- packet_info->destination_connection_id, packet_info->self_address,
- packet_info->peer_address, alpn, packet_info->version, parsed_chlo);
- if (ABSL_PREDICT_FALSE(session == nullptr)) {
- QUIC_BUG(quic_bug_10287_8)
- << "CreateQuicSession returned nullptr for "
- << packet_info->destination_connection_id << " from "
- << packet_info->peer_address << " to " << packet_info->self_address
- << " ALPN \"" << alpn << "\" version " << packet_info->version;
+ auto session_ptr = QuicDispatcher::CreateSessionFromChlo(
+ packet_info->destination_connection_id, parsed_chlo, packet_info->version,
+ packet_info->self_address, packet_info->peer_address);
+ if (session_ptr == nullptr) {
return;
}
- const bool replaced_connection_id =
- original_connection_id != packet_info->destination_connection_id;
- if (replaced_connection_id) {
- session->connection()->SetOriginalDestinationConnectionId(
- original_connection_id);
- }
- QUIC_DLOG(INFO) << "Created new session for "
- << packet_info->destination_connection_id;
-
- QuicSession* session_ptr;
- auto insertion_result = reference_counted_session_map_.insert(std::make_pair(
- packet_info->destination_connection_id,
- std::shared_ptr<QuicSession>(std::move(session.release()))));
- if (!insertion_result.second) {
- QUIC_BUG(quic_bug_10287_9)
- << "Tried to add a session to session_map with existing "
- "connection id: "
- << packet_info->destination_connection_id;
- } else {
- ++num_sessions_in_session_map_;
- }
- session_ptr = insertion_result.first->second.get();
std::list<BufferedPacket> packets =
- buffered_packets_.DeliverPackets(original_connection_id).buffered_packets;
- if (replaced_connection_id && !packets.empty()) {
- QUIC_CODE_COUNT(
- quic_delivered_buffered_packets_to_connection_with_replaced_id);
+ buffered_packets_.DeliverPackets(packet_info->destination_connection_id)
+ .buffered_packets;
+ if (packet_info->destination_connection_id != session_ptr->connection_id()) {
+ // Provide the calling function with access to the new connection ID.
+ packet_info->destination_connection_id = session_ptr->connection_id();
+ if (!packets.empty()) {
+ QUIC_CODE_COUNT(
+ quic_delivered_buffered_packets_to_connection_with_replaced_id);
+ }
+ if (GetQuicRestartFlag(quic_map_original_connection_ids2)) {
+ QUIC_RESTART_FLAG_COUNT_N(quic_map_original_connection_ids2, 2, 4);
+ }
}
// Process CHLO at first.
session_ptr->ProcessUdpPacket(packet_info->self_address,
@@ -1359,12 +1366,10 @@ void QuicDispatcher::ProcessChlo(ParsedClientHello parsed_chlo,
// Deliver queued-up packets in the same order as they arrived.
// Do this even when flag is off because there might be still some packets
// buffered in the store before flag is turned off.
- DeliverPacketsToSession(packets, session_ptr);
+ DeliverPacketsToSession(packets, session_ptr.get());
--new_sessions_allowed_per_event_loop_;
}
-bool QuicDispatcher::ShouldDestroySessionAsynchronously() { return true; }
-
void QuicDispatcher::SetLastError(QuicErrorCode error) { last_error_ = error; }
bool QuicDispatcher::OnFailedToDispatchPacket(
@@ -1394,6 +1399,75 @@ bool QuicDispatcher::IsSupportedVersion(const ParsedQuicVersion version) {
return false;
}
+std::shared_ptr<QuicSession> QuicDispatcher::CreateSessionFromChlo(
+ const QuicConnectionId original_connection_id,
+ const ParsedClientHello& parsed_chlo, const ParsedQuicVersion version,
+ const QuicSocketAddress self_address,
+ const QuicSocketAddress peer_address) {
+ QuicConnectionId server_connection_id =
+ MaybeReplaceServerConnectionId(original_connection_id, version);
+ const bool replaced_connection_id =
+ original_connection_id != server_connection_id;
+ if (reference_counted_session_map_.count(server_connection_id) > 0 &&
+ GetQuicRestartFlag(quic_map_original_connection_ids2)) {
+ // The new connection ID is owned by another session. Avoid creating one
+ // altogether, as this connection attempt cannot possibly succeed.
+ if (replaced_connection_id) {
+ // The original connection ID does not correspond to an existing
+ // session. It is safe to send CONNECTION_CLOSE and add to TIME_WAIT.
+ StatelesslyTerminateConnection(
+ original_connection_id, IETF_QUIC_LONG_HEADER_PACKET,
+ /*version_flag=*/true, version.HasLengthPrefixedConnectionIds(),
+ version, QUIC_HANDSHAKE_FAILED,
+ "Connection ID collision, please retry",
+ QuicTimeWaitListManager::SEND_CONNECTION_CLOSE_PACKETS);
+ }
+ return nullptr;
+ }
+ // Creates a new session and process all buffered packets for this connection.
+ std::string alpn = SelectAlpn(parsed_chlo.alpns);
+ std::unique_ptr<QuicSession> session =
+ CreateQuicSession(server_connection_id, self_address, peer_address, alpn,
+ version, parsed_chlo);
+ if (ABSL_PREDICT_FALSE(session == nullptr)) {
+ QUIC_BUG(quic_bug_10287_8)
+ << "CreateQuicSession returned nullptr for " << server_connection_id
+ << " from " << peer_address << " to " << self_address << " ALPN \""
+ << alpn << "\" version " << version;
+ return nullptr;
+ }
+
+ if (replaced_connection_id) {
+ session->connection()->SetOriginalDestinationConnectionId(
+ original_connection_id);
+ }
+ QUIC_DLOG(INFO) << "Created new session for " << server_connection_id;
+
+ auto insertion_result = reference_counted_session_map_.insert(std::make_pair(
+ server_connection_id, std::shared_ptr<QuicSession>(std::move(session))));
+ std::shared_ptr<QuicSession> session_ptr = insertion_result.first->second;
+ if (!insertion_result.second) {
+ QUIC_BUG(quic_bug_10287_9)
+ << "Tried to add a session to session_map with existing "
+ "connection id: "
+ << server_connection_id;
+ } else {
+ ++num_sessions_in_session_map_;
+ if (GetQuicRestartFlag(quic_map_original_connection_ids2) &&
+ replaced_connection_id) {
+ auto insertion_result2 = reference_counted_session_map_.insert(
+ std::make_pair(original_connection_id, session_ptr));
+ QUIC_BUG_IF(quic_460317833_02, !insertion_result2.second)
+ << "Original connection ID already in session_map: "
+ << original_connection_id;
+ // If insertion of the original connection ID fails, it might cause
+ // loss of 0-RTT and other first flight packets, but the connection
+ // will usually progress.
+ }
+ }
+ return session_ptr;
+}
+
void QuicDispatcher::MaybeResetPacketsWithNoVersion(
const ReceivedPacketInfo& packet_info) {
QUICHE_DCHECK(!packet_info.version_flag);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.h
index f53df8b2447..813655b40b1 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.h
@@ -102,8 +102,9 @@ class QUIC_NO_EXPORT QuicDispatcher
// QuicSession::Visitor interface implementation (via inheritance of
// QuicTimeWaitListManager::Visitor):
- // Add the newly issued connection ID to the session map.
- void OnNewConnectionIdSent(
+ // Try to add the new connection ID to the session map. Returns true on
+ // success.
+ bool TryAddNewConnectionId(
const QuicConnectionId& server_connection_id,
const QuicConnectionId& new_connection_id) override;
@@ -244,10 +245,6 @@ class QUIC_NO_EXPORT QuicDispatcher
void ProcessChlo(ParsedClientHello parsed_chlo,
ReceivedPacketInfo* packet_info);
- // Return true if dispatcher wants to destroy session outside of
- // OnConnectionClosed() call stack.
- virtual bool ShouldDestroySessionAsynchronously();
-
QuicTimeWaitListManager* time_wait_list_manager() {
return time_wait_list_manager_.get();
}
@@ -288,13 +285,6 @@ class QUIC_NO_EXPORT QuicDispatcher
// true if packet is successfully dispatched.
virtual bool OnFailedToDispatchPacket(const ReceivedPacketInfo& packet_info);
- // Called when a new connection starts to be handled by this dispatcher.
- // Either this connection is created or its packets is buffered while waiting
- // for CHLO. Returns true if a new connection should be created or its packets
- // should be buffered, false otherwise.
- virtual bool ShouldCreateOrBufferPacketForConnection(
- const ReceivedPacketInfo& packet_info);
-
bool HasBufferedPackets(QuicConnectionId server_connection_id);
// Called when BufferEarlyPacket() fail to buffer the packet.
@@ -370,15 +360,26 @@ class QUIC_NO_EXPORT QuicDispatcher
// ProcessValidatedPacketWithUnknownConnectionId.
void ProcessHeader(ReceivedPacketInfo* packet_info);
+ struct ExtractChloResult {
+ // If set, a full client hello has been successfully parsed.
+ absl::optional<ParsedClientHello> parsed_chlo;
+ // If set, the TLS alert that will cause a connection close.
+ // Always empty for Google QUIC.
+ absl::optional<uint8_t> tls_alert;
+ };
+
// Try to extract information(sni, alpns, ...) if the full Client Hello has
// been parsed.
//
- // Return the parsed client hello if the full Client Hello has been
- // successfully parsed.
+ // Returns the parsed client hello in ExtractChloResult.parsed_chlo, if the
+ // full Client Hello has been successfully parsed.
+ //
+ // Returns the TLS alert in ExtractChloResult.tls_alert, if the extraction of
+ // Client Hello failed due to that alert.
//
- // Otherwise return absl::nullopt and either buffer or (rarely) drop the
- // packet.
- absl::optional<ParsedClientHello> TryExtractChloOrBufferEarlyPacket(
+ // Otherwise returns a default-constructed ExtractChloResult and either buffer
+ // or (rarely) drop the packet.
+ ExtractChloResult TryExtractChloOrBufferEarlyPacket(
const ReceivedPacketInfo& packet_info);
// Deliver |packets| to |session| for further processing.
@@ -389,6 +390,13 @@ class QUIC_NO_EXPORT QuicDispatcher
// Returns true if |version| is a supported protocol version.
bool IsSupportedVersion(const ParsedQuicVersion version);
+ // Core CHLO processing logic.
+ std::shared_ptr<QuicSession> CreateSessionFromChlo(
+ const QuicConnectionId original_connection_id,
+ const ParsedClientHello& parsed_chlo, const ParsedQuicVersion version,
+ const QuicSocketAddress self_address,
+ const QuicSocketAddress peer_address);
+
const QuicConfig* config_;
const QuicCryptoServerConfig* crypto_config_;
@@ -467,6 +475,9 @@ class QUIC_NO_EXPORT QuicDispatcher
// If true, change expected_server_connection_id_length_ to be the received
// destination connection ID length of all IETF long headers.
bool should_update_expected_server_connection_id_length_;
+
+ const bool send_connection_close_for_tls_alerts_ =
+ GetQuicRestartFlag(quic_dispatcher_send_connection_close_for_tls_alerts);
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher_test.cc
index e5e6ea2c14e..5c71e6246df 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_dispatcher_test.cc
@@ -125,9 +125,6 @@ class TestDispatcher : public QuicDispatcher {
const ParsedClientHello& parsed_chlo),
(override));
- MOCK_METHOD(bool, ShouldCreateOrBufferPacketForConnection,
- (const ReceivedPacketInfo& packet_info), (override));
-
struct TestQuicPerPacketContext : public QuicPerPacketContext {
std::string custom_packet_context;
};
@@ -170,7 +167,10 @@ class MockServerConnection : public MockQuicConnection {
active_connection_ids_({connection_id}) {}
void AddNewConnectionId(QuicConnectionId id) {
- dispatcher_->OnNewConnectionIdSent(active_connection_ids_.back(), id);
+ if (!dispatcher_->TryAddNewConnectionId(active_connection_ids_.back(),
+ id)) {
+ return;
+ }
QuicConnectionPeer::SetServerConnectionId(this, id);
active_connection_ids_.push_back(id);
}
@@ -184,7 +184,19 @@ class MockServerConnection : public MockQuicConnection {
}
std::vector<QuicConnectionId> GetActiveServerConnectionIds() const override {
- return active_connection_ids_;
+ if (!GetQuicRestartFlag(quic_map_original_connection_ids2)) {
+ return active_connection_ids_;
+ }
+ std::vector<QuicConnectionId> result;
+ for (const auto& cid : active_connection_ids_) {
+ result.push_back(cid);
+ }
+ auto original_connection_id = GetOriginalDestinationConnectionId();
+ if (std::find(result.begin(), result.end(), original_connection_id) ==
+ result.end()) {
+ result.push_back(original_connection_id);
+ }
+ return result;
}
void UnregisterOnConnectionClosed() {
@@ -225,8 +237,6 @@ class QuicDispatcherTestBase : public QuicTestWithParam<ParsedQuicVersion> {
// Set the counter to some value to start with.
QuicDispatcherPeer::set_new_sessions_allowed_per_event_loop(
dispatcher_.get(), kMaxNumSessionsToCreate);
- ON_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(_))
- .WillByDefault(Return(true));
}
MockQuicConnection* connection1() {
@@ -475,9 +485,6 @@ class QuicDispatcherTestBase : public QuicTestWithParam<ParsedQuicVersion> {
Invoke([this, connection_id](const QuicEncryptedPacket& packet) {
ValidatePacket(connection_id, packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(connection_id)));
ProcessFirstFlight(version, client_address, connection_id);
}
@@ -553,9 +560,6 @@ TEST_P(QuicDispatcherTestAllVersions, TlsClientHelloCreatesSession) {
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(1), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
ProcessFirstFlight(client_address, TestConnectionId(1));
}
@@ -595,10 +599,6 @@ void QuicDispatcherTestBase::TestTlsMultiPacketClientHello(
}
// Processing the first packet should not create a new session.
- EXPECT_CALL(
- *dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(original_connection_id)));
ProcessReceivedPacket(std::move(packets[0]), client_address, version_,
original_connection_id);
@@ -645,6 +645,9 @@ TEST_P(QuicDispatcherTestAllVersions,
}
TEST_P(QuicDispatcherTestAllVersions, LegacyVersionEncapsulation) {
+ if (GetQuicRestartFlag(quic_disable_legacy_version_encapsulation)) {
+ return;
+ }
if (!version_.HasLongHeaderLengths()) {
// Decapsulating Legacy Version Encapsulation packets from these versions
// is not currently supported in QuicDispatcher.
@@ -724,9 +727,6 @@ TEST_P(QuicDispatcherTestAllVersions, ProcessPackets) {
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(1), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
ProcessFirstFlight(client_address, TestConnectionId(1));
EXPECT_CALL(
@@ -742,9 +742,6 @@ TEST_P(QuicDispatcherTestAllVersions, ProcessPackets) {
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(2), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(2))));
ProcessFirstFlight(client_address, TestConnectionId(2));
EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
@@ -775,9 +772,6 @@ TEST_P(QuicDispatcherTestAllVersions, DispatcherDoesNotRejectPacketNumberZero) {
WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(1), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
ProcessFirstFlight(client_address, TestConnectionId(1));
// Packet number 256 with packet number length 1 would be considered as 0 in
// dispatcher.
@@ -884,9 +878,6 @@ TEST_P(QuicDispatcherTestAllVersions, Shutdown) {
ValidatePacket(TestConnectionId(1), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
ProcessFirstFlight(client_address, TestConnectionId(1));
EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
@@ -913,9 +904,6 @@ TEST_P(QuicDispatcherTestAllVersions, TimeWaitListManager) {
ValidatePacket(TestConnectionId(1), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
ProcessFirstFlight(client_address, connection_id);
// Now close the connection, which should add it to the time wait list.
@@ -1096,9 +1084,6 @@ TEST_P(QuicDispatcherTestAllVersions, LongConnectionIdLengthReplaced) {
Invoke([this, bad_connection_id](const QuicEncryptedPacket& packet) {
ValidatePacket(bad_connection_id, packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(bad_connection_id)));
ProcessFirstFlight(client_address, bad_connection_id);
}
@@ -1133,9 +1118,6 @@ TEST_P(QuicDispatcherTestAllVersions, InvalidShortConnectionIdLengthReplaced) {
Invoke([this, bad_connection_id](const QuicEncryptedPacket& packet) {
ValidatePacket(bad_connection_id, packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(bad_connection_id)));
ProcessFirstFlight(client_address, bad_connection_id);
}
@@ -1163,9 +1145,6 @@ TEST_P(QuicDispatcherTestAllVersions, MixGoodAndBadConnectionIdLengthPackets) {
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(1), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
ProcessFirstFlight(client_address, TestConnectionId(1));
EXPECT_CALL(*dispatcher_,
@@ -1181,9 +1160,6 @@ TEST_P(QuicDispatcherTestAllVersions, MixGoodAndBadConnectionIdLengthPackets) {
Invoke([this, bad_connection_id](const QuicEncryptedPacket& packet) {
ValidatePacket(bad_connection_id, packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(bad_connection_id)));
ProcessFirstFlight(client_address, bad_connection_id);
EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
@@ -1917,9 +1893,6 @@ class QuicDispatcherWriteBlockedListTest : public QuicDispatcherTestBase {
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(1), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
ProcessFirstFlight(client_address, TestConnectionId(1));
EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, client_address,
@@ -1933,9 +1906,6 @@ class QuicDispatcherWriteBlockedListTest : public QuicDispatcherTestBase {
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(2), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(2))));
ProcessFirstFlight(client_address, TestConnectionId(2));
blocked_list_ = QuicDispatcherPeer::GetWriteBlockedList(dispatcher_.get());
@@ -2203,9 +2173,6 @@ class QuicDispatcherSupportMultipleConnectionIdPerConnectionTest
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(1), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(1))));
ProcessFirstFlight(client_address, TestConnectionId(1));
}
@@ -2222,9 +2189,6 @@ class QuicDispatcherSupportMultipleConnectionIdPerConnectionTest
.WillOnce(WithArg<2>(Invoke([this](const QuicEncryptedPacket& packet) {
ValidatePacket(TestConnectionId(2), packet);
})));
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(2))));
ProcessFirstFlight(client_address, TestConnectionId(2));
}
@@ -2240,7 +2204,14 @@ INSTANTIATE_TEST_SUITE_P(
::testing::PrintToStringParamName());
TEST_P(QuicDispatcherSupportMultipleConnectionIdPerConnectionTest,
- OnNewConnectionIdSent) {
+ FailToAddExistingConnectionId) {
+ AddConnection1();
+ EXPECT_FALSE(dispatcher_->TryAddNewConnectionId(TestConnectionId(1),
+ TestConnectionId(1)));
+}
+
+TEST_P(QuicDispatcherSupportMultipleConnectionIdPerConnectionTest,
+ TryAddNewConnectionId) {
AddConnection1();
ASSERT_EQ(dispatcher_->NumSessions(), 1u);
ASSERT_THAT(session1_, testing::NotNull());
@@ -2419,10 +2390,6 @@ INSTANTIATE_TEST_SUITE_P(BufferedPacketStoreTests, BufferedPacketStoreTest,
TEST_P(BufferedPacketStoreTest, ProcessNonChloPacketBeforeChlo) {
InSequence s;
QuicConnectionId conn_id = TestConnectionId(1);
- // Non-CHLO should be buffered upon arrival, and should trigger
- // ShouldCreateOrBufferPacketForConnection().
- EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(conn_id)));
// Process non-CHLO packet.
ProcessUndecryptableEarlyPacket(conn_id);
EXPECT_EQ(0u, dispatcher_->NumSessions())
@@ -2452,10 +2419,6 @@ TEST_P(BufferedPacketStoreTest, ProcessNonChloPacketBeforeChlo) {
TEST_P(BufferedPacketStoreTest, ProcessNonChloPacketsUptoLimitAndProcessChlo) {
InSequence s;
QuicConnectionId conn_id = TestConnectionId(1);
- // A bunch of non-CHLO should be buffered upon arrival, and the first one
- // should trigger ShouldCreateOrBufferPacketForConnection().
- EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(conn_id)));
for (size_t i = 1; i <= kDefaultMaxUndecryptablePackets + 1; ++i) {
ProcessUndecryptableEarlyPacket(conn_id);
}
@@ -2495,9 +2458,6 @@ TEST_P(BufferedPacketStoreTest,
for (size_t i = 1; i <= kNumConnections; ++i) {
QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 20000 + i);
QuicConnectionId conn_id = TestConnectionId(i);
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(conn_id)));
ProcessUndecryptableEarlyPacket(client_address, conn_id);
}
@@ -2513,11 +2473,6 @@ TEST_P(BufferedPacketStoreTest,
for (size_t i = 1; i <= kNumConnections; ++i) {
QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 20000 + i);
QuicConnectionId conn_id = TestConnectionId(i);
- if (i == kNumConnections) {
- EXPECT_CALL(*dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(conn_id)));
- }
EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, _, client_address,
Eq(ExpectedAlpn()), _, _))
.WillOnce(Return(ByMove(CreateSession(
@@ -2544,8 +2499,6 @@ TEST_P(BufferedPacketStoreTest,
// Tests that store delivers empty packet list if CHLO arrives firstly.
TEST_P(BufferedPacketStoreTest, DeliverEmptyPackets) {
QuicConnectionId conn_id = TestConnectionId(1);
- EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(conn_id)));
EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, _, client_addr_,
Eq(ExpectedAlpn()), _, _))
.WillOnce(Return(ByMove(CreateSession(
@@ -2629,10 +2582,6 @@ TEST_P(BufferedPacketStoreTest, ProcessCHLOsUptoLimitAndBufferTheRest) {
const size_t kNumCHLOs =
kMaxNumSessionsToCreate + kDefaultMaxConnectionsInStore + 1;
for (uint64_t conn_id = 1; conn_id <= kNumCHLOs; ++conn_id) {
- EXPECT_CALL(
- *dispatcher_,
- ShouldCreateOrBufferPacketForConnection(
- ReceivedPacketInfoConnectionIdEquals(TestConnectionId(conn_id))));
if (conn_id <= kMaxNumSessionsToCreate) {
EXPECT_CALL(*dispatcher_,
CreateQuicSession(TestConnectionId(conn_id), _, client_addr_,
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc
index c0ea59dba14..9cd540a1247 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc
@@ -281,6 +281,7 @@ const char* QuicErrorCodeToString(QuicErrorCode error) {
RETURN_STRING_LITERAL(QUIC_TLS_KEYING_MATERIAL_EXPORTS_MISMATCH);
RETURN_STRING_LITERAL(QUIC_TLS_KEYING_MATERIAL_EXPORT_NOT_AVAILABLE);
RETURN_STRING_LITERAL(QUIC_UNEXPECTED_DATA_BEFORE_ENCRYPTION_ESTABLISHED);
+ RETURN_STRING_LITERAL(QUIC_SERVER_UNHEALTHY);
RETURN_STRING_LITERAL(QUIC_LAST_ERROR);
// Intentionally have no default case, so we'll break the build
@@ -790,6 +791,8 @@ QuicErrorCodeToIetfMapping QuicErrorCodeToTransportErrorCode(
return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
case QUIC_UNEXPECTED_DATA_BEFORE_ENCRYPTION_ESTABLISHED:
return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
+ case QUIC_SERVER_UNHEALTHY:
+ return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
case QUIC_LAST_ERROR:
return {false, static_cast<uint64_t>(QUIC_LAST_ERROR)};
}
@@ -970,6 +973,17 @@ QuicResetStreamError QuicResetStreamError::FromIetf(uint64_t code) {
IetfResetStreamErrorCodeToRstStreamErrorCode(code), code);
}
+// static
+QuicResetStreamError QuicResetStreamError::FromIetf(QuicHttp3ErrorCode code) {
+ return FromIetf(static_cast<uint64_t>(code));
+}
+
+// static
+QuicResetStreamError QuicResetStreamError::FromIetf(
+ QuicHttpQpackErrorCode code) {
+ return FromIetf(static_cast<uint64_t>(code));
+}
+
#undef RETURN_STRING_LITERAL // undef for jumbo builds
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h
index 9c20cd5a88f..bbd1d393d2f 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h
@@ -614,8 +614,11 @@ enum QuicErrorCode {
QUIC_TLS_KEYING_MATERIAL_EXPORT_NOT_AVAILABLE = 210,
QUIC_UNEXPECTED_DATA_BEFORE_ENCRYPTION_ESTABLISHED = 211,
+ // Error code related to backend health-check.
+ QUIC_SERVER_UNHEALTHY = 213,
+
// No error. Used as bound while iterating.
- QUIC_LAST_ERROR = 213,
+ QUIC_LAST_ERROR = 214,
};
// QuicErrorCodes is encoded as four octets on-the-wire when doing Google QUIC,
// or a varint62 when doing IETF QUIC. Ensure that its value does not exceed
@@ -624,6 +627,37 @@ static_assert(static_cast<uint64_t>(QUIC_LAST_ERROR) <=
static_cast<uint64_t>(std::numeric_limits<uint32_t>::max()),
"QuicErrorCode exceeds four octets");
+// Wire values for HTTP/3 errors.
+// https://www.rfc-editor.org/rfc/rfc9114.html#http-error-codes
+enum class QuicHttp3ErrorCode {
+ // NO_ERROR is defined as a C preprocessor macro on Windows.
+ HTTP3_NO_ERROR = 0x100,
+ GENERAL_PROTOCOL_ERROR = 0x101,
+ INTERNAL_ERROR = 0x102,
+ STREAM_CREATION_ERROR = 0x103,
+ CLOSED_CRITICAL_STREAM = 0x104,
+ FRAME_UNEXPECTED = 0x105,
+ FRAME_ERROR = 0x106,
+ EXCESSIVE_LOAD = 0x107,
+ ID_ERROR = 0x108,
+ SETTINGS_ERROR = 0x109,
+ MISSING_SETTINGS = 0x10A,
+ REQUEST_REJECTED = 0x10B,
+ REQUEST_CANCELLED = 0x10C,
+ REQUEST_INCOMPLETE = 0x10D,
+ MESSAGE_ERROR = 0x10E,
+ CONNECT_ERROR = 0x10F,
+ VERSION_FALLBACK = 0x110,
+};
+
+// Wire values for QPACK errors.
+// https://www.rfc-editor.org/rfc/rfc9204.html#error-code-registration
+enum class QuicHttpQpackErrorCode {
+ DECOMPRESSION_FAILED = 0x200,
+ ENCODER_STREAM_ERROR = 0x201,
+ DECODER_STREAM_ERROR = 0x202
+};
+
// Represents a reason for resetting a stream in both gQUIC and IETF error code
// space. Both error codes have to be present.
class QUIC_EXPORT_PRIVATE QuicResetStreamError {
@@ -634,6 +668,8 @@ class QUIC_EXPORT_PRIVATE QuicResetStreamError {
// Constructs a QuicResetStreamError from an IETF error code; the internal
// error code is inferred.
static QuicResetStreamError FromIetf(uint64_t code);
+ static QuicResetStreamError FromIetf(QuicHttp3ErrorCode code);
+ static QuicResetStreamError FromIetf(QuicHttpQpackErrorCode code);
// Constructs a QuicResetStreamError with no error.
static QuicResetStreamError NoError() {
return FromInternal(QUIC_STREAM_NO_ERROR);
@@ -713,37 +749,6 @@ struct QUIC_EXPORT_PRIVATE QuicErrorCodeToIetfMapping {
QUIC_EXPORT_PRIVATE QuicErrorCodeToIetfMapping
QuicErrorCodeToTransportErrorCode(QuicErrorCode error);
-// Wire values for HTTP/3 errors.
-// https://quicwg.org/base-drafts/draft-ietf-quic-http.html#http-error-codes
-enum class QuicHttp3ErrorCode {
- // NO_ERROR is defined as a C preprocessor macro on Windows.
- HTTP3_NO_ERROR = 0x100,
- GENERAL_PROTOCOL_ERROR = 0x101,
- INTERNAL_ERROR = 0x102,
- STREAM_CREATION_ERROR = 0x103,
- CLOSED_CRITICAL_STREAM = 0x104,
- FRAME_UNEXPECTED = 0x105,
- FRAME_ERROR = 0x106,
- EXCESSIVE_LOAD = 0x107,
- ID_ERROR = 0x108,
- SETTINGS_ERROR = 0x109,
- MISSING_SETTINGS = 0x10A,
- REQUEST_REJECTED = 0x10B,
- REQUEST_CANCELLED = 0x10C,
- REQUEST_INCOMPLETE = 0x10D,
- MESSAGE_ERROR = 0x10E,
- CONNECT_ERROR = 0x10F,
- VERSION_FALLBACK = 0x110,
-};
-
-// Wire values for QPACK errors.
-// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#error-code-registration
-enum class QuicHttpQpackErrorCode {
- DECOMPRESSION_FAILED = 0x200,
- ENCODER_STREAM_ERROR = 0x201,
- DECODER_STREAM_ERROR = 0x202
-};
-
// Convert a QuicRstStreamErrorCode to an application error code to be used in
// an IETF QUIC RESET_STREAM frame
QUIC_EXPORT_PRIVATE uint64_t RstStreamErrorCodeToIetfResetStreamErrorCode(
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_flags_list.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_flags_list.h
index 0fbff267b5b..f043e97d150 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_flags_list.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_flags_list.h
@@ -17,28 +17,30 @@ QUIC_FLAG(quic_restart_flag_quic_testonly_default_false, false)
QUIC_FLAG(quic_restart_flag_quic_testonly_default_true, true)
// If bytes in flight has dipped below 1.25*MaxBW in the last round, do not exit PROBE_UP due to excess queue buildup.
QUIC_FLAG(quic_reloadable_flag_quic_bbr2_no_probe_up_exit_if_no_queue, true)
+// If trrue, early return before write control frame in OnCanWrite() if the connection is already closed.
+QUIC_FLAG(quic_reloadable_flag_quic_no_write_control_frame_upon_connection_close, true)
+// If true and BBQ1 connection option is set, QUIC BBR will use a pacing gain of 2.773 at startup and 0.5 at DRAIN.
+QUIC_FLAG(quic_reloadable_flag_quic_bbr2_support_new_startup_pacing_gain, true)
+// If true, 1) remove all experiments that tunes blackhole detection delay or path degrading delay, and 2) ensure network blackhole delay is at least path degrading delay plus 2 PTOs.
+QUIC_FLAG(quic_reloadable_flag_quic_remove_blackhole_detection_experiments, true)
+// If true, QUIC Legacy Version Encapsulation will be disabled.
+QUIC_FLAG(quic_restart_flag_quic_disable_legacy_version_encapsulation, true)
// If true, QUIC will default enable MTU discovery at server, with a target of 1450 bytes.
QUIC_FLAG(quic_reloadable_flag_quic_enable_mtu_discovery_at_server, false)
+// If true, QuicConnection::ScopedPacketFlusher::~ScopedPacketFlusher will early return if connection is disconnected after FlushPackets.
+QUIC_FLAG(quic_reloadable_flag_quic_packet_flusher_check_connected_after_flush_packets, true)
// If true, QuicGsoBatchWriter will support release time if it is available and the process has the permission to do so.
QUIC_FLAG(quic_restart_flag_quic_support_release_time_for_gso, false)
-// If true, TlsHandshaker::AdvanceHandshake will check if connection is closed after SSL_do_handshake.
-QUIC_FLAG(quic_reloadable_flag_quic_tls_handshaker_check_connection_closed, true)
-// If true, abort async QPACK header decompression in QuicSpdyStream::Reset() and in QuicSpdyStream::OnStreamReset().
-QUIC_FLAG(quic_reloadable_flag_quic_abort_qpack_on_stream_reset, true)
+// If true, account added padding when coalesced packets get buffered.
+QUIC_FLAG(quic_reloadable_flag_quic_fix_bytes_accounting_for_buffered_coalesced_packets, true)
// If true, ack frequency frame can be sent from server to client.
QUIC_FLAG(quic_reloadable_flag_quic_can_send_ack_frequency, true)
// If true, allow client to enable BBRv2 on server via connection option \'B2ON\'.
QUIC_FLAG(quic_reloadable_flag_quic_allow_client_enabled_bbr_v2, true)
-// If true, close read side but not write side in QuicSpdyStream::OnStreamReset().
-QUIC_FLAG(quic_reloadable_flag_quic_fix_on_stream_reset, true)
// If true, close the connection if a crypto send buffer exceeds its size limit.
QUIC_FLAG(quic_reloadable_flag_quic_bounded_crypto_send_buffer, false)
-// If true, consider original connection ID as active before handshake completes.
-QUIC_FLAG(quic_reloadable_flag_quic_consider_original_connection_id_as_active_pre_handshake, true)
// If true, default-enable 5RTO blachole detection.
QUIC_FLAG(quic_reloadable_flag_quic_default_enable_5rto_blackhole_detection2, true)
-// If true, deliver INITIAL packets before other types of packets in QuicBufferedPacketStore.
-QUIC_FLAG(quic_reloadable_flag_quic_deliver_initial_packets_first, true)
// If true, disable QUIC version Q043.
QUIC_FLAG(quic_reloadable_flag_quic_disable_version_q043, false)
// If true, disable QUIC version Q046.
@@ -57,14 +59,18 @@ QUIC_FLAG(quic_reloadable_flag_quic_enable_disable_resumption, true)
QUIC_FLAG(quic_reloadable_flag_quic_discard_initial_packet_with_key_dropped, true)
// If true, do not bundle ACK while sending PATH_CHALLENGE on alternative path.
QUIC_FLAG(quic_reloadable_flag_quic_not_bundle_ack_on_alternative_path, true)
+// If true, do not issue a new connection ID that has been claimed by another connection.
+QUIC_FLAG(quic_reloadable_flag_quic_check_cid_collision_when_issue_new_cid, true)
+// If true, do not mark stream connection level write blocked if its write side has been closed.
+QUIC_FLAG(quic_reloadable_flag_quic_donot_mark_stream_write_blocked_if_write_side_closed, true)
// If true, enable server retransmittable on wire PING.
QUIC_FLAG(quic_reloadable_flag_quic_enable_server_on_wire_ping, true)
// If true, flush pending frames as well as pending padding bytes on connection migration.
QUIC_FLAG(quic_reloadable_flag_quic_flush_pending_frames_and_padding_bytes_on_migration, true)
// If true, ietf connection migration is no longer conditioned on connection option RVCM.
QUIC_FLAG(quic_reloadable_flag_quic_remove_connection_migration_connection_option_v2, false)
-// If true, include offset in QUIC STREAM_DATA_BLOCKED and DATA_BLOCKED frames.
-QUIC_FLAG(quic_reloadable_flag_quic_include_offset_in_blocked_frames, false)
+// If true, if a fatal tls alert is raised while extracting CHLO, QuicDispatcher will send a connection close.
+QUIC_FLAG(quic_restart_flag_quic_dispatcher_send_connection_close_for_tls_alerts, true)
// If true, include stream information in idle timeout connection close detail.
QUIC_FLAG(quic_reloadable_flag_quic_add_stream_info_to_idle_close_detail, true)
// If true, quic server will send ENABLE_CONNECT_PROTOCOL setting and and endpoint will validate required request/response headers and extended CONNECT mechanism and update code counts of valid/invalid headers.
@@ -76,7 +82,7 @@ QUIC_FLAG(quic_reloadable_flag_quic_require_handshake_confirmation, false)
// If true, server proactively retires client issued connection ID on reverse path validation failure.
QUIC_FLAG(quic_reloadable_flag_quic_retire_cid_on_reverse_path_validation_failure, true)
// If true, server sends bandwidth eastimate when network is idle for a while.
-QUIC_FLAG(quic_restart_flag_quic_enable_sending_bandwidth_estimate_when_network_idle, true)
+QUIC_FLAG(quic_restart_flag_quic_enable_sending_bandwidth_estimate_when_network_idle_v2, true)
// If true, set burst token to 2 in cwnd bootstrapping experiment.
QUIC_FLAG(quic_reloadable_flag_quic_conservative_bursts, false)
// If true, stop resetting ideal_next_packet_send_time_ in pacing sender.
@@ -89,6 +95,10 @@ QUIC_FLAG(quic_reloadable_flag_quic_use_ping_manager2, true)
QUIC_FLAG(quic_reloadable_flag_quic_connection_migration_use_new_cid_v2, true)
// If true, uses conservative cwnd gain and pacing gain when cwnd gets bootstrapped.
QUIC_FLAG(quic_reloadable_flag_quic_conservative_cwnd_and_pacing_gains, false)
+// If true, validate header field character at spdy stream instead of qpack for IETF QUIC.
+QUIC_FLAG(quic_reloadable_flag_quic_validate_header_field_value_at_spdy_stream, true)
+// Store original QUIC connection IDs in the dispatcher\'s map
+QUIC_FLAG(quic_restart_flag_quic_map_original_connection_ids2, false)
// When the flag is true, exit STARTUP after the same number of loss events as PROBE_UP.
QUIC_FLAG(quic_reloadable_flag_quic_bbr2_startup_probe_up_loss_events, true)
// When true, defaults to BBR congestion control instead of Cubic.
@@ -105,8 +115,6 @@ QUIC_FLAG(quic_reloadable_flag_quic_bbr2_ignore_inflight_hi_in_probe_up, true)
QUIC_FLAG(quic_reloadable_flag_quic_bbr2_startup_extra_acked, true)
// When true, the B207 connection option causes BBR2 to exit STARTUP if a persistent queue of 2*BDP has existed for the entire round.
QUIC_FLAG(quic_reloadable_flag_quic_bbr2_exit_startup_on_persistent_queue2, true)
-// When true, the BBQ0 connection option causes QUIC BBR2 to add bytes_acked to probe_up_acked if the connection hasn\'t been app-limited since inflight_hi was utilized.
-QUIC_FLAG(quic_reloadable_flag_quic_bbr2_add_bytes_acked_after_inflight_hi_limited, true)
// When true, the BBR4 copt sets the extra_acked window to 20 RTTs and BBR5 sets it to 40 RTTs.
QUIC_FLAG(quic_reloadable_flag_quic_bbr2_extra_acked_window, true)
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.cc
index b6b0c5bab51..1630a2c6f01 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.cc
@@ -860,20 +860,20 @@ bool QuicFramer::WriteIetfLongHeaderLength(const QuicPacketHeader& header,
}
if (writer->length() < length_field_offset ||
writer->length() - length_field_offset <
- kQuicDefaultLongHeaderLengthLength) {
+ quiche::kQuicheDefaultLongHeaderLengthLength) {
set_detailed_error("Invalid length_field_offset.");
QUIC_BUG(quic_bug_10850_14) << "Invalid length_field_offset.";
return false;
}
size_t length_to_write = writer->length() - length_field_offset -
- kQuicDefaultLongHeaderLengthLength;
+ quiche::kQuicheDefaultLongHeaderLengthLength;
// Add length of auth tag.
length_to_write = GetCiphertextSize(level, length_to_write);
QuicDataWriter length_writer(writer->length() - length_field_offset,
writer->data() + length_field_offset);
- if (!length_writer.WriteVarInt62(length_to_write,
- kQuicDefaultLongHeaderLengthLength)) {
+ if (!length_writer.WriteVarInt62WithForcedLength(
+ length_to_write, quiche::kQuicheDefaultLongHeaderLengthLength)) {
set_detailed_error("Failed to overwrite long header length.");
QUIC_BUG(quic_bug_10850_15) << "Failed to overwrite long header length.";
return false;
@@ -1741,7 +1741,7 @@ bool QuicFramer::ProcessIetfDataPacket(QuicDataReader* encrypted_reader,
size_t buffer_length) {
QUICHE_DCHECK_NE(GOOGLE_QUIC_PACKET, header->form);
QUICHE_DCHECK(!header->has_possible_stateless_reset_token);
- header->length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ header->length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
header->remaining_packet_length = 0;
if (header->form == IETF_QUIC_SHORT_HEADER_PACKET &&
perspective_ == Perspective::IS_CLIENT) {
@@ -2274,13 +2274,13 @@ bool QuicFramer::AppendIetfPacketHeader(const QuicPacketHeader& header,
if (QuicVersionHasLongHeaderLengths(transport_version()) &&
header.version_flag) {
if (header.long_packet_type == INITIAL) {
- QUICHE_DCHECK_NE(VARIABLE_LENGTH_INTEGER_LENGTH_0,
+ QUICHE_DCHECK_NE(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
header.retry_token_length_length)
<< ENDPOINT << ParsedQuicVersionToString(version_)
<< " bad retry token length length in header: " << header;
// Write retry token length.
- if (!writer->WriteVarInt62(header.retry_token.length(),
- header.retry_token_length_length)) {
+ if (!writer->WriteVarInt62WithForcedLength(
+ header.retry_token.length(), header.retry_token_length_length)) {
return false;
}
// Write retry token.
@@ -3963,7 +3963,8 @@ bool QuicFramer::ProcessIetfAckFrame(QuicDataReader* reader,
return false;
}
- if (ack_delay_time_in_us >= (kVarInt62MaxValue >> peer_ack_delay_exponent_)) {
+ if (ack_delay_time_in_us >=
+ (quiche::kVarInt62MaxValue >> peer_ack_delay_exponent_)) {
ack_frame->ack_delay_time = QuicTime::Delta::Infinite();
} else {
ack_delay_time_in_us = (ack_delay_time_in_us << peer_ack_delay_exponent_);
@@ -4358,9 +4359,9 @@ absl::string_view QuicFramer::GetAssociatedDataFromEncryptedPacket(
QuicConnectionIdLength source_connection_id_length, bool includes_version,
bool includes_diversification_nonce,
QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
uint64_t retry_token_length,
- QuicVariableLengthIntegerLength length_length) {
+ quiche::QuicheVariableLengthIntegerLength length_length) {
// TODO(ianswett): This is identical to QuicData::AssociatedData.
return absl::string_view(
encrypted.data(),
@@ -6028,7 +6029,7 @@ bool QuicFramer::AppendIetfAckFrameAndTypeByte(const QuicAckFrame& frame,
return false;
}
- uint64_t ack_delay_time_us = kVarInt62MaxValue;
+ uint64_t ack_delay_time_us = quiche::kVarInt62MaxValue;
if (!frame.ack_delay_time.IsInfinite()) {
QUICHE_DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
@@ -6812,7 +6813,7 @@ QuicErrorCode QuicFramer::ParsePublicHeaderDispatcher(
}
const bool ietf_format = QuicUtils::IsIetfPacketHeader(first_byte);
uint8_t unused_first_byte;
- QuicVariableLengthIntegerLength retry_token_length_length;
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length;
absl::string_view maybe_retry_token;
QuicErrorCode error_code = ParsePublicHeader(
&reader, expected_destination_connection_id_length, ietf_format,
@@ -6820,7 +6821,7 @@ QuicErrorCode QuicFramer::ParsePublicHeaderDispatcher(
version_label, parsed_version, destination_connection_id,
source_connection_id, long_packet_type, &retry_token_length_length,
&maybe_retry_token, detailed_error);
- if (retry_token_length_length != VARIABLE_LENGTH_INTEGER_LENGTH_0) {
+ if (retry_token_length_length != quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0) {
*retry_token = maybe_retry_token;
} else {
retry_token->reset();
@@ -6961,7 +6962,7 @@ QuicErrorCode QuicFramer::ParsePublicHeader(
QuicConnectionId* destination_connection_id,
QuicConnectionId* source_connection_id,
QuicLongHeaderType* long_packet_type,
- QuicVariableLengthIntegerLength* retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength* retry_token_length_length,
absl::string_view* retry_token, std::string* detailed_error) {
*version_present = false;
*has_length_prefix = false;
@@ -6969,7 +6970,7 @@ QuicErrorCode QuicFramer::ParsePublicHeader(
*parsed_version = UnsupportedQuicVersion();
*source_connection_id = EmptyQuicConnectionId();
*long_packet_type = INVALID_PACKET_TYPE;
- *retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ *retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
*retry_token = absl::string_view();
*detailed_error = "";
@@ -7047,7 +7048,7 @@ QuicErrorCode QuicFramer::ParsePublicHeader(
*retry_token_length_length = reader->PeekVarInt62Length();
uint64_t retry_token_length;
if (!reader->ReadVarInt62(&retry_token_length)) {
- *retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ *retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
*detailed_error = "Unable to read retry token length.";
return QUIC_INVALID_PACKET_HEADER;
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.h
index f60a1099b12..c39ee2b4d11 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer.h
@@ -425,9 +425,9 @@ class QUIC_EXPORT_PRIVATE QuicFramer {
QuicConnectionIdLength source_connection_id_length, bool includes_version,
bool includes_diversification_nonce,
QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
uint64_t retry_token_length,
- QuicVariableLengthIntegerLength length_length);
+ quiche::QuicheVariableLengthIntegerLength length_length);
// Parses the unencrypted fields in a QUIC header using |reader| as input,
// stores the result in the other parameters.
@@ -440,7 +440,7 @@ class QUIC_EXPORT_PRIVATE QuicFramer {
QuicConnectionId* destination_connection_id,
QuicConnectionId* source_connection_id,
QuicLongHeaderType* long_packet_type,
- QuicVariableLengthIntegerLength* retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength* retry_token_length_length,
absl::string_view* retry_token, std::string* detailed_error);
// Parses the unencrypted fields in |packet| and stores them in the other
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc
index 9b022a2eff5..08b53f87ab6 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_framer_test.cc
@@ -763,7 +763,8 @@ class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
return CheckDecryption(
encrypted, includes_version, includes_diversification_nonce,
destination_connection_id_length, source_connection_id_length,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
}
bool CheckDecryption(
@@ -771,9 +772,9 @@ class QuicFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
bool includes_diversification_nonce,
QuicConnectionIdLength destination_connection_id_length,
QuicConnectionIdLength source_connection_id_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
size_t retry_token_length,
- QuicVariableLengthIntegerLength length_length) {
+ quiche::QuicheVariableLengthIntegerLength length_length) {
if (visitor_.header_->packet_number != decrypter_->packet_number_) {
QUIC_LOG(ERROR) << "Decrypted incorrect packet number. expected "
<< visitor_.header_->packet_number
@@ -1081,7 +1082,8 @@ TEST_P(QuicFramerTest, LargePacket) {
framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
memset(p + header_size, 0, kMaxIncomingPacketSize - header_size);
@@ -1395,8 +1397,8 @@ TEST_P(QuicFramerTest, ParsePublicHeader) {
QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
source_connection_id = EmptyQuicConnectionId();
QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
- QuicVariableLengthIntegerLength retry_token_length_length =
- VARIABLE_LENGTH_INTEGER_LENGTH_4;
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
absl::string_view retry_token;
std::string detailed_error = "foobar";
@@ -1418,7 +1420,8 @@ TEST_P(QuicFramerTest, ParsePublicHeader) {
EXPECT_EQ(framer_.version(), parsed_version);
EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
- EXPECT_EQ(VARIABLE_LENGTH_INTEGER_LENGTH_0, retry_token_length_length);
+ EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
+ retry_token_length_length);
EXPECT_EQ(absl::string_view(), retry_token);
if (framer_.version().HasIetfInvariantHeader()) {
EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
@@ -1464,8 +1467,8 @@ TEST_P(QuicFramerTest, ParsePublicHeaderProxBadSourceConnectionIdLength) {
QuicConnectionId destination_connection_id = EmptyQuicConnectionId(),
source_connection_id = EmptyQuicConnectionId();
QuicLongHeaderType long_packet_type = INVALID_PACKET_TYPE;
- QuicVariableLengthIntegerLength retry_token_length_length =
- VARIABLE_LENGTH_INTEGER_LENGTH_4;
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_4;
absl::string_view retry_token;
std::string detailed_error = "foobar";
@@ -1485,7 +1488,8 @@ TEST_P(QuicFramerTest, ParsePublicHeaderProxBadSourceConnectionIdLength) {
EXPECT_EQ(UnsupportedQuicVersion(), parsed_version);
EXPECT_EQ(FramerTestConnectionId(), destination_connection_id);
EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id);
- EXPECT_EQ(VARIABLE_LENGTH_INTEGER_LENGTH_0, retry_token_length_length);
+ EXPECT_EQ(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
+ retry_token_length_length);
EXPECT_EQ(absl::string_view(), retry_token);
EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format);
}
@@ -2964,13 +2968,13 @@ TEST_P(QuicFramerTest, StreamFrameWithVersion) {
};
// clang-format on
- QuicVariableLengthIntegerLength retry_token_length_length =
- VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
size_t retry_token_length = 0;
- QuicVariableLengthIntegerLength length_length =
+ quiche::QuicheVariableLengthIntegerLength length_length =
QuicVersionHasLongHeaderLengths(framer_.transport_version())
- ? VARIABLE_LENGTH_INTEGER_LENGTH_1
- : VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ ? quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1
+ : quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
ReviseFirstByteByVersion(packet_ietf);
PacketFragments& fragments =
@@ -6551,7 +6555,8 @@ TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
@@ -6740,7 +6745,8 @@ TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
@@ -6815,7 +6821,8 @@ TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
@@ -6890,7 +6897,8 @@ TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
framer_.transport_version(), PACKET_8BYTE_CONNECTION_ID,
PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
memset(p + header_size + 1, 0x00, kMaxOutgoingPacketSize - header_size - 1);
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
@@ -6910,7 +6918,7 @@ TEST_P(QuicFramerTest, BuildStreamFramePacket) {
header.version_flag = false;
header.packet_number = kPacketNumber;
if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
@@ -7009,7 +7017,7 @@ TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
}
header.packet_number = kPacketNumber;
if (QuicVersionHasLongHeaderLengths(framer_.transport_version())) {
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
@@ -10422,11 +10430,12 @@ TEST_P(QuicFramerTest, EncryptPacket) {
p = packet46;
}
- std::unique_ptr<QuicPacket> raw(new QuicPacket(
- AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
- PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
- !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
+ std::unique_ptr<QuicPacket> raw(
+ new QuicPacket(AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
+ PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
+ !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
char buffer[kMaxOutgoingPacketSize];
size_t encrypted_length = framer_.EncryptPayload(
ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
@@ -10442,8 +10451,8 @@ TEST_P(QuicFramerTest, EncryptEmptyPacket) {
PACKET_0BYTE_CONNECTION_ID,
/*includes_version=*/true,
/*includes_diversification_nonce=*/true, PACKET_1BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0,
- /*retry_token_length=*/0, VARIABLE_LENGTH_INTEGER_LENGTH_0);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
+ /*retry_token_length=*/0, quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0);
char buffer[kMaxOutgoingPacketSize];
size_t encrypted_length = 1;
EXPECT_QUIC_BUG(
@@ -10530,11 +10539,12 @@ TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
p_size = ABSL_ARRAYSIZE(packet46);
}
- std::unique_ptr<QuicPacket> raw(new QuicPacket(
- AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
- PACKET_0BYTE_CONNECTION_ID, kIncludeVersion,
- !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, VARIABLE_LENGTH_INTEGER_LENGTH_0));
+ std::unique_ptr<QuicPacket> raw(
+ new QuicPacket(AsChars(p), p_size, false, PACKET_8BYTE_CONNECTION_ID,
+ PACKET_0BYTE_CONNECTION_ID, kIncludeVersion,
+ !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0));
char buffer[kMaxOutgoingPacketSize];
size_t encrypted_length = framer_.EncryptPayload(
ENCRYPTION_INITIAL, packet_number, *raw, buffer, kMaxOutgoingPacketSize);
@@ -14741,8 +14751,8 @@ TEST_P(QuicFramerTest, CoalescedPacketWithZeroesRoundTrip) {
header.packet_number = kPacketNumber;
header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
header.long_packet_type = INITIAL;
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
- header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
QuicFrames frames = {QuicFrame(QuicPingFrame()),
QuicFrame(QuicPaddingFrame(3))};
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc
index a5bd8ad208f..5a63ebc2ade 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector.cc
@@ -74,10 +74,10 @@ void QuicIdleNetworkDetector::SetTimeouts(
bandwidth_update_timeout_ = QuicTime::Delta::Infinite();
if (GetQuicRestartFlag(
- quic_enable_sending_bandwidth_estimate_when_network_idle) &&
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2) &&
handshake_timeout_.IsInfinite()) {
QUIC_RESTART_FLAG_COUNT_N(
- quic_enable_sending_bandwidth_estimate_when_network_idle, 1, 3);
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2, 1, 3);
bandwidth_update_timeout_ = idle_network_timeout_ * 0.5;
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector_test.cc
index 9105ec9e4ae..a139eb25ec1 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_idle_network_detector_test.cc
@@ -103,7 +103,7 @@ TEST_F(QuicIdleNetworkDetectorTest,
/*handshake_timeout=*/QuicTime::Delta::Infinite(),
/*idle_network_timeout=*/QuicTime::Delta::FromSeconds(600));
if (!GetQuicRestartFlag(
- quic_enable_sending_bandwidth_estimate_when_network_idle)) {
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2)) {
EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromSeconds(600),
alarm_->deadline());
@@ -141,7 +141,7 @@ TEST_F(QuicIdleNetworkDetectorTest,
// Handshake completes in 200ms.
const bool enable_sending_bandwidth_estimate_when_network_idle =
GetQuicRestartFlag(
- quic_enable_sending_bandwidth_estimate_when_network_idle);
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2);
clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(200));
detector_->OnPacketReceived(clock_.Now());
detector_->SetTimeouts(
@@ -195,7 +195,7 @@ TEST_F(QuicIdleNetworkDetectorTest, ShorterIdleTimeoutOnSentPacket) {
detector_->enable_shorter_idle_timeout_on_sent_packet();
QuicTime::Delta idle_network_timeout = QuicTime::Delta::Zero();
if (GetQuicRestartFlag(
- quic_enable_sending_bandwidth_estimate_when_network_idle)) {
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2)) {
idle_network_timeout = QuicTime::Delta::FromSeconds(60);
} else {
idle_network_timeout = QuicTime::Delta::FromSeconds(30);
@@ -250,7 +250,7 @@ TEST_F(QuicIdleNetworkDetectorTest, NoAlarmAfterStopped) {
TEST_F(QuicIdleNetworkDetectorTest,
ResetBandwidthTimeoutWhenHandshakeTimeoutIsSet) {
if (!GetQuicRestartFlag(
- quic_enable_sending_bandwidth_estimate_when_network_idle)) {
+ quic_enable_sending_bandwidth_estimate_when_network_idle_v2)) {
return;
}
detector_->SetTimeouts(
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc
index 66c7d14f94a..3be9c40e0d9 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.cc
@@ -129,10 +129,7 @@ QuicPacketCreator::QuicPacketCreator(QuicConnectionId server_connection_id,
flusher_attached_(false),
fully_pad_crypto_handshake_packets_(true),
latched_hard_max_packet_length_(0),
- max_datagram_frame_size_(0),
- chaos_protection_enabled_(
- GetQuicFlag(FLAGS_quic_enable_chaos_protection) &&
- framer->perspective() == Perspective::IS_CLIENT) {
+ max_datagram_frame_size_(0) {
SetMaxPacketLength(kDefaultMaxPacketSize);
if (!framer_->version().UsesTls()) {
// QUIC+TLS negotiates the maximum datagram frame size via the
@@ -387,8 +384,9 @@ size_t QuicPacketCreator::StreamFramePacketOverhead(
QuicConnectionIdLength source_connection_id_length, bool include_version,
bool include_diversification_nonce,
QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
- QuicVariableLengthIntegerLength length_length, QuicStreamOffset offset) {
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength length_length,
+ QuicStreamOffset offset) {
return GetPacketHeaderSize(version, destination_connection_id_length,
source_connection_id_length, include_version,
include_diversification_nonce,
@@ -476,6 +474,12 @@ void QuicPacketCreator::OnSerializedPacket() {
QUIC_BUG_IF(quic_bug_12398_5, packet_.encrypted_buffer == nullptr)
<< ENDPOINT;
+ // Clear bytes_not_retransmitted for packets containing only
+ // NOT_RETRANSMISSION frames.
+ if (packet_.transmission_type == NOT_RETRANSMISSION) {
+ packet_.bytes_not_retransmitted.reset();
+ }
+
SerializedPacket packet(std::move(packet_));
ClearPacket();
RemoveSoftMaxPacketLength();
@@ -499,6 +503,7 @@ void QuicPacketCreator::ClearPacket() {
QUICHE_DCHECK(packet_.nonretransmittable_frames.empty()) << ENDPOINT;
packet_.largest_acked.Clear();
needs_full_padding_ = false;
+ packet_.bytes_not_retransmitted.reset();
}
size_t QuicPacketCreator::ReserializeInitialPacketInCoalescedPacket(
@@ -749,7 +754,7 @@ bool QuicPacketCreator::AddPaddedSavedFrame(
absl::optional<size_t>
QuicPacketCreator::MaybeBuildDataPacketWithChaosProtection(
const QuicPacketHeader& header, char* buffer) {
- if (!chaos_protection_enabled_ ||
+ if (framer_->perspective() != Perspective::IS_CLIENT ||
packet_.encryption_level != ENCRYPTION_INITIAL ||
!framer_->version().UsesCryptoFrames() || queued_frames_.size() != 2u ||
queued_frames_[0].type != CRYPTO_FRAME ||
@@ -1239,14 +1244,14 @@ size_t QuicPacketCreator::PacketHeaderSize() const {
GetRetryTokenLengthLength(), GetRetryToken().length(), GetLengthLength());
}
-QuicVariableLengthIntegerLength QuicPacketCreator::GetRetryTokenLengthLength()
- const {
+quiche::QuicheVariableLengthIntegerLength
+QuicPacketCreator::GetRetryTokenLengthLength() const {
if (QuicVersionHasLongHeaderLengths(framer_->transport_version()) &&
HasIetfLongHeader() &&
EncryptionlevelToLongHeaderType(packet_.encryption_level) == INITIAL) {
return QuicDataWriter::GetVarInt62Len(GetRetryToken().length());
}
- return VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ return quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
}
absl::string_view QuicPacketCreator::GetRetryToken() const {
@@ -1625,17 +1630,18 @@ MessageStatus QuicPacketCreator::AddMessageFrame(
return MESSAGE_STATUS_SUCCESS;
}
-QuicVariableLengthIntegerLength QuicPacketCreator::GetLengthLength() const {
+quiche::QuicheVariableLengthIntegerLength QuicPacketCreator::GetLengthLength()
+ const {
if (QuicVersionHasLongHeaderLengths(framer_->transport_version()) &&
HasIetfLongHeader()) {
QuicLongHeaderType long_header_type =
EncryptionlevelToLongHeaderType(packet_.encryption_level);
if (long_header_type == INITIAL || long_header_type == ZERO_RTT_PROTECTED ||
long_header_type == HANDSHAKE) {
- return VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ return quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
}
- return VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ return quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
}
void QuicPacketCreator::FillPacketHeader(QuicPacketHeader* header) {
@@ -1795,9 +1801,13 @@ bool QuicPacketCreator::AddFrame(const QuicFrame& frame,
debug_delegate_->OnFrameAddedToPacket(frame);
}
- // Packet transmission type is determined by the last added retransmittable
- // frame.
- if (QuicUtils::IsRetransmittableFrame(frame.type)) {
+ if (transmission_type == NOT_RETRANSMISSION) {
+ packet_.bytes_not_retransmitted.emplace(
+ packet_.bytes_not_retransmitted.value_or(0) + frame_len);
+ } else if (QuicUtils::IsRetransmittableFrame(frame.type)) {
+ // Packet transmission type is determined by the last added retransmittable
+ // frame of a retransmission type. If a packet has no retransmittable
+ // retransmission frames, it has type NOT_RETRANSMISSION.
packet_.transmission_type = transmission_type;
}
return true;
@@ -1971,7 +1981,7 @@ QuicPacketLength QuicPacketCreator::GetCurrentLargestMessagePayload() const {
GetSourceConnectionIdLength(), IncludeVersionInHeader(),
IncludeNonceInPublicHeader(), GetPacketNumberLength(),
// No Retry token on packets containing application data.
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, GetLengthLength());
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, GetLengthLength());
// This is the largest possible message payload when the length field is
// omitted.
size_t max_plaintext_size =
@@ -1995,13 +2005,13 @@ QuicPacketLength QuicPacketCreator::GetGuaranteedLargestMessagePayload() const {
framer_->version().handshake_protocol == PROTOCOL_QUIC_CRYPTO &&
framer_->perspective() == Perspective::IS_SERVER;
// IETF QUIC long headers include a length on client 0RTT packets.
- QuicVariableLengthIntegerLength length_length =
- VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ quiche::QuicheVariableLengthIntegerLength length_length =
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
if (framer_->perspective() == Perspective::IS_CLIENT) {
- length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
if (!QuicVersionHasLongHeaderLengths(framer_->transport_version())) {
- length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
+ length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
}
const size_t packet_header_size = GetPacketHeaderSize(
framer_->transport_version(), GetDestinationConnectionIdLength(),
@@ -2009,7 +2019,7 @@ QuicPacketLength QuicPacketCreator::GetGuaranteedLargestMessagePayload() const {
GetSourceConnectionIdLength(), kIncludeVersion, may_include_nonce,
PACKET_4BYTE_PACKET_NUMBER,
// No Retry token on packets containing application data.
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, length_length);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, length_length);
// This is the largest possible message payload when the length field is
// omitted.
size_t max_plaintext_size =
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.h
index 51446ba3e0d..c6b41ad8539 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator.h
@@ -146,8 +146,9 @@ class QUIC_EXPORT_PRIVATE QuicPacketCreator {
QuicConnectionIdLength source_connection_id_length, bool include_version,
bool include_diversification_nonce,
QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
- QuicVariableLengthIntegerLength length_length, QuicStreamOffset offset);
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength length_length,
+ QuicStreamOffset offset);
// Returns false and flushes all pending frames if current open packet is
// full.
@@ -304,11 +305,6 @@ class QUIC_EXPORT_PRIVATE QuicPacketCreator {
void set_encryption_level(EncryptionLevel level);
EncryptionLevel encryption_level() { return packet_.encryption_level; }
- // Sets whether initial packets are protected with chaos.
- void set_chaos_protection_enabled(bool chaos_protection_enabled) {
- chaos_protection_enabled_ = chaos_protection_enabled;
- }
-
// packet number of the last created packet, or 0 if no packets have been
// created.
QuicPacketNumber packet_number() const { return packet_.packet_number; }
@@ -583,7 +579,7 @@ class QUIC_EXPORT_PRIVATE QuicPacketCreator {
// Returns length of the retry token variable length integer to send over the
// wire. Is non-zero for v99 IETF Initial packets.
- QuicVariableLengthIntegerLength GetRetryTokenLengthLength() const;
+ quiche::QuicheVariableLengthIntegerLength GetRetryTokenLengthLength() const;
// Returns the retry token to send over the wire, only sent in
// v99 IETF Initial packets.
@@ -591,7 +587,7 @@ class QUIC_EXPORT_PRIVATE QuicPacketCreator {
// Returns length of the length variable length integer to send over the
// wire. Is non-zero for v99 IETF Initial, 0-RTT or Handshake packets.
- QuicVariableLengthIntegerLength GetLengthLength() const;
+ quiche::QuicheVariableLengthIntegerLength GetLengthLength() const;
// Returns true if |frame| is a ClientHello.
bool StreamFrameIsClientHello(const QuicStreamFrame& frame) const;
@@ -685,9 +681,6 @@ class QUIC_EXPORT_PRIVATE QuicPacketCreator {
// accept. There is no limit for QUIC_CRYPTO connections, but QUIC+TLS
// negotiates this during the handshake.
QuicByteCount max_datagram_frame_size_;
-
- // Whether to attempt protecting initial packets with chaos.
- bool chaos_protection_enabled_;
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator_test.cc
index c9f8ecccfe4..acdd8983606 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packet_creator_test.cc
@@ -18,6 +18,7 @@
#include "quiche/quic/core/crypto/null_encrypter.h"
#include "quiche/quic/core/crypto/quic_decrypter.h"
#include "quiche/quic/core/crypto/quic_encrypter.h"
+#include "quiche/quic/core/frames/quic_frame.h"
#include "quiche/quic/core/frames/quic_stream_frame.h"
#include "quiche/quic/core/quic_connection_id.h"
#include "quiche/quic/core/quic_data_writer.h"
@@ -255,8 +256,6 @@ class QuicPacketCreatorTest : public QuicTestWithParam<TestParams> {
n * 2;
}
- void TestChaosProtection(bool enabled);
-
static constexpr QuicStreamOffset kOffset = 0u;
char buffer_[kMaxOutgoingPacketSize];
@@ -1325,13 +1324,12 @@ TEST_P(QuicPacketCreatorTest, SerializeFrameShortData) {
EXPECT_EQ(GetParam().version_serialization, header.version_flag);
}
-void QuicPacketCreatorTest::TestChaosProtection(bool enabled) {
+TEST_P(QuicPacketCreatorTest, ChaosProtection) {
if (!GetParam().version.UsesCryptoFrames()) {
return;
}
MockRandom mock_random(2);
QuicPacketCreatorPeer::SetRandom(&creator_, &mock_random);
- creator_.set_chaos_protection_enabled(enabled);
std::string data("ChAoS_ThEoRy!");
producer_.SaveCryptoData(ENCRYPTION_INITIAL, 0, data);
frames_.push_back(
@@ -1343,27 +1341,13 @@ void QuicPacketCreatorTest::TestChaosProtection(bool enabled) {
EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_, _));
EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
- if (enabled) {
- EXPECT_CALL(framer_visitor_, OnCryptoFrame(_)).Times(AtLeast(2));
- EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(AtLeast(2));
- EXPECT_CALL(framer_visitor_, OnPingFrame(_)).Times(AtLeast(1));
- } else {
- EXPECT_CALL(framer_visitor_, OnCryptoFrame(_)).Times(1);
- EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(1);
- EXPECT_CALL(framer_visitor_, OnPingFrame(_)).Times(0);
- }
+ EXPECT_CALL(framer_visitor_, OnCryptoFrame(_)).Times(AtLeast(2));
+ EXPECT_CALL(framer_visitor_, OnPaddingFrame(_)).Times(AtLeast(2));
+ EXPECT_CALL(framer_visitor_, OnPingFrame(_)).Times(AtLeast(1));
EXPECT_CALL(framer_visitor_, OnPacketComplete());
ProcessPacket(serialized);
}
-TEST_P(QuicPacketCreatorTest, ChaosProtectionEnabled) {
- TestChaosProtection(/*enabled=*/true);
-}
-
-TEST_P(QuicPacketCreatorTest, ChaosProtectionDisabled) {
- TestChaosProtection(/*enabled=*/false);
-}
-
TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
if (!GetParam().version_serialization) {
creator_.StopSendingVersion();
@@ -1927,6 +1911,10 @@ TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
absl::string_view()));
ASSERT_TRUE(QuicUtils::IsRetransmittableFrame(stream_frame.type));
+ QuicFrame stream_frame_2(QuicStreamFrame(stream_id,
+ /*fin=*/false, 1u,
+ absl::string_view()));
+
QuicFrame padding_frame{QuicPaddingFrame()};
ASSERT_FALSE(QuicUtils::IsRetransmittableFrame(padding_frame.type));
@@ -1939,14 +1927,152 @@ TEST_P(QuicPacketCreatorTest, PacketTransmissionType) {
EXPECT_TRUE(creator_.AddFrame(stream_frame, PTO_RETRANSMISSION));
ASSERT_EQ(serialized_packet_, nullptr);
- EXPECT_TRUE(creator_.AddFrame(padding_frame, LOSS_RETRANSMISSION));
+ EXPECT_TRUE(creator_.AddFrame(stream_frame_2, PATH_RETRANSMISSION));
+ ASSERT_EQ(serialized_packet_, nullptr);
+
+ EXPECT_TRUE(creator_.AddFrame(padding_frame, PTO_RETRANSMISSION));
creator_.FlushCurrentPacket();
ASSERT_TRUE(serialized_packet_->encrypted_buffer);
// The last retransmittable frame on packet is a stream frame, the packet's
// transmission type should be the same as the stream frame's.
- EXPECT_EQ(serialized_packet_->transmission_type, PTO_RETRANSMISSION);
+ EXPECT_EQ(serialized_packet_->transmission_type, PATH_RETRANSMISSION);
+ DeleteSerializedPacket();
+}
+
+TEST_P(QuicPacketCreatorTest,
+ PacketBytesRetransmitted_AddFrame_Retransmission) {
+ creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
+
+ QuicAckFrame temp_ack_frame = InitAckFrame(1);
+ QuicFrame ack_frame(&temp_ack_frame);
+ EXPECT_TRUE(creator_.AddFrame(ack_frame, LOSS_RETRANSMISSION));
+
+ QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
+ client_framer_.transport_version(), Perspective::IS_CLIENT);
+
+ QuicFrame stream_frame;
+ const std::string data("data");
+ // ConsumeDataToFillCurrentPacket calls AddFrame
+ ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
+ stream_id, data, 0u, false, false, PTO_RETRANSMISSION, &stream_frame));
+ EXPECT_EQ(4u, stream_frame.stream_frame.data_length);
+
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+
+ creator_.FlushCurrentPacket();
+ ASSERT_TRUE(serialized_packet_->encrypted_buffer);
+ ASSERT_FALSE(serialized_packet_->bytes_not_retransmitted.has_value());
+
+ DeleteSerializedPacket();
+}
+
+TEST_P(QuicPacketCreatorTest,
+ PacketBytesRetransmitted_AddFrame_NotRetransmission) {
+ creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
+
+ QuicAckFrame temp_ack_frame = InitAckFrame(1);
+ QuicFrame ack_frame(&temp_ack_frame);
+ EXPECT_TRUE(creator_.AddFrame(ack_frame, NOT_RETRANSMISSION));
+
+ QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
+ client_framer_.transport_version(), Perspective::IS_CLIENT);
+
+ QuicFrame stream_frame;
+ const std::string data("data");
+ // ConsumeDataToFillCurrentPacket calls AddFrame
+ ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
+ stream_id, data, 0u, false, false, NOT_RETRANSMISSION, &stream_frame));
+ EXPECT_EQ(4u, stream_frame.stream_frame.data_length);
+
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+
+ creator_.FlushCurrentPacket();
+ ASSERT_TRUE(serialized_packet_->encrypted_buffer);
+ ASSERT_FALSE(serialized_packet_->bytes_not_retransmitted.has_value());
+
+ DeleteSerializedPacket();
+}
+
+TEST_P(QuicPacketCreatorTest, PacketBytesRetransmitted_AddFrame_MixedFrames) {
+ creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
+
+ QuicAckFrame temp_ack_frame = InitAckFrame(1);
+ QuicFrame ack_frame(&temp_ack_frame);
+ EXPECT_TRUE(creator_.AddFrame(ack_frame, NOT_RETRANSMISSION));
+
+ QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
+ client_framer_.transport_version(), Perspective::IS_CLIENT);
+
+ QuicFrame stream_frame;
+ const std::string data("data");
+ // ConsumeDataToFillCurrentPacket calls AddFrame
+ ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
+ stream_id, data, 0u, false, false, NOT_RETRANSMISSION, &stream_frame));
+ EXPECT_EQ(4u, stream_frame.stream_frame.data_length);
+
+ QuicFrame stream_frame2;
+ // ConsumeDataToFillCurrentPacket calls AddFrame
+ ASSERT_TRUE(creator_.ConsumeDataToFillCurrentPacket(
+ stream_id, data, 0u, false, false, LOSS_RETRANSMISSION, &stream_frame2));
+ EXPECT_EQ(4u, stream_frame2.stream_frame.data_length);
+
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+
+ creator_.FlushCurrentPacket();
+ ASSERT_TRUE(serialized_packet_->encrypted_buffer);
+ ASSERT_TRUE(serialized_packet_->bytes_not_retransmitted.has_value());
+ ASSERT_GE(serialized_packet_->bytes_not_retransmitted.value(), 4u);
+
+ DeleteSerializedPacket();
+}
+
+TEST_P(QuicPacketCreatorTest,
+ PacketBytesRetransmitted_CreateAndSerializeStreamFrame_Retransmission) {
+ creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
+
+ const std::string data("test");
+ producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), data);
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+ size_t num_bytes_consumed;
+ // Retransmission frame adds to packet's bytes_retransmitted
+ creator_.CreateAndSerializeStreamFrame(
+ GetNthClientInitiatedStreamId(0), data.length(), 0, 0, true,
+ LOSS_RETRANSMISSION, &num_bytes_consumed);
+ EXPECT_EQ(4u, num_bytes_consumed);
+
+ ASSERT_TRUE(serialized_packet_->encrypted_buffer);
+ ASSERT_FALSE(serialized_packet_->bytes_not_retransmitted.has_value());
DeleteSerializedPacket();
+
+ EXPECT_FALSE(creator_.HasPendingFrames());
+}
+
+TEST_P(
+ QuicPacketCreatorTest,
+ PacketBytesRetransmitted_CreateAndSerializeStreamFrame_NotRetransmission) {
+ creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
+
+ const std::string data("test");
+ producer_.SaveStreamData(GetNthClientInitiatedStreamId(0), data);
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
+ size_t num_bytes_consumed;
+ // Non-retransmission frame does not add to packet's bytes_retransmitted
+ creator_.CreateAndSerializeStreamFrame(
+ GetNthClientInitiatedStreamId(0), data.length(), 0, 0, true,
+ NOT_RETRANSMISSION, &num_bytes_consumed);
+ EXPECT_EQ(4u, num_bytes_consumed);
+
+ ASSERT_TRUE(serialized_packet_->encrypted_buffer);
+ ASSERT_FALSE(serialized_packet_->bytes_not_retransmitted.has_value());
+ DeleteSerializedPacket();
+
+ EXPECT_FALSE(creator_.HasPendingFrames());
}
TEST_P(QuicPacketCreatorTest, RetryToken) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.cc
index 57d6ba7ff33..f0b9ccdc0b8 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.cc
@@ -105,9 +105,9 @@ size_t GetPacketHeaderSize(
QuicConnectionIdLength source_connection_id_length, bool include_version,
bool include_diversification_nonce,
QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
QuicByteCount retry_token_length,
- QuicVariableLengthIntegerLength length_length) {
+ quiche::QuicheVariableLengthIntegerLength length_length) {
if (VersionHasIetfInvariantHeader(version)) {
if (include_version) {
// Long header.
@@ -153,9 +153,9 @@ size_t GetStartOfEncryptedData(
QuicConnectionIdLength source_connection_id_length, bool include_version,
bool include_diversification_nonce,
QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
QuicByteCount retry_token_length,
- QuicVariableLengthIntegerLength length_length) {
+ quiche::QuicheVariableLengthIntegerLength length_length) {
// Encryption starts before private flags.
return GetPacketHeaderSize(
version, destination_connection_id_length, source_connection_id_length,
@@ -177,9 +177,9 @@ QuicPacketHeader::QuicPacketHeader()
form(GOOGLE_QUIC_PACKET),
long_packet_type(INITIAL),
possible_stateless_reset_token({}),
- retry_token_length_length(VARIABLE_LENGTH_INTEGER_LENGTH_0),
+ retry_token_length_length(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0),
retry_token(absl::string_view()),
- length_length(VARIABLE_LENGTH_INTEGER_LENGTH_0),
+ length_length(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0),
remaining_packet_length(0) {}
QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default;
@@ -239,14 +239,15 @@ std::ostream& operator<<(std::ostream& os, const QuicPacketHeader& header) {
os << ", long_packet_type: "
<< QuicUtils::QuicLongHeaderTypetoString(header.long_packet_type);
}
- if (header.retry_token_length_length != VARIABLE_LENGTH_INTEGER_LENGTH_0) {
+ if (header.retry_token_length_length !=
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0) {
os << ", retry_token_length_length: "
<< static_cast<int>(header.retry_token_length_length);
}
if (header.retry_token.length() != 0) {
os << ", retry_token_length: " << header.retry_token.length();
}
- if (header.length_length != VARIABLE_LENGTH_INTEGER_LENGTH_0) {
+ if (header.length_length != quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0) {
os << ", length_length: " << static_cast<int>(header.length_length);
}
if (header.remaining_packet_length != 0) {
@@ -285,9 +286,9 @@ QuicPacket::QuicPacket(
QuicConnectionIdLength source_connection_id_length, bool includes_version,
bool includes_diversification_nonce,
QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
QuicByteCount retry_token_length,
- QuicVariableLengthIntegerLength length_length)
+ quiche::QuicheVariableLengthIntegerLength length_length)
: QuicData(buffer, length, owns_buffer),
buffer_(buffer),
destination_connection_id_length_(destination_connection_id_length),
@@ -439,7 +440,8 @@ SerializedPacket::SerializedPacket(SerializedPacket&& other)
has_ack_frequency(other.has_ack_frequency),
has_message(other.has_message),
fate(other.fate),
- peer_address(other.peer_address) {
+ peer_address(other.peer_address),
+ bytes_not_retransmitted(other.bytes_not_retransmitted) {
if (this != &other) {
if (release_encrypted_buffer && encrypted_buffer != nullptr) {
release_encrypted_buffer(encrypted_buffer);
@@ -486,6 +488,7 @@ SerializedPacket* CopySerializedPacket(const SerializedPacket& serialized,
copy->has_message = serialized.has_message;
copy->fate = serialized.fate;
copy->peer_address = serialized.peer_address;
+ copy->bytes_not_retransmitted = serialized.bytes_not_retransmitted;
if (copy_buffer) {
copy->encrypted_buffer = CopyBuffer(serialized);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.h
index 5246f43eaaf..c0cc8afd1d7 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_packets.h
@@ -82,15 +82,15 @@ GetIncludedSourceConnectionIdLength(const QuicPacketHeader& header);
QUIC_EXPORT_PRIVATE size_t GetPacketHeaderSize(QuicTransportVersion version,
const QuicPacketHeader& header);
-QUIC_EXPORT_PRIVATE size_t
-GetPacketHeaderSize(QuicTransportVersion version,
- QuicConnectionIdLength destination_connection_id_length,
- QuicConnectionIdLength source_connection_id_length,
- bool include_version, bool include_diversification_nonce,
- QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
- QuicByteCount retry_token_length,
- QuicVariableLengthIntegerLength length_length);
+QUIC_EXPORT_PRIVATE size_t GetPacketHeaderSize(
+ QuicTransportVersion version,
+ QuicConnectionIdLength destination_connection_id_length,
+ QuicConnectionIdLength source_connection_id_length, bool include_version,
+ bool include_diversification_nonce,
+ QuicPacketNumberLength packet_number_length,
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
+ QuicByteCount retry_token_length,
+ quiche::QuicheVariableLengthIntegerLength length_length);
// Index of the first byte in a QUIC packet of encrypted data.
QUIC_EXPORT_PRIVATE size_t GetStartOfEncryptedData(
@@ -102,9 +102,9 @@ QUIC_EXPORT_PRIVATE size_t GetStartOfEncryptedData(
QuicConnectionIdLength source_connection_id_length, bool include_version,
bool include_diversification_nonce,
QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
QuicByteCount retry_token_length,
- QuicVariableLengthIntegerLength length_length);
+ quiche::QuicheVariableLengthIntegerLength length_length);
struct QUIC_EXPORT_PRIVATE QuicPacketHeader {
QuicPacketHeader();
@@ -147,12 +147,12 @@ struct QUIC_EXPORT_PRIVATE QuicPacketHeader {
StatelessResetToken possible_stateless_reset_token;
// Length of the retry token length variable length integer field,
// carried only by v99 IETF Initial packets.
- QuicVariableLengthIntegerLength retry_token_length_length;
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length;
// Retry token, carried only by v99 IETF Initial packets.
absl::string_view retry_token;
// Length of the length variable length integer field,
// carried only by v99 IETF Initial, 0-RTT and Handshake packets.
- QuicVariableLengthIntegerLength length_length;
+ quiche::QuicheVariableLengthIntegerLength length_length;
// Length of the packet number and payload, carried only by v99 IETF Initial,
// 0-RTT and Handshake packets. Also includes the length of the
// diversification nonce in server to client 0-RTT packets.
@@ -222,14 +222,15 @@ class QUIC_EXPORT_PRIVATE QuicData {
class QUIC_EXPORT_PRIVATE QuicPacket : public QuicData {
public:
- QuicPacket(char* buffer, size_t length, bool owns_buffer,
- QuicConnectionIdLength destination_connection_id_length,
- QuicConnectionIdLength source_connection_id_length,
- bool includes_version, bool includes_diversification_nonce,
- QuicPacketNumberLength packet_number_length,
- QuicVariableLengthIntegerLength retry_token_length_length,
- QuicByteCount retry_token_length,
- QuicVariableLengthIntegerLength length_length);
+ QuicPacket(
+ char* buffer, size_t length, bool owns_buffer,
+ QuicConnectionIdLength destination_connection_id_length,
+ QuicConnectionIdLength source_connection_id_length, bool includes_version,
+ bool includes_diversification_nonce,
+ QuicPacketNumberLength packet_number_length,
+ quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
+ QuicByteCount retry_token_length,
+ quiche::QuicheVariableLengthIntegerLength length_length);
QuicPacket(QuicTransportVersion version, char* buffer, size_t length,
bool owns_buffer, const QuicPacketHeader& header);
QuicPacket(const QuicPacket&) = delete;
@@ -247,9 +248,9 @@ class QUIC_EXPORT_PRIVATE QuicPacket : public QuicData {
const bool includes_version_;
const bool includes_diversification_nonce_;
const QuicPacketNumberLength packet_number_length_;
- const QuicVariableLengthIntegerLength retry_token_length_length_;
+ const quiche::QuicheVariableLengthIntegerLength retry_token_length_length_;
const QuicByteCount retry_token_length_;
- const QuicVariableLengthIntegerLength length_length_;
+ const quiche::QuicheVariableLengthIntegerLength length_length_;
};
class QUIC_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData {
@@ -376,6 +377,10 @@ struct QUIC_EXPORT_PRIVATE SerializedPacket {
bool has_message;
SerializedPacketFate fate;
QuicSocketAddress peer_address;
+ // Sum of bytes from frames that are not retransmissions. This field is only
+ // populated for packets with "mixed frames": at least one frame of a
+ // retransmission type and at least one frame of NOT_RETRANSMISSION type.
+ absl::optional<QuicByteCount> bytes_not_retransmitted;
};
// Make a copy of |serialized| (including the underlying frames). |copy_buffer|
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc
index 279ac0f0a18..61e3dade583 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.cc
@@ -34,10 +34,11 @@ std::ostream& operator<<(std::ostream& os,
QuicPathValidator::QuicPathValidator(QuicAlarmFactory* alarm_factory,
QuicConnectionArena* arena,
SendDelegate* send_delegate,
- QuicRandom* random,
+ QuicRandom* random, const QuicClock* clock,
QuicConnectionContext* context)
: send_delegate_(send_delegate),
random_(random),
+ clock_(clock),
retry_timer_(alarm_factory->CreateAlarm(
arena->New<RetryAlarmDelegate>(this, context), arena)),
retry_count_(0u) {}
@@ -57,14 +58,16 @@ void QuicPathValidator::OnPathResponse(const QuicPathFrameBuffer& probing_data,
return;
}
// This iterates at most 3 times.
- if (std::find(probing_data_.begin(), probing_data_.end(), probing_data) !=
- probing_data_.end()) {
- result_delegate_->OnPathValidationSuccess(std::move(path_context_));
- ResetPathValidation();
- } else {
- QUIC_DVLOG(1) << "PATH_RESPONSE with payload " << probing_data.data()
- << " doesn't match the probing data.";
+ for (auto it = probing_data_.begin(); it != probing_data_.end(); ++it) {
+ if (it->frame_buffer == probing_data) {
+ result_delegate_->OnPathValidationSuccess(std::move(path_context_),
+ it->send_time);
+ ResetPathValidation();
+ return;
+ }
}
+ QUIC_DVLOG(1) << "PATH_RESPONSE with payload " << probing_data.data()
+ << " doesn't match the probing data.";
}
void QuicPathValidator::StartPathValidation(
@@ -109,9 +112,10 @@ QuicPathValidationContext* QuicPathValidator::GetContext() const {
}
const QuicPathFrameBuffer& QuicPathValidator::GeneratePathChallengePayload() {
- probing_data_.push_back(QuicPathFrameBuffer());
- random_->RandBytes(probing_data_.back().data(), sizeof(QuicPathFrameBuffer));
- return probing_data_.back();
+ probing_data_.emplace_back(clock_->Now());
+ random_->RandBytes(probing_data_.back().frame_buffer.data(),
+ sizeof(QuicPathFrameBuffer));
+ return probing_data_.back().frame_buffer;
}
void QuicPathValidator::OnRetryTimeout() {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.h
index 32758a9fba4..4389ce50eef 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator.h
@@ -16,6 +16,7 @@
#include "quiche/quic/core/quic_connection_context.h"
#include "quiche/quic/core/quic_one_block_arena.h"
#include "quiche/quic/core/quic_packet_writer.h"
+#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/platform/api/quic_export.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
@@ -100,8 +101,11 @@ class QUIC_EXPORT_PRIVATE QuicPathValidator {
public:
virtual ~ResultDelegate() = default;
+ // Called when a PATH_RESPONSE is received with a matching PATH_CHALLANGE.
+ // |start_time| is the time when the matching PATH_CHALLANGE was sent.
virtual void OnPathValidationSuccess(
- std::unique_ptr<QuicPathValidationContext> context) = 0;
+ std::unique_ptr<QuicPathValidationContext> context,
+ QuicTime start_time) = 0;
virtual void OnPathValidationFailure(
std::unique_ptr<QuicPathValidationContext> context) = 0;
@@ -109,7 +113,7 @@ class QUIC_EXPORT_PRIVATE QuicPathValidator {
QuicPathValidator(QuicAlarmFactory* alarm_factory, QuicConnectionArena* arena,
SendDelegate* delegate, QuicRandom* random,
- QuicConnectionContext* context);
+ const QuicClock* clock, QuicConnectionContext* context);
// Send PATH_CHALLENGE and start the retry timer.
void StartPathValidation(std::unique_ptr<QuicPathValidationContext> context,
@@ -144,10 +148,17 @@ class QUIC_EXPORT_PRIVATE QuicPathValidator {
void ResetPathValidation();
+ struct QUIC_NO_EXPORT ProbingData {
+ explicit ProbingData(QuicTime send_time) : send_time(send_time) {}
+ QuicPathFrameBuffer frame_buffer;
+ QuicTime send_time;
+ };
+
// Has at most 3 entries due to validation timeout.
- absl::InlinedVector<QuicPathFrameBuffer, 3> probing_data_;
+ absl::InlinedVector<ProbingData, 3> probing_data_;
SendDelegate* send_delegate_;
QuicRandom* random_;
+ const QuicClock* clock_;
std::unique_ptr<QuicPathValidationContext> path_context_;
std::unique_ptr<ResultDelegate> result_delegate_;
QuicArenaScopedPtr<QuicAlarm> retry_timer_;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator_test.cc
index 7640b86b60c..f45cd26eb56 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_path_validator_test.cc
@@ -43,6 +43,7 @@ class QuicPathValidatorTest : public QuicTest {
public:
QuicPathValidatorTest()
: path_validator_(&alarm_factory_, &arena_, &send_delegate_, &random_,
+ &clock_,
/*context=*/nullptr),
context_(new MockQuicPathValidationContext(
self_address_, peer_address_, effective_peer_address_, &writer_)),
@@ -82,15 +83,19 @@ TEST_F(QuicPathValidatorTest, PathValidationSuccessOnFirstRound) {
return true;
}));
EXPECT_CALL(send_delegate_, GetRetryTimeout(peer_address_, &writer_));
+ const QuicTime expected_start_time = clock_.Now();
path_validator_.StartPathValidation(
std::unique_ptr<QuicPathValidationContext>(context_),
std::unique_ptr<MockQuicPathValidationResultDelegate>(result_delegate_));
EXPECT_TRUE(path_validator_.HasPendingPathValidation());
EXPECT_TRUE(path_validator_.IsValidatingPeerAddress(effective_peer_address_));
- EXPECT_CALL(*result_delegate_, OnPathValidationSuccess(_))
- .WillOnce(Invoke([=](std::unique_ptr<QuicPathValidationContext> context) {
+ EXPECT_CALL(*result_delegate_, OnPathValidationSuccess(_, _))
+ .WillOnce(Invoke([=](std::unique_ptr<QuicPathValidationContext> context,
+ QuicTime start_time) {
EXPECT_EQ(context.get(), context_);
+ EXPECT_EQ(start_time, expected_start_time);
}));
+ clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(kInitialRttMs));
path_validator_.OnPathResponse(challenge_data, self_address_);
EXPECT_FALSE(path_validator_.HasPendingPathValidation());
}
@@ -107,6 +112,7 @@ TEST_F(QuicPathValidatorTest, RespondWithDifferentSelfAddress) {
return true;
}));
EXPECT_CALL(send_delegate_, GetRetryTimeout(peer_address_, &writer_));
+ const QuicTime expected_start_time = clock_.Now();
path_validator_.StartPathValidation(
std::unique_ptr<QuicPathValidationContext>(context_),
std::unique_ptr<MockQuicPathValidationResultDelegate>(result_delegate_));
@@ -114,12 +120,16 @@ TEST_F(QuicPathValidatorTest, RespondWithDifferentSelfAddress) {
// Reception of a PATH_RESPONSE on a different self address should be ignored.
const QuicSocketAddress kAlternativeSelfAddress(QuicIpAddress::Any6(), 54321);
EXPECT_NE(kAlternativeSelfAddress, self_address_);
+ clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(kInitialRttMs));
path_validator_.OnPathResponse(challenge_data, kAlternativeSelfAddress);
- EXPECT_CALL(*result_delegate_, OnPathValidationSuccess(_))
- .WillOnce(Invoke([=](std::unique_ptr<QuicPathValidationContext> context) {
+ EXPECT_CALL(*result_delegate_, OnPathValidationSuccess(_, _))
+ .WillOnce(Invoke([=](std::unique_ptr<QuicPathValidationContext> context,
+ QuicTime start_time) {
EXPECT_EQ(context->self_address(), self_address_);
+ EXPECT_EQ(start_time, expected_start_time);
}));
+ clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(kInitialRttMs));
path_validator_.OnPathResponse(challenge_data, self_address_);
}
@@ -143,6 +153,7 @@ TEST_F(QuicPathValidatorTest, RespondAfter1stRetry) {
}));
EXPECT_CALL(send_delegate_, GetRetryTimeout(peer_address_, &writer_))
.Times(2u);
+ const QuicTime start_time = clock_.Now();
path_validator_.StartPathValidation(
std::unique_ptr<QuicPathValidationContext>(context_),
std::unique_ptr<MockQuicPathValidationResultDelegate>(result_delegate_));
@@ -152,7 +163,7 @@ TEST_F(QuicPathValidatorTest, RespondAfter1stRetry) {
alarm_factory_.FireAlarm(
QuicPathValidatorPeer::retry_timer(&path_validator_));
- EXPECT_CALL(*result_delegate_, OnPathValidationSuccess(_));
+ EXPECT_CALL(*result_delegate_, OnPathValidationSuccess(_, start_time));
// Respond to the 1st PATH_CHALLENGE should complete the validation.
path_validator_.OnPathResponse(challenge_data, self_address_);
EXPECT_FALSE(path_validator_.HasPendingPathValidation());
@@ -183,12 +194,13 @@ TEST_F(QuicPathValidatorTest, RespondToRetryChallenge) {
std::unique_ptr<MockQuicPathValidationResultDelegate>(result_delegate_));
clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(3 * kInitialRttMs));
+ const QuicTime start_time = clock_.Now();
random_.ChangeValue();
alarm_factory_.FireAlarm(
QuicPathValidatorPeer::retry_timer(&path_validator_));
// Respond to the 2nd PATH_CHALLENGE should complete the validation.
- EXPECT_CALL(*result_delegate_, OnPathValidationSuccess(_));
+ EXPECT_CALL(*result_delegate_, OnPathValidationSuccess(_, start_time));
path_validator_.OnPathResponse(challenge_data, self_address_);
EXPECT_FALSE(path_validator_.HasPendingPathValidation());
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc
index da7c42305c1..961eb8d6dbf 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_ping_manager.cc
@@ -4,6 +4,8 @@
#include "quiche/quic/core/quic_ping_manager.h"
+#include "quiche/quic/platform/api/quic_flags.h"
+
namespace quic {
namespace {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_protocol_flags_list.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_protocol_flags_list.h
index 20d9a88aef2..c0006f792a4 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_protocol_flags_list.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_protocol_flags_list.h
@@ -105,10 +105,6 @@ QUIC_PROTOCOL_FLAG(bool, quic_disable_version_negotiation_grease_randomness,
QUIC_PROTOCOL_FLAG(bool, quic_enable_http3_grease_randomness, true,
"If true, use random greased settings and frames.")
-QUIC_PROTOCOL_FLAG(
- bool, quic_enable_chaos_protection, true,
- "If true, use chaos protection to randomize client initials.")
-
QUIC_PROTOCOL_FLAG(int64_t, quic_max_tracked_packet_count, 10000,
"Maximum number of tracked packets.")
@@ -215,4 +211,7 @@ QUIC_PROTOCOL_FLAG(
QUIC_PROTOCOL_FLAG(bool, quic_use_lower_server_response_mtu_for_test, false,
"If true, cap server response packet size at 1250.")
+
+QUIC_PROTOCOL_FLAG(bool, quic_enforce_strict_amplification_factor, false,
+ "If true, enforce strict amplification factor")
#endif
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc
index 10835830bfb..0725631a653 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.cc
@@ -131,17 +131,19 @@ void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) {
ignore_ack_delay_ = true;
}
- if (config.HasClientRequestedIndependentOption(kPDP1, perspective)) {
- num_ptos_for_path_degrading_ = 1;
- }
- if (config.HasClientRequestedIndependentOption(kPDP2, perspective)) {
- num_ptos_for_path_degrading_ = 2;
- }
- if (config.HasClientRequestedIndependentOption(kPDP3, perspective)) {
- num_ptos_for_path_degrading_ = 3;
- }
- if (config.HasClientRequestedIndependentOption(kPDP5, perspective)) {
- num_ptos_for_path_degrading_ = 5;
+ if (!remove_blackhole_detection_experiments_) {
+ if (config.HasClientRequestedIndependentOption(kPDP1, perspective)) {
+ num_ptos_for_path_degrading_ = 1;
+ }
+ if (config.HasClientRequestedIndependentOption(kPDP2, perspective)) {
+ num_ptos_for_path_degrading_ = 2;
+ }
+ if (config.HasClientRequestedIndependentOption(kPDP3, perspective)) {
+ num_ptos_for_path_degrading_ = 3;
+ }
+ if (config.HasClientRequestedIndependentOption(kPDP5, perspective)) {
+ num_ptos_for_path_degrading_ = 5;
+ }
}
// Configure congestion control.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h
index f0a6bc6ded7..731bd3defcc 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager.h
@@ -26,6 +26,7 @@
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_unacked_packet_map.h"
#include "quiche/quic/platform/api/quic_export.h"
+#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/common/quiche_circular_deque.h"
namespace quic {
@@ -464,6 +465,11 @@ class QUIC_EXPORT_PRIVATE QuicSentPacketManager {
// kMinUntrustedInitialRoundTripTimeUs if not |trusted|.
void SetInitialRtt(QuicTime::Delta rtt, bool trusted);
+ // Latched value of --quic_remove_blackhole_detection_experiments.
+ bool remove_blackhole_detection_experiments() const {
+ return remove_blackhole_detection_experiments_;
+ }
+
private:
friend class test::QuicConnectionPeer;
friend class test::QuicSentPacketManagerPeer;
@@ -668,6 +674,9 @@ class QUIC_EXPORT_PRIVATE QuicSentPacketManager {
// Whether to ignore the ack_delay in received ACKs.
bool ignore_ack_delay_;
+
+ const bool remove_blackhole_detection_experiments_ =
+ GetQuicReloadableFlag(quic_remove_blackhole_detection_experiments);
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager_test.cc
index 8c8076b43e5..67605e49cb4 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_sent_packet_manager_test.cc
@@ -2499,6 +2499,9 @@ TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayDefaultPTO) {
}
TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayUsing2PTO) {
+ if (GetQuicReloadableFlag(quic_remove_blackhole_detection_experiments)) {
+ return;
+ }
QuicConfig client_config;
QuicTagVector client_options;
client_options.push_back(kPDP2);
@@ -2512,6 +2515,9 @@ TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayUsing2PTO) {
}
TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayUsing1PTO) {
+ if (GetQuicReloadableFlag(quic_remove_blackhole_detection_experiments)) {
+ return;
+ }
QuicConfig client_config;
QuicTagVector client_options;
client_options.push_back(kPDP1);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.cc
index d29760062ad..8d87de1f2a6 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.cc
@@ -134,9 +134,6 @@ void QuicSession::Initialize() {
connection_->set_can_receive_ack_frequency_frame();
config_.SetMinAckDelayMs(kDefaultMinAckDelayTimeMs);
}
- if (config_.HasClientRequestedIndependentOption(kNBPE, perspective_)) {
- permutes_tls_extensions_ = false;
- }
}
connection_->CreateConnectionIdManager();
@@ -630,9 +627,12 @@ void QuicSession::OnCanWrite() {
if (crypto_stream->HasBufferedCryptoFrames()) {
crypto_stream->WriteBufferedCryptoFrames();
}
- if (crypto_stream->HasBufferedCryptoFrames()) {
- // Cannot finish writing buffered crypto frames, connection is write
- // blocked.
+ if ((GetQuicReloadableFlag(
+ quic_no_write_control_frame_upon_connection_close) &&
+ !connection_->connected()) ||
+ crypto_stream->HasBufferedCryptoFrames()) {
+ // Cannot finish writing buffered crypto frames, connection is either
+ // write blocked or closed.
return;
}
}
@@ -849,7 +849,7 @@ void QuicSession::OnControlFrameManagerError(QuicErrorCode error_code,
bool QuicSession::WriteControlFrame(const QuicFrame& frame,
TransmissionType type) {
- QUICHE_DCHECK(connection()->connected())
+ QUIC_BUG_IF(quic_bug_12435_11, !connection()->connected())
<< ENDPOINT << "Try to write control frames when connection is closed.";
if (!IsEncryptionEstablished()) {
// Suppress the write before encryption gets established.
@@ -2098,12 +2098,13 @@ void QuicSession::SendRetireConnectionId(uint64_t sequence_number) {
control_frame_manager_.WriteOrBufferRetireConnectionId(sequence_number);
}
-void QuicSession::OnServerConnectionIdIssued(
+bool QuicSession::MaybeReserveConnectionId(
const QuicConnectionId& server_connection_id) {
if (visitor_) {
- visitor_->OnNewConnectionIdSent(
+ return visitor_->TryAddNewConnectionId(
connection_->GetOneActiveServerConnectionId(), server_connection_id);
}
+ return true;
}
void QuicSession::OnServerConnectionIdRetired(
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.h
index 7bdcaa95f4d..e749abec6e6 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session.h
@@ -89,8 +89,8 @@ class QUIC_EXPORT_PRIVATE QuicSession
// peer.
virtual void OnStopSendingReceived(const QuicStopSendingFrame& frame) = 0;
- // Called when a NewConnectionId frame has been sent.
- virtual void OnNewConnectionIdSent(
+ // Called when on whether a NewConnectionId frame can been sent.
+ virtual bool TryAddNewConnectionId(
const QuicConnectionId& server_connection_id,
const QuicConnectionId& new_connection_id) = 0;
@@ -145,7 +145,12 @@ class QUIC_EXPORT_PRIVATE QuicSession
void SendAckFrequency(const QuicAckFrequencyFrame& frame) override;
void SendNewConnectionId(const QuicNewConnectionIdFrame& frame) override;
void SendRetireConnectionId(uint64_t sequence_number) override;
- void OnServerConnectionIdIssued(
+ // Returns true if server_connection_id can be issued. If returns true,
+ // |visitor_| may establish a mapping from |server_connection_id| to this
+ // session, if that's not desired,
+ // OnServerConnectionIdRetired(server_connection_id) can be used to remove the
+ // mapping.
+ bool MaybeReserveConnectionId(
const QuicConnectionId& server_connection_id) override;
void OnServerConnectionIdRetired(
const QuicConnectionId& server_connection_id) override;
@@ -612,8 +617,6 @@ class QUIC_EXPORT_PRIVATE QuicSession
return liveness_testing_in_progress_;
}
- bool permutes_tls_extensions() const { return permutes_tls_extensions_; }
-
virtual QuicSSLConfig GetSSLConfig() const { return QuicSSLConfig(); }
// Try converting all pending streams to normal streams.
@@ -999,9 +1002,6 @@ class QUIC_EXPORT_PRIVATE QuicSession
// This indicates a liveness testing is in progress, and push back the
// creation of new outgoing bidirectional streams.
bool liveness_testing_in_progress_;
-
- // Whether BoringSSL randomizes the order of TLS extensions.
- bool permutes_tls_extensions_ = true;
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session_test.cc
index 9b90c4f169f..916ed1bcf40 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_session_test.cc
@@ -3055,6 +3055,79 @@ TEST_P(QuicSessionTestServer, IncomingStreamWithServerInitiatedStreamId) {
session_.OnStreamFrame(frame);
}
+// Regression test for b/235204908.
+TEST_P(QuicSessionTestServer, BlockedFrameCausesWriteError) {
+ CompleteHandshake();
+ MockPacketWriter* writer = static_cast<MockPacketWriter*>(
+ QuicConnectionPeer::GetWriter(session_.connection()));
+ EXPECT_CALL(*writer, WritePacket(_, _, _, _, _))
+ .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0)));
+ // Set a small connection level flow control limit.
+ const uint64_t kWindow = 36;
+ QuicFlowControllerPeer::SetSendWindowOffset(session_.flow_controller(),
+ kWindow);
+ auto stream =
+ session_.GetOrCreateStream(GetNthClientInitiatedBidirectionalId(0));
+ // Try to send more data than the flow control limit allows.
+ const uint64_t kOverflow = 15;
+ std::string body(kWindow + kOverflow, 'a');
+ EXPECT_CALL(*connection_, SendControlFrame(_))
+ .WillOnce(testing::InvokeWithoutArgs([this]() {
+ connection_->ReallyCloseConnection(
+ QUIC_PACKET_WRITE_ERROR, "write error",
+ ConnectionCloseBehavior::SILENT_CLOSE);
+ return false;
+ }));
+ std::string msg =
+ absl::StrCat("Marking unknown stream ", stream->id(), " blocked.");
+ if (GetQuicReloadableFlag(
+ quic_donot_mark_stream_write_blocked_if_write_side_closed)) {
+ stream->WriteOrBufferData(body, false, nullptr);
+ } else {
+ EXPECT_QUIC_BUG(stream->WriteOrBufferData(body, false, nullptr), msg);
+ }
+}
+
+TEST_P(QuicSessionTestServer, BufferedCryptoFrameCausesWriteError) {
+ if (!VersionHasIetfQuicFrames(transport_version())) {
+ return;
+ }
+ std::string data(1350, 'a');
+ TestCryptoStream* crypto_stream = session_.GetMutableCryptoStream();
+ // Only consumed 1000 bytes.
+ EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_FORWARD_SECURE, 1350, 0))
+ .WillOnce(Return(1000));
+ crypto_stream->WriteCryptoData(ENCRYPTION_FORWARD_SECURE, data);
+ EXPECT_TRUE(session_.HasPendingHandshake());
+ EXPECT_TRUE(session_.WillingAndAbleToWrite());
+
+ EXPECT_CALL(*connection_,
+ SendCryptoData(ENCRYPTION_FORWARD_SECURE, 350, 1000))
+ .WillOnce(Return(0));
+ // Buffer the HANDSHAKE_DONE frame.
+ EXPECT_CALL(*connection_, SendControlFrame(_)).WillOnce(Return(false));
+ CryptoHandshakeMessage msg;
+ session_.GetMutableCryptoStream()->OnHandshakeMessage(msg);
+
+ // Flush both frames.
+ EXPECT_CALL(*connection_,
+ SendCryptoData(ENCRYPTION_FORWARD_SECURE, 350, 1000))
+ .WillOnce(testing::InvokeWithoutArgs([this]() {
+ connection_->ReallyCloseConnection(
+ QUIC_PACKET_WRITE_ERROR, "write error",
+ ConnectionCloseBehavior::SILENT_CLOSE);
+ return 350;
+ }));
+ if (!GetQuicReloadableFlag(
+ quic_no_write_control_frame_upon_connection_close)) {
+ EXPECT_CALL(*connection_, SendControlFrame(_)).WillOnce(Return(false));
+ EXPECT_QUIC_BUG(session_.OnCanWrite(),
+ "Try to write control frames when connection is closed");
+ } else {
+ session_.OnCanWrite();
+ }
+}
+
// A client test class that can be used when the automatic configuration is not
// desired.
class QuicSessionTestClientUnconfigured : public QuicSessionTestBase {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream.cc
index dcbb02acd22..29990aa4a34 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream.cc
@@ -746,12 +746,20 @@ void QuicStream::MaybeSendBlocked() {
return;
}
connection_flow_controller_->MaybeSendBlocked();
+ if (GetQuicReloadableFlag(
+ quic_donot_mark_stream_write_blocked_if_write_side_closed)) {
+ QUIC_RELOADABLE_FLAG_COUNT(
+ quic_donot_mark_stream_write_blocked_if_write_side_closed);
+ }
// If the stream is blocked by connection-level flow control but not by
// stream-level flow control, add the stream to the write blocked list so that
// the stream will be given a chance to write when a connection-level
// WINDOW_UPDATE arrives.
- if (connection_flow_controller_->IsBlocked() &&
+ if ((!GetQuicReloadableFlag(
+ quic_donot_mark_stream_write_blocked_if_write_side_closed) ||
+ !write_side_closed_) &&
+ connection_flow_controller_->IsBlocked() &&
!flow_controller_->IsBlocked()) {
session_->MarkConnectionLevelWriteBlocked(id());
}
@@ -1292,7 +1300,11 @@ void QuicStream::WriteBufferedData(EncryptionLevel level) {
was_draining_ = true;
}
CloseWriteSide();
- } else if (fin && !consumed_data.fin_consumed) {
+ } else if (
+ fin && !consumed_data.fin_consumed &&
+ (!GetQuicReloadableFlag(
+ quic_donot_mark_stream_write_blocked_if_write_side_closed) ||
+ !write_side_closed_)) {
session_->MarkConnectionLevelWriteBlocked(id());
}
} else {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream_test.cc
index 51b25a5f322..1bec69fc399 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_stream_test.cc
@@ -346,8 +346,8 @@ TEST_P(QuicStreamTest, WriteAllData) {
connection_->transport_version(), PACKET_8BYTE_CONNECTION_ID,
PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0u);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0u);
connection_->SetMaxPacketLength(length);
EXPECT_CALL(*session_, WritevData(kTestStreamId, _, _, _, _, _))
@@ -431,8 +431,8 @@ TEST_P(QuicStreamTest, WriteOrBufferData) {
connection_->transport_version(), PACKET_8BYTE_CONNECTION_ID,
PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER,
- VARIABLE_LENGTH_INTEGER_LENGTH_0,
- VARIABLE_LENGTH_INTEGER_LENGTH_0, 0u);
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
+ quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0u);
connection_->SetMaxPacketLength(length);
EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_time.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_time.h
index 0be5d3cda0a..21bad687f05 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_time.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_time.h
@@ -61,17 +61,19 @@ class QUIC_EXPORT_PRIVATE QuicTime {
static constexpr Delta FromMicroseconds(int64_t us) { return Delta(us); }
// Converts the time offset to a rounded number of seconds.
- int64_t ToSeconds() const { return time_offset_ / 1000 / 1000; }
+ constexpr int64_t ToSeconds() const { return time_offset_ / 1000 / 1000; }
// Converts the time offset to a rounded number of milliseconds.
- int64_t ToMilliseconds() const { return time_offset_ / 1000; }
+ constexpr int64_t ToMilliseconds() const { return time_offset_ / 1000; }
// Converts the time offset to a rounded number of microseconds.
- int64_t ToMicroseconds() const { return time_offset_; }
+ constexpr int64_t ToMicroseconds() const { return time_offset_; }
- bool IsZero() const { return time_offset_ == 0; }
+ constexpr bool IsZero() const { return time_offset_ == 0; }
- bool IsInfinite() const { return time_offset_ == kQuicInfiniteTimeUs; }
+ constexpr bool IsInfinite() const {
+ return time_offset_ == kQuicInfiniteTimeUs;
+ }
std::string ToDebuggingValue() const;
@@ -81,11 +83,13 @@ class QUIC_EXPORT_PRIVATE QuicTime {
friend inline QuicTime::Delta operator<<(QuicTime::Delta lhs, size_t rhs);
friend inline QuicTime::Delta operator>>(QuicTime::Delta lhs, size_t rhs);
- friend inline QuicTime::Delta operator+(QuicTime::Delta lhs,
- QuicTime::Delta rhs);
- friend inline QuicTime::Delta operator-(QuicTime::Delta lhs,
- QuicTime::Delta rhs);
- friend inline QuicTime::Delta operator*(QuicTime::Delta lhs, int rhs);
+ friend inline constexpr QuicTime::Delta operator+(QuicTime::Delta lhs,
+ QuicTime::Delta rhs);
+ friend inline constexpr QuicTime::Delta operator-(QuicTime::Delta lhs,
+ QuicTime::Delta rhs);
+ friend inline constexpr QuicTime::Delta operator*(QuicTime::Delta lhs,
+ int rhs);
+ // Not constexpr since std::llround() is not constexpr.
friend inline QuicTime::Delta operator*(QuicTime::Delta lhs, double rhs);
friend inline QuicTime operator+(QuicTime lhs, QuicTime::Delta rhs);
@@ -242,13 +246,15 @@ inline std::ostream& operator<<(std::ostream& output, const QuicTime t) {
}
// Non-member arithmetic operators for QuicTime::Delta.
-inline QuicTime::Delta operator+(QuicTime::Delta lhs, QuicTime::Delta rhs) {
+inline constexpr QuicTime::Delta operator+(QuicTime::Delta lhs,
+ QuicTime::Delta rhs) {
return QuicTime::Delta(lhs.time_offset_ + rhs.time_offset_);
}
-inline QuicTime::Delta operator-(QuicTime::Delta lhs, QuicTime::Delta rhs) {
+inline constexpr QuicTime::Delta operator-(QuicTime::Delta lhs,
+ QuicTime::Delta rhs) {
return QuicTime::Delta(lhs.time_offset_ - rhs.time_offset_);
}
-inline QuicTime::Delta operator*(QuicTime::Delta lhs, int rhs) {
+inline constexpr QuicTime::Delta operator*(QuicTime::Delta lhs, int rhs) {
return QuicTime::Delta(lhs.time_offset_ * rhs);
}
inline QuicTime::Delta operator*(QuicTime::Delta lhs, double rhs) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.cc
index 62760c9678d..6e74dd78945 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.cc
@@ -307,6 +307,24 @@ std::ostream& operator<<(std::ostream& os, SerializedPacketFate fate) {
return os;
}
+std::string CongestionControlTypeToString(CongestionControlType cc_type) {
+ switch (cc_type) {
+ case kCubicBytes:
+ return "CUBIC_BYTES";
+ case kRenoBytes:
+ return "RENO_BYTES";
+ case kBBR:
+ return "BBR";
+ case kBBRv2:
+ return "BBRv2";
+ case kPCC:
+ return "PCC";
+ case kGoogCC:
+ return "GoogCC";
+ }
+ return absl::StrCat("Unknown(", static_cast<int>(cc_type), ")");
+}
+
std::string EncryptionLevelToString(EncryptionLevel level) {
switch (level) {
RETURN_STRING_LITERAL(ENCRYPTION_INITIAL);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.h
index c79633c70ea..ffaf6c61490 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_types.h
@@ -21,6 +21,7 @@
#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/platform/api/quic_export.h"
#include "quiche/quic/platform/api/quic_flags.h"
+#include "quiche/common/quiche_endian.h"
namespace quic {
@@ -353,20 +354,6 @@ QUIC_EXPORT_PRIVATE std::string QuicIetfFrameTypeString(QuicIetfFrameType t);
#define IETF_STREAM_FRAME_LEN_BIT 0x02
#define IETF_STREAM_FRAME_OFF_BIT 0x04
-enum QuicVariableLengthIntegerLength : uint8_t {
- // Length zero means the variable length integer is not present.
- VARIABLE_LENGTH_INTEGER_LENGTH_0 = 0,
- VARIABLE_LENGTH_INTEGER_LENGTH_1 = 1,
- VARIABLE_LENGTH_INTEGER_LENGTH_2 = 2,
- VARIABLE_LENGTH_INTEGER_LENGTH_4 = 4,
- VARIABLE_LENGTH_INTEGER_LENGTH_8 = 8,
-
- // By default we write the IETF long header length using the 2-byte encoding
- // of variable length integers, even when the length is below 64, which allows
- // us to fill in the length before knowing what the length actually is.
- kQuicDefaultLongHeaderLengthLength = VARIABLE_LENGTH_INTEGER_LENGTH_2,
-};
-
enum QuicPacketNumberLength : uint8_t {
PACKET_1BYTE_PACKET_NUMBER = 1,
PACKET_2BYTE_PACKET_NUMBER = 2,
@@ -452,6 +439,9 @@ enum CongestionControlType {
kBBRv2,
};
+QUIC_EXPORT_PRIVATE std::string CongestionControlTypeToString(
+ CongestionControlType cc_type);
+
// EncryptionLevel enumerates the stages of encryption that a QUIC connection
// progresses through. When retransmitting a packet, the encryption level needs
// to be specified so that it is retransmitted at a level which the peer can
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket.h b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket.h
index 039b07a6d19..2ae722e3b8d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket.h
@@ -9,22 +9,22 @@
#include <cstdint>
#include <type_traits>
+#include "quiche/quic/core/io/socket.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_utils.h"
#include "quiche/quic/platform/api/quic_ip_address.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
+#ifndef UDP_GRO
+#define UDP_GRO 104
+#endif
+
namespace quic {
-#if defined(_WIN32)
-using QuicUdpSocketFd = SOCKET;
-const QuicUdpSocketFd kQuicInvalidSocketFd = INVALID_SOCKET;
-#else
-using QuicUdpSocketFd = int;
-const QuicUdpSocketFd kQuicInvalidSocketFd = -1;
-#endif
+using QuicUdpSocketFd = SocketFd;
+inline constexpr QuicUdpSocketFd kQuicInvalidSocketFd = kInvalidSocketFd;
-const size_t kDefaultUdpPacketControlBufferSize = 512;
+inline constexpr size_t kDefaultUdpPacketControlBufferSize = 512;
enum class QuicUdpPacketInfoBit : uint8_t {
DROPPED_PACKETS = 0, // Read
@@ -35,6 +35,7 @@ enum class QuicUdpPacketInfoBit : uint8_t {
TTL, // Read & Write
GOOGLE_PACKET_HEADER, // Read
NUM_BITS,
+ IS_GRO, // Read
};
static_assert(static_cast<size_t>(QuicUdpPacketInfoBit::NUM_BITS) <=
BitMask64::NumBits(),
@@ -74,6 +75,13 @@ class QUIC_EXPORT_PRIVATE QuicUdpPacketInfo {
bitmask_.Set(QuicUdpPacketInfoBit::DROPPED_PACKETS);
}
+ void set_gso_size(size_t gso_size) {
+ gso_size_ = gso_size;
+ bitmask_.Set(QuicUdpPacketInfoBit::IS_GRO);
+ }
+
+ size_t gso_size() { return gso_size_; }
+
const QuicIpAddress& self_v4_ip() const {
QUICHE_DCHECK(HasValue(QuicUdpPacketInfoBit::V4_SELF_IP));
return self_v4_ip_;
@@ -151,6 +159,7 @@ class QUIC_EXPORT_PRIVATE QuicUdpPacketInfo {
QuicWallTime receive_timestamp_ = QuicWallTime::Zero();
int ttl_;
BufferSpan google_packet_headers_;
+ size_t gso_size_ = 0;
};
// QuicUdpSocketApi provides a minimal set of apis for sending and receiving
@@ -177,6 +186,12 @@ class QUIC_EXPORT_PRIVATE QuicUdpSocketApi {
// to get the bound random port.
bool Bind(QuicUdpSocketFd fd, QuicSocketAddress address);
+ // Bind |fd| to |interface_name|. Returns true if the setsockopt call
+ // succeeded. Returns false if |interface_name| is empty, its length exceeds
+ // IFNAMSIZ, or setsockopt experienced an error. Only implemented for
+ // non-Android Linux.
+ bool BindInterface(QuicUdpSocketFd fd, const std::string& interface_name);
+
// Enable receiving of various per-packet information. Return true if the
// corresponding information can be received on read.
bool EnableDroppedPacketCount(QuicUdpSocketFd fd);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket_posix.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket_posix.cc
index c77d560c640..400f45b563e 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket_posix.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/quic_udp_socket_posix.cc
@@ -4,14 +4,17 @@
#include <arpa/inet.h>
#include <fcntl.h>
+#include <net/if.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/types.h>
#include "absl/base/optimization.h"
+#include "quiche/quic/core/io/socket.h"
#include "quiche/quic/core/quic_udp_socket.h"
#include "quiche/quic/platform/api/quic_bug_tracker.h"
+#include "quiche/quic/platform/api/quic_ip_address_family.h"
#include "quiche/quic/platform/api/quic_udp_socket_platform_api.h"
#if defined(__APPLE__) && !defined(__APPLE_USE_RFC_3542)
@@ -58,49 +61,6 @@ const size_t kMinCmsgSpaceForRead =
+ kCmsgSpaceForRecvTimestamp + CMSG_SPACE(sizeof(int)) // TTL
+ kCmsgSpaceForGooglePacketHeader;
-QuicUdpSocketFd CreateNonblockingSocket(int address_family) {
-#if defined(__linux__) && defined(SOCK_NONBLOCK)
-
- // Create a nonblocking socket directly.
- int fd = socket(address_family, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP);
- if (fd < 0) {
- QUIC_LOG_FIRST_N(ERROR, 100)
- << "socket() failed with address_family=" << address_family << ": "
- << strerror(errno);
- return kQuicInvalidSocketFd;
- }
-#else
- // Create a socket and use fcntl to set it to nonblocking.
- // This implementation is used when building for iOS, OSX and old versions of
- // Linux (< 2.6.27) and old versions of Android (< API 21).
- int fd = socket(address_family, SOCK_DGRAM, IPPROTO_UDP);
- if (fd < 0) {
- QUIC_LOG_FIRST_N(ERROR, 100)
- << "socket() failed with address_family=" << address_family << ": "
- << strerror(errno);
- return kQuicInvalidSocketFd;
- }
- int current_flags = fcntl(fd, F_GETFL, 0);
- if (current_flags == -1) {
- QUIC_LOG_FIRST_N(ERROR, 100)
- << "failed to get current socket flags: " << strerror(errno);
- close(fd);
- return kQuicInvalidSocketFd;
- }
-
- int rc = fcntl(fd, F_SETFL, current_flags | O_NONBLOCK);
- if (rc == -1) {
- QUIC_LOG_FIRST_N(ERROR, 100)
- << "failed to set socket to non-blocking: " << strerror(errno);
- close(fd);
- return kQuicInvalidSocketFd;
- }
-#endif
-
- SetGoogleSocketOptions(fd);
- return fd;
-} // End CreateNonblockingSocket
-
void SetV4SelfIpInControlMessage(const QuicIpAddress& self_address,
cmsghdr* cmsg) {
QUICHE_DCHECK(self_address.IsIPv4());
@@ -124,6 +84,13 @@ void SetV6SelfIpInControlMessage(const QuicIpAddress& self_address,
void PopulatePacketInfoFromControlMessage(struct cmsghdr* cmsg,
QuicUdpPacketInfo* packet_info,
BitMask64 packet_info_interested) {
+#ifdef SOL_UDP
+ if (packet_info_interested.IsSet(QuicUdpPacketInfoBit::IS_GRO) &&
+ cmsg->cmsg_level == SOL_UDP && cmsg->cmsg_type == UDP_GRO) {
+ packet_info->set_gso_size(*reinterpret_cast<uint16_t*>(CMSG_DATA(cmsg)));
+ }
+#endif
+
#if defined(__linux__) && defined(SO_RXQ_OVFL)
if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SO_RXQ_OVFL) {
if (packet_info_interested.IsSet(QuicUdpPacketInfoBit::DROPPED_PACKETS)) {
@@ -237,19 +204,28 @@ QuicUdpSocketFd QuicUdpSocketApi::Create(int address_family,
// debug mode. This should have been a static_assert, however it can't be done
// on ios/osx because CMSG_SPACE isn't a constant expression there.
QUICHE_DCHECK_GE(kDefaultUdpPacketControlBufferSize, kMinCmsgSpaceForRead);
- QuicUdpSocketFd fd = CreateNonblockingSocket(address_family);
- if (fd == kQuicInvalidSocketFd) {
+ absl::StatusOr<SocketFd> socket =
+ socket_api::CreateSocket(FromPlatformAddressFamily(address_family),
+ socket_api::SocketProtocol::kUdp,
+ /*blocking=*/false);
+
+ if (!socket.ok()) {
+ QUIC_LOG_FIRST_N(ERROR, 100)
+ << "UDP non-blocking socket creation for address_family="
+ << address_family << " failed: " << socket.status();
return kQuicInvalidSocketFd;
}
- if (!SetupSocket(fd, address_family, receive_buffer_size, send_buffer_size,
- ipv6_only)) {
- Destroy(fd);
+ SetGoogleSocketOptions(socket.value());
+
+ if (!SetupSocket(socket.value(), address_family, receive_buffer_size,
+ send_buffer_size, ipv6_only)) {
+ Destroy(socket.value());
return kQuicInvalidSocketFd;
}
- return fd;
+ return socket.value();
}
bool QuicUdpSocketApi::SetupSocket(QuicUdpSocketFd fd, int address_family,
@@ -290,7 +266,11 @@ bool QuicUdpSocketApi::SetupSocket(QuicUdpSocketFd fd, int address_family,
void QuicUdpSocketApi::Destroy(QuicUdpSocketFd fd) {
if (fd != kQuicInvalidSocketFd) {
- close(fd);
+ absl::Status result = socket_api::Close(fd);
+ if (!result.ok()) {
+ QUIC_LOG_FIRST_N(WARNING, 100)
+ << "Failed to close UDP socket with error " << result;
+ }
}
}
@@ -301,6 +281,26 @@ bool QuicUdpSocketApi::Bind(QuicUdpSocketFd fd, QuicSocketAddress address) {
return 0 == bind(fd, reinterpret_cast<sockaddr*>(&addr), addr_len);
}
+bool QuicUdpSocketApi::BindInterface(QuicUdpSocketFd fd,
+ const std::string& interface_name) {
+#if defined(__linux__) && !defined(__ANDROID_API__)
+ if (interface_name.empty() || interface_name.size() >= IFNAMSIZ) {
+ QUIC_BUG(udp_bad_interface_name)
+ << "interface_name must be nonempty and shorter than " << IFNAMSIZ;
+ return false;
+ }
+
+ return 0 == setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,
+ interface_name.c_str(), interface_name.length());
+#else
+ (void)fd;
+ (void)interface_name;
+ QUIC_BUG(interface_bind_not_implemented)
+ << "Interface binding is not implemented on this platform";
+ return false;
+#endif
+}
+
bool QuicUdpSocketApi::EnableDroppedPacketCount(QuicUdpSocketFd fd) {
#if defined(__linux__) && defined(SO_RXQ_OVFL)
int get_overflow = 1;
@@ -455,87 +455,102 @@ size_t QuicUdpSocketApi::ReadMultiplePackets(QuicUdpSocketFd fd,
BitMask64 packet_info_interested,
ReadPacketResults* results) {
#if defined(__linux__) && !defined(__ANDROID__)
- // Use recvmmsg.
- size_t hdrs_size = sizeof(mmsghdr) * results->size();
- mmsghdr* hdrs = static_cast<mmsghdr*>(alloca(hdrs_size));
- memset(hdrs, 0, hdrs_size);
-
- struct TempPerPacketData {
- iovec iov;
- sockaddr_storage raw_peer_address;
- };
- TempPerPacketData* packet_data_array = static_cast<TempPerPacketData*>(
- alloca(sizeof(TempPerPacketData) * results->size()));
-
- for (size_t i = 0; i < results->size(); ++i) {
- (*results)[i].ok = false;
-
- msghdr* hdr = &hdrs[i].msg_hdr;
- TempPerPacketData* packet_data = &packet_data_array[i];
- packet_data->iov.iov_base = (*results)[i].packet_buffer.buffer;
- packet_data->iov.iov_len = (*results)[i].packet_buffer.buffer_len;
-
- hdr->msg_name = &packet_data->raw_peer_address;
- hdr->msg_namelen = sizeof(sockaddr_storage);
- hdr->msg_iov = &packet_data->iov;
- hdr->msg_iovlen = 1;
- hdr->msg_flags = 0;
- hdr->msg_control = (*results)[i].control_buffer.buffer;
- hdr->msg_controllen = (*results)[i].control_buffer.buffer_len;
-
- QUICHE_DCHECK_GE(hdr->msg_controllen, kMinCmsgSpaceForRead);
- }
- // If MSG_TRUNC is set on Linux, recvmmsg will return the real packet size in
- // |hdrs[i].msg_len| even if packet buffer is too small to receive it.
- int packets_read = recvmmsg(fd, hdrs, results->size(), MSG_TRUNC, nullptr);
- if (packets_read <= 0) {
- const int error_num = errno;
- if (error_num != EAGAIN) {
- QUIC_LOG_FIRST_N(ERROR, 100)
- << "Error reading packets: " << strerror(error_num);
+ if (packet_info_interested.IsSet(QuicUdpPacketInfoBit::IS_GRO)) {
+ size_t num_packets = 0;
+ for (ReadPacketResult& result : *results) {
+ result.ok = false;
}
- return 0;
- }
-
- for (int i = 0; i < packets_read; ++i) {
- if (hdrs[i].msg_len == 0) {
- continue;
+ for (ReadPacketResult& result : *results) {
+ ReadPacket(fd, packet_info_interested, &result);
+ if (!result.ok) {
+ break;
+ }
+ ++num_packets;
}
-
- msghdr& hdr = hdrs[i].msg_hdr;
- if (ABSL_PREDICT_FALSE(hdr.msg_flags & MSG_CTRUNC)) {
- QUIC_BUG(quic_bug_10751_4) << "Control buffer too small. size:"
- << (*results)[i].control_buffer.buffer_len
- << ", need:" << hdr.msg_controllen;
- continue;
+ return num_packets;
+ } else {
+ // Use recvmmsg.
+ size_t hdrs_size = sizeof(mmsghdr) * results->size();
+ mmsghdr* hdrs = static_cast<mmsghdr*>(alloca(hdrs_size));
+ memset(hdrs, 0, hdrs_size);
+
+ struct TempPerPacketData {
+ iovec iov;
+ sockaddr_storage raw_peer_address;
+ };
+ TempPerPacketData* packet_data_array = static_cast<TempPerPacketData*>(
+ alloca(sizeof(TempPerPacketData) * results->size()));
+
+ for (size_t i = 0; i < results->size(); ++i) {
+ (*results)[i].ok = false;
+
+ msghdr* hdr = &hdrs[i].msg_hdr;
+ TempPerPacketData* packet_data = &packet_data_array[i];
+ packet_data->iov.iov_base = (*results)[i].packet_buffer.buffer;
+ packet_data->iov.iov_len = (*results)[i].packet_buffer.buffer_len;
+
+ hdr->msg_name = &packet_data->raw_peer_address;
+ hdr->msg_namelen = sizeof(sockaddr_storage);
+ hdr->msg_iov = &packet_data->iov;
+ hdr->msg_iovlen = 1;
+ hdr->msg_flags = 0;
+ hdr->msg_control = (*results)[i].control_buffer.buffer;
+ hdr->msg_controllen = (*results)[i].control_buffer.buffer_len;
+
+ QUICHE_DCHECK_GE(hdr->msg_controllen, kMinCmsgSpaceForRead);
}
-
- if (ABSL_PREDICT_FALSE(hdr.msg_flags & MSG_TRUNC)) {
- QUIC_LOG_FIRST_N(WARNING, 100)
- << "Received truncated QUIC packet: buffer size:"
- << (*results)[i].packet_buffer.buffer_len
- << " packet size:" << hdrs[i].msg_len;
- continue;
+ // If MSG_TRUNC is set on Linux, recvmmsg will return the real packet size
+ // in |hdrs[i].msg_len| even if packet buffer is too small to receive it.
+ int packets_read = recvmmsg(fd, hdrs, results->size(), MSG_TRUNC, nullptr);
+ if (packets_read <= 0) {
+ const int error_num = errno;
+ if (error_num != EAGAIN) {
+ QUIC_LOG_FIRST_N(ERROR, 100)
+ << "Error reading packets: " << strerror(error_num);
+ }
+ return 0;
}
- (*results)[i].ok = true;
- (*results)[i].packet_buffer.buffer_len = hdrs[i].msg_len;
+ for (int i = 0; i < packets_read; ++i) {
+ if (hdrs[i].msg_len == 0) {
+ continue;
+ }
- QuicUdpPacketInfo* packet_info = &(*results)[i].packet_info;
- if (packet_info_interested.IsSet(QuicUdpPacketInfoBit::PEER_ADDRESS)) {
- packet_info->SetPeerAddress(
- QuicSocketAddress(packet_data_array[i].raw_peer_address));
- }
+ msghdr& hdr = hdrs[i].msg_hdr;
+ if (ABSL_PREDICT_FALSE(hdr.msg_flags & MSG_CTRUNC)) {
+ QUIC_BUG(quic_bug_10751_4) << "Control buffer too small. size:"
+ << (*results)[i].control_buffer.buffer_len
+ << ", need:" << hdr.msg_controllen;
+ continue;
+ }
+
+ if (ABSL_PREDICT_FALSE(hdr.msg_flags & MSG_TRUNC)) {
+ QUIC_LOG_FIRST_N(WARNING, 100)
+ << "Received truncated QUIC packet: buffer size:"
+ << (*results)[i].packet_buffer.buffer_len
+ << " packet size:" << hdrs[i].msg_len;
+ continue;
+ }
+
+ (*results)[i].ok = true;
+ (*results)[i].packet_buffer.buffer_len = hdrs[i].msg_len;
+
+ QuicUdpPacketInfo* packet_info = &(*results)[i].packet_info;
+ if (packet_info_interested.IsSet(QuicUdpPacketInfoBit::PEER_ADDRESS)) {
+ packet_info->SetPeerAddress(
+ QuicSocketAddress(packet_data_array[i].raw_peer_address));
+ }
- if (hdr.msg_controllen > 0) {
- for (struct cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr); cmsg != nullptr;
- cmsg = CMSG_NXTHDR(&hdr, cmsg)) {
- PopulatePacketInfoFromControlMessage(cmsg, packet_info,
- packet_info_interested);
+ if (hdr.msg_controllen > 0) {
+ for (struct cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr); cmsg != nullptr;
+ cmsg = CMSG_NXTHDR(&hdr, cmsg)) {
+ PopulatePacketInfoFromControlMessage(cmsg, packet_info,
+ packet_info_interested);
+ }
}
}
+ return packets_read;
}
- return packets_read;
#else
size_t num_packets = 0;
for (ReadPacketResult& result : *results) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc
index 046f83dc236..9a741d01929 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.cc
@@ -18,6 +18,7 @@
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_versions.h"
#include "quiche/quic/platform/api/quic_bug_tracker.h"
+#include "quiche/common/platform/api/quiche_logging.h"
namespace quic {
@@ -61,6 +62,7 @@ TlsChloExtractor& TlsChloExtractor::operator=(TlsChloExtractor&& other) {
other.parsed_crypto_frame_in_this_packet_;
alpns_ = std::move(other.alpns_);
server_name_ = std::move(other.server_name_);
+ client_hello_bytes_ = std::move(other.client_hello_bytes_);
return *this;
}
@@ -267,6 +269,9 @@ void TlsChloExtractor::SendAlert(uint8_t tls_alert_value) {
HandleUnrecoverableError(absl::StrCat(
"BoringSSL attempted to send alert ", static_cast<int>(tls_alert_value),
" ", SSL_alert_desc_string_long(tls_alert_value)));
+ if (state_ == State::kUnrecoverableFailure) {
+ tls_alert_ = tls_alert_value;
+ }
}
// static
@@ -289,6 +294,11 @@ void TlsChloExtractor::HandleParsedChlo(const SSL_CLIENT_HELLO* client_hello) {
HasExtension(client_hello, TLSEXT_TYPE_pre_shared_key);
early_data_attempted_ = HasExtension(client_hello, TLSEXT_TYPE_early_data);
+ QUICHE_DCHECK(client_hello_bytes_.empty());
+ client_hello_bytes_.assign(
+ client_hello->client_hello,
+ client_hello->client_hello + client_hello->client_hello_len);
+
const uint8_t* alpn_data;
size_t alpn_len;
int rv = SSL_early_callback_ctx_extension_get(
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.h b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.h
index b2cf50c95c0..b48065f9e1d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor.h
@@ -9,6 +9,7 @@
#include <string>
#include <vector>
+#include "absl/types/span.h"
#include "openssl/ssl.h"
#include "quiche/quic/core/frames/quic_ack_frequency_frame.h"
#include "quiche/quic/core/quic_framer.h"
@@ -48,6 +49,9 @@ class QUIC_NO_EXPORT TlsChloExtractor
std::string server_name() const { return server_name_; }
bool resumption_attempted() const { return resumption_attempted_; }
bool early_data_attempted() const { return early_data_attempted_; }
+ absl::Span<const uint8_t> client_hello_bytes() const {
+ return client_hello_bytes_;
+ }
// Converts |state| to a human-readable string suitable for logging.
static std::string StateToString(State state);
@@ -62,6 +66,13 @@ class QUIC_NO_EXPORT TlsChloExtractor
state_ == State::kParsedFullMultiPacketChlo;
}
+ // Returns the TLS alert that caused the unrecoverable error, if any.
+ absl::optional<uint8_t> tls_alert() const {
+ QUICHE_DCHECK(!tls_alert_.has_value() ||
+ state_ == State::kUnrecoverableFailure);
+ return tls_alert_;
+ }
+
// Methods from QuicFramerVisitorInterface.
void OnError(QuicFramer* /*framer*/) override {}
bool OnProtocolVersionMismatch(ParsedQuicVersion version) override;
@@ -249,6 +260,11 @@ class QUIC_NO_EXPORT TlsChloExtractor
// Whether early data is attempted from the CHLO, indicated by the
// 'early_data' TLS extension.
bool early_data_attempted_ = false;
+ // If set, contains the TLS alert that caused an unrecoverable error, which is
+ // an AlertDescription value defined in go/rfc/8446#appendix-B.2.
+ absl::optional<uint8_t> tls_alert_;
+ // Exact TLS message bytes.
+ std::vector<uint8_t> client_hello_bytes_;
};
// Convenience method to facilitate logging TlsChloExtractor::State.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor_test.cc
index 375dd33332b..44a1e634856 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_chlo_extractor_test.cc
@@ -9,7 +9,6 @@
#include "openssl/ssl.h"
#include "quiche/quic/core/http/quic_spdy_client_session.h"
#include "quiche/quic/core/quic_connection.h"
-#include "quiche/quic/core/quic_packet_writer_wrapper.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_versions.h"
#include "quiche/quic/platform/api/quic_test.h"
@@ -29,11 +28,19 @@ class TlsChloExtractorTest : public QuicTestWithParam<ParsedQuicVersion> {
protected:
TlsChloExtractorTest() : version_(GetParam()), server_id_(TestServerId()) {}
- void Initialize() { packets_ = GetFirstFlightOfPackets(version_, config_); }
+ void Initialize() {
+ AnnotatedPackets packets =
+ GetAnnotatedFirstFlightOfPackets(version_, config_);
+ packets_ = std::move(packets.packets);
+ crypto_stream_size_ = packets.crypto_stream_size;
+ }
+
void Initialize(std::unique_ptr<QuicCryptoClientConfig> crypto_config) {
- packets_ = GetFirstFlightOfPackets(version_, config_, TestConnectionId(),
- EmptyQuicConnectionId(),
- std::move(crypto_config));
+ AnnotatedPackets packets = GetAnnotatedFirstFlightOfPackets(
+ version_, config_, TestConnectionId(), EmptyQuicConnectionId(),
+ std::move(crypto_config));
+ packets_ = std::move(packets.packets);
+ crypto_stream_size_ = packets.crypto_stream_size;
}
// Perform a full handshake in order to insert a SSL_SESSION into
@@ -76,13 +83,13 @@ class TlsChloExtractorTest : public QuicTestWithParam<ParsedQuicVersion> {
SettingsFrame server_settings;
server_settings.values[SETTINGS_QPACK_MAX_TABLE_CAPACITY] =
kDefaultQpackMaxDynamicTableCapacity;
- std::unique_ptr<char[]> buffer;
- uint64_t length =
- HttpEncoder::SerializeSettingsFrame(server_settings, &buffer);
+ std::string settings_frame =
+ HttpEncoder::SerializeSettingsFrame(server_settings);
client_session.GetMutableCryptoStream()
->SetServerApplicationStateForResumption(
- std::make_unique<ApplicationState>(buffer.get(),
- buffer.get() + length));
+ std::make_unique<ApplicationState>(
+ settings_frame.data(),
+ settings_frame.data() + settings_frame.length()));
}
void IngestPackets() {
@@ -105,12 +112,28 @@ class TlsChloExtractorTest : public QuicTestWithParam<ParsedQuicVersion> {
packets_.clear();
}
- void ValidateChloDetails() {
- EXPECT_TRUE(tls_chlo_extractor_.HasParsedFullChlo());
- std::vector<std::string> alpns = tls_chlo_extractor_.alpns();
+ void ValidateChloDetails(const TlsChloExtractor* extractor = nullptr) const {
+ if (extractor == nullptr) {
+ extractor = &tls_chlo_extractor_;
+ }
+
+ EXPECT_TRUE(extractor->HasParsedFullChlo());
+ std::vector<std::string> alpns = extractor->alpns();
ASSERT_EQ(alpns.size(), 1u);
EXPECT_EQ(alpns[0], AlpnForVersion(version_));
- EXPECT_EQ(tls_chlo_extractor_.server_name(), TestHostname());
+ EXPECT_EQ(extractor->server_name(), TestHostname());
+ // Crypto stream has one frame in the following format:
+ // CRYPTO Frame {
+ // Type (i) = 0x06,
+ // Offset (i),
+ // Length (i),
+ // Crypto Data (..),
+ // }
+ //
+ // Type is 1 byte long, Offset is zero and also 1 byte long, and
+ // all generated ClientHello messages have 2 byte length. So
+ // the header is 4 bytes total.
+ EXPECT_EQ(extractor->client_hello_bytes().size(), crypto_stream_size_ - 4);
}
void IncreaseSizeOfChlo() {
@@ -127,6 +150,7 @@ class TlsChloExtractorTest : public QuicTestWithParam<ParsedQuicVersion> {
TlsChloExtractor tls_chlo_extractor_;
QuicConfig config_;
std::vector<std::unique_ptr<QuicReceivedPacket>> packets_;
+ uint64_t crypto_stream_size_;
};
INSTANTIATE_TEST_SUITE_P(TlsChloExtractorTests, TlsChloExtractorTest,
@@ -211,6 +235,21 @@ TEST_P(TlsChloExtractorTest, MoveAssignment) {
TlsChloExtractor::State::kParsedFullSinglePacketChlo);
}
+TEST_P(TlsChloExtractorTest, MoveAssignmentAfterExtraction) {
+ Initialize();
+ EXPECT_EQ(packets_.size(), 1u);
+ IngestPackets();
+ ValidateChloDetails();
+ EXPECT_EQ(tls_chlo_extractor_.state(),
+ TlsChloExtractor::State::kParsedFullSinglePacketChlo);
+
+ TlsChloExtractor other_extractor = std::move(tls_chlo_extractor_);
+
+ EXPECT_EQ(other_extractor.state(),
+ TlsChloExtractor::State::kParsedFullSinglePacketChlo);
+ ValidateChloDetails(&other_extractor);
+}
+
TEST_P(TlsChloExtractorTest, MoveAssignmentBetweenPackets) {
IncreaseSizeOfChlo();
Initialize();
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc
index 36edcacc28d..4d05af8ffa8 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_client_handshaker.cc
@@ -75,13 +75,9 @@ bool TlsClientHandshaker::CryptoConnect() {
// TODO(b/193650832) Add SetFromConfig to QUIC handshakers and remove reliance
// on session pointer.
- const bool permutes_tls_extensions = session()->permutes_tls_extensions();
- if (!permutes_tls_extensions) {
- QUIC_DLOG(INFO) << "Disabling TLS extension permutation";
- }
#if BORINGSSL_API_VERSION >= 16
// Ask BoringSSL to randomize the order of TLS extensions.
- SSL_set_permute_extensions(ssl(), permutes_tls_extensions);
+ SSL_set_permute_extensions(ssl(), true);
#endif // BORINGSSL_API_VERSION
// Set the SNI to send, if any.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc
index 0449c6779ae..087602e24d0 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_handshaker.cc
@@ -101,10 +101,7 @@ void TlsHandshaker::AdvanceHandshake() {
QUIC_VLOG(1) << ENDPOINT << "Continuing handshake";
int rv = SSL_do_handshake(ssl());
- if (GetQuicReloadableFlag(quic_tls_handshaker_check_connection_closed) &&
- is_connection_closed()) {
- QUIC_RELOADABLE_FLAG_COUNT_N(quic_tls_handshaker_check_connection_closed, 1,
- 2);
+ if (is_connection_closed()) {
return;
}
@@ -117,10 +114,7 @@ void TlsHandshaker::AdvanceHandshake() {
OnEnterEarlyData();
rv = SSL_do_handshake(ssl());
- if (GetQuicReloadableFlag(quic_tls_handshaker_check_connection_closed) &&
- is_connection_closed()) {
- QUIC_RELOADABLE_FLAG_COUNT_N(quic_tls_handshaker_check_connection_closed,
- 2, 2);
+ if (is_connection_closed()) {
return;
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc
index c9781ccb583..239de233f73 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.cc
@@ -891,8 +891,6 @@ ssl_select_cert_result_t TlsServerHandshaker::EarlySelectCertCallback(
size_t ssl_capabilities_len = 0;
absl::string_view ssl_capabilities_view;
- absl::optional<std::string> alps;
-
if (CryptoUtils::GetSSLCapabilities(ssl(), &ssl_capabilities,
&ssl_capabilities_len)) {
ssl_capabilities_view =
@@ -906,10 +904,6 @@ ssl_select_cert_result_t TlsServerHandshaker::EarlySelectCertCallback(
if (!alps_result.success) {
return ssl_select_cert_error;
}
- alps =
- alps_result.alps_length > 0
- ? std::string(alps_result.alps_buffer.get(), alps_result.alps_length)
- : std::string();
if (!session()->connection()->connected()) {
select_cert_status_ = QUIC_FAILURE;
@@ -924,7 +918,7 @@ ssl_select_cert_result_t TlsServerHandshaker::EarlySelectCertCallback(
absl::string_view(
reinterpret_cast<const char*>(client_hello->client_hello),
client_hello->client_hello_len),
- AlpnForVersion(session()->version()), std::move(alps),
+ AlpnForVersion(session()->version()), std::move(alps_result.alps_buffer),
set_transport_params_result.quic_transport_params,
set_transport_params_result.early_data_context,
tls_connection_.ssl_config());
@@ -1092,7 +1086,6 @@ int TlsServerHandshaker::SelectAlpn(const uint8_t** out, uint8_t* out_len,
TlsServerHandshaker::SetApplicationSettingsResult
TlsServerHandshaker::SetApplicationSettings(absl::string_view alpn) {
TlsServerHandshaker::SetApplicationSettingsResult result;
- const uint8_t* alps_data = nullptr;
const std::string& hostname = crypto_negotiated_params_->sni;
std::string accept_ch_value = GetAcceptChValueForHostname(hostname);
@@ -1106,14 +1099,13 @@ TlsServerHandshaker::SetApplicationSettings(absl::string_view alpn) {
if (!accept_ch_value.empty()) {
AcceptChFrame frame{{{std::move(origin), std::move(accept_ch_value)}}};
- result.alps_length =
- HttpEncoder::SerializeAcceptChFrame(frame, &result.alps_buffer);
- alps_data = reinterpret_cast<const uint8_t*>(result.alps_buffer.get());
+ result.alps_buffer = HttpEncoder::SerializeAcceptChFrame(frame);
}
+ const std::string& alps = result.alps_buffer;
if (SSL_add_application_settings(
ssl(), reinterpret_cast<const uint8_t*>(alpn.data()), alpn.size(),
- alps_data, result.alps_length) != 1) {
+ reinterpret_cast<const uint8_t*>(alps.data()), alps.size()) != 1) {
QUIC_DLOG(ERROR) << "Failed to enable ALPS";
result.success = false;
} else {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.h b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.h
index 05b63ae9663..bae7741bca7 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/tls_server_handshaker.h
@@ -304,8 +304,9 @@ class QUIC_EXPORT_PRIVATE TlsServerHandshaker
struct QUIC_NO_EXPORT SetApplicationSettingsResult {
bool success = false;
- std::unique_ptr<char[]> alps_buffer;
- size_t alps_length = 0;
+ // TODO(b/239676439): Change type to absl::optional<std::string> and make
+ // sure SetApplicationSettings() returns nullopt if no ALPS data.
+ std::string alps_buffer;
};
SetApplicationSettingsResult SetApplicationSettings(absl::string_view alpn);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/web_transport_interface.h b/chromium/net/third_party/quiche/src/quiche/quic/core/web_transport_interface.h
index ea8747d25db..bfccf7ded88 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/core/web_transport_interface.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/web_transport_interface.h
@@ -17,7 +17,7 @@
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/platform/api/quic_export.h"
#include "quiche/common/platform/api/quiche_mem_slice.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -94,7 +94,7 @@ class QUIC_EXPORT_PRIVATE WebTransportVisitor {
// Notifies the visitor when the session is ready to exchange application
// data.
- virtual void OnSessionReady(const spdy::SpdyHeaderBlock& headers) = 0;
+ virtual void OnSessionReady(const spdy::Http2HeaderBlock& headers) = 0;
// Notifies the visitor when the session has been closed.
virtual void OnSessionClosed(WebTransportSessionError error_code,
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config.cc b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config.cc
index 56669e0e596..46a0f688a29 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config.cc
@@ -62,7 +62,8 @@ void TakePlaintextFromLeft(uint8_t *to, uint8_t *from, uint8_t plaintext_len,
if (plaintext_len % 2) {
to[half] = from[half] & 0xf0;
}
- to[kLoadBalancerBlockSize - 1] = index;
+ to[kLoadBalancerBlockSize - 1] = plaintext_len + 1;
+ to[kLoadBalancerBlockSize - 2] = index;
}
void TakePlaintextFromRight(uint8_t *to, uint8_t *from, uint8_t plaintext_len,
@@ -75,7 +76,8 @@ void TakePlaintextFromRight(uint8_t *to, uint8_t *from, uint8_t plaintext_len,
if (plaintext_len % 2) {
to[write_point - 1] = from[read_point - 1] & 0x0f;
}
- to[0] = index;
+ to[0] = plaintext_len + 1;
+ to[1] = index;
}
// CiphertextXorWith{Left,Right}() takes the relevant end of the ciphertext in
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config_test.cc
index f59a3beb745..c93f1e49cfc 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_config_test.cc
@@ -85,7 +85,7 @@ TEST_F(LoadBalancerConfigTest, ValidParams) {
}
// Compare EncryptionPass() results to the example in
-// draft-ietf-quic-load-balancers-12, Section 5.3.2.
+// draft-ietf-quic-load-balancers-14, Section 4.3.2.
TEST_F(LoadBalancerConfigTest, TestEncryptionPassExample) {
auto config =
LoadBalancerConfig::Create(0, 3, 4, absl::string_view(raw_key, 16));
@@ -98,16 +98,16 @@ TEST_F(LoadBalancerConfigTest, TestEncryptionPassExample) {
EXPECT_FALSE(config->EncryptionPass(absl::Span<uint8_t>(bytes.data(), 6), 0));
EXPECT_TRUE(config->EncryptionPass(absl::Span<uint8_t>(bytes), 1));
EXPECT_TRUE((bytes == std::array<uint8_t, 7>(
- {0x31, 0x44, 0x1a, 0x9d, 0xbc, 0x04, 0x26})));
+ {0x31, 0x44, 0x1a, 0x92, 0x52, 0xaa, 0xef})));
EXPECT_TRUE(config->EncryptionPass(absl::Span<uint8_t>(bytes), 2));
EXPECT_TRUE((bytes == std::array<uint8_t, 7>(
- {0x4f, 0xdd, 0x0c, 0x9d, 0xbc, 0x04, 0x26})));
+ {0xe6, 0xa1, 0x3a, 0xb2, 0x52, 0xaa, 0xef})));
EXPECT_TRUE(config->EncryptionPass(absl::Span<uint8_t>(bytes), 3));
EXPECT_TRUE((bytes == std::array<uint8_t, 7>(
- {0x4f, 0xdd, 0x0c, 0x9b, 0xba, 0x1e, 0xe0})));
+ {0xe6, 0xa1, 0x3a, 0xbc, 0xe1, 0xe0, 0xd2})));
EXPECT_TRUE(config->EncryptionPass(absl::Span<uint8_t>(bytes), 4));
EXPECT_TRUE((bytes == std::array<uint8_t, 7>(
- {0xe2, 0x3c, 0xb4, 0x2b, 0xba, 0x1e, 0xe0})));
+ {0x32, 0xc3, 0x63, 0xfc, 0xe1, 0xe0, 0xd2})));
}
TEST_F(LoadBalancerConfigTest, EncryptionPassPlaintext) {
@@ -133,7 +133,7 @@ TEST_F(LoadBalancerConfigTest, InvalidBlockEncryption) {
}
// Block decrypt test from the Test Vector in
-// draft-ietf-quic-load-balancers-12, Appendix B.
+// draft-ietf-quic-load-balancers-14, Appendix B.
TEST_F(LoadBalancerConfigTest, BlockEncryptionExample) {
const uint8_t ptext[] = {0xed, 0x79, 0x3a, 0x51, 0xd4, 0x9b, 0x8f, 0x5f,
0xee, 0x08, 0x0d, 0xbf, 0x48, 0xc0, 0xd1, 0xe5};
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_decoder_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_decoder_test.cc
index e38fc0cda40..ee1feac89f8 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_decoder_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_decoder_test.cc
@@ -57,7 +57,7 @@ TEST_F(LoadBalancerDecoderTest, UnencryptedConnectionIdTestVectors) {
}
}
-// Compare test vectors from Appendix B of draft-ietf-quic-load-balancers-12.
+// Compare test vectors from Appendix B of draft-ietf-quic-load-balancers-14.
TEST_F(LoadBalancerDecoderTest, DecoderTestVectors) {
// Try (1) the "standard" CID length of 8
// (2) server_id_len > nonce_len, so there is a fourth decryption pass
@@ -66,13 +66,13 @@ TEST_F(LoadBalancerDecoderTest, DecoderTestVectors) {
const struct LoadBalancerDecoderTestCase test_vectors[4] = {
{
*LoadBalancerConfig::Create(0, 3, 4, kKey),
- QuicConnectionId({0x07, 0xfb, 0xfe, 0x05, 0xf7, 0x31, 0xb4, 0x25}),
+ QuicConnectionId({0x07, 0x27, 0xed, 0xaa, 0x37, 0xe7, 0xfa, 0xc8}),
MakeServerId(kServerId, 3),
},
{
*LoadBalancerConfig::Create(1, 10, 5, kKey),
- QuicConnectionId({0x4f, 0x01, 0x09, 0x56, 0xfb, 0x5c, 0x1d, 0x4d,
- 0x86, 0xe0, 0x10, 0x18, 0x3e, 0x0b, 0x7d, 0x1e}),
+ QuicConnectionId({0x4f, 0x22, 0x61, 0x4a, 0x97, 0xce, 0xee, 0x84,
+ 0x34, 0x1e, 0xd7, 0xfb, 0xfe, 0xb1, 0xe6, 0xe2}),
MakeServerId(kServerId, 10),
},
{
@@ -84,9 +84,9 @@ TEST_F(LoadBalancerDecoderTest, DecoderTestVectors) {
},
{
*LoadBalancerConfig::Create(0, 9, 9, kKey),
- QuicConnectionId({0x12, 0x7a, 0x28, 0x5a, 0x09, 0xf8, 0x52, 0x80,
- 0xf4, 0xfd, 0x6a, 0xbb, 0x43, 0x4a, 0x71, 0x59,
- 0xe4, 0xd3, 0xeb}),
+ QuicConnectionId({0x12, 0x5e, 0x3b, 0x00, 0xaa, 0x5f, 0xcf, 0xd1,
+ 0xa9, 0xa5, 0x81, 0x02, 0xa8, 0x9a, 0x19, 0xa1,
+ 0xe4, 0xa1, 0x0e}),
MakeServerId(kServerId, 9),
},
};
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_encoder_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_encoder_test.cc
index c267a2d4a6c..f1df860e053 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_encoder_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_encoder_test.cc
@@ -157,22 +157,22 @@ TEST_F(LoadBalancerEncoderTest, FailToUpdateConfigWithSameId) {
struct LoadBalancerEncoderTestCase {
LoadBalancerConfig config;
- LoadBalancerServerId server_id;
QuicConnectionId connection_id;
+ LoadBalancerServerId server_id;
};
TEST_F(LoadBalancerEncoderTest, UnencryptedConnectionIdTestVectors) {
const struct LoadBalancerEncoderTestCase test_vectors[2] = {
{
*LoadBalancerConfig::CreateUnencrypted(0, 3, 4),
- MakeServerId(kServerId, 3),
QuicConnectionId({0x07, 0xed, 0x79, 0x3a, 0x80, 0x49, 0x71, 0x8a}),
+ MakeServerId(kServerId, 3),
},
{
*LoadBalancerConfig::CreateUnencrypted(1, 8, 5),
- MakeServerId(kServerId, 8),
QuicConnectionId({0x4d, 0xed, 0x79, 0x3a, 0x51, 0xd4, 0x9b, 0x8f,
0x5f, 0xee, 0x15, 0xda, 0x27, 0xc4}),
+ MakeServerId(kServerId, 8),
},
};
for (const auto &test : test_vectors) {
@@ -185,7 +185,7 @@ TEST_F(LoadBalancerEncoderTest, UnencryptedConnectionIdTestVectors) {
}
}
-// Follow example in draft-ietf-quic-load-balancers-12.
+// Follow example in draft-ietf-quic-load-balancers-14.
TEST_F(LoadBalancerEncoderTest, FollowSpecExample) {
const uint8_t config_id = 0, server_id_len = 3, nonce_len = 4;
const uint8_t raw_server_id[] = {
@@ -206,14 +206,14 @@ TEST_F(LoadBalancerEncoderTest, FollowSpecExample) {
EXPECT_TRUE(encoder->UpdateConfig(
*config, *LoadBalancerServerId::Create(raw_server_id)));
EXPECT_TRUE(encoder->IsEncoding());
- const char raw_connection_id[] = {0x07, 0xe2, 0x3c, 0xb4,
- 0x2b, 0xba, 0x1e, 0xe0};
+ const char raw_connection_id[] = {0x07, 0x32, 0xc3, 0x63,
+ 0xfc, 0xe1, 0xe0, 0xd2};
auto expected =
QuicConnectionId(raw_connection_id, 1 + server_id_len + nonce_len);
EXPECT_EQ(encoder->GenerateConnectionId(), expected);
}
-// Compare test vectors from Appendix B of draft-ietf-quic-load-balancers-12.
+// Compare test vectors from Appendix B of draft-ietf-quic-load-balancers-14.
TEST_F(LoadBalancerEncoderTest, EncoderTestVectors) {
// Try (1) the "standard" ConnectionId length of 8
// (2) server_id_len > nonce_len, so there is a fourth decryption pass
@@ -222,28 +222,28 @@ TEST_F(LoadBalancerEncoderTest, EncoderTestVectors) {
const LoadBalancerEncoderTestCase test_vectors[4] = {
{
*LoadBalancerConfig::Create(0, 3, 4, kKey),
+ QuicConnectionId({0x07, 0x27, 0xed, 0xaa, 0x37, 0xe7, 0xfa, 0xc8}),
MakeServerId(kServerId, 3),
- QuicConnectionId({0x07, 0xfb, 0xfe, 0x05, 0xf7, 0x31, 0xb4, 0x25}),
},
{
*LoadBalancerConfig::Create(1, 10, 5, kKey),
+ QuicConnectionId({0x4f, 0x22, 0x61, 0x4a, 0x97, 0xce, 0xee, 0x84,
+ 0x34, 0x1e, 0xd7, 0xfb, 0xfe, 0xb1, 0xe6, 0xe2}),
MakeServerId(kServerId, 10),
- QuicConnectionId({0x4f, 0x01, 0x09, 0x56, 0xfb, 0x5c, 0x1d, 0x4d,
- 0x86, 0xe0, 0x10, 0x18, 0x3e, 0x0b, 0x7d, 0x1e}),
},
{
*LoadBalancerConfig::Create(2, 8, 8, kKey),
- MakeServerId(kServerId, 8),
QuicConnectionId({0x90, 0x4d, 0xd2, 0xd0, 0x5a, 0x7b, 0x0d, 0xe9,
0xb2, 0xb9, 0x90, 0x7a, 0xfb, 0x5e, 0xcf, 0x8c,
0xc3}),
+ MakeServerId(kServerId, 8),
},
{
*LoadBalancerConfig::Create(0, 9, 9, kKey),
+ QuicConnectionId({0x12, 0x5e, 0x3b, 0x00, 0xaa, 0x5f, 0xcf, 0xd1,
+ 0xa9, 0xa5, 0x81, 0x02, 0xa8, 0x9a, 0x19, 0xa1,
+ 0xe4, 0xa1, 0x0e}),
MakeServerId(kServerId, 9),
- QuicConnectionId({0x12, 0x7a, 0x28, 0x5a, 0x09, 0xf8, 0x52, 0x80,
- 0xf4, 0xfd, 0x6a, 0xbb, 0x43, 0x4a, 0x71, 0x59,
- 0xe4, 0xd3, 0xeb}),
},
};
for (const auto &test : test_vectors) {
@@ -268,7 +268,7 @@ TEST_F(LoadBalancerEncoderTest, RunOutOfNonces) {
LoadBalancerEncoderPeer::SetNumNoncesLeft(*encoder, 2);
EXPECT_EQ(encoder->num_nonces_left(), 2);
EXPECT_EQ(encoder->GenerateConnectionId(),
- QuicConnectionId({0x07, 0xba, 0x7f, 0x38, 0x2f, 0x5c, 0x22, 0x1d}));
+ QuicConnectionId({0x07, 0xf4, 0xeb, 0x21, 0xfb, 0x22, 0xa8, 0x40}));
EXPECT_EQ(encoder->num_nonces_left(), 1);
encoder->GenerateConnectionId();
EXPECT_EQ(encoder->IsEncoding(), false);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_server_id.h b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_server_id.h
index a3398a9220d..18fc40e3984 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_server_id.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/load_balancer/load_balancer_server_id.h
@@ -17,7 +17,7 @@ inline constexpr uint8_t kLoadBalancerMaxServerIdLen = 15;
// LoadBalancerServerId is the globally understood identifier for a given pool
// member. It is unique to any given QUIC-LB configuration. See
-// draft-ietf-quic-load-balancers-12.
+// draft-ietf-quic-load-balancers.
// Note: this has nothing to do with QuicServerID. It's an unfortunate collision
// between an internal term for the destination identifiers for a particular
// deployment (QuicServerID) and the object of a load balancing decision
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.cc b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.cc
index 28ba839f758..03d2cfb42ed 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_session.cc
@@ -19,6 +19,7 @@
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/tools/quic_url.h"
#include "quiche/common/platform/api/quiche_url_utils.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_tools.cc b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_tools.cc
index 92fd9d7286c..2c21a7739f2 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_tools.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_client_tools.cc
@@ -9,6 +9,7 @@
#include "quiche/quic/platform/api/quic_default_proof_providers.h"
#include "quiche/quic/tools/fake_proof_verifier.h"
#include "quiche/quic/tools/quic_url.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
namespace tools {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.cc b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.cc
index d0440a6cd14..32776eec197 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.cc
@@ -11,7 +11,7 @@ namespace quic {
MasqueDispatcher::MasqueDispatcher(
MasqueMode masque_mode, const QuicConfig* config,
const QuicCryptoServerConfig* crypto_config,
- QuicVersionManager* version_manager, QuicEpollServer* epoll_server,
+ QuicVersionManager* version_manager, QuicEventLoop* event_loop,
std::unique_ptr<QuicConnectionHelperInterface> helper,
std::unique_ptr<QuicCryptoServerStreamBase::Helper> session_helper,
std::unique_ptr<QuicAlarmFactory> alarm_factory,
@@ -22,7 +22,7 @@ MasqueDispatcher::MasqueDispatcher(
std::move(alarm_factory), masque_server_backend,
expected_server_connection_id_length),
masque_mode_(masque_mode),
- epoll_server_(epoll_server),
+ event_loop_(event_loop),
masque_server_backend_(masque_server_backend) {}
std::unique_ptr<QuicSession> MasqueDispatcher::CreateQuicSession(
@@ -39,8 +39,8 @@ std::unique_ptr<QuicSession> MasqueDispatcher::CreateQuicSession(
auto session = std::make_unique<MasqueServerSession>(
masque_mode_, config(), GetSupportedVersions(), connection, this,
- epoll_server_, session_helper(), crypto_config(),
- compressed_certs_cache(), masque_server_backend_);
+ event_loop_, session_helper(), crypto_config(), compressed_certs_cache(),
+ masque_server_backend_);
session->Initialize();
return session;
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.h b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.h
index b5ef5bb22ed..804d2e9421d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_dispatcher.h
@@ -6,10 +6,10 @@
#define QUICHE_QUIC_MASQUE_MASQUE_DISPATCHER_H_
#include "absl/container/flat_hash_map.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
#include "quiche/quic/masque/masque_server_backend.h"
#include "quiche/quic/masque/masque_server_session.h"
#include "quiche/quic/masque/masque_utils.h"
-#include "quiche/quic/platform/api/quic_epoll.h"
#include "quiche/quic/platform/api/quic_export.h"
#include "quiche/quic/tools/quic_simple_dispatcher.h"
@@ -22,7 +22,7 @@ class QUIC_NO_EXPORT MasqueDispatcher : public QuicSimpleDispatcher {
explicit MasqueDispatcher(
MasqueMode masque_mode, const QuicConfig* config,
const QuicCryptoServerConfig* crypto_config,
- QuicVersionManager* version_manager, QuicEpollServer* epoll_server,
+ QuicVersionManager* version_manager, QuicEventLoop* event_loop,
std::unique_ptr<QuicConnectionHelperInterface> helper,
std::unique_ptr<QuicCryptoServerStreamBase::Helper> session_helper,
std::unique_ptr<QuicAlarmFactory> alarm_factory,
@@ -42,7 +42,7 @@ class QUIC_NO_EXPORT MasqueDispatcher : public QuicSimpleDispatcher {
private:
MasqueMode masque_mode_;
- QuicEpollServer* epoll_server_; // Unowned.
+ QuicEventLoop* event_loop_; // Unowned.
MasqueServerBackend* masque_server_backend_; // Unowned.
};
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_epoll_server.cc b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_epoll_server.cc
index 1efc5e1fbf7..a67c5077f60 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_epoll_server.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_epoll_server.cc
@@ -4,7 +4,7 @@
#include "quiche/quic/masque/masque_epoll_server.h"
-#include "quiche/quic/core/quic_epoll_alarm_factory.h"
+#include "quiche/quic/core/quic_default_connection_helper.h"
#include "quiche/quic/masque/masque_dispatcher.h"
#include "quiche/quic/masque/masque_utils.h"
#include "quiche/quic/platform/api/quic_default_proof_providers.h"
@@ -22,12 +22,10 @@ MasqueEpollServer::MasqueEpollServer(MasqueMode masque_mode,
QuicDispatcher* MasqueEpollServer::CreateQuicDispatcher() {
return new MasqueDispatcher(
masque_mode_, &config(), &crypto_config(), version_manager(),
- epoll_server(),
- std::make_unique<QuicEpollConnectionHelper>(epoll_server(),
- QuicAllocator::BUFFER_POOL),
+ event_loop(), std::make_unique<QuicDefaultConnectionHelper>(),
std::make_unique<QuicSimpleCryptoServerStreamHelper>(),
- std::make_unique<QuicEpollAlarmFactory>(epoll_server()),
- masque_server_backend_, expected_server_connection_id_length());
+ event_loop()->CreateAlarmFactory(), masque_server_backend_,
+ expected_server_connection_id_length());
}
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_backend.h b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_backend.h
index a86209731a6..cb4b067294f 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_backend.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_backend.h
@@ -9,6 +9,7 @@
#include "quiche/quic/masque/masque_utils.h"
#include "quiche/quic/platform/api/quic_export.h"
#include "quiche/quic/tools/quic_memory_cache_backend.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.cc b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.cc
index 742b0c654f9..03fc3262465 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.cc
@@ -9,11 +9,13 @@
#include <cstddef>
#include <limits>
+#include "absl/cleanup/cleanup.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "quiche/quic/core/http/spdy_utils.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
#include "quiche/quic/core/quic_data_reader.h"
#include "quiche/quic/core/quic_udp_socket.h"
#include "quiche/quic/tools/quic_url.h"
@@ -79,7 +81,7 @@ MasqueServerSession::MasqueServerSession(
MasqueMode masque_mode, const QuicConfig& config,
const ParsedQuicVersionVector& supported_versions,
QuicConnection* connection, QuicSession::Visitor* visitor,
- QuicEpollServer* epoll_server, QuicCryptoServerStreamBase::Helper* helper,
+ QuicEventLoop* event_loop, QuicCryptoServerStreamBase::Helper* helper,
const QuicCryptoServerConfig* crypto_config,
QuicCompressedCertsCache* compressed_certs_cache,
MasqueServerBackend* masque_server_backend)
@@ -87,7 +89,7 @@ MasqueServerSession::MasqueServerSession(
helper, crypto_config, compressed_certs_cache,
masque_server_backend),
masque_server_backend_(masque_server_backend),
- epoll_server_(epoll_server),
+ event_loop_(event_loop),
masque_mode_(masque_mode) {
// Artificially increase the max packet length to 1350 to ensure we can fit
// QUIC packets inside DATAGRAM frames.
@@ -95,7 +97,7 @@ MasqueServerSession::MasqueServerSession(
connection->SetMaxPacketLength(kDefaultMaxPacketSize);
masque_server_backend_->RegisterBackendClient(connection_id(), this);
- QUICHE_DCHECK_NE(epoll_server_, nullptr);
+ QUICHE_DCHECK_NE(event_loop_, nullptr);
}
void MasqueServerSession::OnMessageAcked(QuicMessageId message_id,
@@ -229,7 +231,11 @@ std::unique_ptr<QuicBackendResponse> MasqueServerSession::HandleMasqueRequest(
QUIC_DLOG(ERROR) << "Socket bind failed";
return CreateBackendErrorResponse("500", "Socket bind failed");
}
- epoll_server_->RegisterFDForRead(fd_wrapper.fd(), this);
+ if (!event_loop_->RegisterSocket(fd_wrapper.fd(), kSocketEventReadable,
+ this)) {
+ QUIC_DLOG(ERROR) << "Failed to register socket with the event loop";
+ return CreateBackendErrorResponse("500", "Registering socket failed");
+ }
QuicSpdyStream* stream =
static_cast<QuicSpdyStream*>(GetActiveStream(request_handler->stream_id()));
@@ -252,19 +258,11 @@ std::unique_ptr<QuicBackendResponse> MasqueServerSession::HandleMasqueRequest(
return response;
}
-void MasqueServerSession::OnRegistration(QuicEpollServer* /*eps*/,
- QuicUdpSocketFd fd, int event_mask) {
- QUIC_DVLOG(1) << "OnRegistration " << fd << " event_mask " << event_mask;
-}
-
-void MasqueServerSession::OnModification(QuicUdpSocketFd fd, int event_mask) {
- QUIC_DVLOG(1) << "OnModification " << fd << " event_mask " << event_mask;
-}
-
-void MasqueServerSession::OnEvent(QuicUdpSocketFd fd, QuicEpollEvent* event) {
- if ((event->in_events & EPOLLIN) == 0) {
- QUIC_DVLOG(1) << "Ignoring OnEvent fd " << fd << " event mask "
- << event->in_events;
+void MasqueServerSession::OnSocketEvent(QuicEventLoop* /*event_loop*/,
+ QuicUdpSocketFd fd,
+ QuicSocketEventMask events) {
+ if ((events & kSocketEventReadable) == 0) {
+ QUIC_DVLOG(1) << "Ignoring OnEvent fd " << fd << " event mask " << events;
return;
}
auto it = absl::c_find_if(connect_udp_server_states_,
@@ -272,16 +270,26 @@ void MasqueServerSession::OnEvent(QuicUdpSocketFd fd, QuicEpollEvent* event) {
return connect_udp.fd() == fd;
});
if (it == connect_udp_server_states_.end()) {
- QUIC_BUG(quic_bug_10974_1) << "Got unexpected event mask "
- << event->in_events << " on unknown fd " << fd;
+ QUIC_BUG(quic_bug_10974_1)
+ << "Got unexpected event mask " << events << " on unknown fd " << fd;
return;
}
+
+ auto rearm = absl::MakeCleanup([&]() {
+ if (!event_loop_->SupportsEdgeTriggered()) {
+ if (!event_loop_->RearmSocket(fd, kSocketEventReadable)) {
+ QUIC_BUG(MasqueServerSession_OnSocketEvent_Rearm)
+ << "Failed to re-arm socket " << fd << " for reading";
+ }
+ }
+ });
+
QuicSocketAddress expected_target_server_address =
it->target_server_address();
QUICHE_DCHECK(expected_target_server_address.IsInitialized());
- QUIC_DVLOG(1) << "Received readable event on fd " << fd << " (mask "
- << event->in_events << ") stream ID " << it->stream()->id()
- << " server " << expected_target_server_address;
+ QUIC_DVLOG(1) << "Received readable event on fd " << fd << " (mask " << events
+ << ") stream ID " << it->stream()->id() << " server "
+ << expected_target_server_address;
QuicUdpSocketApi socket_api;
BitMask64 packet_info_interested(QuicUdpPacketInfoBit::PEER_ADDRESS);
char packet_buffer[1 + kMaxIncomingPacketSize];
@@ -329,20 +337,6 @@ void MasqueServerSession::OnEvent(QuicUdpSocketFd fd, QuicEpollEvent* event) {
}
}
-void MasqueServerSession::OnUnregistration(QuicUdpSocketFd fd, bool replaced) {
- QUIC_DVLOG(1) << "OnUnregistration " << fd << " " << (replaced ? "" : "!")
- << " replaced";
-}
-
-void MasqueServerSession::OnShutdown(QuicEpollServer* /*eps*/,
- QuicUdpSocketFd fd) {
- QUIC_DVLOG(1) << "OnShutdown " << fd;
-}
-
-std::string MasqueServerSession::Name() const {
- return std::string("MasqueServerSession-") + connection_id().ToString();
-}
-
bool MasqueServerSession::OnSettingsFrame(const SettingsFrame& frame) {
QUIC_DLOG(INFO) << "Received SETTINGS: " << frame;
if (!QuicSimpleServerSession::OnSettingsFrame(frame)) {
@@ -377,7 +371,9 @@ MasqueServerSession::ConnectUdpServerState::~ConnectUdpServerState() {
}
QuicUdpSocketApi socket_api;
QUIC_DLOG(INFO) << "Closing fd " << fd_;
- masque_session_->epoll_server()->UnregisterFD(fd_);
+ if (!masque_session_->event_loop()->UnregisterSocket(fd_)) {
+ QUIC_DLOG(ERROR) << "Failed to unregister FD " << fd_;
+ }
socket_api.Destroy(fd_);
}
@@ -393,7 +389,9 @@ MasqueServerSession::ConnectUdpServerState::operator=(
if (fd_ != kQuicInvalidSocketFd) {
QuicUdpSocketApi socket_api;
QUIC_DLOG(INFO) << "Closing fd " << fd_;
- masque_session_->epoll_server()->UnregisterFD(fd_);
+ if (!masque_session_->event_loop()->UnregisterSocket(fd_)) {
+ QUIC_DLOG(ERROR) << "Failed to unregister FD " << fd_;
+ }
socket_api.Destroy(fd_);
}
stream_ = other.stream_;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.h b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.h
index 59b33c29b72..20b85a1e2cd 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/masque/masque_server_session.h
@@ -5,13 +5,14 @@
#ifndef QUICHE_QUIC_MASQUE_MASQUE_SERVER_SESSION_H_
#define QUICHE_QUIC_MASQUE_MASQUE_SERVER_SESSION_H_
+#include "quiche/quic/core/io/quic_event_loop.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_udp_socket.h"
#include "quiche/quic/masque/masque_server_backend.h"
#include "quiche/quic/masque/masque_utils.h"
-#include "quiche/quic/platform/api/quic_epoll.h"
#include "quiche/quic/platform/api/quic_export.h"
#include "quiche/quic/tools/quic_simple_server_session.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -19,13 +20,13 @@ namespace quic {
class QUIC_NO_EXPORT MasqueServerSession
: public QuicSimpleServerSession,
public MasqueServerBackend::BackendClient,
- public QuicEpollCallbackInterface {
+ public QuicSocketEventListener {
public:
explicit MasqueServerSession(
MasqueMode masque_mode, const QuicConfig& config,
const ParsedQuicVersionVector& supported_versions,
QuicConnection* connection, QuicSession::Visitor* visitor,
- QuicEpollServer* epoll_server, QuicCryptoServerStreamBase::Helper* helper,
+ QuicEventLoop* event_loop, QuicCryptoServerStreamBase::Helper* helper,
const QuicCryptoServerConfig* crypto_config,
QuicCompressedCertsCache* compressed_certs_cache,
MasqueServerBackend* masque_server_backend);
@@ -47,16 +48,11 @@ class QUIC_NO_EXPORT MasqueServerSession
const spdy::Http2HeaderBlock& request_headers,
QuicSimpleServerBackend::RequestHandler* request_handler) override;
- // From QuicEpollCallbackInterface.
- void OnRegistration(QuicEpollServer* eps, QuicUdpSocketFd fd,
- int event_mask) override;
- void OnModification(QuicUdpSocketFd fd, int event_mask) override;
- void OnEvent(QuicUdpSocketFd fd, QuicEpollEvent* event) override;
- void OnUnregistration(QuicUdpSocketFd fd, bool replaced) override;
- void OnShutdown(QuicEpollServer* eps, QuicUdpSocketFd fd) override;
- std::string Name() const override;
+ // From QuicSocketEventListener.
+ void OnSocketEvent(QuicEventLoop* event_loop, QuicUdpSocketFd fd,
+ QuicSocketEventMask events) override;
- QuicEpollServer* epoll_server() const { return epoll_server_; }
+ QuicEventLoop* event_loop() const { return event_loop_; }
private:
// State that the MasqueServerSession keeps for each CONNECT-UDP request.
@@ -64,7 +60,7 @@ class QUIC_NO_EXPORT MasqueServerSession
: public QuicSpdyStream::Http3DatagramVisitor {
public:
// ConnectUdpServerState takes ownership of |fd|. It will unregister it
- // from |epoll_server| and close the file descriptor when destructed.
+ // from |event_loop| and close the file descriptor when destructed.
explicit ConnectUdpServerState(
QuicSpdyStream* stream, const QuicSocketAddress& target_server_address,
QuicUdpSocketFd fd, MasqueServerSession* masque_session);
@@ -101,7 +97,7 @@ class QUIC_NO_EXPORT MasqueServerSession
}
MasqueServerBackend* masque_server_backend_; // Unowned.
- QuicEpollServer* epoll_server_; // Unowned.
+ QuicEventLoop* event_loop_; // Unowned.
MasqueMode masque_mode_;
std::list<ConnectUdpServerState> connect_udp_server_states_;
bool masque_initialized_ = false;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address.cc b/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address.cc
index d8412c5e3d6..ba7f6af6b56 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address.cc
@@ -10,24 +10,11 @@
#include <string>
#include "quiche/quic/platform/api/quic_bug_tracker.h"
+#include "quiche/quic/platform/api/quic_ip_address_family.h"
#include "quiche/quic/platform/api/quic_logging.h"
namespace quic {
-static int ToPlatformAddressFamily(IpAddressFamily family) {
- switch (family) {
- case IpAddressFamily::IP_V4:
- return AF_INET;
- case IpAddressFamily::IP_V6:
- return AF_INET6;
- case IpAddressFamily::IP_UNSPEC:
- return AF_UNSPEC;
- }
- QUIC_BUG(quic_bug_10126_1)
- << "Invalid IpAddressFamily " << static_cast<int32_t>(family);
- return AF_UNSPEC;
-}
-
QuicIpAddress QuicIpAddress::Loopback4() {
QuicIpAddress result;
result.family_ = IpAddressFamily::IP_V4;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address_family.cc b/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address_family.cc
new file mode 100644
index 00000000000..c78abf2adac
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address_family.cc
@@ -0,0 +1,47 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/platform/api/quic_ip_address_family.h"
+
+#include "quiche/quic/platform/api/quic_bug_tracker.h"
+
+#if defined(_WIN32)
+#include <winsock2.h>
+#else
+#include <sys/socket.h>
+#endif // defined(_WIN32)
+
+namespace quic {
+
+int ToPlatformAddressFamily(IpAddressFamily family) {
+ switch (family) {
+ case IpAddressFamily::IP_V4:
+ return AF_INET;
+ case IpAddressFamily::IP_V6:
+ return AF_INET6;
+ case IpAddressFamily::IP_UNSPEC:
+ return AF_UNSPEC;
+ default:
+ QUIC_BUG(quic_bug_10126_1)
+ << "Invalid IpAddressFamily " << static_cast<int32_t>(family);
+ return AF_UNSPEC;
+ }
+}
+
+IpAddressFamily FromPlatformAddressFamily(int family) {
+ switch (family) {
+ case AF_INET:
+ return IpAddressFamily::IP_V4;
+ case AF_INET6:
+ return IpAddressFamily::IP_V6;
+ case AF_UNSPEC:
+ return IpAddressFamily::IP_UNSPEC;
+ default:
+ QUIC_BUG(quic_FromPlatformAddressFamily_unrecognized_family)
+ << "Invalid platform address family int " << family;
+ return IpAddressFamily::IP_UNSPEC;
+ }
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address_family.h b/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address_family.h
index dad2cb971b7..ad3963c5452 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address_family.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_ip_address_family.h
@@ -15,6 +15,9 @@ enum class IpAddressFamily {
IP_UNSPEC,
};
+int ToPlatformAddressFamily(IpAddressFamily family);
+IpAddressFamily FromPlatformAddressFamily(int family);
+
} // namespace quic
#endif // QUICHE_QUIC_PLATFORM_API_QUIC_IP_ADDRESS_FAMILY_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_socket_address.h b/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_socket_address.h
index 9ec97175051..626a54de86f 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_socket_address.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/platform/api/quic_socket_address.h
@@ -30,7 +30,11 @@ class QUIC_EXPORT_PRIVATE QuicSocketAddress {
bool IsInitialized() const;
std::string ToString() const;
+
+ // TODO(ericorth): Convert usage over to socket_api::GetSocketAddress() and
+ // remove.
int FromSocket(int fd);
+
QuicSocketAddress Normalized() const;
QuicIpAddress host() const;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller.cc b/chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller.cc
index 80c190987c3..b6e3d7684fc 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller.cc
@@ -15,6 +15,11 @@ ABSL_FLAG(bool, qbone_tun_device_replace_default_routing_rules, true,
"qbone interface to the qbone table. This is unnecessary in "
"environments with no other ipv6 route.");
+ABSL_FLAG(int, qbone_route_init_cwnd,
+ quic::NetlinkInterface::kUnspecifiedInitCwnd,
+ "If non-zero, will add initcwnd to QBONE routing rules. Setting "
+ "a value below 10 is dangerous and not recommended.");
+
namespace quic {
bool TunDeviceController::UpdateAddress(const IpRange& desired_range) {
@@ -82,7 +87,8 @@ bool TunDeviceController::UpdateRoutes(
rule.table == QboneConstants::kQboneRouteTableId) {
if (!netlink_->ChangeRoute(NetlinkInterface::Verb::kRemove, rule.table,
rule.destination_subnet, rule.scope,
- rule.preferred_source, rule.out_interface)) {
+ rule.preferred_source, rule.out_interface,
+ rule.init_cwnd)) {
QUIC_LOG(ERROR) << "Unable to remove old route to <"
<< rule.destination_subnet.ToString() << ">";
return false;
@@ -102,8 +108,8 @@ bool TunDeviceController::UpdateRoutes(
for (const auto& route : routes) {
if (!netlink_->ChangeRoute(NetlinkInterface::Verb::kReplace,
QboneConstants::kQboneRouteTableId, route,
- RT_SCOPE_LINK, desired_address,
- link_info.index)) {
+ RT_SCOPE_LINK, desired_address, link_info.index,
+ absl::GetFlag(FLAGS_qbone_route_init_cwnd))) {
QUIC_LOG(ERROR) << "Unable to add route <" << route.ToString() << ">";
return false;
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller_test.cc
index 62cb8630b59..59863feeb09 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/bonnet/tun_device_controller_test.cc
@@ -13,6 +13,7 @@
#include "quiche/quic/qbone/qbone_constants.h"
ABSL_DECLARE_FLAG(bool, qbone_tun_device_replace_default_routing_rules);
+ABSL_DECLARE_FLAG(int, qbone_route_init_cwnd);
namespace quic::test {
namespace {
@@ -130,6 +131,7 @@ TEST_F(TunDeviceControllerTest, UpdateRoutesRemovedOldRoutes) {
NetlinkInterface::RoutingRule matching_route;
matching_route.table = QboneConstants::kQboneRouteTableId;
matching_route.out_interface = kIfindex;
+ matching_route.init_cwnd = NetlinkInterface::kUnspecifiedInitCwnd;
for (int i = 0; i < num_matching_routes; i++) {
routing_rules->push_back(matching_route);
}
@@ -141,9 +143,10 @@ TEST_F(TunDeviceControllerTest, UpdateRoutesRemovedOldRoutes) {
return true;
}));
- EXPECT_CALL(netlink_, ChangeRoute(NetlinkInterface::Verb::kRemove,
- QboneConstants::kQboneRouteTableId, _, _, _,
- kIfindex))
+ EXPECT_CALL(netlink_,
+ ChangeRoute(NetlinkInterface::Verb::kRemove,
+ QboneConstants::kQboneRouteTableId, _, _, _, kIfindex,
+ NetlinkInterface::kUnspecifiedInitCwnd))
.Times(num_matching_routes)
.WillRepeatedly(Return(true));
@@ -157,7 +160,7 @@ TEST_F(TunDeviceControllerTest, UpdateRoutesRemovedOldRoutes) {
EXPECT_CALL(netlink_,
ChangeRoute(NetlinkInterface::Verb::kReplace,
QboneConstants::kQboneRouteTableId,
- IpRangeEq(link_local_range_), _, _, kIfindex))
+ IpRangeEq(link_local_range_), _, _, kIfindex, _))
.WillOnce(Return(true));
EXPECT_TRUE(controller_.UpdateRoutes(kIpRange, {}));
@@ -170,9 +173,11 @@ TEST_F(TunDeviceControllerTest, UpdateRoutesAddsNewRoutes) {
EXPECT_CALL(netlink_, GetRuleInfo(_)).WillOnce(Return(true));
+ absl::SetFlag(&FLAGS_qbone_route_init_cwnd, 32);
EXPECT_CALL(netlink_, ChangeRoute(NetlinkInterface::Verb::kReplace,
QboneConstants::kQboneRouteTableId,
- IpRangeEq(kIpRange), _, _, kIfindex))
+ IpRangeEq(kIpRange), _, _, kIfindex,
+ absl::GetFlag(FLAGS_qbone_route_init_cwnd)))
.Times(2)
.WillRepeatedly(Return(true))
.RetiresOnSaturation();
@@ -185,7 +190,7 @@ TEST_F(TunDeviceControllerTest, UpdateRoutesAddsNewRoutes) {
EXPECT_CALL(netlink_,
ChangeRoute(NetlinkInterface::Verb::kReplace,
QboneConstants::kQboneRouteTableId,
- IpRangeEq(link_local_range_), _, _, kIfindex))
+ IpRangeEq(link_local_range_), _, _, kIfindex, _))
.WillOnce(Return(true));
EXPECT_TRUE(controller_.UpdateRoutes(kIpRange, {kIpRange, kIpRange}));
@@ -206,7 +211,7 @@ TEST_F(TunDeviceControllerTest, EmptyUpdateRouteKeepsLinkLocalRoute) {
EXPECT_CALL(netlink_,
ChangeRoute(NetlinkInterface::Verb::kReplace,
QboneConstants::kQboneRouteTableId,
- IpRangeEq(link_local_range_), _, _, kIfindex))
+ IpRangeEq(link_local_range_), _, _, kIfindex, _))
.WillOnce(Return(true));
EXPECT_TRUE(controller_.UpdateRoutes(kIpRange, {}));
@@ -220,7 +225,7 @@ TEST_F(TunDeviceControllerTest, DisablingRoutingRulesSkipsRuleCreation) {
EXPECT_CALL(netlink_, ChangeRoute(NetlinkInterface::Verb::kReplace,
QboneConstants::kQboneRouteTableId,
- IpRangeEq(kIpRange), _, _, kIfindex))
+ IpRangeEq(kIpRange), _, _, kIfindex, _))
.Times(2)
.WillRepeatedly(Return(true))
.RetiresOnSaturation();
@@ -228,7 +233,7 @@ TEST_F(TunDeviceControllerTest, DisablingRoutingRulesSkipsRuleCreation) {
EXPECT_CALL(netlink_,
ChangeRoute(NetlinkInterface::Verb::kReplace,
QboneConstants::kQboneRouteTableId,
- IpRangeEq(link_local_range_), _, _, kIfindex))
+ IpRangeEq(link_local_range_), _, _, kIfindex, _))
.WillOnce(Return(true));
EXPECT_TRUE(controller_.UpdateRoutes(kIpRange, {kIpRange, kIpRange}));
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/mock_netlink.h b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/mock_netlink.h
index 6e33d9cf162..72e3b666fa7 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/mock_netlink.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/mock_netlink.h
@@ -25,7 +25,8 @@ class MockNetlink : public NetlinkInterface {
MOCK_METHOD(bool, GetRouteInfo, (std::vector<RoutingRule>*), (override));
MOCK_METHOD(bool, ChangeRoute,
- (Verb, uint32_t, const IpRange&, uint8_t, QuicIpAddress, int32_t),
+ (Verb, uint32_t, const IpRange&, uint8_t, QuicIpAddress, int32_t,
+ uint32_t),
(override));
MOCK_METHOD(bool, GetRuleInfo, (std::vector<IpRule>*), (override));
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.cc b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.cc
index b40ec380bbf..0f20576286a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.cc
@@ -422,6 +422,7 @@ class RoutingRuleParser : public NetlinkParserInterface {
Netlink::RoutingRule rule;
rule.scope = route->rtm_scope;
rule.table = route->rtm_table;
+ rule.init_cwnd = Netlink::kUnspecifiedInitCwnd;
struct rtattr* rta;
for (rta = RTM_RTA(route); RTA_OK(rta, payload_length);
@@ -448,6 +449,25 @@ class RoutingRuleParser : public NetlinkParserInterface {
rule.out_interface = *reinterpret_cast<int*>(RTA_DATA(rta));
break;
}
+ case RTA_METRICS: {
+ struct rtattr* rtax;
+ int rta_payload_length = RTA_PAYLOAD(rta);
+ for (rtax = reinterpret_cast<struct rtattr*>(RTA_DATA(rta));
+ RTA_OK(rtax, rta_payload_length);
+ rtax = RTA_NEXT(rtax, rta_payload_length)) {
+ switch (rtax->rta_type) {
+ case RTAX_INITCWND: {
+ rule.init_cwnd = *reinterpret_cast<uint32_t*>(RTA_DATA(rtax));
+ break;
+ }
+ default: {
+ QUIC_VLOG(2) << absl::StrCat(
+ "Uninteresting RTA_METRICS attribute: ", rtax->rta_type);
+ }
+ }
+ }
+ break;
+ }
default: {
QUIC_VLOG(2) << absl::StrCat("Uninteresting attribute: ",
rta->rta_type);
@@ -489,7 +509,7 @@ bool Netlink::GetRouteInfo(std::vector<Netlink::RoutingRule>* routing_rules) {
bool Netlink::ChangeRoute(Netlink::Verb verb, uint32_t table,
const IpRange& destination_subnet, uint8_t scope,
QuicIpAddress preferred_source,
- int32_t interface_index) {
+ int32_t interface_index, uint32_t init_cwnd) {
if (!destination_subnet.prefix().IsInitialized()) {
return false;
}
@@ -551,6 +571,15 @@ bool Netlink::ChangeRoute(Netlink::Verb verb, uint32_t table,
message.AppendAttribute(RTA_TABLE, &table, sizeof(table));
+ if (init_cwnd != kUnspecifiedInitCwnd) {
+ char data[RTA_LENGTH(sizeof(uint32_t))];
+ struct rtattr* rta = reinterpret_cast<struct rtattr*>(data);
+ rta->rta_type = RTAX_INITCWND;
+ rta->rta_len = sizeof(data);
+ *reinterpret_cast<uint32_t*>(RTA_DATA(rta)) = init_cwnd;
+ message.AppendAttribute(RTA_METRICS, data, sizeof(data));
+ }
+
// RTA_OIF is the target interface for this rule.
message.AppendAttribute(RTA_OIF, &interface_index, sizeof(interface_index));
// The actual destination subnet must be truncated of all the tailing zeros.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.h b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.h
index 45709c7bd8c..857b8bff4ac 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink.h
@@ -74,6 +74,8 @@ class Netlink : public NetlinkInterface {
//
// preferred_source can be !IsInitialized(), in which case it will be omitted.
//
+ // init_cwnd will be left unspecified if set to 0.
+ //
// For Verb::kRemove, rule matching is done by (destination_subnet, scope,
// preferred_source, interface_index). Return true if a matching rule is
// found. interface_index can be 0 for wilecard.
@@ -86,8 +88,8 @@ class Netlink : public NetlinkInterface {
// matching rule is found, a new entry will be created.
bool ChangeRoute(Netlink::Verb verb, uint32_t table,
const IpRange& destination_subnet, uint8_t scope,
- QuicIpAddress preferred_source,
- int32_t interface_index) override;
+ QuicIpAddress preferred_source, int32_t interface_index,
+ uint32_t init_cwnd) override;
// Returns the set of all rules in the routing policy database.
bool GetRuleInfo(std::vector<Netlink::IpRule>* ip_rules) override;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_interface.h b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_interface.h
index 4bbde21dfba..c4fc42c6f69 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_interface.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_interface.h
@@ -73,6 +73,8 @@ class NetlinkInterface {
uint8_t prefix_length, uint8_t ifa_flags, uint8_t ifa_scope,
const std::vector<struct rtattr*>& additional_attributes) = 0;
+ static constexpr uint32_t kUnspecifiedInitCwnd = 0;
+
// Routing rule reported back from GetRouteInfo.
struct RoutingRule {
uint32_t table;
@@ -80,6 +82,7 @@ class NetlinkInterface {
QuicIpAddress preferred_source;
uint8_t scope;
int out_interface;
+ uint32_t init_cwnd; // kUnspecifiedInitCwnd if unspecified
};
struct IpRule {
@@ -109,7 +112,7 @@ class NetlinkInterface {
virtual bool ChangeRoute(Verb verb, uint32_t table,
const IpRange& destination_subnet, uint8_t scope,
QuicIpAddress preferred_source,
- int32_t interface_index) = 0;
+ int32_t interface_index, uint32_t init_cwnd) = 0;
// Returns the set of all rules in the routing policy database.
virtual bool GetRuleInfo(std::vector<IpRule>* ip_rules) = 0;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_test.cc
index 9bd91b07d13..b0ea1f0b8d1 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/platform/netlink_test.cc
@@ -204,7 +204,8 @@ void CreateRtmsg(struct nlmsghdr* nlm, unsigned char family,
unsigned char destination_length, unsigned char source_length,
unsigned char tos, unsigned char table, unsigned char protocol,
unsigned char scope, unsigned char type, unsigned int flags,
- QuicIpAddress destination, int interface_index) {
+ QuicIpAddress destination, int interface_index,
+ int init_cwnd) {
auto* msg = reinterpret_cast<struct rtmsg*>(NLMSG_DATA(nlm));
msg->rtm_family = family;
msg->rtm_dst_len = destination_length;
@@ -223,6 +224,16 @@ void CreateRtmsg(struct nlmsghdr* nlm, unsigned char family,
// Add egress interface
AddRTA(nlm, RTA_OIF, &interface_index, sizeof(interface_index));
+
+ // Add initcwnd
+ if (init_cwnd > 0) {
+ char data[RTA_LENGTH(sizeof(uint32_t))];
+ struct rtattr* rta = reinterpret_cast<struct rtattr*>(data);
+ rta->rta_len = sizeof(data);
+ rta->rta_type = RTA_METRICS;
+ *reinterpret_cast<uint32_t*>(RTA_DATA(rta)) = init_cwnd;
+ AddRTA(nlm, RTA_METRICS, data, sizeof(data));
+ }
}
TEST_F(NetlinkTest, GetLinkInfoWorks) {
@@ -474,7 +485,7 @@ TEST_F(NetlinkTest, GetRouteInfoWorks) {
buf, nullptr, RTM_NEWROUTE, seq);
CreateRtmsg(netlink_message, AF_INET6, 48, 0, 0,
RT_TABLE_MAIN, RTPROT_STATIC, RT_SCOPE_LINK,
- RTN_UNICAST, 0, destination, 7);
+ RTN_UNICAST, 0, destination, 7, 0);
ret += NLMSG_ALIGN(netlink_message->nlmsg_len);
netlink_message = CreateNetlinkMessage(
@@ -494,6 +505,7 @@ TEST_F(NetlinkTest, GetRouteInfoWorks) {
routing_rules[0].destination_subnet.ToString());
EXPECT_FALSE(routing_rules[0].preferred_source.IsInitialized());
EXPECT_EQ(7, routing_rules[0].out_interface);
+ EXPECT_EQ(0, routing_rules[0].init_cwnd);
}
TEST_F(NetlinkTest, ChangeRouteAdd) {
@@ -504,6 +516,7 @@ TEST_F(NetlinkTest, ChangeRouteAdd) {
IpRange subnet;
subnet.FromString("ff80:dead:beef::/48");
int egress_interface_index = 7;
+ uint32_t init_cwnd = 32;
ExpectNetlinkPacket(
RTM_NEWROUTE, NLM_F_ACK | NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL,
[](void* buf, size_t len, int seq) {
@@ -516,8 +529,8 @@ TEST_F(NetlinkTest, ChangeRouteAdd) {
netlink_message->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr));
return netlink_message->nlmsg_len;
},
- [preferred_ip, subnet, egress_interface_index](const void* buf,
- size_t len) {
+ [preferred_ip, subnet, egress_interface_index, init_cwnd](const void* buf,
+ size_t len) {
auto* netlink_message = reinterpret_cast<const struct nlmsghdr*>(buf);
auto* rtm =
reinterpret_cast<const struct rtmsg*>(NLMSG_DATA(netlink_message));
@@ -575,16 +588,25 @@ TEST_F(NetlinkTest, ChangeRouteAdd) {
QboneConstants::kQboneRouteTableId);
break;
}
+ case RTA_METRICS: {
+ struct rtattr* rtax =
+ reinterpret_cast<struct rtattr*>(RTA_DATA(rta));
+ ASSERT_EQ(rtax->rta_type, RTAX_INITCWND);
+ ASSERT_EQ(rtax->rta_len, RTA_LENGTH(sizeof(uint32_t)));
+ ASSERT_EQ(*reinterpret_cast<uint32_t*>(RTA_DATA(rtax)),
+ init_cwnd);
+ break;
+ }
default:
EXPECT_TRUE(false) << "Seeing rtattr that should not be sent";
}
++num_rta;
}
- EXPECT_EQ(5, num_rta);
+ EXPECT_EQ(6, num_rta);
});
EXPECT_TRUE(netlink->ChangeRoute(
Netlink::Verb::kAdd, QboneConstants::kQboneRouteTableId, subnet,
- RT_SCOPE_LINK, preferred_ip, egress_interface_index));
+ RT_SCOPE_LINK, preferred_ip, egress_interface_index, init_cwnd));
}
TEST_F(NetlinkTest, ChangeRouteRemove) {
@@ -666,7 +688,8 @@ TEST_F(NetlinkTest, ChangeRouteRemove) {
});
EXPECT_TRUE(netlink->ChangeRoute(
Netlink::Verb::kRemove, QboneConstants::kQboneRouteTableId, subnet,
- RT_SCOPE_LINK, preferred_ip, egress_interface_index));
+ RT_SCOPE_LINK, preferred_ip, egress_interface_index,
+ Netlink::kUnspecifiedInitCwnd));
}
TEST_F(NetlinkTest, ChangeRouteReplace) {
@@ -757,7 +780,8 @@ TEST_F(NetlinkTest, ChangeRouteReplace) {
});
EXPECT_TRUE(netlink->ChangeRoute(
Netlink::Verb::kReplace, QboneConstants::kQboneRouteTableId, subnet,
- RT_SCOPE_LINK, preferred_ip, egress_interface_index));
+ RT_SCOPE_LINK, preferred_ip, egress_interface_index,
+ Netlink::kUnspecifiedInitCwnd));
}
} // namespace
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_client_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_client_test.cc
index 5fd7229ba91..7d54852abb7 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_client_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_client_test.cc
@@ -8,6 +8,7 @@
#include "absl/strings/string_view.h"
#include "quiche/quic/core/quic_alarm_factory.h"
+#include "quiche/quic/core/quic_default_connection_helper.h"
#include "quiche/quic/core/quic_default_packet_writer.h"
#include "quiche/quic/core/quic_dispatcher.h"
#include "quiche/quic/core/quic_epoll_alarm_factory.h"
@@ -134,26 +135,20 @@ class QuicQboneDispatcher : public QuicDispatcher {
class QboneTestServer : public QuicServer {
public:
- explicit QboneTestServer(std::unique_ptr<ProofSource> proof_source)
- : QuicServer(std::move(proof_source), &response_cache_) {}
+ explicit QboneTestServer(std::unique_ptr<ProofSource> proof_source,
+ quic::QuicMemoryCacheBackend* response_cache)
+ : QuicServer(std::move(proof_source), response_cache) {}
QuicDispatcher* CreateQuicDispatcher() override {
- QuicEpollAlarmFactory alarm_factory(epoll_server());
return new QuicQboneDispatcher(
&config(), &crypto_config(), version_manager(),
- std::unique_ptr<QuicEpollConnectionHelper>(
- new QuicEpollConnectionHelper(epoll_server(),
- QuicAllocator::BUFFER_POOL)),
- std::unique_ptr<QuicCryptoServerStreamBase::Helper>(
- new QboneCryptoServerStreamHelper()),
- std::unique_ptr<QuicEpollAlarmFactory>(
- new QuicEpollAlarmFactory(epoll_server())),
- &writer_);
+ std::make_unique<QuicDefaultConnectionHelper>(),
+ std::make_unique<QboneCryptoServerStreamHelper>(),
+ event_loop()->CreateAlarmFactory(), &writer_);
}
std::vector<std::string> data() { return writer_.data(); }
private:
- quic::QuicMemoryCacheBackend response_cache_;
DataSavingQbonePacketWriter writer_;
};
@@ -208,8 +203,9 @@ INSTANTIATE_TEST_SUITE_P(Tests, QboneClientTest,
::testing::PrintToStringParamName());
TEST_P(QboneClientTest, SendDataFromClient) {
+ quic::QuicMemoryCacheBackend server_backend;
auto server = std::make_unique<QboneTestServer>(
- crypto_test_utils::ProofSourceForTesting());
+ crypto_test_utils::ProofSourceForTesting(), &server_backend);
QboneTestServer* server_ptr = server.get();
QuicSocketAddress server_address(TestLoopback(), 0);
ServerThread server_thread(std::move(server), server_address);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.cc b/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.cc
index ae9dd560ef8..9a731887fbf 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.cc
@@ -25,4 +25,16 @@ std::string PrependIPv6HeaderForTest(const std::string& body, int hops) {
return packet;
}
+bool DecrementIPv6HopLimit(std::string& packet) {
+ if (packet.size() < sizeof(ip6_hdr)) {
+ return false;
+ }
+ ip6_hdr* header = reinterpret_cast<ip6_hdr*>(&packet[0]);
+ if (header->ip6_vfc >> 4 != 6 || header->ip6_hops == 0) {
+ return false;
+ }
+ header->ip6_hops--;
+ return true;
+}
+
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.h b/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.h
index 191a417eb2f..3d3492dba58 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_processor_test_tools.h
@@ -37,6 +37,10 @@ class MockPacketProcessorStats : public QbonePacketProcessor::StatsInterface {
std::string PrependIPv6HeaderForTest(const std::string& body, int hops);
+// Returns true if the hop limit was decremented. Returns false if the packet is
+// too short, not IPv6, or already has a hop limit of zero.
+bool DecrementIPv6HopLimit(std::string& packet);
+
} // namespace quic
#endif // QUICHE_QUIC_QBONE_QBONE_PACKET_PROCESSOR_TEST_TOOLS_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.cc
index 596573425ed..ed7dd9c00f2 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.cc
@@ -15,6 +15,7 @@
#include "quiche/quic/core/quic_connection_id.h"
#include "quiche/quic/core/quic_packet_writer.h"
#include "quiche/quic/core/quic_packets.h"
+#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_versions.h"
#include "quiche/quic/platform/api/quic_ip_address.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
@@ -85,6 +86,13 @@ class FirstFlightExtractor : public DelegatedPacketWriter::Delegate {
return std::move(packets_);
}
+ uint64_t GetCryptoStreamBytesWritten() const {
+ QUICHE_DCHECK(session_);
+ QUICHE_DCHECK(session_->GetCryptoStream());
+ return session_->GetCryptoStream()->BytesSentOnLevel(
+ EncryptionLevel::ENCRYPTION_INITIAL);
+ }
+
private:
ParsedQuicVersion version_;
QuicConnectionId server_connection_id_;
@@ -155,5 +163,27 @@ std::vector<std::unique_ptr<QuicReceivedPacket>> GetFirstFlightOfPackets(
TestConnectionId());
}
+AnnotatedPackets GetAnnotatedFirstFlightOfPackets(
+ const ParsedQuicVersion& version, const QuicConfig& config,
+ const QuicConnectionId& server_connection_id,
+ const QuicConnectionId& client_connection_id,
+ std::unique_ptr<QuicCryptoClientConfig> crypto_config) {
+ FirstFlightExtractor first_flight_extractor(
+ version, config, server_connection_id, client_connection_id,
+ std::move(crypto_config));
+ first_flight_extractor.GenerateFirstFlight();
+ return AnnotatedPackets{first_flight_extractor.ConsumePackets(),
+ first_flight_extractor.GetCryptoStreamBytesWritten()};
+}
+
+AnnotatedPackets GetAnnotatedFirstFlightOfPackets(
+ const ParsedQuicVersion& version, const QuicConfig& config) {
+ FirstFlightExtractor first_flight_extractor(
+ version, config, TestConnectionId(), EmptyQuicConnectionId());
+ first_flight_extractor.GenerateFirstFlight();
+ return AnnotatedPackets{first_flight_extractor.ConsumePackets(),
+ first_flight_extractor.GetCryptoStreamBytesWritten()};
+}
+
} // namespace test
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.h
index bc82657630a..38960317471 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/first_flight.h
@@ -112,6 +112,21 @@ std::vector<std::unique_ptr<QuicReceivedPacket>> GetFirstFlightOfPackets(
std::vector<std::unique_ptr<QuicReceivedPacket>> GetFirstFlightOfPackets(
const ParsedQuicVersion& version);
+// Functions that also provide additional information about the session.
+struct AnnotatedPackets {
+ std::vector<std::unique_ptr<QuicReceivedPacket>> packets;
+ uint64_t crypto_stream_size;
+};
+
+AnnotatedPackets GetAnnotatedFirstFlightOfPackets(
+ const ParsedQuicVersion& version, const QuicConfig& config,
+ const QuicConnectionId& server_connection_id,
+ const QuicConnectionId& client_connection_id,
+ std::unique_ptr<QuicCryptoClientConfig> crypto_config);
+
+AnnotatedPackets GetAnnotatedFirstFlightOfPackets(
+ const ParsedQuicVersion& version, const QuicConfig& config);
+
} // namespace test
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_client_promised_info.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_client_promised_info.h
index 3dca99e733f..acaefeff9c4 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_client_promised_info.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_client_promised_info.h
@@ -10,6 +10,7 @@
#include "quiche/quic/core/http/quic_client_promised_info.h"
#include "quiche/quic/core/quic_packets.h"
#include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
namespace test {
@@ -21,7 +22,7 @@ class MockQuicClientPromisedInfo : public QuicClientPromisedInfo {
~MockQuicClientPromisedInfo() override;
MOCK_METHOD(QuicAsyncStatus, HandleClientRequest,
- (const spdy::SpdyHeaderBlock& headers,
+ (const spdy::Http2HeaderBlock& headers,
QuicClientPushPromiseIndex::Delegate*),
(override));
};
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_session_visitor.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_session_visitor.h
index 53c09d84dac..61dc5d56307 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_session_visitor.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/mock_quic_session_visitor.h
@@ -27,7 +27,7 @@ class MockQuicSessionVisitor : public QuicTimeWaitListManager::Visitor {
(override));
MOCK_METHOD(void, OnStopSendingReceived, (const QuicStopSendingFrame& frame),
(override));
- MOCK_METHOD(void, OnNewConnectionIdSent,
+ MOCK_METHOD(bool, TryAddNewConnectionId,
(const QuicConnectionId& server_connection_id,
const QuicConnectionId& new_connection_id),
(override));
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc
index ed94cf582af..2b39dcdf7c3 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.cc
@@ -14,9 +14,6 @@
namespace quic {
namespace test {
-void NoopEncoderStreamErrorDelegate::OnEncoderStreamError(
- QuicErrorCode /* error_code */, absl::string_view /*error_message*/) {}
-
TestHeadersHandler::TestHeadersHandler()
: decoding_completed_(false), decoding_error_detected_(false) {}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h
index e3b9680ac6b..f746550bc6a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h
@@ -13,21 +13,11 @@
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
namespace test {
-// QpackDecoder::EncoderStreamErrorDelegate implementation that does nothing.
-class NoopEncoderStreamErrorDelegate
- : public QpackDecoder::EncoderStreamErrorDelegate {
- public:
- ~NoopEncoderStreamErrorDelegate() override = default;
-
- void OnEncoderStreamError(QuicErrorCode error_code,
- absl::string_view error_message) override;
-};
-
// Mock QpackDecoder::EncoderStreamErrorDelegate implementation.
class MockEncoderStreamErrorDelegate
: public QpackDecoder::EncoderStreamErrorDelegate {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.cc
deleted file mode 100644
index 718e8fa2f32..00000000000
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2018 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.
-
-#include "quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h"
-
-#include "absl/strings/string_view.h"
-#include "quiche/spdy/core/hpack/hpack_encoder.h"
-
-namespace quic {
-namespace test {
-
-void NoopDecoderStreamErrorDelegate::OnDecoderStreamError(
- QuicErrorCode /*error_code*/, absl::string_view /*error_message*/) {}
-
-} // namespace test
-} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h
deleted file mode 100644
index fc4621f0c92..00000000000
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2018 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.
-
-#ifndef QUICHE_QUIC_TEST_TOOLS_QPACK_QPACK_ENCODER_TEST_UTILS_H_
-#define QUICHE_QUIC_TEST_TOOLS_QPACK_QPACK_ENCODER_TEST_UTILS_H_
-
-#include <string>
-
-#include "absl/strings/string_view.h"
-#include "quiche/quic/core/qpack/qpack_encoder.h"
-#include "quiche/quic/platform/api/quic_test.h"
-#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
-#include "quiche/spdy/core/spdy_header_block.h"
-
-namespace quic {
-namespace test {
-
-// QpackEncoder::DecoderStreamErrorDelegate implementation that does nothing.
-class NoopDecoderStreamErrorDelegate
- : public QpackEncoder::DecoderStreamErrorDelegate {
- public:
- ~NoopDecoderStreamErrorDelegate() override = default;
-
- void OnDecoderStreamError(QuicErrorCode error_code,
- absl::string_view error_message) override;
-};
-
-// Mock QpackEncoder::DecoderStreamErrorDelegate implementation.
-class MockDecoderStreamErrorDelegate
- : public QpackEncoder::DecoderStreamErrorDelegate {
- public:
- ~MockDecoderStreamErrorDelegate() override = default;
-
- MOCK_METHOD(void, OnDecoderStreamError,
- (QuicErrorCode error_code, absl::string_view error_message),
- (override));
-};
-
-} // namespace test
-} // namespace quic
-
-#endif // QUICHE_QUIC_TEST_TOOLS_QPACK_QPACK_ENCODER_TEST_UTILS_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc
index 9901a70909e..282e33f5c92 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.cc
@@ -323,7 +323,7 @@ bool QpackOfflineDecoder::CompareHeaderBlocks(
++decoded_it;
continue;
}
- // SpdyHeaderBlock does not support erasing by iterator, only by key.
+ // Http2HeaderBlock does not support erasing by iterator, only by key.
++decoded_it;
expected_header_list.erase(key);
// This will invalidate |key|.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.h
index 71cb92a0504..07fa2769356 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_offline_decoder.h
@@ -12,7 +12,7 @@
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h"
#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc
index e38bfc3980f..db827aa3eb8 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.cc
@@ -438,6 +438,12 @@ QuicPathValidator* QuicConnectionPeer::path_validator(
return &connection->path_validator_;
}
+// static
+QuicByteCount QuicConnectionPeer::BytesReceivedOnDefaultPath(
+ QuicConnection* connection) {
+ return connection->default_path_.bytes_received_before_address_validation;
+}
+
// static
QuicByteCount QuicConnectionPeer::BytesSentOnAlternativePath(
QuicConnection* connection) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h
index d1a41f99006..7ad551fed64 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h
@@ -175,6 +175,8 @@ class QuicConnectionPeer {
static QuicPathValidator* path_validator(QuicConnection* connection);
+ static QuicByteCount BytesReceivedOnDefaultPath(QuicConnection* connection);
+
static QuicByteCount BytesSentOnAlternativePath(QuicConnection* connection);
static QuicByteCount BytesReceivedOnAlternativePath(
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.cc
index 507de251b81..2ab9fb0d855 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.cc
@@ -45,14 +45,14 @@ QuicPacketNumberLength QuicPacketCreatorPeer::GetPacketNumberLength(
}
// static
-QuicVariableLengthIntegerLength
+quiche::QuicheVariableLengthIntegerLength
QuicPacketCreatorPeer::GetRetryTokenLengthLength(QuicPacketCreator* creator) {
return creator->GetRetryTokenLengthLength();
}
// static
-QuicVariableLengthIntegerLength QuicPacketCreatorPeer::GetLengthLength(
- QuicPacketCreator* creator) {
+quiche::QuicheVariableLengthIntegerLength
+QuicPacketCreatorPeer::GetLengthLength(QuicPacketCreator* creator) {
return creator->GetLengthLength();
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.h
index 0c9ce77bb8b..4607bcd2d7d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_packet_creator_peer.h
@@ -26,9 +26,9 @@ class QuicPacketCreatorPeer {
QuicPacketCreator* creator, QuicPacketNumberLength packet_number_length);
static QuicPacketNumberLength GetPacketNumberLength(
QuicPacketCreator* creator);
- static QuicVariableLengthIntegerLength GetRetryTokenLengthLength(
+ static quiche::QuicheVariableLengthIntegerLength GetRetryTokenLengthLength(
QuicPacketCreator* creator);
- static QuicVariableLengthIntegerLength GetLengthLength(
+ static quiche::QuicheVariableLengthIntegerLength GetLengthLength(
QuicPacketCreator* creator);
static void SetPacketNumber(QuicPacketCreator* creator, uint64_t s);
static void SetPacketNumber(QuicPacketCreator* creator, QuicPacketNumber num);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.cc
index 62348cb4815..ea920670955 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.cc
@@ -46,7 +46,7 @@ void QuicSpdySessionPeer::SetMaxInboundHeaderListSize(
// static
size_t QuicSpdySessionPeer::WriteHeadersOnHeadersStream(
- QuicSpdySession* session, QuicStreamId id, spdy::SpdyHeaderBlock headers,
+ QuicSpdySession* session, QuicStreamId id, spdy::Http2HeaderBlock headers,
bool fin, const spdy::SpdyStreamPrecedence& precedence,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.h
index d87104f880b..87d38eee2dd 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.h
@@ -12,6 +12,7 @@
#include "quiche/quic/core/qpack/qpack_send_stream.h"
#include "quiche/quic/core/quic_packets.h"
#include "quiche/quic/core/quic_write_blocked_list.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_framer.h"
namespace quic {
@@ -32,7 +33,7 @@ class QuicSpdySessionPeer {
static void SetMaxInboundHeaderListSize(QuicSpdySession* session,
size_t max_inbound_header_size);
static size_t WriteHeadersOnHeadersStream(
- QuicSpdySession* session, QuicStreamId id, spdy::SpdyHeaderBlock headers,
+ QuicSpdySession* session, QuicStreamId id, spdy::Http2HeaderBlock headers,
bool fin, const spdy::SpdyStreamPrecedence& precedence,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.cc
index 756c5606ee8..983db8e4481 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.cc
@@ -28,7 +28,7 @@ class SessionCloseVisitor : public WebTransportVisitor {
public:
SessionCloseVisitor(WebTransportSession* session) : session_(session) {}
- void OnSessionReady(const spdy::SpdyHeaderBlock& /*headers*/) override {}
+ void OnSessionReady(const spdy::Http2HeaderBlock& /*headers*/) override {}
void OnSessionClosed(WebTransportSessionError /*error_code*/,
const std::string& /*error_message*/) override {}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.h
index 33549cce8f9..e59eb9124af 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_backend.h
@@ -7,6 +7,7 @@
#include "quiche/quic/tools/quic_memory_cache_backend.h"
#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
namespace test {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc
index cffcfa2e327..32b61ed285e 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.cc
@@ -14,7 +14,8 @@
#include "quiche/quic/core/crypto/proof_verifier.h"
#include "quiche/quic/core/http/quic_spdy_client_stream.h"
#include "quiche/quic/core/http/spdy_utils.h"
-#include "quiche/quic/core/quic_epoll_connection_helper.h"
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+#include "quiche/quic/core/quic_default_clock.h"
#include "quiche/quic/core/quic_packet_writer_wrapper.h"
#include "quiche/quic/core/quic_server_id.h"
#include "quiche/quic/core/quic_utils.h"
@@ -133,17 +134,17 @@ class RecordingProofVerifier : public ProofVerifier {
};
} // namespace
-class MockableQuicClientEpollNetworkHelper
- : public QuicClientEpollNetworkHelper {
+class MockableQuicClientDefaultNetworkHelper
+ : public QuicClientDefaultNetworkHelper {
public:
- using QuicClientEpollNetworkHelper::QuicClientEpollNetworkHelper;
- ~MockableQuicClientEpollNetworkHelper() override = default;
+ using QuicClientDefaultNetworkHelper::QuicClientDefaultNetworkHelper;
+ ~MockableQuicClientDefaultNetworkHelper() override = default;
void ProcessPacket(const QuicSocketAddress& self_address,
const QuicSocketAddress& peer_address,
const QuicReceivedPacket& packet) override {
- QuicClientEpollNetworkHelper::ProcessPacket(self_address, peer_address,
- packet);
+ QuicClientDefaultNetworkHelper::ProcessPacket(self_address, peer_address,
+ packet);
if (track_last_incoming_packet_) {
last_incoming_packet_ = packet.Clone();
}
@@ -151,7 +152,7 @@ class MockableQuicClientEpollNetworkHelper
QuicPacketWriter* CreateQuicPacketWriter() override {
QuicPacketWriter* writer =
- QuicClientEpollNetworkHelper::CreateQuicPacketWriter();
+ QuicClientDefaultNetworkHelper::CreateQuicPacketWriter();
if (!test_writer_) {
return writer;
}
@@ -188,35 +189,33 @@ class MockableQuicClientEpollNetworkHelper
MockableQuicClient::MockableQuicClient(
QuicSocketAddress server_address, const QuicServerId& server_id,
const ParsedQuicVersionVector& supported_versions,
- QuicEpollServer* epoll_server)
+ QuicEventLoop* event_loop)
: MockableQuicClient(server_address, server_id, QuicConfig(),
- supported_versions, epoll_server) {}
+ supported_versions, event_loop) {}
MockableQuicClient::MockableQuicClient(
QuicSocketAddress server_address, const QuicServerId& server_id,
const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
- QuicEpollServer* epoll_server)
+ QuicEventLoop* event_loop)
: MockableQuicClient(server_address, server_id, config, supported_versions,
- epoll_server, nullptr) {}
+ event_loop, nullptr) {}
MockableQuicClient::MockableQuicClient(
QuicSocketAddress server_address, const QuicServerId& server_id,
const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
- QuicEpollServer* epoll_server,
- std::unique_ptr<ProofVerifier> proof_verifier)
+ QuicEventLoop* event_loop, std::unique_ptr<ProofVerifier> proof_verifier)
: MockableQuicClient(server_address, server_id, config, supported_versions,
- epoll_server, std::move(proof_verifier), nullptr) {}
+ event_loop, std::move(proof_verifier), nullptr) {}
MockableQuicClient::MockableQuicClient(
QuicSocketAddress server_address, const QuicServerId& server_id,
const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
- QuicEpollServer* epoll_server,
- std::unique_ptr<ProofVerifier> proof_verifier,
+ QuicEventLoop* event_loop, std::unique_ptr<ProofVerifier> proof_verifier,
std::unique_ptr<SessionCache> session_cache)
- : QuicClient(
- server_address, server_id, supported_versions, config, epoll_server,
- std::make_unique<MockableQuicClientEpollNetworkHelper>(epoll_server,
- this),
+ : QuicDefaultClient(
+ server_address, server_id, supported_versions, config, event_loop,
+ std::make_unique<MockableQuicClientDefaultNetworkHelper>(event_loop,
+ this),
std::make_unique<RecordingProofVerifier>(std::move(proof_verifier)),
std::move(session_cache)),
override_server_connection_id_(EmptyQuicConnectionId()),
@@ -230,16 +229,16 @@ MockableQuicClient::~MockableQuicClient() {
}
}
-MockableQuicClientEpollNetworkHelper*
+MockableQuicClientDefaultNetworkHelper*
MockableQuicClient::mockable_network_helper() {
- return static_cast<MockableQuicClientEpollNetworkHelper*>(
- epoll_network_helper());
+ return static_cast<MockableQuicClientDefaultNetworkHelper*>(
+ default_network_helper());
}
-const MockableQuicClientEpollNetworkHelper*
+const MockableQuicClientDefaultNetworkHelper*
MockableQuicClient::mockable_network_helper() const {
- return static_cast<const MockableQuicClientEpollNetworkHelper*>(
- epoll_network_helper());
+ return static_cast<const MockableQuicClientDefaultNetworkHelper*>(
+ default_network_helper());
}
QuicConnectionId MockableQuicClient::GenerateNewConnectionId() {
@@ -250,7 +249,7 @@ QuicConnectionId MockableQuicClient::GenerateNewConnectionId() {
return QuicUtils::CreateRandomConnectionId(
override_server_connection_id_length_);
}
- return QuicClient::GenerateNewConnectionId();
+ return QuicDefaultClient::GenerateNewConnectionId();
}
void MockableQuicClient::UseConnectionId(
@@ -272,7 +271,7 @@ QuicConnectionId MockableQuicClient::GetClientConnectionId() {
return QuicUtils::CreateRandomConnectionId(
override_client_connection_id_length_);
}
- return QuicClient::GetClientConnectionId();
+ return QuicDefaultClient::GetClientConnectionId();
}
void MockableQuicClient::UseClientConnectionId(
@@ -314,10 +313,11 @@ QuicTestClient::QuicTestClient(
QuicTestClient::QuicTestClient(
QuicSocketAddress server_address, const std::string& server_hostname,
const QuicConfig& config, const ParsedQuicVersionVector& supported_versions)
- : client_(new MockableQuicClient(
+ : event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get())),
+ client_(new MockableQuicClient(
server_address,
QuicServerId(server_hostname, server_address.port(), false), config,
- supported_versions, &epoll_server_)) {
+ supported_versions, event_loop_.get())) {
Initialize();
}
@@ -325,10 +325,11 @@ QuicTestClient::QuicTestClient(
QuicSocketAddress server_address, const std::string& server_hostname,
const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
std::unique_ptr<ProofVerifier> proof_verifier)
- : client_(new MockableQuicClient(
+ : event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get())),
+ client_(new MockableQuicClient(
server_address,
QuicServerId(server_hostname, server_address.port(), false), config,
- supported_versions, &epoll_server_, std::move(proof_verifier))) {
+ supported_versions, event_loop_.get(), std::move(proof_verifier))) {
Initialize();
}
@@ -337,10 +338,26 @@ QuicTestClient::QuicTestClient(
const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
std::unique_ptr<ProofVerifier> proof_verifier,
std::unique_ptr<SessionCache> session_cache)
- : client_(new MockableQuicClient(
+ : event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get())),
+ client_(new MockableQuicClient(
+ server_address,
+ QuicServerId(server_hostname, server_address.port(), false), config,
+ supported_versions, event_loop_.get(), std::move(proof_verifier),
+ std::move(session_cache))) {
+ Initialize();
+}
+
+QuicTestClient::QuicTestClient(
+ QuicSocketAddress server_address, const std::string& server_hostname,
+ const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache,
+ std::unique_ptr<QuicEventLoop> event_loop)
+ : event_loop_(std::move(event_loop)),
+ client_(new MockableQuicClient(
server_address,
QuicServerId(server_hostname, server_address.port(), false), config,
- supported_versions, &epoll_server_, std::move(proof_verifier),
+ supported_versions, event_loop_.get(), std::move(proof_verifier),
std::move(session_cache))) {
Initialize();
}
@@ -373,7 +390,7 @@ void QuicTestClient::SetUserAgentID(const std::string& user_agent_id) {
}
ssize_t QuicTestClient::SendRequest(const std::string& uri) {
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
if (!PopulateHeaderBlockFromUrl(uri, &headers)) {
return 0;
}
@@ -381,7 +398,7 @@ ssize_t QuicTestClient::SendRequest(const std::string& uri) {
}
ssize_t QuicTestClient::SendRequestAndRstTogether(const std::string& uri) {
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
if (!PopulateHeaderBlockFromUrl(uri, &headers)) {
return 0;
}
@@ -406,7 +423,7 @@ void QuicTestClient::SendRequestsAndWaitForResponses(
}
ssize_t QuicTestClient::GetOrCreateStreamAndSendRequest(
- const spdy::SpdyHeaderBlock* headers, absl::string_view body, bool fin,
+ const spdy::Http2HeaderBlock* headers, absl::string_view body, bool fin,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener) {
if (headers) {
@@ -416,8 +433,8 @@ ssize_t QuicTestClient::GetOrCreateStreamAndSendRequest(
if (rv == QUIC_SUCCESS) return 1;
if (rv == QUIC_PENDING) {
// May need to retry request if asynchronous rendezvous fails.
- std::unique_ptr<spdy::SpdyHeaderBlock> new_headers(
- new spdy::SpdyHeaderBlock(headers->Clone()));
+ std::unique_ptr<spdy::Http2HeaderBlock> new_headers(
+ new spdy::Http2HeaderBlock(headers->Clone()));
push_promise_data_to_resend_ = std::make_unique<TestClientDataToResend>(
std::move(new_headers), body, fin, this, std::move(ack_listener));
return 1;
@@ -435,7 +452,7 @@ ssize_t QuicTestClient::GetOrCreateStreamAndSendRequest(
ssize_t ret = 0;
if (headers != nullptr) {
- spdy::SpdyHeaderBlock spdy_headers(headers->Clone());
+ spdy::Http2HeaderBlock spdy_headers(headers->Clone());
if (spdy_headers[":authority"].as_string().empty()) {
spdy_headers[":authority"] = client_->server_id().host();
}
@@ -448,17 +465,17 @@ ssize_t QuicTestClient::GetOrCreateStreamAndSendRequest(
return ret;
}
-ssize_t QuicTestClient::SendMessage(const spdy::SpdyHeaderBlock& headers,
+ssize_t QuicTestClient::SendMessage(const spdy::Http2HeaderBlock& headers,
absl::string_view body) {
return SendMessage(headers, body, /*fin=*/true);
}
-ssize_t QuicTestClient::SendMessage(const spdy::SpdyHeaderBlock& headers,
+ssize_t QuicTestClient::SendMessage(const spdy::Http2HeaderBlock& headers,
absl::string_view body, bool fin) {
return SendMessage(headers, body, fin, /*flush=*/true);
}
-ssize_t QuicTestClient::SendMessage(const spdy::SpdyHeaderBlock& headers,
+ssize_t QuicTestClient::SendMessage(const spdy::Http2HeaderBlock& headers,
absl::string_view body, bool fin,
bool flush) {
// Always force creation of a stream for SendMessage.
@@ -499,7 +516,7 @@ void QuicTestClient::set_buffer_body(bool buffer_body) {
const std::string& QuicTestClient::response_body() const { return response_; }
std::string QuicTestClient::SendCustomSynchronousRequest(
- const spdy::SpdyHeaderBlock& headers, const std::string& body) {
+ const spdy::Http2HeaderBlock& headers, const std::string& body) {
// Clear connection state here and only track this synchronous request.
ClearPerConnectionState();
if (SendMessage(headers, body) == 0) {
@@ -514,7 +531,7 @@ std::string QuicTestClient::SendCustomSynchronousRequest(
}
std::string QuicTestClient::SendSynchronousRequest(const std::string& uri) {
- spdy::SpdyHeaderBlock headers;
+ spdy::Http2HeaderBlock headers;
if (!PopulateHeaderBlockFromUrl(uri, &headers)) {
return "";
}
@@ -636,24 +653,15 @@ bool QuicTestClient::HaveActiveStream() {
}
bool QuicTestClient::WaitUntil(int timeout_ms, std::function<bool()> trigger) {
- int64_t timeout_us = timeout_ms * kNumMicrosPerMilli;
- int64_t old_timeout_us = epoll_server()->timeout_in_us_for_test();
- if (timeout_us > 0) {
- epoll_server()->set_timeout_in_us(timeout_us);
- }
- const QuicClock* clock =
- QuicConnectionPeer::GetHelper(client()->session()->connection())
- ->GetClock();
- QuicTime end_waiting_time =
- clock->Now() + QuicTime::Delta::FromMicroseconds(timeout_us);
- while (HaveActiveStream() && !(trigger && trigger()) &&
- (timeout_us < 0 || clock->Now() < end_waiting_time)) {
- client_->WaitForEvents();
+ QuicTime::Delta timeout = QuicTime::Delta::FromMilliseconds(timeout_ms);
+ const QuicClock* clock = client()->session()->connection()->clock();
+ QuicTime end_waiting_time = clock->Now() + timeout;
+ while (connected() && !(trigger && trigger()) &&
+ (timeout_ms < 0 || clock->Now() < end_waiting_time)) {
+ event_loop_->RunEventLoopOnce(timeout);
+ client_->WaitForEventsPostprocessing();
}
ReadNextResponse();
- if (timeout_us > 0) {
- epoll_server()->set_timeout_in_us(old_timeout_us);
- }
if (trigger && !trigger()) {
QUIC_VLOG(1) << "Client WaitUntil returning with trigger returning false.";
return false;
@@ -674,7 +682,7 @@ bool QuicTestClient::response_headers_complete() const {
return response_headers_complete_;
}
-const spdy::SpdyHeaderBlock* QuicTestClient::response_headers() const {
+const spdy::Http2HeaderBlock* QuicTestClient::response_headers() const {
for (std::pair<QuicStreamId, QuicSpdyClientStream*> stream : open_streams_) {
if (stream.second->headers_decompressed()) {
response_headers_ = stream.second->response_headers().Clone();
@@ -684,7 +692,7 @@ const spdy::SpdyHeaderBlock* QuicTestClient::response_headers() const {
return &response_headers_;
}
-const spdy::SpdyHeaderBlock* QuicTestClient::preliminary_headers() const {
+const spdy::Http2HeaderBlock* QuicTestClient::preliminary_headers() const {
for (std::pair<QuicStreamId, QuicSpdyClientStream*> stream : open_streams_) {
size_t bytes_read =
stream.second->stream_bytes_read() + stream.second->header_bytes_read();
@@ -696,7 +704,7 @@ const spdy::SpdyHeaderBlock* QuicTestClient::preliminary_headers() const {
return &preliminary_headers_;
}
-const spdy::SpdyHeaderBlock& QuicTestClient::response_trailers() const {
+const spdy::Http2HeaderBlock& QuicTestClient::response_trailers() const {
return response_trailers_;
}
@@ -761,9 +769,9 @@ void QuicTestClient::OnClose(QuicSpdyStream* stream) {
}
bool QuicTestClient::CheckVary(
- const spdy::SpdyHeaderBlock& /*client_request*/,
- const spdy::SpdyHeaderBlock& /*promise_request*/,
- const spdy::SpdyHeaderBlock& /*promise_response*/) {
+ const spdy::Http2HeaderBlock& /*client_request*/,
+ const spdy::Http2HeaderBlock& /*promise_request*/,
+ const spdy::Http2HeaderBlock& /*promise_response*/) {
return true;
}
@@ -833,11 +841,11 @@ void QuicTestClient::WaitForWriteToFlush() {
}
QuicTestClient::TestClientDataToResend::TestClientDataToResend(
- std::unique_ptr<spdy::SpdyHeaderBlock> headers, absl::string_view body,
+ std::unique_ptr<spdy::Http2HeaderBlock> headers, absl::string_view body,
bool fin, QuicTestClient* test_client,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener)
- : QuicClient::QuicDataToResend(std::move(headers), body, fin),
+ : QuicDefaultClient::QuicDataToResend(std::move(headers), body, fin),
test_client_(test_client),
ack_listener_(std::move(ack_listener)) {}
@@ -864,10 +872,11 @@ QuicTestClient::PerStreamState::PerStreamState(const PerStreamState& other)
QuicTestClient::PerStreamState::PerStreamState(
QuicRstStreamErrorCode stream_error, bool response_complete,
bool response_headers_complete,
- const spdy::SpdyHeaderBlock& response_headers,
- const spdy::SpdyHeaderBlock& preliminary_headers,
- const std::string& response, const spdy::SpdyHeaderBlock& response_trailers,
- uint64_t bytes_read, uint64_t bytes_written, int64_t response_body_size)
+ const spdy::Http2HeaderBlock& response_headers,
+ const spdy::Http2HeaderBlock& preliminary_headers,
+ const std::string& response,
+ const spdy::Http2HeaderBlock& response_trailers, uint64_t bytes_read,
+ uint64_t bytes_written, int64_t response_body_size)
: stream_error(stream_error),
response_complete(response_complete),
response_headers_complete(response_headers_complete),
@@ -882,7 +891,7 @@ QuicTestClient::PerStreamState::PerStreamState(
QuicTestClient::PerStreamState::~PerStreamState() = default;
bool QuicTestClient::PopulateHeaderBlockFromUrl(
- const std::string& uri, spdy::SpdyHeaderBlock* headers) {
+ const std::string& uri, spdy::Http2HeaderBlock* headers) {
std::string url;
if (absl::StartsWith(uri, "https://") || absl::StartsWith(uri, "http://")) {
url = uri;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.h
index 078f96be7c9..a1f7b1328fd 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_client.h
@@ -10,14 +10,15 @@
#include <string>
#include "absl/strings/string_view.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
#include "quiche/quic/core/proto/cached_network_parameters_proto.h"
#include "quiche/quic/core/quic_framer.h"
#include "quiche/quic/core/quic_packet_creator.h"
#include "quiche/quic/core/quic_packets.h"
-#include "quiche/quic/platform/api/quic_epoll.h"
#include "quiche/quic/platform/api/quic_test.h"
-#include "quiche/quic/tools/quic_client.h"
+#include "quiche/quic/tools/quic_default_client.h"
#include "quiche/common/quiche_linked_hash_map.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -26,31 +27,31 @@ class QuicPacketWriterWrapper;
namespace test {
-class MockableQuicClientEpollNetworkHelper;
+class MockableQuicClientDefaultNetworkHelper;
// A quic client which allows mocking out reads and writes.
-class MockableQuicClient : public QuicClient {
+class MockableQuicClient : public QuicDefaultClient {
public:
MockableQuicClient(QuicSocketAddress server_address,
const QuicServerId& server_id,
const ParsedQuicVersionVector& supported_versions,
- QuicEpollServer* epoll_server);
+ QuicEventLoop* event_loop);
MockableQuicClient(QuicSocketAddress server_address,
const QuicServerId& server_id, const QuicConfig& config,
const ParsedQuicVersionVector& supported_versions,
- QuicEpollServer* epoll_server);
+ QuicEventLoop* event_loop);
MockableQuicClient(QuicSocketAddress server_address,
const QuicServerId& server_id, const QuicConfig& config,
const ParsedQuicVersionVector& supported_versions,
- QuicEpollServer* epoll_server,
+ QuicEventLoop* event_loop,
std::unique_ptr<ProofVerifier> proof_verifier);
MockableQuicClient(QuicSocketAddress server_address,
const QuicServerId& server_id, const QuicConfig& config,
const ParsedQuicVersionVector& supported_versions,
- QuicEpollServer* epoll_server,
+ QuicEventLoop* event_loop,
std::unique_ptr<ProofVerifier> proof_verifier,
std::unique_ptr<SessionCache> session_cache);
MockableQuicClient(const MockableQuicClient&) = delete;
@@ -72,9 +73,9 @@ class MockableQuicClient : public QuicClient {
// If true, copy each packet from ProcessPacket into |last_incoming_packet|
void set_track_last_incoming_packet(bool track);
- // Casts the network helper to a MockableQuicClientEpollNetworkHelper.
- MockableQuicClientEpollNetworkHelper* mockable_network_helper();
- const MockableQuicClientEpollNetworkHelper* mockable_network_helper() const;
+ // Casts the network helper to a MockableQuicClientDefaultNetworkHelper.
+ MockableQuicClientDefaultNetworkHelper* mockable_network_helper();
+ const MockableQuicClientDefaultNetworkHelper* mockable_network_helper() const;
private:
// Server connection ID to use, if server_connection_id_overridden_
@@ -107,6 +108,12 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
const ParsedQuicVersionVector& supported_versions,
std::unique_ptr<ProofVerifier> proof_verifier,
std::unique_ptr<SessionCache> session_cache);
+ QuicTestClient(QuicSocketAddress server_address,
+ const std::string& server_hostname, const QuicConfig& config,
+ const ParsedQuicVersionVector& supported_versions,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache,
+ std::unique_ptr<QuicEventLoop> event_loop);
~QuicTestClient() override;
@@ -133,23 +140,23 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
const std::vector<std::string>& url_list);
// Sends a request containing |headers| and |body| and returns the number of
// bytes sent (the size of the serialized request headers and body).
- ssize_t SendMessage(const spdy::SpdyHeaderBlock& headers,
+ ssize_t SendMessage(const spdy::Http2HeaderBlock& headers,
absl::string_view body);
// Sends a request containing |headers| and |body| with the fin bit set to
// |fin| and returns the number of bytes sent (the size of the serialized
// request headers and body).
- ssize_t SendMessage(const spdy::SpdyHeaderBlock& headers,
+ ssize_t SendMessage(const spdy::Http2HeaderBlock& headers,
absl::string_view body, bool fin);
// Sends a request containing |headers| and |body| with the fin bit set to
// |fin| and returns the number of bytes sent (the size of the serialized
// request headers and body). If |flush| is true, will wait for the message to
// be flushed before returning.
- ssize_t SendMessage(const spdy::SpdyHeaderBlock& headers,
+ ssize_t SendMessage(const spdy::Http2HeaderBlock& headers,
absl::string_view body, bool fin, bool flush);
// Sends a request containing |headers| and |body|, waits for the response,
// and returns the response body.
- std::string SendCustomSynchronousRequest(const spdy::SpdyHeaderBlock& headers,
- const std::string& body);
+ std::string SendCustomSynchronousRequest(
+ const spdy::Http2HeaderBlock& headers, const std::string& body);
// Sends a GET request for |uri|, waits for the response, and returns the
// response body.
std::string SendSynchronousRequest(const std::string& uri);
@@ -170,14 +177,14 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
// is received. 2) returns state of the oldest active stream which have
// received partial response (if any).
// Group 1.
- const spdy::SpdyHeaderBlock& response_trailers() const;
+ const spdy::Http2HeaderBlock& response_trailers() const;
bool response_complete() const;
int64_t response_body_size() const;
const std::string& response_body() const;
// Group 2.
bool response_headers_complete() const;
- const spdy::SpdyHeaderBlock* response_headers() const;
- const spdy::SpdyHeaderBlock* preliminary_headers() const;
+ const spdy::Http2HeaderBlock* response_headers() const;
+ const spdy::Http2HeaderBlock* preliminary_headers() const;
int64_t response_size() const;
size_t bytes_read() const;
size_t bytes_written() const;
@@ -197,7 +204,9 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
// responses are received while the client is waiting, subsequent calls to
// this function will return immediately.
void WaitForResponseForMs(int timeout_ms) {
- WaitUntil(timeout_ms, [this]() { return !closed_stream_states_.empty(); });
+ WaitUntil(timeout_ms, [this]() {
+ return !HaveActiveStream() || !closed_stream_states_.empty();
+ });
if (response_complete()) {
QUIC_VLOG(1) << "Client received response:"
<< response_headers()->DebugString() << response_body();
@@ -208,7 +217,8 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
// complete response is received from the server, or once the timeout
// expires. -1 means no timeout.
void WaitForInitialResponseForMs(int timeout_ms) {
- WaitUntil(timeout_ms, [this]() { return response_size() != 0; });
+ WaitUntil(timeout_ms,
+ [this]() { return !HaveActiveStream() || response_size() != 0; });
}
// Migrate local address to <|new_host|, a random port>.
@@ -225,9 +235,9 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
void OnClose(QuicSpdyStream* stream) override;
// From QuicClientPushPromiseIndex::Delegate
- bool CheckVary(const spdy::SpdyHeaderBlock& client_request,
- const spdy::SpdyHeaderBlock& promise_request,
- const spdy::SpdyHeaderBlock& promise_response) override;
+ bool CheckVary(const spdy::Http2HeaderBlock& client_request,
+ const spdy::Http2HeaderBlock& promise_request,
+ const spdy::Http2HeaderBlock& promise_response) override;
void OnRendezvousResult(QuicSpdyStream*) override;
// Configures client_ to take ownership of and use the writer.
@@ -253,7 +263,7 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
// stores the request in case it needs to be resent. If |headers| is
// null, only the body will be sent on the stream.
ssize_t GetOrCreateStreamAndSendRequest(
- const spdy::SpdyHeaderBlock* headers, absl::string_view body, bool fin,
+ const spdy::Http2HeaderBlock* headers, absl::string_view body, bool fin,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener);
@@ -280,7 +290,7 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
void WaitForWriteToFlush();
- QuicEpollServer* epoll_server() { return &epoll_server_; }
+ QuicEventLoop* event_loop() { return event_loop_.get(); }
size_t num_requests() const { return num_requests_; }
@@ -309,7 +319,7 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
// request. If |uri| is a relative URL, the QuicServerId will be
// use to specify the authority.
bool PopulateHeaderBlockFromUrl(const std::string& uri,
- spdy::SpdyHeaderBlock* headers);
+ spdy::Http2HeaderBlock* headers);
// Waits for a period of time that is long enough to receive all delayed acks
// sent by peer.
@@ -327,10 +337,10 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
QuicTestClient& operator=(const QuicTestClient&&) = delete;
private:
- class TestClientDataToResend : public QuicClient::QuicDataToResend {
+ class TestClientDataToResend : public QuicDefaultClient::QuicDataToResend {
public:
TestClientDataToResend(
- std::unique_ptr<spdy::SpdyHeaderBlock> headers, absl::string_view body,
+ std::unique_ptr<spdy::Http2HeaderBlock> headers, absl::string_view body,
bool fin, QuicTestClient* test_client,
quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
ack_listener);
@@ -350,10 +360,10 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
PerStreamState(const PerStreamState& other);
PerStreamState(QuicRstStreamErrorCode stream_error, bool response_complete,
bool response_headers_complete,
- const spdy::SpdyHeaderBlock& response_headers,
- const spdy::SpdyHeaderBlock& preliminary_headers,
+ const spdy::Http2HeaderBlock& response_headers,
+ const spdy::Http2HeaderBlock& preliminary_headers,
const std::string& response,
- const spdy::SpdyHeaderBlock& response_trailers,
+ const spdy::Http2HeaderBlock& response_trailers,
uint64_t bytes_read, uint64_t bytes_written,
int64_t response_body_size);
~PerStreamState();
@@ -361,10 +371,10 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
QuicRstStreamErrorCode stream_error;
bool response_complete;
bool response_headers_complete;
- spdy::SpdyHeaderBlock response_headers;
- spdy::SpdyHeaderBlock preliminary_headers;
+ spdy::Http2HeaderBlock response_headers;
+ spdy::Http2HeaderBlock preliminary_headers;
std::string response;
- spdy::SpdyHeaderBlock response_trailers;
+ spdy::Http2HeaderBlock response_trailers;
uint64_t bytes_read;
uint64_t bytes_written;
int64_t response_body_size;
@@ -383,7 +393,7 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
// tracking its state.
void SetLatestCreatedStream(QuicSpdyClientStream* stream);
- QuicEpollServer epoll_server_;
+ std::unique_ptr<QuicEventLoop> event_loop_;
std::unique_ptr<MockableQuicClient> client_; // The actual client
QuicSpdyClientStream* latest_created_stream_;
std::map<QuicStreamId, QuicSpdyClientStream*> open_streams_;
@@ -395,11 +405,11 @@ class QuicTestClient : public QuicSpdyStream::Visitor,
bool response_complete_;
bool response_headers_complete_;
- mutable spdy::SpdyHeaderBlock preliminary_headers_;
- mutable spdy::SpdyHeaderBlock response_headers_;
+ mutable spdy::Http2HeaderBlock preliminary_headers_;
+ mutable spdy::Http2HeaderBlock response_headers_;
// Parsed response trailers (if present), copied from the stream in OnClose.
- spdy::SpdyHeaderBlock response_trailers_;
+ spdy::Http2HeaderBlock response_trailers_;
spdy::SpdyPriority priority_;
std::string response_;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc
index 53068df9665..b8499ffc360 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.cc
@@ -8,8 +8,8 @@
#include "absl/memory/memory.h"
#include "absl/strings/string_view.h"
-#include "quiche/quic/core/quic_epoll_alarm_factory.h"
-#include "quiche/quic/core/quic_epoll_connection_helper.h"
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+#include "quiche/quic/core/quic_default_connection_helper.h"
#include "quiche/quic/tools/quic_simple_crypto_server_stream_helper.h"
#include "quiche/quic/tools/quic_simple_dispatcher.h"
#include "quiche/quic/tools/quic_simple_server_session.h"
@@ -178,11 +178,10 @@ QuicTestServer::QuicTestServer(
QuicDispatcher* QuicTestServer::CreateQuicDispatcher() {
return new QuicTestDispatcher(
&config(), &crypto_config(), version_manager(),
- std::make_unique<QuicEpollConnectionHelper>(epoll_server(),
- QuicAllocator::BUFFER_POOL),
+ std::make_unique<QuicDefaultConnectionHelper>(),
std::unique_ptr<QuicCryptoServerStreamBase::Helper>(
new QuicSimpleCryptoServerStreamHelper()),
- std::make_unique<QuicEpollAlarmFactory>(epoll_server()), server_backend(),
+ event_loop()->CreateAlarmFactory(), server_backend(),
expected_server_connection_id_length());
}
@@ -200,6 +199,18 @@ void QuicTestServer::SetCryptoStreamFactory(CryptoStreamFactory* factory) {
->SetCryptoStreamFactory(factory);
}
+void QuicTestServer::SetEventLoopFactory(QuicEventLoopFactory* factory) {
+ event_loop_factory_ = factory;
+}
+
+std::unique_ptr<QuicEventLoop> QuicTestServer::CreateEventLoop() {
+ QuicEventLoopFactory* factory = event_loop_factory_;
+ if (factory == nullptr) {
+ factory = GetDefaultEventLoop();
+ }
+ return factory->Create(QuicDefaultClock::Get());
+}
+
/////////////////////////// TEST SESSIONS ///////////////////////////////
ImmediateGoAwaySession::ImmediateGoAwaySession(
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.h
index f986bdc3872..c0be6f0cf62 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_server.h
@@ -88,6 +88,15 @@ class QuicTestServer : public QuicServer {
// Sets a custom crypto stream factory, owned by the caller, for easy custom
// crypto logic. This is incompatible with setting a session factory.
void SetCryptoStreamFactory(CryptoStreamFactory* factory);
+
+ // Sets the override for the default event loop factory used by the server.
+ void SetEventLoopFactory(QuicEventLoopFactory* factory);
+
+ protected:
+ std::unique_ptr<QuicEventLoop> CreateEventLoop() override;
+
+ private:
+ QuicEventLoopFactory* event_loop_factory_ = nullptr;
};
// Useful test sessions for the QuicTestServer.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc
index 6582ee715f8..39ba0a737b4 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.cc
@@ -455,6 +455,8 @@ MockQuicConnectionHelper::~MockQuicConnectionHelper() {}
const QuicClock* MockQuicConnectionHelper::GetClock() const { return &clock_; }
+QuicClock* MockQuicConnectionHelper::GetClock() { return &clock_; }
+
QuicRandom* MockQuicConnectionHelper::GetRandomGenerator() {
return &random_generator_;
}
@@ -483,8 +485,8 @@ void MockQuicConnectionHelper::AdvanceTime(QuicTime::Delta delta) {
clock_.AdvanceTime(delta);
}
-MockQuicConnection::MockQuicConnection(MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory,
+MockQuicConnection::MockQuicConnection(QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory,
Perspective perspective)
: MockQuicConnection(TestConnectionId(),
QuicSocketAddress(TestPeerIPAddress(), kTestPort),
@@ -492,16 +494,16 @@ MockQuicConnection::MockQuicConnection(MockQuicConnectionHelper* helper,
ParsedVersionOfIndex(CurrentSupportedVersions(), 0)) {}
MockQuicConnection::MockQuicConnection(QuicSocketAddress address,
- MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory,
+ QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory,
Perspective perspective)
: MockQuicConnection(TestConnectionId(), address, helper, alarm_factory,
perspective,
ParsedVersionOfIndex(CurrentSupportedVersions(), 0)) {}
MockQuicConnection::MockQuicConnection(QuicConnectionId connection_id,
- MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory,
+ QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory,
Perspective perspective)
: MockQuicConnection(connection_id,
QuicSocketAddress(TestPeerIPAddress(), kTestPort),
@@ -509,7 +511,7 @@ MockQuicConnection::MockQuicConnection(QuicConnectionId connection_id,
ParsedVersionOfIndex(CurrentSupportedVersions(), 0)) {}
MockQuicConnection::MockQuicConnection(
- MockQuicConnectionHelper* helper, MockAlarmFactory* alarm_factory,
+ QuicConnectionHelperInterface* helper, QuicAlarmFactory* alarm_factory,
Perspective perspective, const ParsedQuicVersionVector& supported_versions)
: MockQuicConnection(
TestConnectionId(), QuicSocketAddress(TestPeerIPAddress(), kTestPort),
@@ -517,7 +519,7 @@ MockQuicConnection::MockQuicConnection(
MockQuicConnection::MockQuicConnection(
QuicConnectionId connection_id, QuicSocketAddress initial_peer_address,
- MockQuicConnectionHelper* helper, MockAlarmFactory* alarm_factory,
+ QuicConnectionHelperInterface* helper, QuicAlarmFactory* alarm_factory,
Perspective perspective, const ParsedQuicVersionVector& supported_versions)
: QuicConnection(
connection_id,
@@ -546,19 +548,24 @@ bool MockQuicConnection::OnProtocolVersionMismatch(
return false;
}
-PacketSavingConnection::PacketSavingConnection(MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory,
- Perspective perspective)
+PacketSavingConnection::PacketSavingConnection(
+ QuicConnectionHelperInterface* helper, QuicAlarmFactory* alarm_factory,
+ Perspective perspective)
: MockQuicConnection(helper, alarm_factory, perspective) {}
PacketSavingConnection::PacketSavingConnection(
- MockQuicConnectionHelper* helper, MockAlarmFactory* alarm_factory,
+ QuicConnectionHelperInterface* helper, QuicAlarmFactory* alarm_factory,
Perspective perspective, const ParsedQuicVersionVector& supported_versions)
: MockQuicConnection(helper, alarm_factory, perspective,
supported_versions) {}
PacketSavingConnection::~PacketSavingConnection() {}
+SerializedPacketFate PacketSavingConnection::GetSerializedPacketFate(
+ bool /*is_mtu_discovery*/, EncryptionLevel /*encryption_level*/) {
+ return SEND_TO_WRITER;
+}
+
void PacketSavingConnection::SendOrQueuePacket(SerializedPacket packet) {
encrypted_packets_.push_back(std::make_unique<QuicEncryptedPacket>(
CopyBuffer(packet), packet.encrypted_length, true));
@@ -766,9 +773,9 @@ TestPushPromiseDelegate::TestPushPromiseDelegate(bool match)
: match_(match), rendezvous_fired_(false), rendezvous_stream_(nullptr) {}
bool TestPushPromiseDelegate::CheckVary(
- const spdy::SpdyHeaderBlock& /*client_request*/,
- const spdy::SpdyHeaderBlock& /*promise_request*/,
- const spdy::SpdyHeaderBlock& /*promise_response*/) {
+ const spdy::Http2HeaderBlock& /*client_request*/,
+ const spdy::Http2HeaderBlock& /*promise_request*/,
+ const spdy::Http2HeaderBlock& /*promise_response*/) {
QUIC_DVLOG(1) << "match " << match_;
return match_;
}
@@ -903,8 +910,8 @@ QuicEncryptedPacket* ConstructEncryptedPacket(
ParsedQuicVersion version = (*versions)[0];
if (QuicVersionHasLongHeaderLengths(version.transport_version) &&
version_flag) {
- header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
QuicFrames frames;
@@ -968,8 +975,8 @@ std::unique_ptr<QuicEncryptedPacket> GetUndecryptableEarlyPacket(
header.packet_number = QuicPacketNumber(33);
header.long_packet_type = ZERO_RTT_PROTECTED;
if (version.HasLongHeaderLengths()) {
- header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
QuicFrames frames;
@@ -1022,8 +1029,8 @@ QuicEncryptedPacket* ConstructMisFramedEncryptedPacket(
header.packet_number = QuicPacketNumber(packet_number);
if (QuicVersionHasLongHeaderLengths(version.transport_version) &&
version_flag) {
- header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
- header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ header.retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ header.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
QuicFrame frame(QuicStreamFrame(1, false, 0, absl::string_view(data)));
QuicFrames frames;
@@ -1120,7 +1127,7 @@ QuicCryptoClientStreamPeer::GetHandshaker(QuicCryptoClientStream* stream) {
void CreateClientSessionForTest(
QuicServerId server_id, QuicTime::Delta connection_start_time,
const ParsedQuicVersionVector& supported_versions,
- MockQuicConnectionHelper* helper, MockAlarmFactory* alarm_factory,
+ QuicConnectionHelperInterface* helper, QuicAlarmFactory* alarm_factory,
QuicCryptoClientConfig* crypto_client_config,
PacketSavingConnection** client_connection,
TestQuicSpdyClientSession** client_session) {
@@ -1143,7 +1150,7 @@ void CreateClientSessionForTest(
void CreateServerSessionForTest(
QuicServerId /*server_id*/, QuicTime::Delta connection_start_time,
ParsedQuicVersionVector supported_versions,
- MockQuicConnectionHelper* helper, MockAlarmFactory* alarm_factory,
+ QuicConnectionHelperInterface* helper, QuicAlarmFactory* alarm_factory,
QuicCryptoServerConfig* server_crypto_config,
QuicCompressedCertsCache* compressed_certs_cache,
PacketSavingConnection** server_connection,
@@ -1363,6 +1370,7 @@ WriteResult TestPacketWriter::WritePacket(const char* buffer, size_t buf_len,
}
last_packet_size_ = packet.length();
+ total_bytes_written_ += packet.length();
last_packet_header_ = framer_.header();
if (!framer_.connection_close_frames().empty()) {
++connection_close_packets_;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h
index 0e2c20c509e..af9cf2c41e3 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h
@@ -14,11 +14,13 @@
#include <vector>
#include "absl/container/flat_hash_map.h"
+#include "absl/strings/ascii.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "quiche/quic/core/congestion_control/loss_detection_interface.h"
#include "quiche/quic/core/congestion_control/send_algorithm_interface.h"
#include "quiche/quic/core/crypto/transport_parameters.h"
+#include "quiche/quic/core/http/http_decoder.h"
#include "quiche/quic/core/http/quic_client_push_promise_index.h"
#include "quiche/quic/core/http/quic_server_session_base.h"
#include "quiche/quic/core/http/quic_spdy_session.h"
@@ -41,6 +43,7 @@
#include "quiche/quic/test_tools/simple_quic_framer.h"
#include "quiche/common/quiche_mem_slice_storage.h"
#include "quiche/common/simple_buffer_allocator.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -475,7 +478,7 @@ class MockQuicConnectionVisitor : public QuicConnectionVisitorInterface {
(const QuicNewConnectionIdFrame& frame), (override));
MOCK_METHOD(void, SendRetireConnectionId, (uint64_t sequence_number),
(override));
- MOCK_METHOD(void, OnServerConnectionIdIssued,
+ MOCK_METHOD(bool, MaybeReserveConnectionId,
(const QuicConnectionId& server_connection_id), (override));
MOCK_METHOD(void, OnServerConnectionIdRetired,
(const QuicConnectionId& server_connection_id), (override));
@@ -514,6 +517,7 @@ class MockQuicConnectionHelper : public QuicConnectionHelperInterface {
MockQuicConnectionHelper& operator=(const MockQuicConnectionHelper&) = delete;
~MockQuicConnectionHelper() override;
const QuicClock* GetClock() const override;
+ QuicClock* GetClock();
QuicRandom* GetRandomGenerator() override;
quiche::QuicheBufferAllocator* GetStreamSendBufferAllocator() override;
void AdvanceTime(QuicTime::Delta delta);
@@ -578,36 +582,35 @@ class TestAlarmFactory : public QuicAlarmFactory {
class MockQuicConnection : public QuicConnection {
public:
// Uses a ConnectionId of 42 and 127.0.0.1:123.
- MockQuicConnection(MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory, Perspective perspective);
+ MockQuicConnection(QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory, Perspective perspective);
// Uses a ConnectionId of 42.
MockQuicConnection(QuicSocketAddress address,
- MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory, Perspective perspective);
+ QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory, Perspective perspective);
// Uses 127.0.0.1:123.
MockQuicConnection(QuicConnectionId connection_id,
- MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory, Perspective perspective);
+ QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory, Perspective perspective);
// Uses a ConnectionId of 42, and 127.0.0.1:123.
- MockQuicConnection(MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory, Perspective perspective,
+ MockQuicConnection(QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory, Perspective perspective,
const ParsedQuicVersionVector& supported_versions);
MockQuicConnection(QuicConnectionId connection_id, QuicSocketAddress address,
- MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory, Perspective perspective,
+ QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory, Perspective perspective,
const ParsedQuicVersionVector& supported_versions);
MockQuicConnection(const MockQuicConnection&) = delete;
MockQuicConnection& operator=(const MockQuicConnection&) = delete;
~MockQuicConnection() override;
- // If the constructor that uses a MockQuicConnectionHelper has been used then
- // this method
- // will advance the time of the MockClock.
+ // If the constructor that uses a QuicConnectionHelperInterface has been used
+ // then this method will advance the time of the MockClock.
void AdvanceTime(QuicTime::Delta delta);
MOCK_METHOD(void, ProcessUdpPacket,
@@ -689,6 +692,7 @@ class MockQuicConnection : public QuicConnection {
}
bool OnProtocolVersionMismatch(ParsedQuicVersion version) override;
+ void OnIdleNetworkDetected() override {}
bool ReallySendControlFrame(const QuicFrame& frame) {
return QuicConnection::SendControlFrame(frame);
@@ -719,12 +723,12 @@ class MockQuicConnection : public QuicConnection {
class PacketSavingConnection : public MockQuicConnection {
public:
- PacketSavingConnection(MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory,
+ PacketSavingConnection(QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory,
Perspective perspective);
- PacketSavingConnection(MockQuicConnectionHelper* helper,
- MockAlarmFactory* alarm_factory,
+ PacketSavingConnection(QuicConnectionHelperInterface* helper,
+ QuicAlarmFactory* alarm_factory,
Perspective perspective,
const ParsedQuicVersionVector& supported_versions);
PacketSavingConnection(const PacketSavingConnection&) = delete;
@@ -732,6 +736,9 @@ class PacketSavingConnection : public MockQuicConnection {
~PacketSavingConnection() override;
+ SerializedPacketFate GetSerializedPacketFate(
+ bool is_mtu_discovery, EncryptionLevel encryption_level) override;
+
void SendOrQueuePacket(SerializedPacket packet) override;
MOCK_METHOD(void, OnPacketSent, (EncryptionLevel, TransmissionType));
@@ -1002,7 +1009,7 @@ class MockHttp3DebugVisitor : public Http3DebugVisitor {
MOCK_METHOD(void, OnDataFrameSent, (QuicStreamId, QuicByteCount), (override));
MOCK_METHOD(void, OnHeadersFrameSent,
- (QuicStreamId, const spdy::SpdyHeaderBlock&), (override));
+ (QuicStreamId, const spdy::Http2HeaderBlock&), (override));
};
class TestQuicSpdyServerSession : public QuicServerSessionBase {
@@ -1073,9 +1080,9 @@ class TestPushPromiseDelegate : public QuicClientPushPromiseIndex::Delegate {
// fields match for promise request and client request.
explicit TestPushPromiseDelegate(bool match);
- bool CheckVary(const spdy::SpdyHeaderBlock& client_request,
- const spdy::SpdyHeaderBlock& promise_request,
- const spdy::SpdyHeaderBlock& promise_response) override;
+ bool CheckVary(const spdy::Http2HeaderBlock& client_request,
+ const spdy::Http2HeaderBlock& promise_request,
+ const spdy::Http2HeaderBlock& promise_response) override;
void OnRendezvousResult(QuicSpdyStream* stream) override;
@@ -1429,12 +1436,61 @@ class MockQuicPathValidationResultDelegate
: public QuicPathValidator::ResultDelegate {
public:
MOCK_METHOD(void, OnPathValidationSuccess,
- (std::unique_ptr<QuicPathValidationContext>), (override));
+ (std::unique_ptr<QuicPathValidationContext>, QuicTime),
+ (override));
MOCK_METHOD(void, OnPathValidationFailure,
(std::unique_ptr<QuicPathValidationContext>), (override));
};
+class MockHttpDecoderVisitor : public HttpDecoder::Visitor {
+ public:
+ ~MockHttpDecoderVisitor() override = default;
+
+ // Called if an error is detected.
+ MOCK_METHOD(void, OnError, (HttpDecoder*), (override));
+
+ MOCK_METHOD(bool, OnMaxPushIdFrame, (), (override));
+ MOCK_METHOD(bool, OnGoAwayFrame, (const GoAwayFrame& frame), (override));
+ MOCK_METHOD(bool, OnSettingsFrameStart, (QuicByteCount header_length),
+ (override));
+ MOCK_METHOD(bool, OnSettingsFrame, (const SettingsFrame& frame), (override));
+
+ MOCK_METHOD(bool, OnDataFrameStart,
+ (QuicByteCount header_length, QuicByteCount payload_length),
+ (override));
+ MOCK_METHOD(bool, OnDataFramePayload, (absl::string_view payload),
+ (override));
+ MOCK_METHOD(bool, OnDataFrameEnd, (), (override));
+
+ MOCK_METHOD(bool, OnHeadersFrameStart,
+ (QuicByteCount header_length, QuicByteCount payload_length),
+ (override));
+ MOCK_METHOD(bool, OnHeadersFramePayload, (absl::string_view payload),
+ (override));
+ MOCK_METHOD(bool, OnHeadersFrameEnd, (), (override));
+
+ MOCK_METHOD(bool, OnPriorityUpdateFrameStart, (QuicByteCount header_length),
+ (override));
+ MOCK_METHOD(bool, OnPriorityUpdateFrame, (const PriorityUpdateFrame& frame),
+ (override));
+
+ MOCK_METHOD(bool, OnAcceptChFrameStart, (QuicByteCount header_length),
+ (override));
+ MOCK_METHOD(bool, OnAcceptChFrame, (const AcceptChFrame& frame), (override));
+ MOCK_METHOD(void, OnWebTransportStreamFrameType,
+ (QuicByteCount header_length, WebTransportSessionId session_id),
+ (override));
+
+ MOCK_METHOD(bool, OnUnknownFrameStart,
+ (uint64_t frame_type, QuicByteCount header_length,
+ QuicByteCount payload_length),
+ (override));
+ MOCK_METHOD(bool, OnUnknownFramePayload, (absl::string_view payload),
+ (override));
+ MOCK_METHOD(bool, OnUnknownFrameEnd, (), (override));
+};
+
class QuicCryptoClientStreamPeer {
public:
QuicCryptoClientStreamPeer() = delete;
@@ -1461,7 +1517,7 @@ class QuicCryptoClientStreamPeer {
void CreateClientSessionForTest(
QuicServerId server_id, QuicTime::Delta connection_start_time,
const ParsedQuicVersionVector& supported_versions,
- MockQuicConnectionHelper* helper, MockAlarmFactory* alarm_factory,
+ QuicConnectionHelperInterface* helper, QuicAlarmFactory* alarm_factory,
QuicCryptoClientConfig* crypto_client_config,
PacketSavingConnection** client_connection,
TestQuicSpdyClientSession** client_session);
@@ -1484,7 +1540,7 @@ void CreateClientSessionForTest(
void CreateServerSessionForTest(
QuicServerId server_id, QuicTime::Delta connection_start_time,
ParsedQuicVersionVector supported_versions,
- MockQuicConnectionHelper* helper, MockAlarmFactory* alarm_factory,
+ QuicConnectionHelperInterface* helper, QuicAlarmFactory* alarm_factory,
QuicCryptoServerConfig* server_crypto_config,
QuicCompressedCertsCache* compressed_certs_cache,
PacketSavingConnection** server_connection,
@@ -1859,7 +1915,9 @@ class TestPacketWriter : public QuicPacketWriter {
return framer_.coalesced_packet();
}
- size_t last_packet_size() { return last_packet_size_; }
+ size_t last_packet_size() const { return last_packet_size_; }
+
+ size_t total_bytes_written() const { return total_bytes_written_; }
const QuicPacketHeader& last_packet_header() const {
return last_packet_header_;
@@ -1934,6 +1992,7 @@ class TestPacketWriter : public QuicPacketWriter {
ParsedQuicVersion version_;
SimpleQuicFramer framer_;
size_t last_packet_size_ = 0;
+ size_t total_bytes_written_ = 0;
QuicPacketHeader last_packet_header_;
bool write_blocked_ = false;
bool write_should_fail_ = false;
@@ -2025,6 +2084,18 @@ class SavingHttp3DatagramVisitor : public QuicSpdyStream::Http3DatagramVisitor {
std::vector<SavedHttp3Datagram> received_h3_datagrams_;
};
+inline std::string EscapeTestParamName(absl::string_view name) {
+ std::string result(name);
+ // Escape all characters that are not allowed by gtest ([a-zA-Z0-9_]).
+ for (char& c : result) {
+ bool valid = absl::ascii_isalnum(c) || c == '_';
+ if (!valid) {
+ c = '_';
+ }
+ }
+ return result;
+}
+
} // namespace test
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.cc
index 7e8ab1ef873..c0d32ea40d5 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.cc
@@ -4,6 +4,7 @@
#include "quiche/quic/test_tools/server_thread.h"
+#include "quiche/quic/core/quic_default_clock.h"
#include "quiche/quic/core/quic_dispatcher.h"
#include "quiche/quic/test_tools/crypto_test_utils.h"
#include "quiche/quic/test_tools/quic_dispatcher_peer.h"
@@ -16,7 +17,7 @@ ServerThread::ServerThread(std::unique_ptr<QuicServer> server,
const QuicSocketAddress& address)
: QuicThread("server_thread"),
server_(std::move(server)),
- clock_(server_->epoll_server()),
+ clock_(QuicDefaultClock::Get()),
address_(address),
port_(0),
initialized_(false) {}
@@ -27,8 +28,9 @@ void ServerThread::Initialize() {
if (initialized_) {
return;
}
-
- server_->CreateUDPSocketAndListen(address_);
+ if (!server_->CreateUDPSocketAndListen(address_)) {
+ return;
+ }
QuicWriterMutexLock lock(&port_lock_);
port_ = server_->port();
@@ -72,8 +74,8 @@ void ServerThread::WaitForCryptoHandshakeConfirmed() {
bool ServerThread::WaitUntil(std::function<bool()> termination_predicate,
QuicTime::Delta timeout) {
- const QuicTime deadline = clock_.Now() + timeout;
- while (clock_.Now() < deadline) {
+ const QuicTime deadline = clock_->Now() + timeout;
+ while (clock_->Now() < deadline) {
QuicNotification done_checking;
bool should_terminate = false;
Schedule([&] {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.h
index fc534679ae6..c29d6331aab 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/server_thread.h
@@ -8,7 +8,6 @@
#include <memory>
#include "quiche/quic/core/quic_config.h"
-#include "quiche/quic/core/quic_epoll_clock.h"
#include "quiche/quic/platform/api/quic_mutex.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/platform/api/quic_thread.h"
@@ -79,7 +78,7 @@ class ServerThread : public QuicThread {
QuicNotification quit_; // Notified when the server should quit.
std::unique_ptr<QuicServer> server_;
- QuicEpollClock clock_;
+ QuicClock* clock_;
QuicSocketAddress address_;
mutable QuicMutex port_lock_;
int port_ QUIC_GUARDED_BY(port_lock_);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.cc
index 123eb6e8e9a..7a2e7058156 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.cc
@@ -37,6 +37,12 @@ SimpleSessionNotifier::StreamState::~StreamState() {}
QuicConsumedData SimpleSessionNotifier::WriteOrBufferData(
QuicStreamId id, QuicByteCount data_length, StreamSendingState state) {
+ return WriteOrBufferData(id, data_length, state, NOT_RETRANSMISSION);
+}
+
+QuicConsumedData SimpleSessionNotifier::WriteOrBufferData(
+ QuicStreamId id, QuicByteCount data_length, StreamSendingState state,
+ TransmissionType transmission_type) {
if (!stream_map_.contains(id)) {
stream_map_[id] = StreamState();
}
@@ -53,7 +59,7 @@ QuicConsumedData SimpleSessionNotifier::WriteOrBufferData(
return {0, false};
}
const size_t length = stream_state.bytes_total - stream_state.bytes_sent;
- connection_->SetTransmissionType(NOT_RETRANSMISSION);
+ connection_->SetTransmissionType(transmission_type);
QuicConsumedData consumed =
connection_->SendStreamData(id, length, stream_state.bytes_sent, state);
QUIC_DVLOG(1) << "consumed: " << consumed;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.h
index e846499e26b..f1af586ed15 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simple_session_notifier.h
@@ -28,6 +28,9 @@ class SimpleSessionNotifier : public SessionNotifierInterface {
// Tries to write stream data and returns data consumed.
QuicConsumedData WriteOrBufferData(QuicStreamId id, QuicByteCount data_length,
StreamSendingState state);
+ QuicConsumedData WriteOrBufferData(QuicStreamId id, QuicByteCount data_length,
+ StreamSendingState state,
+ TransmissionType transmission_type);
// Tries to write RST_STREAM_FRAME.
void WriteOrBufferRstStream(QuicStreamId id, QuicRstStreamErrorCode error,
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.h
index d3741c50615..7654d89f64d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/quic_endpoint.h
@@ -74,8 +74,10 @@ class QuicEndpoint : public QuicEndpointBase,
void SendNewConnectionId(const QuicNewConnectionIdFrame& /*frame*/) override {
}
void SendRetireConnectionId(uint64_t /*sequence_number*/) override {}
- void OnServerConnectionIdIssued(
- const QuicConnectionId& /*server_connection_id*/) override {}
+ bool MaybeReserveConnectionId(
+ const QuicConnectionId& /*server_connection_id*/) override {
+ return true;
+ }
void OnServerConnectionIdRetired(
const QuicConnectionId& /*server_connection_id*/) override {}
bool AllowSelfAddressChange() const override;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/test_harness.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/test_harness.cc
new file mode 100644
index 00000000000..e3af48e2201
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/test_harness.cc
@@ -0,0 +1,35 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/test_tools/simulator/test_harness.h"
+
+#include "quiche/quic/core/quic_connection.h"
+#include "quiche/quic/core/quic_versions.h"
+#include "quiche/quic/test_tools/quic_test_utils.h"
+#include "quiche/quic/test_tools/simulator/quic_endpoint_base.h"
+
+namespace quic::simulator {
+
+QuicEndpointWithConnection::QuicEndpointWithConnection(
+ Simulator* simulator, const std::string& name, const std::string& peer_name,
+ Perspective perspective, const ParsedQuicVersionVector& supported_versions)
+ : QuicEndpointBase(simulator, name, peer_name) {
+ connection_ = std::make_unique<QuicConnection>(
+ quic::test::TestConnectionId(0x10), GetAddressFromName(name),
+ GetAddressFromName(peer_name), simulator, simulator->GetAlarmFactory(),
+ &writer_,
+ /*owns_writer=*/false, perspective, supported_versions);
+ connection_->SetSelfAddress(GetAddressFromName(name));
+}
+
+TestHarness::TestHarness() : switch_(&simulator_, "Switch", 8, 2 * kBdp) {}
+
+void TestHarness::WireUpEndpoints() {
+ client_link_.emplace(client_, switch_.port(1), kClientBandwidth,
+ kClientPropagationDelay);
+ server_link_.emplace(server_, switch_.port(2), kServerBandwidth,
+ kServerPropagationDelay);
+}
+
+} // namespace quic::simulator
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/test_harness.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/test_harness.h
new file mode 100644
index 00000000000..681cfa3fa4e
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/simulator/test_harness.h
@@ -0,0 +1,83 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TEST_HARNESS_H_
+#define QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TEST_HARNESS_H_
+
+#include <memory>
+
+#include "absl/types/optional.h"
+#include "quiche/quic/core/quic_constants.h"
+#include "quiche/quic/core/quic_versions.h"
+#include "quiche/quic/test_tools/simulator/link.h"
+#include "quiche/quic/test_tools/simulator/port.h"
+#include "quiche/quic/test_tools/simulator/quic_endpoint_base.h"
+#include "quiche/quic/test_tools/simulator/simulator.h"
+#include "quiche/quic/test_tools/simulator/switch.h"
+
+namespace quic::simulator {
+
+// A subclass of QuicEndpointBase that creates the connection object for the
+// caller. Uses a fixed connection ID (0x10) and IP addresses derived from the
+// names supplied.
+class QuicEndpointWithConnection : public QuicEndpointBase {
+ public:
+ QuicEndpointWithConnection(Simulator* simulator, const std::string& name,
+ const std::string& peer_name,
+ Perspective perspective,
+ const ParsedQuicVersionVector& supported_versions);
+};
+
+// A test harness that provides a reasonable preset for running unit tests.
+class TestHarness {
+ public:
+ // The configuration of the test harness.
+ static constexpr QuicBandwidth kClientBandwidth =
+ QuicBandwidth::FromKBitsPerSecond(10000);
+ static constexpr QuicTime::Delta kClientPropagationDelay =
+ QuicTime::Delta::FromMilliseconds(2);
+ static constexpr QuicBandwidth kServerBandwidth =
+ QuicBandwidth::FromKBitsPerSecond(4000);
+ static constexpr QuicTime::Delta kServerPropagationDelay =
+ QuicTime::Delta::FromMilliseconds(50);
+ static constexpr QuicTime::Delta kTransferTime =
+ kClientBandwidth.TransferTime(kMaxOutgoingPacketSize) +
+ kServerBandwidth.TransferTime(kMaxOutgoingPacketSize);
+ static constexpr QuicTime::Delta kRtt =
+ (kClientPropagationDelay + kServerPropagationDelay + kTransferTime) * 2;
+ static constexpr QuicByteCount kBdp = kRtt * kServerBandwidth;
+
+ static constexpr QuicTime::Delta kDefaultTimeout =
+ QuicTime::Delta::FromSeconds(3);
+
+ TestHarness();
+
+ Simulator& simulator() { return simulator_; }
+ void set_client(Endpoint* client) { client_ = client; }
+ void set_server(Endpoint* server) { server_ = server; }
+
+ // Connects |client_| and |server_| to a virtual switch; must be called after
+ // set_client/set_server are called.
+ void WireUpEndpoints();
+
+ // A convenience wrapper around Simulator::RunUntilOrTimeout().
+ template <class TerminationPredicate>
+ bool RunUntilWithDefaultTimeout(TerminationPredicate termination_predicate) {
+ return simulator_.RunUntilOrTimeout(std::move(termination_predicate),
+ kDefaultTimeout);
+ }
+
+ private:
+ Simulator simulator_;
+ Switch switch_;
+ absl::optional<SymmetricLink> client_link_;
+ absl::optional<SymmetricLink> server_link_;
+
+ Endpoint* client_;
+ Endpoint* server_;
+};
+
+} // namespace quic::simulator
+
+#endif // QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TEST_HARNESS_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.cc b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.cc
index aa48dd60924..63bb8422bd2 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.cc
@@ -36,7 +36,7 @@ class ResetsVisitor : public WebTransportVisitor {
public:
ResetsVisitor(WebTransportSession* session) : session_(session) {}
- void OnSessionReady(const spdy::SpdyHeaderBlock& /*headers*/) override {}
+ void OnSessionReady(const spdy::Http2HeaderBlock& /*headers*/) override {}
void OnSessionClosed(WebTransportSessionError /*error_code*/,
const std::string& /*error_message*/) override {}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.h
index d3b490c2beb..c5ffbe0df7a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_resets_backend.h
@@ -6,6 +6,7 @@
#define QUICHE_QUIC_TEST_TOOLS_WEB_TRANSPORT_RESETS_BACKEND_H_
#include "quiche/quic/test_tools/quic_test_backend.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
namespace test {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_test_tools.h b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_test_tools.h
index 3a4603c57cd..353b48f14a7 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_test_tools.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/test_tools/web_transport_test_tools.h
@@ -7,13 +7,15 @@
#include "quiche/quic/core/web_transport_interface.h"
#include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
namespace test {
class MockWebTransportSessionVisitor : public WebTransportVisitor {
public:
- MOCK_METHOD(void, OnSessionReady, (const spdy::SpdyHeaderBlock&), (override));
+ MOCK_METHOD(void, OnSessionReady, (const spdy::Http2HeaderBlock&),
+ (override));
MOCK_METHOD(void, OnSessionClosed,
(WebTransportSessionError, const std::string&), (override));
MOCK_METHOD(void, OnIncomingBidirectionalStreamAvailable, (), (override));
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_server_backend.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_server_backend.cc
new file mode 100644
index 00000000000..baee9c165c4
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_server_backend.cc
@@ -0,0 +1,133 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/tools/connect_server_backend.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "absl/container/flat_hash_set.h"
+#include "absl/strings/string_view.h"
+#include "quiche/quic/core/io/socket_factory.h"
+#include "quiche/quic/tools/connect_tunnel.h"
+#include "quiche/quic/tools/quic_simple_server_backend.h"
+#include "quiche/common/platform/api/quiche_bug_tracker.h"
+#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/spdy/core/http2_header_block.h"
+
+namespace quic {
+
+namespace {
+
+void SendErrorResponse(QuicSimpleServerBackend::RequestHandler* request_handler,
+ absl::string_view error_code) {
+ spdy::Http2HeaderBlock headers;
+ headers[":status"] = error_code;
+ QuicBackendResponse response;
+ response.set_headers(std::move(headers));
+ request_handler->OnResponseBackendComplete(&response);
+}
+
+} // namespace
+
+ConnectServerBackend::ConnectServerBackend(
+ std::unique_ptr<QuicSimpleServerBackend> non_connect_backend,
+ absl::flat_hash_set<ConnectTunnel::HostAndPort> acceptable_destinations)
+ : non_connect_backend_(std::move(non_connect_backend)),
+ acceptable_destinations_(std::move(acceptable_destinations)) {
+ QUICHE_DCHECK(non_connect_backend_);
+}
+
+ConnectServerBackend::~ConnectServerBackend() {
+ // Expect all streams to be closed before destroying backend.
+ QUICHE_DCHECK(tunnels_.empty());
+}
+
+bool ConnectServerBackend::InitializeBackend(const std::string&) {
+ return true;
+}
+
+bool ConnectServerBackend::IsBackendInitialized() const { return true; }
+
+void ConnectServerBackend::SetSocketFactory(SocketFactory* socket_factory) {
+ QUICHE_DCHECK_NE(socket_factory_, socket_factory);
+ QUICHE_DCHECK(tunnels_.empty());
+ socket_factory_ = socket_factory;
+}
+
+void ConnectServerBackend::FetchResponseFromBackend(
+ const spdy::Http2HeaderBlock& request_headers,
+ const std::string& request_body, RequestHandler* request_handler) {
+ // Not a CONNECT request, so send to `non_connect_backend_`.
+ non_connect_backend_->FetchResponseFromBackend(request_headers, request_body,
+ request_handler);
+}
+
+void ConnectServerBackend::HandleConnectHeaders(
+ const spdy::Http2HeaderBlock& request_headers,
+ RequestHandler* request_handler) {
+ QUICHE_DCHECK(request_headers.contains(":method") &&
+ request_headers.find(":method")->second == "CONNECT");
+
+ if (!socket_factory_) {
+ QUICHE_BUG(connect_server_backend_no_socket_factory)
+ << "Must set socket factory before ConnectServerBackend receives "
+ "requests.";
+ SendErrorResponse(request_handler, "500");
+ return;
+ }
+
+ if (request_headers.contains(":protocol")) {
+ // Anything other than normal CONNECT not supported.
+ // TODO(ericorth): Add CONNECT-UDP support.
+ non_connect_backend_->HandleConnectHeaders(request_headers,
+ request_handler);
+ return;
+ }
+
+ auto [tunnel_it, inserted] = tunnels_.emplace(
+ request_handler->stream_id(),
+ std::make_unique<ConnectTunnel>(request_handler, socket_factory_,
+ acceptable_destinations_));
+ QUICHE_DCHECK(inserted);
+
+ tunnel_it->second->OpenTunnel(request_headers);
+}
+
+void ConnectServerBackend::HandleConnectData(absl::string_view data,
+ bool data_complete,
+ RequestHandler* request_handler) {
+ auto tunnel_it = tunnels_.find(request_handler->stream_id());
+ if (tunnel_it == tunnels_.end()) {
+ // If tunnel not found, perhaps it's something being handled for
+ // non-CONNECT. Possible because this method could be called for anything
+ // with a ":method":"CONNECT" header, but this class does not handle such
+ // requests if they have a ":protocol" header.
+ non_connect_backend_->HandleConnectData(data, data_complete,
+ request_handler);
+ return;
+ }
+
+ if (!data.empty()) {
+ tunnel_it->second->SendDataToDestination(data);
+ }
+ if (data_complete) {
+ tunnel_it->second->OnClientStreamClose();
+ tunnels_.erase(tunnel_it);
+ }
+}
+
+void ConnectServerBackend::CloseBackendResponseStream(
+ QuicSimpleServerBackend::RequestHandler* request_handler) {
+ auto tunnel_it = tunnels_.find(request_handler->stream_id());
+ if (tunnel_it != tunnels_.end()) {
+ tunnel_it->second->OnClientStreamClose();
+ tunnels_.erase(tunnel_it);
+ }
+
+ non_connect_backend_->CloseBackendResponseStream(request_handler);
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_server_backend.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_server_backend.h
new file mode 100644
index 00000000000..a1cd843b6f8
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_server_backend.h
@@ -0,0 +1,60 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_CONNECT_PROXY_CONNECT_SERVER_BACKEND_H_
+#define QUICHE_QUIC_CONNECT_PROXY_CONNECT_SERVER_BACKEND_H_
+
+#include <cstdint>
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "absl/container/flat_hash_map.h"
+#include "absl/container/flat_hash_set.h"
+#include "quiche/quic/core/io/socket_factory.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/quic/tools/connect_tunnel.h"
+#include "quiche/quic/tools/quic_simple_server_backend.h"
+
+namespace quic {
+
+// QUIC server backend that handles CONNECT requests. Non-CONNECT requests are
+// delegated to a separate backend.
+class ConnectServerBackend : public QuicSimpleServerBackend {
+ public:
+ ConnectServerBackend(
+ std::unique_ptr<QuicSimpleServerBackend> non_connect_backend,
+ absl::flat_hash_set<ConnectTunnel::HostAndPort> acceptable_destinations);
+
+ ConnectServerBackend(const ConnectServerBackend&) = delete;
+ ConnectServerBackend& operator=(const ConnectServerBackend&) = delete;
+
+ ~ConnectServerBackend() override;
+
+ // QuicSimpleServerBackend:
+ bool InitializeBackend(const std::string& backend_url) override;
+ bool IsBackendInitialized() const override;
+ void SetSocketFactory(SocketFactory* socket_factory) override;
+ void FetchResponseFromBackend(const spdy::Http2HeaderBlock& request_headers,
+ const std::string& request_body,
+ RequestHandler* request_handler) override;
+ void HandleConnectHeaders(const spdy::Http2HeaderBlock& request_headers,
+ RequestHandler* request_handler) override;
+ void HandleConnectData(absl::string_view data, bool data_complete,
+ RequestHandler* request_handler) override;
+ void CloseBackendResponseStream(
+ QuicSimpleServerBackend::RequestHandler* request_handler) override;
+
+ private:
+ std::unique_ptr<QuicSimpleServerBackend> non_connect_backend_;
+ const absl::flat_hash_set<ConnectTunnel::HostAndPort>
+ acceptable_destinations_;
+
+ SocketFactory* socket_factory_; // unowned
+ absl::flat_hash_map<QuicStreamId, std::unique_ptr<ConnectTunnel>> tunnels_;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CONNECT_PROXY_CONNECT_SERVER_BACKEND_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel.cc
new file mode 100644
index 00000000000..ef2a5eb00b9
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel.cc
@@ -0,0 +1,342 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/tools/connect_tunnel.h"
+
+#include <cstdint>
+#include <limits>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "absl/container/flat_hash_set.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
+#include "absl/types/span.h"
+#include "url/third_party/mozilla/url_parse.h"
+#include "quiche/quic/core/io/socket_factory.h"
+#include "quiche/quic/core/quic_error_codes.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/quic/tools/quic_backend_response.h"
+#include "quiche/quic/tools/quic_client.h"
+#include "quiche/quic/tools/quic_simple_server_backend.h"
+#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/platform/api/quiche_mem_slice.h"
+#include "quiche/spdy/core/http2_header_block.h"
+
+namespace quic {
+
+namespace {
+
+// Arbitrarily chosen. No effort has been made to figure out an optimal size.
+constexpr size_t kReadSize = 4 * 1024;
+
+absl::optional<ConnectTunnel::HostAndPort> ValidateAndParseAuthorityString(
+ absl::string_view authority_string) {
+ url::Component username_component;
+ url::Component password_component;
+ url::Component host_component;
+ url::Component port_component;
+
+ url::ParseAuthority(authority_string.data(),
+ url::Component(0, authority_string.size()),
+ &username_component, &password_component, &host_component,
+ &port_component);
+
+ // A valid CONNECT authority must contain host and port and nothing else, per
+ // https://www.rfc-editor.org/rfc/rfc9110.html#name-connect.
+ if (username_component.is_valid() || password_component.is_valid() ||
+ !host_component.is_nonempty() || !port_component.is_nonempty()) {
+ QUICHE_DVLOG(1) << "CONNECT request authority is malformed: "
+ << authority_string;
+ return absl::nullopt;
+ }
+
+ QUICHE_DCHECK_LT(static_cast<size_t>(host_component.end()),
+ authority_string.length());
+ if (authority_string.length() > 2 &&
+ authority_string.data()[host_component.begin] == '[' &&
+ authority_string.data()[host_component.end() - 1] == ']') {
+ // Strip "[]" off IPv6 literals.
+ host_component.begin += 1;
+ host_component.len -= 2;
+ }
+ std::string hostname(authority_string.data() + host_component.begin,
+ host_component.len);
+
+ int parsed_port_number =
+ url::ParsePort(authority_string.data(), port_component);
+ // Negative result is either invalid or unspecified, either of which is
+ // disallowed for a CONNECT authority. Port 0 is technically valid but
+ // reserved and not really usable in practice, so easiest to just disallow it
+ // here.
+ if (parsed_port_number <= 0) {
+ QUICHE_DVLOG(1) << "CONNECT request authority port is malformed: "
+ << authority_string;
+ return absl::nullopt;
+ }
+ QUICHE_DCHECK_LE(parsed_port_number, std::numeric_limits<uint16_t>::max());
+
+ return ConnectTunnel::HostAndPort(std::move(hostname),
+ static_cast<uint16_t>(parsed_port_number));
+}
+
+absl::optional<ConnectTunnel::HostAndPort> ValidateHeadersAndGetAuthority(
+ const spdy::Http2HeaderBlock& request_headers) {
+ QUICHE_DCHECK(request_headers.contains(":method"));
+ QUICHE_DCHECK(request_headers.find(":method")->second == "CONNECT");
+ QUICHE_DCHECK(!request_headers.contains(":protocol"));
+
+ auto scheme_it = request_headers.find(":scheme");
+ if (scheme_it != request_headers.end()) {
+ QUICHE_DVLOG(1) << "CONNECT request contains unexpected scheme: "
+ << scheme_it->second;
+ return absl::nullopt;
+ }
+
+ auto path_it = request_headers.find(":path");
+ if (path_it != request_headers.end()) {
+ QUICHE_DVLOG(1) << "CONNECT request contains unexpected path: "
+ << path_it->second;
+ return absl::nullopt;
+ }
+
+ auto authority_it = request_headers.find(":authority");
+ if (authority_it == request_headers.end() || authority_it->second.empty()) {
+ QUICHE_DVLOG(1) << "CONNECT request missing authority";
+ return absl::nullopt;
+ }
+
+ return ValidateAndParseAuthorityString(authority_it->second);
+}
+
+bool ValidateAuthority(const ConnectTunnel::HostAndPort& authority,
+ const absl::flat_hash_set<ConnectTunnel::HostAndPort>&
+ acceptable_destinations) {
+ if (acceptable_destinations.contains(authority)) {
+ return true;
+ }
+
+ QUICHE_DVLOG(1) << "CONNECT request authority: "
+ << absl::StrCat(authority.host, ":", authority.port)
+ << " is not an acceptable allow-listed destiation ";
+ return false;
+}
+
+} // namespace
+
+ConnectTunnel::HostAndPort::HostAndPort(std::string host, uint16_t port)
+ : host(std::move(host)), port(port) {}
+
+bool ConnectTunnel::HostAndPort::operator==(const HostAndPort& other) const {
+ return host == other.host && port == other.port;
+}
+
+ConnectTunnel::ConnectTunnel(
+ QuicSimpleServerBackend::RequestHandler* client_stream_request_handler,
+ SocketFactory* socket_factory,
+ absl::flat_hash_set<HostAndPort> acceptable_destinations)
+ : acceptable_destinations_(std::move(acceptable_destinations)),
+ socket_factory_(socket_factory),
+ client_stream_request_handler_(client_stream_request_handler) {
+ QUICHE_DCHECK(client_stream_request_handler_);
+ QUICHE_DCHECK(socket_factory_);
+}
+
+ConnectTunnel::~ConnectTunnel() {
+ // Expect client and destination sides of tunnel to both be closed before
+ // destruction.
+ QUICHE_DCHECK_EQ(client_stream_request_handler_, nullptr);
+ QUICHE_DCHECK(!IsConnectedToDestination());
+ QUICHE_DCHECK(!receive_started_);
+}
+
+void ConnectTunnel::OpenTunnel(const spdy::Http2HeaderBlock& request_headers) {
+ QUICHE_DCHECK(!IsConnectedToDestination());
+
+ absl::optional<HostAndPort> authority =
+ ValidateHeadersAndGetAuthority(request_headers);
+ if (!authority) {
+ TerminateClientStream(
+ "invalid request headers",
+ QuicResetStreamError::FromIetf(QuicHttp3ErrorCode::MESSAGE_ERROR));
+ return;
+ }
+
+ if (!ValidateAuthority(authority.value(), acceptable_destinations_)) {
+ TerminateClientStream(
+ "disallowed request authority",
+ QuicResetStreamError::FromIetf(QuicHttp3ErrorCode::REQUEST_REJECTED));
+ return;
+ }
+
+ QuicSocketAddress address = tools::LookupAddress(
+ AF_UNSPEC, authority->host, absl::StrCat(authority->port));
+ if (!address.IsInitialized()) {
+ TerminateClientStream("host resolution error");
+ return;
+ }
+
+ destination_socket_ =
+ socket_factory_->CreateTcpClientSocket(address,
+ /*receive_buffer_size=*/0,
+ /*send_buffer_size=*/0,
+ /*async_visitor=*/this);
+ QUICHE_DCHECK(destination_socket_);
+
+ absl::Status connect_result = destination_socket_->ConnectBlocking();
+ if (!connect_result.ok()) {
+ TerminateClientStream(
+ "error connecting TCP socket to destination server: " +
+ connect_result.ToString());
+ return;
+ }
+
+ QUICHE_DVLOG(1) << "CONNECT tunnel opened from stream "
+ << client_stream_request_handler_->stream_id() << " to "
+ << authority->host << ":" << authority->port;
+
+ SendConnectResponse();
+ BeginAsyncReadFromDestination();
+}
+
+bool ConnectTunnel::IsConnectedToDestination() const {
+ return !!destination_socket_;
+}
+
+void ConnectTunnel::SendDataToDestination(absl::string_view data) {
+ QUICHE_DCHECK(IsConnectedToDestination());
+ QUICHE_DCHECK(!data.empty());
+
+ absl::Status send_result =
+ destination_socket_->SendBlocking(std::string(data));
+ if (!send_result.ok()) {
+ TerminateClientStream("TCP error sending data to destination server: " +
+ send_result.ToString());
+ }
+}
+
+void ConnectTunnel::OnClientStreamClose() {
+ QUICHE_DCHECK(client_stream_request_handler_);
+
+ QUICHE_DVLOG(1) << "CONNECT stream "
+ << client_stream_request_handler_->stream_id() << " closed";
+
+ client_stream_request_handler_ = nullptr;
+
+ if (IsConnectedToDestination()) {
+ // TODO(ericorth): Consider just calling shutdown() on the socket rather
+ // than fully disconnecting in order to allow a graceful TCP FIN stream
+ // shutdown per
+ // https://www.rfc-editor.org/rfc/rfc9114.html#name-the-connect-method.
+ // Would require shutdown support in the socket library, and would need to
+ // deal with the tunnel/socket outliving the client stream.
+ destination_socket_->Disconnect();
+ }
+
+ // Clear socket pointer.
+ destination_socket_.reset();
+}
+
+void ConnectTunnel::ConnectComplete(absl::Status /*status*/) {
+ // Async connect not expected.
+ QUICHE_NOTREACHED();
+}
+
+void ConnectTunnel::ReceiveComplete(
+ absl::StatusOr<quiche::QuicheMemSlice> data) {
+ QUICHE_DCHECK(IsConnectedToDestination());
+ QUICHE_DCHECK(receive_started_);
+
+ receive_started_ = false;
+
+ if (!data.ok()) {
+ if (client_stream_request_handler_) {
+ TerminateClientStream("TCP error receiving data from destination server");
+ } else {
+ // This typically just means a receive operation was cancelled on calling
+ // destination_socket_->Disconnect().
+ QUICHE_DVLOG(1) << "TCP error receiving data from destination server "
+ "after stream already closed.";
+ }
+ return;
+ } else if (data.value().empty()) {
+ OnDestinationConnectionClosed();
+ return;
+ }
+
+ QUICHE_DCHECK(client_stream_request_handler_);
+ client_stream_request_handler_->SendStreamData(data.value().AsStringView(),
+ /*close_stream=*/false);
+
+ BeginAsyncReadFromDestination();
+}
+
+void ConnectTunnel::SendComplete(absl::Status /*status*/) {
+ // Async send not expected.
+ QUICHE_NOTREACHED();
+}
+
+void ConnectTunnel::BeginAsyncReadFromDestination() {
+ QUICHE_DCHECK(IsConnectedToDestination());
+ QUICHE_DCHECK(client_stream_request_handler_);
+ QUICHE_DCHECK(!receive_started_);
+
+ receive_started_ = true;
+ destination_socket_->ReceiveAsync(kReadSize);
+}
+
+void ConnectTunnel::OnDestinationConnectionClosed() {
+ QUICHE_DCHECK(IsConnectedToDestination());
+ QUICHE_DCHECK(client_stream_request_handler_);
+
+ QUICHE_DVLOG(1) << "CONNECT stream "
+ << client_stream_request_handler_->stream_id()
+ << " destination connection closed";
+ destination_socket_->Disconnect();
+
+ // Clear socket pointer.
+ destination_socket_.reset();
+
+ // Extra check that nothing in the Disconnect could lead to terminating the
+ // stream.
+ QUICHE_DCHECK(client_stream_request_handler_);
+
+ client_stream_request_handler_->SendStreamData("", /*close_stream=*/true);
+}
+
+void ConnectTunnel::SendConnectResponse() {
+ QUICHE_DCHECK(IsConnectedToDestination());
+ QUICHE_DCHECK(client_stream_request_handler_);
+
+ spdy::Http2HeaderBlock response_headers;
+ response_headers[":status"] = "200";
+
+ QuicBackendResponse response;
+ response.set_headers(std::move(response_headers));
+ // Need to leave the stream open after sending the CONNECT response.
+ response.set_response_type(QuicBackendResponse::INCOMPLETE_RESPONSE);
+
+ client_stream_request_handler_->OnResponseBackendComplete(&response);
+}
+
+void ConnectTunnel::TerminateClientStream(absl::string_view error_description,
+ QuicResetStreamError error_code) {
+ QUICHE_DCHECK(client_stream_request_handler_);
+
+ std::string error_description_str =
+ error_description.empty() ? ""
+ : absl::StrCat(" due to ", error_description);
+ QUICHE_DVLOG(1) << "Terminating CONNECT stream "
+ << client_stream_request_handler_->stream_id()
+ << " with error code " << error_code.ietf_application_code()
+ << error_description_str;
+
+ client_stream_request_handler_->TerminateStreamWithError(error_code);
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel.h
new file mode 100644
index 00000000000..d18d63fef13
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel.h
@@ -0,0 +1,102 @@
+// Copyright 2022 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.
+
+#ifndef QUICHE_QUIC_TOOLS_CONNECT_TUNNEL_H_
+#define QUICHE_QUIC_TOOLS_CONNECT_TUNNEL_H_
+
+#include <cstdint>
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "absl/container/flat_hash_set.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "quiche/quic/core/io/socket_factory.h"
+#include "quiche/quic/core/io/stream_client_socket.h"
+#include "quiche/quic/core/quic_error_codes.h"
+#include "quiche/quic/tools/quic_simple_server_backend.h"
+#include "quiche/common/platform/api/quiche_mem_slice.h"
+#include "quiche/spdy/core/http2_header_block.h"
+
+namespace quic {
+
+// Manages a single connection tunneled over a CONNECT proxy.
+class ConnectTunnel : public StreamClientSocket::AsyncVisitor {
+ public:
+ struct HostAndPort {
+ HostAndPort(std::string host, uint16_t port);
+
+ bool operator==(const HostAndPort& other) const;
+
+ template <typename H>
+ friend H AbslHashValue(H h, const HostAndPort& host_and_port) {
+ return H::combine(std::move(h), host_and_port.host, host_and_port.port);
+ }
+
+ std::string host;
+ uint16_t port;
+ };
+
+ // `client_stream_request_handler` and `socket_factory` must both outlive the
+ // created ConnectTunnel.
+ ConnectTunnel(
+ QuicSimpleServerBackend::RequestHandler* client_stream_request_handler,
+ SocketFactory* socket_factory,
+ absl::flat_hash_set<HostAndPort> acceptable_destinations);
+ ~ConnectTunnel();
+ ConnectTunnel(const ConnectTunnel&) = delete;
+ ConnectTunnel& operator=(const ConnectTunnel&) = delete;
+
+ // Attempts to open TCP connection to destination server and then sends
+ // appropriate success/error response to the request stream. `request_headers`
+ // must represent headers from a CONNECT request, that is ":method"="CONNECT"
+ // and no ":protocol".
+ void OpenTunnel(const spdy::Http2HeaderBlock& request_headers);
+
+ // Returns true iff the connection to the destination server is currently open
+ bool IsConnectedToDestination() const;
+
+ void SendDataToDestination(absl::string_view data);
+
+ // Called when the client stream has been closed. Connection to destination
+ // server is closed if connected. The RequestHandler will no longer be
+ // interacted with after completion.
+ void OnClientStreamClose();
+
+ // StreamClientSocket::AsyncVisitor:
+ void ConnectComplete(absl::Status status) override;
+ void ReceiveComplete(absl::StatusOr<quiche::QuicheMemSlice> data) override;
+ void SendComplete(absl::Status status) override;
+
+ private:
+ void BeginAsyncReadFromDestination();
+ void OnDataReceivedFromDestination(bool success);
+
+ // For normal (FIN) closure. Errors (RST) should result in directly calling
+ // TerminateClientStream().
+ void OnDestinationConnectionClosed();
+
+ void SendConnectResponse();
+ void TerminateClientStream(
+ absl::string_view error_description,
+ QuicResetStreamError error_code =
+ QuicResetStreamError::FromIetf(QuicHttp3ErrorCode::CONNECT_ERROR));
+
+ const absl::flat_hash_set<HostAndPort> acceptable_destinations_;
+ SocketFactory* const socket_factory_;
+
+ // Null when client stream closed.
+ QuicSimpleServerBackend::RequestHandler* client_stream_request_handler_;
+
+ // Null when destination connection disconnected.
+ std::unique_ptr<StreamClientSocket> destination_socket_;
+
+ bool receive_started_ = false;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_TOOLS_CONNECT_TUNNEL_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel_test.cc
new file mode 100644
index 00000000000..a9d4c1dae8b
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/connect_tunnel_test.cc
@@ -0,0 +1,342 @@
+// Copyright 2022 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.
+
+#include "quiche/quic/tools/connect_tunnel.h"
+
+#include <cstdint>
+#include <utility>
+
+#include "absl/container/flat_hash_set.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "quiche/quic/core/io/socket_factory.h"
+#include "quiche/quic/core/io/stream_client_socket.h"
+#include "quiche/quic/core/quic_connection_id.h"
+#include "quiche/quic/core/quic_error_codes.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/quic/platform/api/quic_test_loopback.h"
+#include "quiche/quic/test_tools/quic_test_utils.h"
+#include "quiche/quic/tools/quic_backend_response.h"
+#include "quiche/quic/tools/quic_simple_server_backend.h"
+#include "quiche/common/platform/api/quiche_mem_slice.h"
+#include "quiche/common/platform/api/quiche_test.h"
+#include "quiche/spdy/core/http2_header_block.h"
+
+namespace quic::test {
+namespace {
+
+using ::testing::_;
+using ::testing::AllOf;
+using ::testing::AnyOf;
+using ::testing::ElementsAre;
+using ::testing::Eq;
+using ::testing::Ge;
+using ::testing::Gt;
+using ::testing::InvokeWithoutArgs;
+using ::testing::IsEmpty;
+using ::testing::Matcher;
+using ::testing::NiceMock;
+using ::testing::Pair;
+using ::testing::Property;
+using ::testing::Return;
+using ::testing::StrictMock;
+
+class MockRequestHandler : public QuicSimpleServerBackend::RequestHandler {
+ public:
+ QuicConnectionId connection_id() const override {
+ return TestConnectionId(41212);
+ }
+ QuicStreamId stream_id() const override { return 100; }
+ std::string peer_host() const override { return "127.0.0.1"; }
+
+ MOCK_METHOD(void, OnResponseBackendComplete,
+ (const QuicBackendResponse* response), (override));
+ MOCK_METHOD(void, SendStreamData, (absl::string_view data, bool close_stream),
+ (override));
+ MOCK_METHOD(void, TerminateStreamWithError, (QuicResetStreamError error),
+ (override));
+};
+
+class MockSocketFactory : public SocketFactory {
+ public:
+ MOCK_METHOD(std::unique_ptr<StreamClientSocket>, CreateTcpClientSocket,
+ (const quic::QuicSocketAddress& peer_address,
+ QuicByteCount receive_buffer_size,
+ QuicByteCount send_buffer_size,
+ StreamClientSocket::AsyncVisitor* async_visitor),
+ (override));
+};
+
+class MockSocket : public StreamClientSocket {
+ public:
+ MOCK_METHOD(absl::Status, ConnectBlocking, (), (override));
+ MOCK_METHOD(void, ConnectAsync, (), (override));
+ MOCK_METHOD(void, Disconnect, (), (override));
+ MOCK_METHOD(absl::StatusOr<quiche::QuicheMemSlice>, ReceiveBlocking,
+ (QuicByteCount max_size), (override));
+ MOCK_METHOD(void, ReceiveAsync, (QuicByteCount max_size), (override));
+ MOCK_METHOD(absl::Status, SendBlocking, (std::string data), (override));
+ MOCK_METHOD(absl::Status, SendBlocking, (quiche::QuicheMemSlice data),
+ (override));
+ MOCK_METHOD(void, SendAsync, (std::string data), (override));
+ MOCK_METHOD(void, SendAsync, (quiche::QuicheMemSlice data), (override));
+};
+
+class ConnectTunnelTest : public quiche::test::QuicheTest {
+ public:
+ void SetUp() override {
+ auto socket = std::make_unique<StrictMock<MockSocket>>();
+ socket_ = socket.get();
+ ON_CALL(socket_factory_,
+ CreateTcpClientSocket(
+ AnyOf(QuicSocketAddress(TestLoopback4(), kAcceptablePort),
+ QuicSocketAddress(TestLoopback6(), kAcceptablePort)),
+ _, _, &tunnel_))
+ .WillByDefault(Return(ByMove(std::move(socket))));
+ }
+
+ protected:
+ static constexpr absl::string_view kAcceptableDestination = "localhost";
+ static constexpr uint16_t kAcceptablePort = 977;
+
+ StrictMock<MockRequestHandler> request_handler_;
+ NiceMock<MockSocketFactory> socket_factory_;
+ StrictMock<MockSocket>* socket_;
+
+ ConnectTunnel tunnel_{&request_handler_,
+ &socket_factory_,
+ /*acceptable_destinations=*/
+ {{std::string(kAcceptableDestination), kAcceptablePort},
+ {TestLoopback4().ToString(), kAcceptablePort},
+ {TestLoopback6().ToString(), kAcceptablePort}}};
+};
+
+TEST_F(ConnectTunnelTest, OpenTunnel) {
+ EXPECT_CALL(*socket_, ConnectBlocking()).WillOnce(Return(absl::OkStatus()));
+ EXPECT_CALL(*socket_, ReceiveAsync(Gt(0)));
+ EXPECT_CALL(*socket_, Disconnect()).WillOnce(InvokeWithoutArgs([this]() {
+ tunnel_.ReceiveComplete(absl::CancelledError());
+ }));
+
+ spdy::Http2HeaderBlock expected_response_headers;
+ expected_response_headers[":status"] = "200";
+ QuicBackendResponse expected_response;
+ expected_response.set_headers(std::move(expected_response_headers));
+ expected_response.set_response_type(QuicBackendResponse::INCOMPLETE_RESPONSE);
+ EXPECT_CALL(request_handler_,
+ OnResponseBackendComplete(
+ AllOf(Property(&QuicBackendResponse::response_type,
+ QuicBackendResponse::INCOMPLETE_RESPONSE),
+ Property(&QuicBackendResponse::headers,
+ ElementsAre(Pair(":status", "200"))),
+ Property(&QuicBackendResponse::trailers, IsEmpty()),
+ Property(&QuicBackendResponse::body, IsEmpty()))));
+
+ spdy::Http2HeaderBlock request_headers;
+ request_headers[":method"] = "CONNECT";
+ request_headers[":authority"] =
+ absl::StrCat(kAcceptableDestination, ":", kAcceptablePort);
+
+ tunnel_.OpenTunnel(request_headers);
+ EXPECT_TRUE(tunnel_.IsConnectedToDestination());
+ tunnel_.OnClientStreamClose();
+ EXPECT_FALSE(tunnel_.IsConnectedToDestination());
+}
+
+TEST_F(ConnectTunnelTest, OpenTunnelToIpv4LiteralDestination) {
+ EXPECT_CALL(*socket_, ConnectBlocking()).WillOnce(Return(absl::OkStatus()));
+ EXPECT_CALL(*socket_, ReceiveAsync(Gt(0)));
+ EXPECT_CALL(*socket_, Disconnect()).WillOnce(InvokeWithoutArgs([this]() {
+ tunnel_.ReceiveComplete(absl::CancelledError());
+ }));
+
+ spdy::Http2HeaderBlock expected_response_headers;
+ expected_response_headers[":status"] = "200";
+ QuicBackendResponse expected_response;
+ expected_response.set_headers(std::move(expected_response_headers));
+ expected_response.set_response_type(QuicBackendResponse::INCOMPLETE_RESPONSE);
+ EXPECT_CALL(request_handler_,
+ OnResponseBackendComplete(
+ AllOf(Property(&QuicBackendResponse::response_type,
+ QuicBackendResponse::INCOMPLETE_RESPONSE),
+ Property(&QuicBackendResponse::headers,
+ ElementsAre(Pair(":status", "200"))),
+ Property(&QuicBackendResponse::trailers, IsEmpty()),
+ Property(&QuicBackendResponse::body, IsEmpty()))));
+
+ spdy::Http2HeaderBlock request_headers;
+ request_headers[":method"] = "CONNECT";
+ request_headers[":authority"] =
+ absl::StrCat(TestLoopback4().ToString(), ":", kAcceptablePort);
+
+ tunnel_.OpenTunnel(request_headers);
+ EXPECT_TRUE(tunnel_.IsConnectedToDestination());
+ tunnel_.OnClientStreamClose();
+ EXPECT_FALSE(tunnel_.IsConnectedToDestination());
+}
+
+TEST_F(ConnectTunnelTest, OpenTunnelToIpv6LiteralDestination) {
+ EXPECT_CALL(*socket_, ConnectBlocking()).WillOnce(Return(absl::OkStatus()));
+ EXPECT_CALL(*socket_, ReceiveAsync(Gt(0)));
+ EXPECT_CALL(*socket_, Disconnect()).WillOnce(InvokeWithoutArgs([this]() {
+ tunnel_.ReceiveComplete(absl::CancelledError());
+ }));
+
+ spdy::Http2HeaderBlock expected_response_headers;
+ expected_response_headers[":status"] = "200";
+ QuicBackendResponse expected_response;
+ expected_response.set_headers(std::move(expected_response_headers));
+ expected_response.set_response_type(QuicBackendResponse::INCOMPLETE_RESPONSE);
+ EXPECT_CALL(request_handler_,
+ OnResponseBackendComplete(
+ AllOf(Property(&QuicBackendResponse::response_type,
+ QuicBackendResponse::INCOMPLETE_RESPONSE),
+ Property(&QuicBackendResponse::headers,
+ ElementsAre(Pair(":status", "200"))),
+ Property(&QuicBackendResponse::trailers, IsEmpty()),
+ Property(&QuicBackendResponse::body, IsEmpty()))));
+
+ spdy::Http2HeaderBlock request_headers;
+ request_headers[":method"] = "CONNECT";
+ request_headers[":authority"] =
+ absl::StrCat("[", TestLoopback6().ToString(), "]:", kAcceptablePort);
+
+ tunnel_.OpenTunnel(request_headers);
+ EXPECT_TRUE(tunnel_.IsConnectedToDestination());
+ tunnel_.OnClientStreamClose();
+ EXPECT_FALSE(tunnel_.IsConnectedToDestination());
+}
+
+TEST_F(ConnectTunnelTest, OpenTunnelWithMalformedRequest) {
+ EXPECT_CALL(request_handler_,
+ TerminateStreamWithError(Property(
+ &QuicResetStreamError::ietf_application_code,
+ static_cast<uint64_t>(QuicHttp3ErrorCode::MESSAGE_ERROR))));
+
+ spdy::Http2HeaderBlock request_headers;
+ request_headers[":method"] = "CONNECT";
+ // No ":authority" header.
+
+ tunnel_.OpenTunnel(request_headers);
+ EXPECT_FALSE(tunnel_.IsConnectedToDestination());
+ tunnel_.OnClientStreamClose();
+}
+
+TEST_F(ConnectTunnelTest, OpenTunnelWithUnacceptableDestination) {
+ EXPECT_CALL(
+ request_handler_,
+ TerminateStreamWithError(Property(
+ &QuicResetStreamError::ietf_application_code,
+ static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_REJECTED))));
+
+ spdy::Http2HeaderBlock request_headers;
+ request_headers[":method"] = "CONNECT";
+ request_headers[":authority"] = "unacceptable.test:100";
+
+ tunnel_.OpenTunnel(request_headers);
+ EXPECT_FALSE(tunnel_.IsConnectedToDestination());
+ tunnel_.OnClientStreamClose();
+}
+
+TEST_F(ConnectTunnelTest, ReceiveFromDestination) {
+ static constexpr absl::string_view kData = "\x11\x22\x33\x44\x55";
+
+ EXPECT_CALL(*socket_, ConnectBlocking()).WillOnce(Return(absl::OkStatus()));
+ EXPECT_CALL(*socket_, ReceiveAsync(Ge(kData.size()))).Times(2);
+ EXPECT_CALL(*socket_, Disconnect()).WillOnce(InvokeWithoutArgs([this]() {
+ tunnel_.ReceiveComplete(absl::CancelledError());
+ }));
+
+ EXPECT_CALL(request_handler_, OnResponseBackendComplete(_));
+
+ EXPECT_CALL(request_handler_, SendStreamData(kData, /*close_stream=*/false));
+
+ spdy::Http2HeaderBlock request_headers;
+ request_headers[":method"] = "CONNECT";
+ request_headers[":authority"] =
+ absl::StrCat(kAcceptableDestination, ":", kAcceptablePort);
+
+ tunnel_.OpenTunnel(request_headers);
+
+ // Simulate receiving `kData`.
+ tunnel_.ReceiveComplete(MemSliceFromString(kData));
+
+ tunnel_.OnClientStreamClose();
+}
+
+TEST_F(ConnectTunnelTest, SendToDestination) {
+ static constexpr absl::string_view kData = "\x11\x22\x33\x44\x55";
+
+ EXPECT_CALL(*socket_, ConnectBlocking()).WillOnce(Return(absl::OkStatus()));
+ EXPECT_CALL(*socket_, ReceiveAsync(Gt(0)));
+ EXPECT_CALL(*socket_, SendBlocking(Matcher<std::string>(Eq(kData))))
+ .WillOnce(Return(absl::OkStatus()));
+ EXPECT_CALL(*socket_, Disconnect()).WillOnce(InvokeWithoutArgs([this]() {
+ tunnel_.ReceiveComplete(absl::CancelledError());
+ }));
+
+ EXPECT_CALL(request_handler_, OnResponseBackendComplete(_));
+
+ spdy::Http2HeaderBlock request_headers;
+ request_headers[":method"] = "CONNECT";
+ request_headers[":authority"] =
+ absl::StrCat(kAcceptableDestination, ":", kAcceptablePort);
+
+ tunnel_.OpenTunnel(request_headers);
+ tunnel_.SendDataToDestination(kData);
+ tunnel_.OnClientStreamClose();
+}
+
+TEST_F(ConnectTunnelTest, DestinationDisconnect) {
+ EXPECT_CALL(*socket_, ConnectBlocking()).WillOnce(Return(absl::OkStatus()));
+ EXPECT_CALL(*socket_, ReceiveAsync(Gt(0)));
+ EXPECT_CALL(*socket_, Disconnect());
+
+ EXPECT_CALL(request_handler_, OnResponseBackendComplete(_));
+ EXPECT_CALL(request_handler_, SendStreamData("", /*close_stream=*/true));
+
+ spdy::Http2HeaderBlock request_headers;
+ request_headers[":method"] = "CONNECT";
+ request_headers[":authority"] =
+ absl::StrCat(kAcceptableDestination, ":", kAcceptablePort);
+
+ tunnel_.OpenTunnel(request_headers);
+
+ // Simulate receiving empty data.
+ tunnel_.ReceiveComplete(quiche::QuicheMemSlice());
+
+ EXPECT_FALSE(tunnel_.IsConnectedToDestination());
+
+ tunnel_.OnClientStreamClose();
+}
+
+TEST_F(ConnectTunnelTest, DestinationTcpConnectionError) {
+ EXPECT_CALL(*socket_, ConnectBlocking()).WillOnce(Return(absl::OkStatus()));
+ EXPECT_CALL(*socket_, ReceiveAsync(Gt(0)));
+ EXPECT_CALL(*socket_, Disconnect());
+
+ EXPECT_CALL(request_handler_, OnResponseBackendComplete(_));
+ EXPECT_CALL(request_handler_,
+ TerminateStreamWithError(Property(
+ &QuicResetStreamError::ietf_application_code,
+ static_cast<uint64_t>(QuicHttp3ErrorCode::CONNECT_ERROR))));
+
+ spdy::Http2HeaderBlock request_headers;
+ request_headers[":method"] = "CONNECT";
+ request_headers[":authority"] =
+ absl::StrCat(kAcceptableDestination, ":", kAcceptablePort);
+
+ tunnel_.OpenTunnel(request_headers);
+
+ // Simulate receving error.
+ tunnel_.ReceiveComplete(absl::UnknownError("error"));
+
+ tunnel_.OnClientStreamClose();
+}
+
+} // namespace
+} // namespace quic::test
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.cc
index 8fce5d52258..8a54204a49a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.cc
@@ -20,7 +20,8 @@ QuicBackendResponse::ServerPushInfo::ServerPushInfo(const ServerPushInfo& other)
priority(other.priority),
body(other.body) {}
-QuicBackendResponse::QuicBackendResponse() : response_type_(REGULAR_RESPONSE) {}
+QuicBackendResponse::QuicBackendResponse()
+ : response_type_(REGULAR_RESPONSE), delay_(QuicTime::Delta::Zero()) {}
QuicBackendResponse::~QuicBackendResponse() = default;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.h
index 3ee4bf4b975..6d1b10584f2 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_backend_response.h
@@ -6,7 +6,9 @@
#define QUICHE_QUIC_TOOLS_QUIC_BACKEND_RESPONSE_H_
#include "absl/strings/string_view.h"
+#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/tools/quic_url.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_protocol.h"
namespace quic {
@@ -77,12 +79,18 @@ class QuicBackendResponse {
body_.assign(body.data(), body.size());
}
+ // This would simulate a delay before sending the response
+ // back to the client. Intended for testing purposes.
+ void set_delay(QuicTime::Delta delay) { delay_ = delay; }
+ QuicTime::Delta delay() const { return delay_; }
+
private:
std::vector<spdy::Http2HeaderBlock> early_hints_;
SpecialResponseType response_type_;
spdy::Http2HeaderBlock headers_;
spdy::Http2HeaderBlock trailers_;
std::string body_;
+ QuicTime::Delta delay_;
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc
index 826ade89826..3a7dfd6cb0a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.cc
@@ -49,7 +49,8 @@ class QuicClientSocketMigrationValidationResultDelegate
// Overridden to start migration and takes the ownership of the writer in the
// context.
void OnPathValidationSuccess(
- std::unique_ptr<QuicPathValidationContext> context) override {
+ std::unique_ptr<QuicPathValidationContext> context,
+ QuicTime /*start_time*/) override {
QUIC_DLOG(INFO) << "Successfully validated path from " << *context
<< ". Migrate to it now.";
auto migration_context = std::unique_ptr<PathMigrationContext>(
@@ -239,6 +240,10 @@ bool QuicClientBase::WaitForEvents() {
network_helper_->RunEventLoop();
+ return WaitForEventsPostprocessing();
+}
+
+bool QuicClientBase::WaitForEventsPostprocessing() {
QUICHE_DCHECK(session() != nullptr);
ParsedQuicVersion version = UnsupportedQuicVersion();
if (!connected() && CanReconnectWithDifferentVersion(&version)) {
@@ -467,8 +472,10 @@ class ValidationResultDelegate : public QuicPathValidator::ResultDelegate {
: QuicPathValidator::ResultDelegate(), client_(client) {}
void OnPathValidationSuccess(
- std::unique_ptr<QuicPathValidationContext> context) override {
- QUIC_DLOG(INFO) << "Successfully validated path from " << *context;
+ std::unique_ptr<QuicPathValidationContext> context,
+ QuicTime start_time) override {
+ QUIC_DLOG(INFO) << "Successfully validated path from " << *context
+ << ", validation started at " << start_time;
client_->AddValidatedPath(std::move(context));
}
void OnPathValidationFailure(
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.h
index 4f0c8800b90..91c597b2a5d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_base.h
@@ -116,6 +116,10 @@ class QuicClientBase {
// Returns true if there are any outstanding requests.
bool WaitForEvents();
+ // Performs the part of WaitForEvents() that is done after the actual event
+ // loop call.
+ bool WaitForEventsPostprocessing();
+
// Migrate to a new socket (new_host) during an active connection.
bool MigrateSocket(const QuicIpAddress& new_host);
@@ -247,6 +251,14 @@ class QuicClientBase {
connection_debug_visitor_ = connection_debug_visitor;
}
+ // Sets the interface name to bind. If empty, will not attempt to bind the
+ // socket to that interface. Defaults to empty string.
+ void set_interface_name(std::string interface_name) {
+ interface_name_ = interface_name;
+ }
+
+ std::string interface_name() { return interface_name_; }
+
void set_server_connection_id_length(uint8_t server_connection_id_length) {
server_connection_id_length_ = server_connection_id_length;
}
@@ -400,6 +412,10 @@ class QuicClientBase {
// Stores validated paths.
std::vector<std::unique_ptr<QuicPathValidationContext>> validated_paths_;
+
+ // Stores the interface name to bind. If empty, will not attempt to bind the
+ // socket to that interface. Defaults to empty string.
+ std::string interface_name_;
};
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc
new file mode 100644
index 00000000000..24c4b3e8dfc
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.cc
@@ -0,0 +1,234 @@
+// 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.
+
+#include "quiche/quic/tools/quic_client_default_network_helper.h"
+
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_default_packet_writer.h"
+#include "quiche/quic/core/quic_packets.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/quic/core/quic_udp_socket.h"
+#include "quiche/quic/platform/api/quic_logging.h"
+#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/platform/api/quiche_system_event_loop.h"
+
+namespace quic {
+
+namespace {
+
+// For level-triggered I/O, we need to manually rearm the kSocketEventWritable
+// listener whenever the socket gets blocked.
+class LevelTriggeredPacketWriter : public QuicDefaultPacketWriter {
+ public:
+ explicit LevelTriggeredPacketWriter(int fd, QuicEventLoop* event_loop)
+ : QuicDefaultPacketWriter(fd), event_loop_(event_loop) {
+ QUICHE_DCHECK(!event_loop->SupportsEdgeTriggered());
+ }
+
+ WriteResult WritePacket(const char* buffer, size_t buf_len,
+ const QuicIpAddress& self_address,
+ const QuicSocketAddress& peer_address,
+ PerPacketOptions* options) override {
+ WriteResult result = QuicDefaultPacketWriter::WritePacket(
+ buffer, buf_len, self_address, peer_address, options);
+ if (IsWriteBlockedStatus(result.status)) {
+ bool success = event_loop_->RearmSocket(fd(), kSocketEventWritable);
+ QUICHE_DCHECK(success);
+ }
+ return result;
+ }
+
+ private:
+ QuicEventLoop* event_loop_;
+};
+
+} // namespace
+
+QuicClientDefaultNetworkHelper::QuicClientDefaultNetworkHelper(
+ QuicEventLoop* event_loop, QuicClientBase* client)
+ : event_loop_(event_loop),
+ packets_dropped_(0),
+ overflow_supported_(false),
+ packet_reader_(new QuicPacketReader()),
+ client_(client),
+ max_reads_per_event_loop_(std::numeric_limits<int>::max()) {}
+
+QuicClientDefaultNetworkHelper::~QuicClientDefaultNetworkHelper() {
+ if (client_->connected()) {
+ client_->session()->connection()->CloseConnection(
+ QUIC_PEER_GOING_AWAY, "Client being torn down",
+ ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
+ }
+
+ CleanUpAllUDPSockets();
+}
+
+bool QuicClientDefaultNetworkHelper::CreateUDPSocketAndBind(
+ QuicSocketAddress server_address, QuicIpAddress bind_to_address,
+ int bind_to_port) {
+ int fd = CreateUDPSocket(server_address, &overflow_supported_);
+ if (fd < 0) {
+ return false;
+ }
+
+ QuicSocketAddress client_address;
+ if (bind_to_address.IsInitialized()) {
+ client_address = QuicSocketAddress(bind_to_address, client_->local_port());
+ } else if (server_address.host().address_family() == IpAddressFamily::IP_V4) {
+ client_address = QuicSocketAddress(QuicIpAddress::Any4(), bind_to_port);
+ } else {
+ client_address = QuicSocketAddress(QuicIpAddress::Any6(), bind_to_port);
+ }
+
+ // Some platforms expect that the addrlen given to bind() exactly matches the
+ // size of the associated protocol family's sockaddr struct.
+ // TODO(b/179430548): Revert this when affected platforms are updated to
+ // to support binding with an addrelen of sizeof(sockaddr_storage)
+ socklen_t addrlen;
+ switch (client_address.host().address_family()) {
+ case IpAddressFamily::IP_V4:
+ addrlen = sizeof(sockaddr_in);
+ break;
+ case IpAddressFamily::IP_V6:
+ addrlen = sizeof(sockaddr_in6);
+ break;
+ case IpAddressFamily::IP_UNSPEC:
+ addrlen = 0;
+ break;
+ }
+
+ sockaddr_storage addr = client_address.generic_address();
+ int rc = bind(fd, reinterpret_cast<sockaddr*>(&addr), addrlen);
+ if (rc < 0) {
+ QUIC_LOG(ERROR) << "Bind failed: " << strerror(errno)
+ << " bind_to_address:" << bind_to_address
+ << ", bind_to_port:" << bind_to_port
+ << ", client_address:" << client_address;
+ return false;
+ }
+
+ if (client_address.FromSocket(fd) != 0) {
+ QUIC_LOG(ERROR) << "Unable to get self address. Error: "
+ << strerror(errno);
+ }
+
+ fd_address_map_[fd] = client_address;
+ bool success = event_loop_->RegisterSocket(
+ fd, kSocketEventReadable | kSocketEventWritable, this);
+ return success;
+}
+
+void QuicClientDefaultNetworkHelper::CleanUpUDPSocket(int fd) {
+ CleanUpUDPSocketImpl(fd);
+ fd_address_map_.erase(fd);
+}
+
+void QuicClientDefaultNetworkHelper::CleanUpAllUDPSockets() {
+ for (std::pair<int, QuicSocketAddress> fd_address : fd_address_map_) {
+ CleanUpUDPSocketImpl(fd_address.first);
+ }
+ fd_address_map_.clear();
+}
+
+void QuicClientDefaultNetworkHelper::CleanUpUDPSocketImpl(int fd) {
+ if (fd > -1) {
+ bool success = event_loop_->UnregisterSocket(fd);
+ QUICHE_DCHECK(success);
+ int rc = close(fd);
+ QUICHE_DCHECK_EQ(0, rc);
+ }
+}
+
+void QuicClientDefaultNetworkHelper::RunEventLoop() {
+ quiche::QuicheRunSystemEventLoopIteration();
+ event_loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(50));
+}
+
+void QuicClientDefaultNetworkHelper::OnSocketEvent(
+ QuicEventLoop* /*event_loop*/, QuicUdpSocketFd fd,
+ QuicSocketEventMask events) {
+ if (events & kSocketEventReadable) {
+ QUIC_DVLOG(1) << "Read packets on kSocketEventReadable";
+ int times_to_read = max_reads_per_event_loop_;
+ bool more_to_read = true;
+ QuicPacketCount packets_dropped = 0;
+ while (client_->connected() && more_to_read && times_to_read > 0) {
+ more_to_read = packet_reader_->ReadAndDispatchPackets(
+ fd, GetLatestClientAddress().port(), *client_->helper()->GetClock(),
+ this, overflow_supported_ ? &packets_dropped : nullptr);
+ --times_to_read;
+ }
+ if (packets_dropped_ < packets_dropped) {
+ QUIC_LOG(ERROR)
+ << packets_dropped - packets_dropped_
+ << " more packets are dropped in the socket receive buffer.";
+ packets_dropped_ = packets_dropped;
+ }
+ if (client_->connected() && more_to_read) {
+ bool success =
+ event_loop_->ArtificiallyNotifyEvent(fd, kSocketEventReadable);
+ QUICHE_DCHECK(success);
+ } else if (!event_loop_->SupportsEdgeTriggered()) {
+ bool success = event_loop_->RearmSocket(fd, kSocketEventReadable);
+ QUICHE_DCHECK(success);
+ }
+ }
+ if (client_->connected() && (events & kSocketEventWritable)) {
+ client_->writer()->SetWritable();
+ client_->session()->connection()->OnCanWrite();
+ }
+}
+
+QuicPacketWriter* QuicClientDefaultNetworkHelper::CreateQuicPacketWriter() {
+ if (event_loop_->SupportsEdgeTriggered()) {
+ return new QuicDefaultPacketWriter(GetLatestFD());
+ } else {
+ return new LevelTriggeredPacketWriter(GetLatestFD(), event_loop_);
+ }
+}
+
+void QuicClientDefaultNetworkHelper::SetClientPort(int port) {
+ fd_address_map_.back().second =
+ QuicSocketAddress(GetLatestClientAddress().host(), port);
+}
+
+QuicSocketAddress QuicClientDefaultNetworkHelper::GetLatestClientAddress()
+ const {
+ if (fd_address_map_.empty()) {
+ return QuicSocketAddress();
+ }
+
+ return fd_address_map_.back().second;
+}
+
+int QuicClientDefaultNetworkHelper::GetLatestFD() const {
+ if (fd_address_map_.empty()) {
+ return -1;
+ }
+
+ return fd_address_map_.back().first;
+}
+
+void QuicClientDefaultNetworkHelper::ProcessPacket(
+ const QuicSocketAddress& self_address,
+ const QuicSocketAddress& peer_address, const QuicReceivedPacket& packet) {
+ client_->session()->ProcessUdpPacket(self_address, peer_address, packet);
+}
+
+int QuicClientDefaultNetworkHelper::CreateUDPSocket(
+ QuicSocketAddress server_address, bool* overflow_supported) {
+ QuicUdpSocketApi api;
+ int fd = api.Create(server_address.host().AddressFamilyToInt(),
+ /*receive_buffer_size =*/kDefaultSocketReceiveBuffer,
+ /*send_buffer_size =*/kDefaultSocketReceiveBuffer);
+ if (fd < 0) {
+ return fd;
+ }
+
+ *overflow_supported = api.EnableDroppedPacketCount(fd);
+ api.EnableReceiveTimestamp(fd);
+ return fd;
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.h
new file mode 100644
index 00000000000..ac126189e84
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_default_network_helper.h
@@ -0,0 +1,116 @@
+// 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.
+
+#ifndef QUICHE_QUIC_TOOLS_QUIC_CLIENT_DEFAULT_NETWORK_HELPER_H_
+#define QUICHE_QUIC_TOOLS_QUIC_CLIENT_DEFAULT_NETWORK_HELPER_H_
+
+#include <cstdint>
+#include <memory>
+#include <string>
+
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_packet_reader.h"
+#include "quiche/quic/tools/quic_client_base.h"
+#include "quiche/common/quiche_linked_hash_map.h"
+
+namespace quic {
+
+namespace test {
+class QuicClientPeer;
+} // namespace test
+
+// An implementation of the QuicClientBase::NetworkHelper interface that is
+// based on the QuicEventLoop API.
+class QuicClientDefaultNetworkHelper : public QuicClientBase::NetworkHelper,
+ public QuicSocketEventListener,
+ public ProcessPacketInterface {
+ public:
+ QuicClientDefaultNetworkHelper(QuicEventLoop* event_loop,
+ QuicClientBase* client);
+ QuicClientDefaultNetworkHelper(const QuicClientDefaultNetworkHelper&) =
+ delete;
+ QuicClientDefaultNetworkHelper& operator=(
+ const QuicClientDefaultNetworkHelper&) = delete;
+
+ ~QuicClientDefaultNetworkHelper() override;
+
+ // From QuicSocketEventListener.
+ void OnSocketEvent(QuicEventLoop* event_loop, QuicUdpSocketFd fd,
+ QuicSocketEventMask events) override;
+
+ // From ProcessPacketInterface. This will be called for each received
+ // packet.
+ void ProcessPacket(const QuicSocketAddress& self_address,
+ const QuicSocketAddress& peer_address,
+ const QuicReceivedPacket& packet) override;
+
+ // From NetworkHelper.
+ void RunEventLoop() override;
+ bool CreateUDPSocketAndBind(QuicSocketAddress server_address,
+ QuicIpAddress bind_to_address,
+ int bind_to_port) override;
+ void CleanUpAllUDPSockets() override;
+ QuicSocketAddress GetLatestClientAddress() const override;
+ QuicPacketWriter* CreateQuicPacketWriter() override;
+
+ // Accessors provided for convenience, not part of any interface.
+ QuicEventLoop* event_loop() { return event_loop_; }
+ const quiche::QuicheLinkedHashMap<int, QuicSocketAddress>& fd_address_map()
+ const {
+ return fd_address_map_;
+ }
+
+ // If the client has at least one UDP socket, return the latest created one.
+ // Otherwise, return -1.
+ int GetLatestFD() const;
+
+ // Create socket for connection to |server_address| with default socket
+ // options.
+ // Return fd index.
+ virtual int CreateUDPSocket(QuicSocketAddress server_address,
+ bool* overflow_supported);
+
+ QuicClientBase* client() { return client_; }
+
+ void set_max_reads_per_event_loop(int num_reads) {
+ max_reads_per_event_loop_ = num_reads;
+ }
+ // If |fd| is an open UDP socket, unregister and close it. Otherwise, do
+ // nothing.
+ void CleanUpUDPSocket(int fd);
+
+ // Used for testing.
+ void SetClientPort(int port);
+
+ private:
+ // Actually clean up |fd|.
+ void CleanUpUDPSocketImpl(int fd);
+
+ // Listens for events on the client socket.
+ QuicEventLoop* event_loop_;
+
+ // Map mapping created UDP sockets to their addresses. By using linked hash
+ // map, the order of socket creation can be recorded.
+ quiche::QuicheLinkedHashMap<int, QuicSocketAddress> fd_address_map_;
+
+ // If overflow_supported_ is true, this will be the number of packets dropped
+ // during the lifetime of the server.
+ QuicPacketCount packets_dropped_;
+
+ // True if the kernel supports SO_RXQ_OVFL, the number of packets dropped
+ // because the socket would otherwise overflow.
+ bool overflow_supported_;
+
+ // Point to a QuicPacketReader object on the heap. The reader allocates more
+ // space than allowed on the stack.
+ std::unique_ptr<QuicPacketReader> packet_reader_;
+
+ QuicClientBase* client_;
+
+ int max_reads_per_event_loop_;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_TOOLS_QUIC_CLIENT_DEFAULT_NETWORK_HELPER_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_epoll_network_helper.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_epoll_network_helper.cc
index 14b905de416..b9798bdf3cb 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_epoll_network_helper.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_epoll_network_helper.cc
@@ -218,6 +218,18 @@ int QuicClientEpollNetworkHelper::CreateUDPSocket(
*overflow_supported = api.EnableDroppedPacketCount(fd);
api.EnableReceiveTimestamp(fd);
+
+ std::string interface_name = client_->interface_name();
+ if (!interface_name.empty()) {
+ if (!api.BindInterface(fd, interface_name)) {
+ QUIC_DLOG(WARNING) << "Failed to bind socket (" << fd
+ << ") to interface (" << interface_name << ").";
+
+ CleanUpUDPSocket(fd);
+ return kQuicInvalidSocketFd;
+ }
+ }
+
return fd;
}
} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_interop_test_bin.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_interop_test_bin.cc
index 9a29afeec25..7d204bb8bb4 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_interop_test_bin.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_client_interop_test_bin.cc
@@ -20,6 +20,7 @@
#include "quiche/quic/tools/quic_url.h"
#include "quiche/common/platform/api/quiche_command_line_flags.h"
#include "quiche/common/platform/api/quiche_system_event_loop.h"
+#include "quiche/spdy/core/http2_header_block.h"
DEFINE_QUICHE_COMMAND_LINE_FLAG(std::string, host, "",
"The IP or hostname to connect to.");
@@ -113,8 +114,8 @@ class QuicClientInteropRunner : QuicConnectionDebugVisitor {
bool test_version_negotiation, bool attempt_rebind,
bool attempt_multi_packet_chlo, bool attempt_key_update);
- // Constructs a SpdyHeaderBlock containing the pseudo-headers needed to make a
- // GET request to "/" on the hostname |authority|.
+ // Constructs a Http2HeaderBlock containing the pseudo-headers needed to make
+ // a GET request to "/" on the hostname |authority|.
spdy::Http2HeaderBlock ConstructHeaderBlock(const std::string& authority);
// Sends an HTTP request represented by |header_block| using |client|.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc
new file mode 100644
index 00000000000..de509c52829
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.cc
@@ -0,0 +1,102 @@
+// 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.
+
+#include "quiche/quic/tools/quic_default_client.h"
+
+#include <utility>
+
+#include "quiche/quic/core/quic_connection.h"
+#include "quiche/quic/core/quic_default_connection_helper.h"
+#include "quiche/quic/core/quic_server_id.h"
+#include "quiche/quic/platform/api/quic_socket_address.h"
+#include "quiche/quic/tools/quic_simple_client_session.h"
+
+namespace quic {
+
+QuicDefaultClient::QuicDefaultClient(
+ QuicSocketAddress server_address, const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ QuicEventLoop* event_loop, std::unique_ptr<ProofVerifier> proof_verifier)
+ : QuicDefaultClient(
+ server_address, server_id, supported_versions, QuicConfig(),
+ event_loop,
+ std::make_unique<QuicClientDefaultNetworkHelper>(event_loop, this),
+ std::move(proof_verifier), nullptr) {}
+
+QuicDefaultClient::QuicDefaultClient(
+ QuicSocketAddress server_address, const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ QuicEventLoop* event_loop, std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache)
+ : QuicDefaultClient(
+ server_address, server_id, supported_versions, QuicConfig(),
+ event_loop,
+ std::make_unique<QuicClientDefaultNetworkHelper>(event_loop, this),
+ std::move(proof_verifier), std::move(session_cache)) {}
+
+QuicDefaultClient::QuicDefaultClient(
+ QuicSocketAddress server_address, const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions, const QuicConfig& config,
+ QuicEventLoop* event_loop, std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache)
+ : QuicDefaultClient(
+ server_address, server_id, supported_versions, config, event_loop,
+ std::make_unique<QuicClientDefaultNetworkHelper>(event_loop, this),
+ std::move(proof_verifier), std::move(session_cache)) {}
+
+QuicDefaultClient::QuicDefaultClient(
+ QuicSocketAddress server_address, const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ QuicEventLoop* event_loop,
+ std::unique_ptr<QuicClientDefaultNetworkHelper> network_helper,
+ std::unique_ptr<ProofVerifier> proof_verifier)
+ : QuicDefaultClient(server_address, server_id, supported_versions,
+ QuicConfig(), event_loop, std::move(network_helper),
+ std::move(proof_verifier), nullptr) {}
+
+QuicDefaultClient::QuicDefaultClient(
+ QuicSocketAddress server_address, const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions, const QuicConfig& config,
+ QuicEventLoop* event_loop,
+ std::unique_ptr<QuicClientDefaultNetworkHelper> network_helper,
+ std::unique_ptr<ProofVerifier> proof_verifier)
+ : QuicDefaultClient(server_address, server_id, supported_versions, config,
+ event_loop, std::move(network_helper),
+ std::move(proof_verifier), nullptr) {}
+
+QuicDefaultClient::QuicDefaultClient(
+ QuicSocketAddress server_address, const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions, const QuicConfig& config,
+ QuicEventLoop* event_loop,
+ std::unique_ptr<QuicClientDefaultNetworkHelper> network_helper,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache)
+ : QuicSpdyClientBase(server_id, supported_versions, config,
+ new QuicDefaultConnectionHelper(),
+ event_loop->CreateAlarmFactory().release(),
+ std::move(network_helper), std::move(proof_verifier),
+ std::move(session_cache)) {
+ set_server_address(server_address);
+}
+
+QuicDefaultClient::~QuicDefaultClient() = default;
+
+std::unique_ptr<QuicSession> QuicDefaultClient::CreateQuicClientSession(
+ const ParsedQuicVersionVector& supported_versions,
+ QuicConnection* connection) {
+ return std::make_unique<QuicSimpleClientSession>(
+ *config(), supported_versions, connection, server_id(), crypto_config(),
+ push_promise_index(), drop_response_body(), enable_web_transport());
+}
+
+QuicClientDefaultNetworkHelper* QuicDefaultClient::default_network_helper() {
+ return static_cast<QuicClientDefaultNetworkHelper*>(network_helper());
+}
+
+const QuicClientDefaultNetworkHelper*
+QuicDefaultClient::default_network_helper() const {
+ return static_cast<const QuicClientDefaultNetworkHelper*>(network_helper());
+}
+
+} // namespace quic
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.h
new file mode 100644
index 00000000000..8ef170db807
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client.h
@@ -0,0 +1,87 @@
+// 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.
+
+// A toy client, which connects to a specified port and sends QUIC
+// request to that endpoint.
+
+#ifndef QUICHE_QUIC_TOOLS_QUIC_DEFAULT_CLIENT_H_
+#define QUICHE_QUIC_TOOLS_QUIC_DEFAULT_CLIENT_H_
+
+#include <cstdint>
+#include <memory>
+#include <string>
+
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_config.h"
+#include "quiche/quic/tools/quic_client_default_network_helper.h"
+#include "quiche/quic/tools/quic_spdy_client_base.h"
+
+namespace quic {
+
+class QuicServerId;
+
+namespace test {
+class QuicDefaultClientPeer;
+} // namespace test
+
+class QuicDefaultClient : public QuicSpdyClientBase {
+ public:
+ // These will create their own QuicClientDefaultNetworkHelper.
+ QuicDefaultClient(QuicSocketAddress server_address,
+ const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ QuicEventLoop* event_loop,
+ std::unique_ptr<ProofVerifier> proof_verifier);
+ QuicDefaultClient(QuicSocketAddress server_address,
+ const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ QuicEventLoop* event_loop,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache);
+ QuicDefaultClient(QuicSocketAddress server_address,
+ const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ const QuicConfig& config, QuicEventLoop* event_loop,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache);
+ // This will take ownership of a passed in network primitive.
+ QuicDefaultClient(
+ QuicSocketAddress server_address, const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ QuicEventLoop* event_loop,
+ std::unique_ptr<QuicClientDefaultNetworkHelper> network_helper,
+ std::unique_ptr<ProofVerifier> proof_verifier);
+ QuicDefaultClient(
+ QuicSocketAddress server_address, const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ const QuicConfig& config, QuicEventLoop* event_loop,
+ std::unique_ptr<QuicClientDefaultNetworkHelper> network_helper,
+ std::unique_ptr<ProofVerifier> proof_verifier);
+ QuicDefaultClient(
+ QuicSocketAddress server_address, const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ const QuicConfig& config, QuicEventLoop* event_loop,
+ std::unique_ptr<QuicClientDefaultNetworkHelper> network_helper,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache);
+ QuicDefaultClient(const QuicDefaultClient&) = delete;
+ QuicDefaultClient& operator=(const QuicDefaultClient&) = delete;
+
+ ~QuicDefaultClient() override;
+
+ // QuicSpdyClientBase overrides.
+ std::unique_ptr<QuicSession> CreateQuicClientSession(
+ const ParsedQuicVersionVector& supported_versions,
+ QuicConnection* connection) override;
+
+ // Exposed for QUIC tests.
+ int GetLatestFD() const { return default_network_helper()->GetLatestFD(); }
+
+ QuicClientDefaultNetworkHelper* default_network_helper();
+ const QuicClientDefaultNetworkHelper* default_network_helper() const;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_TOOLS_QUIC_DEFAULT_CLIENT_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client_test.cc
new file mode 100644
index 00000000000..78f6c493cf4
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_default_client_test.cc
@@ -0,0 +1,147 @@
+// Copyright (c) 2014 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 unit test relies on /proc, which is not available on non-Linux based
+// OSes that we support.
+#if defined(__linux__)
+
+#include "quiche/quic/tools/quic_default_client.h"
+
+#include <dirent.h>
+#include <sys/types.h>
+
+#include <memory>
+#include <utility>
+
+#include "absl/strings/match.h"
+#include "absl/strings/string_view.h"
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_default_clock.h"
+#include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/quic/platform/api/quic_test_loopback.h"
+#include "quiche/quic/test_tools/crypto_test_utils.h"
+#include "quiche/quic/test_tools/quic_client_peer.h"
+#include "quiche/common/quiche_text_utils.h"
+
+namespace quic {
+namespace test {
+namespace {
+
+const char* kPathToFds = "/proc/self/fd";
+
+// Return the value of a symbolic link in |path|, if |path| is not found, return
+// an empty string.
+std::string ReadLink(const std::string& path) {
+ std::string result(PATH_MAX, '\0');
+ ssize_t result_size = readlink(path.c_str(), &result[0], result.size());
+ if (result_size < 0 && errno == ENOENT) {
+ return "";
+ }
+ QUICHE_CHECK(result_size > 0 &&
+ static_cast<size_t>(result_size) < result.size())
+ << "result_size:" << result_size << ", errno:" << errno
+ << ", path:" << path;
+ result.resize(result_size);
+ return result;
+}
+
+// Counts the number of open sockets for the current process.
+size_t NumOpenSocketFDs() {
+ size_t socket_count = 0;
+ dirent* file;
+ std::unique_ptr<DIR, int (*)(DIR*)> fd_directory(opendir(kPathToFds),
+ closedir);
+ while ((file = readdir(fd_directory.get())) != nullptr) {
+ absl::string_view name(file->d_name);
+ if (name == "." || name == "..") {
+ continue;
+ }
+
+ std::string fd_path = ReadLink(absl::StrCat(kPathToFds, "/", name));
+ if (absl::StartsWith(fd_path, "socket:")) {
+ socket_count++;
+ }
+ }
+ return socket_count;
+}
+
+class QuicDefaultClientTest : public QuicTest {
+ public:
+ QuicDefaultClientTest()
+ : event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get())) {
+ // Creates and destroys a single client first which may open persistent
+ // sockets when initializing platform dependencies like certificate
+ // verifier. Future creation of addtional clients will deterministically
+ // open one socket per client.
+ CreateAndInitializeQuicClient();
+ }
+
+ // Creates a new QuicClient and Initializes it on an unused port.
+ // Caller is responsible for deletion.
+ std::unique_ptr<QuicDefaultClient> CreateAndInitializeQuicClient() {
+ QuicSocketAddress server_address(QuicSocketAddress(TestLoopback(), 0));
+ QuicServerId server_id("hostname", server_address.port(), false);
+ ParsedQuicVersionVector versions = AllSupportedVersions();
+ auto client = std::make_unique<QuicDefaultClient>(
+ server_address, server_id, versions, event_loop_.get(),
+ crypto_test_utils::ProofVerifierForTesting());
+ EXPECT_TRUE(client->Initialize());
+ return client;
+ }
+
+ private:
+ std::unique_ptr<QuicEventLoop> event_loop_;
+};
+
+TEST_F(QuicDefaultClientTest, DoNotLeakSocketFDs) {
+ // Make sure that the QuicClient doesn't leak socket FDs. Doing so could cause
+ // port exhaustion in long running processes which repeatedly create clients.
+
+ // Record the initial number of FDs.
+ size_t number_of_open_fds = NumOpenSocketFDs();
+
+ // Create a number of clients, initialize them, and verify this has resulted
+ // in additional FDs being opened.
+ const int kNumClients = 50;
+ for (int i = 0; i < kNumClients; ++i) {
+ EXPECT_EQ(number_of_open_fds, NumOpenSocketFDs());
+ std::unique_ptr<QuicDefaultClient> client(CreateAndInitializeQuicClient());
+ // Initializing the client will create a new FD.
+ EXPECT_EQ(number_of_open_fds + 1, NumOpenSocketFDs());
+ }
+
+ // The FDs created by the QuicClients should now be closed.
+ EXPECT_EQ(number_of_open_fds, NumOpenSocketFDs());
+}
+
+TEST_F(QuicDefaultClientTest, CreateAndCleanUpUDPSockets) {
+ size_t number_of_open_fds = NumOpenSocketFDs();
+
+ std::unique_ptr<QuicDefaultClient> client(CreateAndInitializeQuicClient());
+ // Creating and initializing a client will result in one socket being opened.
+ EXPECT_EQ(number_of_open_fds + 1, NumOpenSocketFDs());
+
+ // Create more UDP sockets.
+ EXPECT_TRUE(client->default_network_helper()->CreateUDPSocketAndBind(
+ client->server_address(), client->bind_to_address(),
+ client->local_port()));
+ EXPECT_EQ(number_of_open_fds + 2, NumOpenSocketFDs());
+ EXPECT_TRUE(client->default_network_helper()->CreateUDPSocketAndBind(
+ client->server_address(), client->bind_to_address(),
+ client->local_port()));
+ EXPECT_EQ(number_of_open_fds + 3, NumOpenSocketFDs());
+
+ // Clean up UDP sockets.
+ client->default_network_helper()->CleanUpUDPSocket(client->GetLatestFD());
+ EXPECT_EQ(number_of_open_fds + 2, NumOpenSocketFDs());
+ client->default_network_helper()->CleanUpUDPSocket(client->GetLatestFD());
+ EXPECT_EQ(number_of_open_fds + 1, NumOpenSocketFDs());
+}
+
+} // namespace
+} // namespace test
+} // namespace quic
+
+#endif // defined(__linux__)
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc
index 0e501390e91..0fe984d9691 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.cc
@@ -215,6 +215,17 @@ void QuicMemoryCacheBackend::AddResponse(absl::string_view host,
std::vector<spdy::Http2HeaderBlock>());
}
+bool QuicMemoryCacheBackend::SetResponseDelay(absl::string_view host,
+ absl::string_view path,
+ QuicTime::Delta delay) {
+ QuicWriterMutexLock lock(&response_mutex_);
+ auto it = responses_.find(GetKey(host, path));
+ if (it == responses_.end()) return false;
+
+ it->second->set_delay(delay);
+ return true;
+}
+
void QuicMemoryCacheBackend::AddResponseWithEarlyHints(
absl::string_view host, absl::string_view path,
spdy::Http2HeaderBlock response_headers, absl::string_view response_body,
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.h
index 1738e3c8acf..ccdaf59a299 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.h
@@ -17,6 +17,7 @@
#include "quiche/quic/tools/quic_backend_response.h"
#include "quiche/quic/tools/quic_simple_server_backend.h"
#include "quiche/quic/tools/quic_url.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_framer.h"
namespace quic {
@@ -120,6 +121,12 @@ class QuicMemoryCacheBackend : public QuicSimpleServerBackend {
spdy::Http2HeaderBlock response_headers, absl::string_view response_body,
QuicBackendResponse::SpecialResponseType response_type);
+ // Finds a response with the given host and path, and assign it a simulated
+ // delay. Returns true if the requisite response was found and the delay was
+ // set.
+ bool SetResponseDelay(absl::string_view host, absl::string_view path,
+ QuicTime::Delta delay);
+
// Sets a default response in case of cache misses. Takes ownership of
// 'response'.
void AddDefaultResponse(QuicBackendResponse* response);
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.cc
index c5ab6ea5923..0c3233a6406 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.cc
@@ -16,14 +16,16 @@
#include "quiche/quic/core/crypto/crypto_handshake.h"
#include "quiche/quic/core/crypto/quic_random.h"
+#include "quiche/quic/core/io/event_loop_socket_factory.h"
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
#include "quiche/quic/core/quic_clock.h"
#include "quiche/quic/core/quic_crypto_stream.h"
#include "quiche/quic/core/quic_data_reader.h"
+#include "quiche/quic/core/quic_default_clock.h"
+#include "quiche/quic/core/quic_default_connection_helper.h"
#include "quiche/quic/core/quic_default_packet_writer.h"
#include "quiche/quic/core/quic_dispatcher.h"
-#include "quiche/quic/core/quic_epoll_alarm_factory.h"
-#include "quiche/quic/core/quic_epoll_clock.h"
-#include "quiche/quic/core/quic_epoll_connection_helper.h"
#include "quiche/quic/core/quic_packet_reader.h"
#include "quiche/quic/core/quic_packets.h"
#include "quiche/quic/platform/api/quic_flags.h"
@@ -31,12 +33,12 @@
#include "quiche/quic/tools/quic_simple_crypto_server_stream_helper.h"
#include "quiche/quic/tools/quic_simple_dispatcher.h"
#include "quiche/quic/tools/quic_simple_server_backend.h"
+#include "quiche/common/simple_buffer_allocator.h"
namespace quic {
namespace {
-const int kEpollFlags = EPOLLIN | EPOLLOUT | EPOLLET;
const char kSourceAddressTokenSecret[] = "secret";
} // namespace
@@ -95,17 +97,28 @@ void QuicServer::Initialize() {
kInitialSessionFlowControlWindow);
}
- epoll_server_.set_timeout_in_us(50 * 1000);
-
- QuicEpollClock clock(&epoll_server_);
-
std::unique_ptr<CryptoHandshakeMessage> scfg(crypto_config_.AddDefaultConfig(
- QuicRandom::GetInstance(), &clock, crypto_config_options_));
+ QuicRandom::GetInstance(), QuicDefaultClock::Get(),
+ crypto_config_options_));
}
-QuicServer::~QuicServer() = default;
+QuicServer::~QuicServer() {
+ close(fd_);
+ fd_ = -1;
+
+ // Should be fine without because nothing should send requests to the backend
+ // after `this` is destroyed, but for extra pointer safety, clear the socket
+ // factory from the backend before the socket factory is destroyed.
+ quic_simple_server_backend_->SetSocketFactory(nullptr);
+}
bool QuicServer::CreateUDPSocketAndListen(const QuicSocketAddress& address) {
+ event_loop_ = CreateEventLoop();
+
+ socket_factory_ = std::make_unique<EventLoopSocketFactory>(
+ event_loop_.get(), quiche::SimpleBufferAllocator::Get());
+ quic_simple_server_backend_->SetSocketFactory(socket_factory_.get());
+
QuicUdpSocketApi socket_api;
fd_ = socket_api.Create(address.host().AddressFamilyToInt(),
/*receive_buffer_size =*/kDefaultSocketReceiveBuffer,
@@ -135,7 +148,11 @@ bool QuicServer::CreateUDPSocketAndListen(const QuicSocketAddress& address) {
port_ = address.port();
}
- epoll_server_.RegisterFD(fd_, this, kEpollFlags);
+ bool register_result = event_loop_->RegisterSocket(
+ fd_, kSocketEventReadable | kSocketEventWritable, this);
+ if (!register_result) {
+ return false;
+ }
dispatcher_.reset(CreateQuicDispatcher());
dispatcher_->InitializeWithWriter(CreateWriter(fd_));
@@ -147,16 +164,17 @@ QuicPacketWriter* QuicServer::CreateWriter(int fd) {
}
QuicDispatcher* QuicServer::CreateQuicDispatcher() {
- QuicEpollAlarmFactory alarm_factory(&epoll_server_);
return new QuicSimpleDispatcher(
&config_, &crypto_config_, &version_manager_,
- std::unique_ptr<QuicEpollConnectionHelper>(new QuicEpollConnectionHelper(
- &epoll_server_, QuicAllocator::BUFFER_POOL)),
+ std::make_unique<QuicDefaultConnectionHelper>(),
std::unique_ptr<QuicCryptoServerStreamBase::Helper>(
new QuicSimpleCryptoServerStreamHelper()),
- std::unique_ptr<QuicEpollAlarmFactory>(
- new QuicEpollAlarmFactory(&epoll_server_)),
- quic_simple_server_backend_, expected_server_connection_id_length_);
+ event_loop_->CreateAlarmFactory(), quic_simple_server_backend_,
+ expected_server_connection_id_length_);
+}
+
+std::unique_ptr<QuicEventLoop> QuicServer::CreateEventLoop() {
+ return GetDefaultEventLoop()->Create(QuicDefaultClock::Get());
}
void QuicServer::HandleEventsForever() {
@@ -166,7 +184,7 @@ void QuicServer::HandleEventsForever() {
}
void QuicServer::WaitForEvents() {
- epoll_server_.WaitForEventsAndExecuteCallbacks();
+ event_loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(50));
}
void QuicServer::Shutdown() {
@@ -176,17 +194,15 @@ void QuicServer::Shutdown() {
dispatcher_->Shutdown();
}
- epoll_server_.Shutdown();
-
- close(fd_);
- fd_ = -1;
+ dispatcher_.reset();
+ event_loop_.reset();
}
-void QuicServer::OnEvent(int fd, QuicEpollEvent* event) {
+void QuicServer::OnSocketEvent(QuicEventLoop* /*event_loop*/,
+ QuicUdpSocketFd fd, QuicSocketEventMask events) {
QUICHE_DCHECK_EQ(fd, fd_);
- event->out_ready_mask = 0;
- if (event->in_events & EPOLLIN) {
+ if (events & kSocketEventReadable) {
QUIC_DVLOG(1) << "EPOLLIN";
dispatcher_->ProcessBufferedChlos(kNumSessionsToCreatePerSocketEvent);
@@ -194,19 +210,27 @@ void QuicServer::OnEvent(int fd, QuicEpollEvent* event) {
bool more_to_read = true;
while (more_to_read) {
more_to_read = packet_reader_->ReadAndDispatchPackets(
- fd_, port_, QuicEpollClock(&epoll_server_), dispatcher_.get(),
+ fd_, port_, *QuicDefaultClock::Get(), dispatcher_.get(),
overflow_supported_ ? &packets_dropped_ : nullptr);
}
if (dispatcher_->HasChlosBuffered()) {
// Register EPOLLIN event to consume buffered CHLO(s).
- event->out_ready_mask |= EPOLLIN;
+ bool success =
+ event_loop_->ArtificiallyNotifyEvent(fd_, kSocketEventReadable);
+ QUICHE_DCHECK(success);
+ }
+ if (!event_loop_->SupportsEdgeTriggered()) {
+ bool success = event_loop_->RearmSocket(fd_, kSocketEventReadable);
+ QUICHE_DCHECK(success);
}
}
- if (event->in_events & EPOLLOUT) {
+ if (events & kSocketEventWritable) {
dispatcher_->OnCanWrite();
- if (dispatcher_->HasPendingWrites()) {
- event->out_ready_mask |= EPOLLOUT;
+ if (!event_loop_->SupportsEdgeTriggered() &&
+ dispatcher_->HasPendingWrites()) {
+ bool success = event_loop_->RearmSocket(fd_, kSocketEventWritable);
+ QUICHE_DCHECK(success);
}
}
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.h
index 5c65fe0a4d6..0e4837167f1 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server.h
@@ -15,13 +15,12 @@
#include "absl/strings/string_view.h"
#include "quiche/quic/core/crypto/quic_crypto_server_config.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/io/socket_factory.h"
#include "quiche/quic/core/quic_config.h"
-#include "quiche/quic/core/quic_epoll_connection_helper.h"
-#include "quiche/quic/core/quic_framer.h"
#include "quiche/quic/core/quic_packet_writer.h"
#include "quiche/quic/core/quic_udp_socket.h"
#include "quiche/quic/core/quic_version_manager.h"
-#include "quiche/quic/platform/api/quic_epoll.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/tools/quic_simple_server_backend.h"
#include "quiche/quic/tools/quic_spdy_server_base.h"
@@ -35,9 +34,9 @@ class QuicServerPeer;
class QuicDispatcher;
class QuicPacketReader;
-class QuicServer : public QuicSpdyServerBase,
- public QuicEpollCallbackInterface {
+class QuicServer : public QuicSpdyServerBase, public QuicSocketEventListener {
public:
+ // `quic_simple_server_backend` must outlive the created QuicServer.
QuicServer(std::unique_ptr<ProofSource> proof_source,
QuicSimpleServerBackend* quic_simple_server_backend);
QuicServer(std::unique_ptr<ProofSource> proof_source,
@@ -54,8 +53,6 @@ class QuicServer : public QuicSpdyServerBase,
~QuicServer() override;
- std::string Name() const override { return "QuicServer"; }
-
// Start listening on the specified address.
bool CreateUDPSocketAndListen(const QuicSocketAddress& address) override;
// Handles all events. Does not return.
@@ -64,17 +61,12 @@ class QuicServer : public QuicSpdyServerBase,
// Wait up to 50ms, and handle any events which occur.
void WaitForEvents();
- // Server deletion is imminent. Start cleaning up the epoll server.
+ // Server deletion is imminent. Start cleaning up any pending sessions.
virtual void Shutdown();
- // From EpollCallbackInterface
- void OnRegistration(QuicEpollServer* /*eps*/, int /*fd*/,
- int /*event_mask*/) override {}
- void OnModification(int /*fd*/, int /*event_mask*/) override {}
- void OnEvent(int /*fd*/, QuicEpollEvent* /*event*/) override;
- void OnUnregistration(int /*fd*/, bool /*replaced*/) override {}
-
- void OnShutdown(QuicEpollServer* /*eps*/, int /*fd*/) override {}
+ // QuicSocketEventListener implementation.
+ void OnSocketEvent(QuicEventLoop* event_loop, QuicUdpSocketFd fd,
+ QuicSocketEventMask events) override;
void SetChloMultiplier(size_t multiplier) {
crypto_config_.set_chlo_multiplier(multiplier);
@@ -90,13 +82,15 @@ class QuicServer : public QuicSpdyServerBase,
int port() { return port_; }
- QuicEpollServer* epoll_server() { return &epoll_server_; }
+ QuicEventLoop* event_loop() { return event_loop_.get(); }
protected:
virtual QuicPacketWriter* CreateWriter(int fd);
virtual QuicDispatcher* CreateQuicDispatcher();
+ virtual std::unique_ptr<QuicEventLoop> CreateEventLoop();
+
const QuicConfig& config() const { return config_; }
const QuicCryptoServerConfig& crypto_config() const { return crypto_config_; }
@@ -120,10 +114,13 @@ class QuicServer : public QuicSpdyServerBase,
// Initialize the internal state of the server.
void Initialize();
+ // Schedules alarms and notifies the server of the I/O events.
+ std::unique_ptr<QuicEventLoop> event_loop_;
+ // Used by some backends to create additional sockets, e.g. for upstream
+ // destination connections for proxying.
+ std::unique_ptr<SocketFactory> socket_factory_;
// Accepts data from the framer and demuxes clients to sessions.
std::unique_ptr<QuicDispatcher> dispatcher_;
- // Frames incoming packets and hands them to the dispatcher.
- QuicEpollServer epoll_server_;
// The port the server is listening on.
int port_;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_bin.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_bin.cc
index b7e587b9c6a..d823af0f745 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_bin.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_bin.cc
@@ -7,9 +7,7 @@
#include <vector>
-#include "quiche/quic/core/quic_versions.h"
-#include "quiche/quic/platform/api/quic_flags.h"
-#include "quiche/quic/tools/quic_epoll_server_factory.h"
+#include "quiche/quic/tools/quic_server_factory.h"
#include "quiche/quic/tools/quic_toy_server.h"
#include "quiche/common/platform/api/quiche_command_line_flags.h"
#include "quiche/common/platform/api/quiche_system_event_loop.h"
@@ -25,7 +23,7 @@ int main(int argc, char* argv[]) {
}
quic::QuicToyServer::MemoryCacheBackendFactory backend_factory;
- quic::QuicEpollServerFactory server_factory;
+ quic::QuicServerFactory server_factory;
quic::QuicToyServer server(&backend_factory, &server_factory);
return server.Start();
}
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_epoll_server_factory.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc
index a81b973b4cf..7aac48b1e3b 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_epoll_server_factory.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "quiche/quic/tools/quic_epoll_server_factory.h"
+#include "quiche/quic/tools/quic_server_factory.h"
#include <utility>
@@ -10,7 +10,7 @@
namespace quic {
-std::unique_ptr<quic::QuicSpdyServerBase> QuicEpollServerFactory::CreateServer(
+std::unique_ptr<quic::QuicSpdyServerBase> QuicServerFactory::CreateServer(
quic::QuicSimpleServerBackend* backend,
std::unique_ptr<quic::ProofSource> proof_source,
const quic::ParsedQuicVersionVector& supported_versions) {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_epoll_server_factory.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.h
index c1e2e2cbc64..ba6bdfceb6d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_epoll_server_factory.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_factory.h
@@ -2,26 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef QUICHE_QUIC_TOOLS_QUIC_EPOLL_SERVER_FACTORY_H_
-#define QUICHE_QUIC_TOOLS_QUIC_EPOLL_SERVER_FACTORY_H_
+#ifndef QUICHE_QUIC_TOOLS_QUIC_SERVER_FACTORY_H_
+#define QUICHE_QUIC_TOOLS_QUIC_SERVER_FACTORY_H_
-#include "quiche/quic/platform/api/quic_epoll.h"
#include "quiche/quic/tools/quic_toy_server.h"
namespace quic {
// Factory creating QuicServer instances.
-class QuicEpollServerFactory : public QuicToyServer::ServerFactory {
+class QuicServerFactory : public QuicToyServer::ServerFactory {
public:
std::unique_ptr<QuicSpdyServerBase> CreateServer(
QuicSimpleServerBackend* backend,
std::unique_ptr<ProofSource> proof_source,
const quic::ParsedQuicVersionVector& supported_versions) override;
-
- private:
- QuicEpollServer epoll_server_;
};
} // namespace quic
-#endif // QUICHE_QUIC_TOOLS_QUIC_EPOLL_SERVER_FACTORY_H_
+#endif // QUICHE_QUIC_TOOLS_QUIC_SERVER_FACTORY_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_test.cc
index b0094be053f..fe68ba574cd 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_server_test.cc
@@ -4,10 +4,15 @@
#include "quiche/quic/tools/quic_server.h"
+#include <memory>
+
#include "absl/base/macros.h"
#include "quiche/quic/core/crypto/quic_random.h"
-#include "quiche/quic/core/quic_epoll_alarm_factory.h"
-#include "quiche/quic/core/quic_epoll_connection_helper.h"
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
+#include "quiche/quic/core/quic_default_clock.h"
+#include "quiche/quic/core/quic_default_connection_helper.h"
+#include "quiche/quic/core/quic_default_packet_writer.h"
#include "quiche/quic/core/quic_utils.h"
#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_logging.h"
@@ -50,9 +55,12 @@ class MockQuicSimpleDispatcher : public QuicSimpleDispatcher {
class TestQuicServer : public QuicServer {
public:
- TestQuicServer()
+ explicit TestQuicServer(QuicEventLoopFactory* event_loop_factory,
+ QuicMemoryCacheBackend* quic_simple_server_backend)
: QuicServer(crypto_test_utils::ProofSourceForTesting(),
- &quic_simple_server_backend_) {}
+ quic_simple_server_backend),
+ quic_simple_server_backend_(quic_simple_server_backend),
+ event_loop_factory_(event_loop_factory) {}
~TestQuicServer() override = default;
@@ -62,24 +70,27 @@ class TestQuicServer : public QuicServer {
QuicDispatcher* CreateQuicDispatcher() override {
mock_dispatcher_ = new MockQuicSimpleDispatcher(
&config(), &crypto_config(), version_manager(),
- std::unique_ptr<QuicEpollConnectionHelper>(
- new QuicEpollConnectionHelper(epoll_server(),
- QuicAllocator::BUFFER_POOL)),
+ std::make_unique<QuicDefaultConnectionHelper>(),
std::unique_ptr<QuicCryptoServerStreamBase::Helper>(
new QuicSimpleCryptoServerStreamHelper()),
- std::unique_ptr<QuicEpollAlarmFactory>(
- new QuicEpollAlarmFactory(epoll_server())),
- &quic_simple_server_backend_);
+ event_loop()->CreateAlarmFactory(), quic_simple_server_backend_);
return mock_dispatcher_;
}
+ std::unique_ptr<QuicEventLoop> CreateEventLoop() override {
+ return event_loop_factory_->Create(QuicDefaultClock::Get());
+ }
+
MockQuicSimpleDispatcher* mock_dispatcher_ = nullptr;
- QuicMemoryCacheBackend quic_simple_server_backend_;
+ QuicMemoryCacheBackend* quic_simple_server_backend_;
+ QuicEventLoopFactory* event_loop_factory_;
};
-class QuicServerEpollInTest : public QuicTest {
+class QuicServerEpollInTest : public QuicTestWithParam<QuicEventLoopFactory*> {
public:
- QuicServerEpollInTest() : server_address_(TestLoopback(), 0) {}
+ QuicServerEpollInTest()
+ : server_address_(TestLoopback(), 0),
+ server_(GetParam(), &quic_simple_server_backend_) {}
void StartListening() {
server_.CreateUDPSocketAndListen(server_address_);
@@ -95,13 +106,23 @@ class QuicServerEpollInTest : public QuicTest {
protected:
QuicSocketAddress server_address_;
+ QuicMemoryCacheBackend quic_simple_server_backend_;
TestQuicServer server_;
};
+std::string GetTestParamName(
+ ::testing::TestParamInfo<QuicEventLoopFactory*> info) {
+ return EscapeTestParamName(info.param->GetName());
+}
+
+INSTANTIATE_TEST_SUITE_P(QuicServerEpollInTests, QuicServerEpollInTest,
+ ::testing::ValuesIn(GetAllSupportedEventLoops()),
+ GetTestParamName);
+
// Tests that if dispatcher has CHLOs waiting for connection creation, EPOLLIN
// event should try to create connections for them. And set epoll mask with
// EPOLLIN if there are still CHLOs remaining at the end of epoll event.
-TEST_F(QuicServerEpollInTest, ProcessBufferedCHLOsOnEpollin) {
+TEST_P(QuicServerEpollInTest, ProcessBufferedCHLOsOnEpollin) {
// Given an EPOLLIN event, try to create session for buffered CHLOs. In first
// event, dispatcher can't create session for all of CHLOs. So listener should
// register another EPOLLIN event by itself. Even without new packet arrival,
@@ -147,14 +168,11 @@ class QuicServerDispatchPacketTest : public QuicTest {
crypto_test_utils::ProofSourceForTesting(),
KeyExchangeSource::Default()),
version_manager_(AllSupportedVersions()),
+ event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get())),
dispatcher_(&config_, &crypto_config_, &version_manager_,
- std::unique_ptr<QuicEpollConnectionHelper>(
- new QuicEpollConnectionHelper(
- &eps_, QuicAllocator::BUFFER_POOL)),
- std::unique_ptr<QuicCryptoServerStreamBase::Helper>(
- new QuicSimpleCryptoServerStreamHelper()),
- std::unique_ptr<QuicEpollAlarmFactory>(
- new QuicEpollAlarmFactory(&eps_)),
+ std::make_unique<QuicDefaultConnectionHelper>(),
+ std::make_unique<QuicSimpleCryptoServerStreamHelper>(),
+ event_loop_->CreateAlarmFactory(),
&quic_simple_server_backend_) {
dispatcher_.InitializeWithWriter(new QuicDefaultPacketWriter(1234));
}
@@ -168,7 +186,7 @@ class QuicServerDispatchPacketTest : public QuicTest {
QuicConfig config_;
QuicCryptoServerConfig crypto_config_;
QuicVersionManager version_manager_;
- QuicEpollServer eps_;
+ std::unique_ptr<QuicEventLoop> event_loop_;
QuicMemoryCacheBackend quic_simple_server_backend_;
MockQuicDispatcher dispatcher_;
};
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_backend.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_backend.h
index c603468b134..26eaa65f92d 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_backend.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_backend.h
@@ -9,12 +9,12 @@
#include <memory>
#include "absl/strings/string_view.h"
+#include "quiche/quic/core/io/socket_factory.h"
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/web_transport_interface.h"
-#include "quiche/quic/platform/api/quic_logging.h"
#include "quiche/quic/tools/quic_backend_response.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -59,6 +59,10 @@ class QuicSimpleServerBackend {
// Returns true if the backend has been successfully initialized
// and could be used to fetch HTTP requests
virtual bool IsBackendInitialized() const = 0;
+ // Passes the socket factory in use by the QuicServer. Must live as long as
+ // incoming requests/data are still sent to the backend, or until cleared by
+ // calling with null. Must not be called while backend is handling requests.
+ virtual void SetSocketFactory(SocketFactory* /*socket_factory*/) {}
// Triggers a HTTP request to be sent to the backend server or cache
// If response is immediately available, the function synchronously calls
// the `request_handler` with the HTTP response.
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.h
index 0530ce26a3a..f9490bdedaf 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_session.h
@@ -23,6 +23,7 @@
#include "quiche/quic/tools/quic_backend_response.h"
#include "quiche/quic/tools/quic_simple_server_backend.h"
#include "quiche/quic/tools/quic_simple_server_stream.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc
index 608d7b58289..beea65a993e 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.cc
@@ -96,12 +96,6 @@ void QuicSimpleServerStream::OnInitialHeadersComplete(
}
}
-void QuicSimpleServerStream::OnTrailingHeadersComplete(
- bool /*fin*/, size_t /*frame_len*/, const QuicHeaderList& /*header_list*/) {
- QUIC_BUG(quic_bug_10962_1) << "Server does not support receiving Trailers.";
- SendErrorResponse();
-}
-
void QuicSimpleServerStream::OnBodyAvailable() {
while (HasBytesToRead()) {
struct iovec iov;
@@ -251,6 +245,31 @@ std::string QuicSimpleServerStream::peer_host() const {
return spdy_session()->peer_address().host().ToString();
}
+namespace {
+
+class DelayedResponseAlarm : public QuicAlarm::DelegateWithContext {
+ public:
+ DelayedResponseAlarm(QuicSimpleServerStream* stream,
+ const QuicBackendResponse* response)
+ : QuicAlarm::DelegateWithContext(
+ stream->spdy_session()->connection()->context()),
+ stream_(stream),
+ response_(response) {
+ stream_ = stream;
+ response_ = response;
+ }
+
+ ~DelayedResponseAlarm() override = default;
+
+ void OnAlarm() override { stream_->Respond(response_); }
+
+ private:
+ QuicSimpleServerStream* stream_;
+ const QuicBackendResponse* response_;
+};
+
+} // namespace
+
void QuicSimpleServerStream::OnResponseBackendComplete(
const QuicBackendResponse* response) {
if (response == nullptr) {
@@ -259,6 +278,19 @@ void QuicSimpleServerStream::OnResponseBackendComplete(
return;
}
+ auto delay = response->delay();
+ if (delay.IsZero()) {
+ Respond(response);
+ return;
+ }
+
+ auto* connection = session()->connection();
+ delayed_response_alarm_.reset(connection->alarm_factory()->CreateAlarm(
+ new DelayedResponseAlarm(this, response)));
+ delayed_response_alarm_->Set(connection->clock()->Now() + delay);
+}
+
+void QuicSimpleServerStream::Respond(const QuicBackendResponse* response) {
// Send Early Hints first.
for (const auto& headers : response->early_hints()) {
QUIC_DVLOG(1) << "Stream " << id() << " sending an Early Hints response: "
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.h
index 7b7859a8f5f..3bcd9edba8a 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream.h
@@ -14,6 +14,7 @@
#include "quiche/quic/core/quic_packets.h"
#include "quiche/quic/tools/quic_backend_response.h"
#include "quiche/quic/tools/quic_simple_server_backend.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_framer.h"
namespace quic {
@@ -35,8 +36,6 @@ class QuicSimpleServerStream : public QuicSpdyServerStreamBase,
// QuicSpdyStream
void OnInitialHeadersComplete(bool fin, size_t frame_len,
const QuicHeaderList& header_list) override;
- void OnTrailingHeadersComplete(bool fin, size_t frame_len,
- const QuicHeaderList& header_list) override;
void OnCanWrite() override;
// QuicStream implementation called by the sequencer when there is
@@ -62,6 +61,8 @@ class QuicSimpleServerStream : public QuicSpdyServerStreamBase,
void SendStreamData(absl::string_view data, bool close_stream) override;
void TerminateStreamWithError(QuicResetStreamError error) override;
+ void Respond(const QuicBackendResponse* response);
+
protected:
// Handles fresh body data whenever received when method is CONNECT.
void HandleRequestConnectData(bool fin_received);
@@ -107,6 +108,8 @@ class QuicSimpleServerStream : public QuicSpdyServerStreamBase,
quic_simple_server_backend_ = backend;
}
+ bool response_sent() const { return response_sent_; }
+
// The parsed headers received from the client.
spdy::Http2HeaderBlock request_headers_;
int64_t content_length_;
@@ -117,6 +120,8 @@ class QuicSimpleServerStream : public QuicSpdyServerStreamBase,
// Whether response headers have already been sent.
bool response_sent_ = false;
+ std::unique_ptr<QuicAlarm> delayed_response_alarm_;
+
QuicSimpleServerBackend* quic_simple_server_backend_; // Not owned.
};
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream_test.cc
index 5d9ff15e3b2..92d06bd4996 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_simple_server_stream_test.cc
@@ -15,10 +15,13 @@
#include "quiche/quic/core/crypto/null_encrypter.h"
#include "quiche/quic/core/http/http_encoder.h"
#include "quiche/quic/core/http/spdy_utils.h"
+#include "quiche/quic/core/quic_alarm_factory.h"
+#include "quiche/quic/core/quic_default_clock.h"
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_utils.h"
#include "quiche/quic/platform/api/quic_expect_bug.h"
+#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/crypto_test_utils.h"
@@ -28,12 +31,12 @@
#include "quiche/quic/test_tools/quic_spdy_session_peer.h"
#include "quiche/quic/test_tools/quic_stream_peer.h"
#include "quiche/quic/test_tools/quic_test_utils.h"
+#include "quiche/quic/test_tools/simulator/simulator.h"
#include "quiche/quic/tools/quic_backend_response.h"
#include "quiche/quic/tools/quic_memory_cache_backend.h"
#include "quiche/quic/tools/quic_simple_server_backend.h"
#include "quiche/quic/tools/quic_simple_server_session.h"
#include "quiche/common/simple_buffer_allocator.h"
-#include "quiche/spdy/core/spdy_header_block.h"
using testing::_;
using testing::AnyNumber;
@@ -63,6 +66,7 @@ class TestStream : public QuicSimpleServerStream {
~TestStream() override = default;
+ MOCK_METHOD(void, FireAlarmMock, (), ());
MOCK_METHOD(void, WriteHeadersMock, (bool fin), ());
MOCK_METHOD(void, WriteEarlyHintsHeadersMock, (bool fin), ());
MOCK_METHOD(void, WriteOrBufferBody, (absl::string_view data, bool fin),
@@ -205,7 +209,7 @@ class QuicSimpleServerStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
public:
QuicSimpleServerStreamTest()
: connection_(new StrictMock<MockQuicConnection>(
- &helper_, &alarm_factory_, Perspective::IS_SERVER,
+ &simulator_, simulator_.GetAlarmFactory(), Perspective::IS_SERVER,
SupportedVersions(GetParam()))),
crypto_config_(new QuicCryptoServerConfig(
QuicCryptoServerConfig::TESTING, QuicRandom::GetInstance(),
@@ -275,9 +279,9 @@ class QuicSimpleServerStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
stream_->ReplaceBackend(replacement_backend_.get());
}
+ quic::simulator::Simulator simulator_;
spdy::Http2HeaderBlock response_headers_;
MockQuicConnectionHelper helper_;
- MockAlarmFactory alarm_factory_;
StrictMock<MockQuicConnection>* connection_;
StrictMock<MockQuicSessionVisitor> session_owner_;
StrictMock<MockQuicCryptoServerStreamHelper> session_helper_;
@@ -565,6 +569,61 @@ TEST_P(QuicSimpleServerStreamTest, SendResponseWithEarlyHints) {
EXPECT_TRUE(stream_->write_side_closed());
}
+class AlarmTestDelegate : public QuicAlarm::DelegateWithoutContext {
+ public:
+ AlarmTestDelegate(TestStream* stream) : stream_(stream) {}
+
+ void OnAlarm() override { stream_->FireAlarmMock(); }
+
+ private:
+ TestStream* stream_;
+};
+
+TEST_P(QuicSimpleServerStreamTest, SendResponseWithDelay) {
+ // Add a request and response with valid headers.
+ spdy::Http2HeaderBlock* request_headers = stream_->mutable_headers();
+ std::string host = "www.google.com";
+ std::string path = "/bar";
+ (*request_headers)[":path"] = path;
+ (*request_headers)[":authority"] = host;
+ (*request_headers)[":method"] = "GET";
+
+ response_headers_[":status"] = "200";
+ response_headers_["content-length"] = "5";
+ std::string body = "Yummm";
+ QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(3000);
+
+ quiche::QuicheBuffer header = HttpEncoder::SerializeDataFrameHeader(
+ body.length(), quiche::SimpleBufferAllocator::Get());
+
+ memory_cache_backend_.AddResponse(host, path, std::move(response_headers_),
+ body);
+ auto did_delay_succeed =
+ memory_cache_backend_.SetResponseDelay(host, path, delay);
+ EXPECT_TRUE(did_delay_succeed);
+ auto did_invalid_delay_succeed =
+ memory_cache_backend_.SetResponseDelay(host, "nonsense", delay);
+ EXPECT_FALSE(did_invalid_delay_succeed);
+ std::unique_ptr<QuicAlarm> alarm(connection_->alarm_factory()->CreateAlarm(
+ new AlarmTestDelegate(stream_)));
+ alarm->Set(connection_->clock()->Now() + delay);
+ QuicStreamPeer::SetFinReceived(stream_);
+ InSequence s;
+ EXPECT_CALL(*stream_, FireAlarmMock());
+ EXPECT_CALL(*stream_, WriteHeadersMock(false));
+
+ if (UsesHttp3()) {
+ EXPECT_CALL(session_, WritevData(_, header.size(), _, NO_FIN, _, _));
+ }
+ EXPECT_CALL(session_, WritevData(_, body.length(), _, FIN, _, _));
+
+ stream_->DoSendResponse();
+ simulator_.RunFor(delay);
+
+ EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
+ EXPECT_TRUE(stream_->write_side_closed());
+}
+
TEST_P(QuicSimpleServerStreamTest, PushResponseOnClientInitiatedStream) {
// EXPECT_QUIC_BUG tests are expensive so only run one instance of them.
if (GetParam() != AllSupportedVersions()[0]) {
@@ -644,6 +703,12 @@ TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLength) {
// \000 is a way to write the null byte when followed by a literal digit.
header_list_.OnHeader("content-length", absl::string_view("11\00012", 5));
+ if (GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) &&
+ session_.version().UsesHttp3()) {
+ EXPECT_CALL(session_,
+ MaybeSendStopSendingFrame(_, QuicResetStreamError::FromInternal(
+ QUIC_STREAM_NO_ERROR)));
+ }
EXPECT_CALL(*stream_, WriteHeadersMock(false));
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _))
.WillRepeatedly(
@@ -660,6 +725,12 @@ TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) {
// \000 is a way to write the null byte when followed by a literal digit.
header_list_.OnHeader("content-length", absl::string_view("\00012", 3));
+ if (GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) &&
+ session_.version().UsesHttp3()) {
+ EXPECT_CALL(session_,
+ MaybeSendStopSendingFrame(_, QuicResetStreamError::FromInternal(
+ QUIC_STREAM_NO_ERROR)));
+ }
EXPECT_CALL(*stream_, WriteHeadersMock(false));
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _))
.WillRepeatedly(
@@ -671,17 +742,35 @@ TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) {
EXPECT_TRUE(stream_->write_side_closed());
}
-TEST_P(QuicSimpleServerStreamTest, ValidMultipleContentLength) {
+TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLengthII) {
spdy::Http2HeaderBlock request_headers;
// \000 is a way to write the null byte when followed by a literal digit.
header_list_.OnHeader("content-length", absl::string_view("11\00011", 5));
+ if (GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) &&
+ session_.version().UsesHttp3()) {
+ EXPECT_CALL(session_,
+ MaybeSendStopSendingFrame(_, QuicResetStreamError::FromInternal(
+ QUIC_STREAM_NO_ERROR)));
+ EXPECT_CALL(*stream_, WriteHeadersMock(false));
+ EXPECT_CALL(session_, WritevData(_, _, _, _, _, _))
+ .WillRepeatedly(
+ Invoke(&session_, &MockQuicSimpleServerSession::ConsumeData));
+ }
+
stream_->OnStreamHeaderList(false, kFakeFrameLen, header_list_);
- EXPECT_EQ(11, stream_->content_length());
- EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
- EXPECT_FALSE(stream_->reading_stopped());
- EXPECT_FALSE(stream_->write_side_closed());
+ if (GetQuicReloadableFlag(quic_validate_header_field_value_at_spdy_stream) &&
+ session_.version().UsesHttp3()) {
+ EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_));
+ EXPECT_TRUE(stream_->reading_stopped());
+ EXPECT_TRUE(stream_->write_side_closed());
+ } else {
+ EXPECT_EQ(11, stream_->content_length());
+ EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
+ EXPECT_FALSE(stream_->reading_stopped());
+ EXPECT_FALSE(stream_->write_side_closed());
+ }
}
TEST_P(QuicSimpleServerStreamTest,
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.h
index a6c4a4a392b..aad229a9e88 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_spdy_client_base.h
@@ -18,6 +18,7 @@
#include "quiche/quic/core/quic_config.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/tools/quic_client_base.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.cc
index 790e26361ae..be51cf33fd8 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.cc
@@ -64,6 +64,7 @@
#include "quiche/quic/tools/quic_url.h"
#include "quiche/common/platform/api/quiche_command_line_flags.h"
#include "quiche/common/quiche_text_utils.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace {
@@ -186,6 +187,9 @@ DEFINE_QUICHE_COMMAND_LINE_FLAG(
int32_t, max_inbound_header_list_size, 128 * 1024,
"Max inbound header list size. 0 means default.");
+DEFINE_QUICHE_COMMAND_LINE_FLAG(std::string, interface_name, "",
+ "Interface name to bind QUIC UDP sockets to.");
+
namespace quic {
namespace {
@@ -366,6 +370,11 @@ int QuicToyClient::SendRequestsAndPrintResponses(
if (max_inbound_header_list_size > 0) {
client->set_max_inbound_header_list_size(max_inbound_header_list_size);
}
+ const std::string interface_name =
+ quiche::GetQuicheCommandLineFlag(FLAGS_interface_name);
+ if (!interface_name.empty()) {
+ client->set_interface_name(interface_name);
+ }
if (!client->Initialize()) {
std::cerr << "Failed to initialize client." << std::endl;
return 1;
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_server.cc b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_server.cc
index 1e31b2e0124..6b3c76fa7be 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_server.cc
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/quic_toy_server.cc
@@ -9,7 +9,6 @@
#include "quiche/quic/core/quic_versions.h"
#include "quiche/quic/platform/api/quic_default_proof_providers.h"
-#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/tools/quic_memory_cache_backend.h"
#include "quiche/common/platform/api/quiche_command_line_flags.h"
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/tools/web_transport_test_visitors.h b/chromium/net/third_party/quiche/src/quiche/quic/tools/web_transport_test_visitors.h
index e5b7fefda9d..c7630e46f46 100644
--- a/chromium/net/third_party/quiche/src/quiche/quic/tools/web_transport_test_visitors.h
+++ b/chromium/net/third_party/quiche/src/quiche/quic/tools/web_transport_test_visitors.h
@@ -13,6 +13,7 @@
#include "quiche/common/platform/api/quiche_mem_slice.h"
#include "quiche/common/quiche_circular_deque.h"
#include "quiche/common/simple_buffer_allocator.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace quic {
@@ -175,7 +176,7 @@ class EchoWebTransportSessionVisitor : public WebTransportVisitor {
EchoWebTransportSessionVisitor(WebTransportSession* session)
: session_(session) {}
- void OnSessionReady(const spdy::SpdyHeaderBlock&) override {
+ void OnSessionReady(const spdy::Http2HeaderBlock&) override {
if (session_->CanOpenNextOutgoingBidirectionalStream()) {
OnCanCreateNewOutgoingBidirectionalStream();
}
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.cc
index 874a7947d63..122fe458191 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.cc
@@ -98,7 +98,7 @@ bool HpackDecoderAdapter::HandleControlFrameHeadersComplete() {
return true;
}
-const SpdyHeaderBlock& HpackDecoderAdapter::decoded_block() const {
+const Http2HeaderBlock& HpackDecoderAdapter::decoded_block() const {
return listener_adapter_.decoded_block();
}
@@ -148,7 +148,7 @@ void HpackDecoderAdapter::ListenerAdapter::OnHeader(const std::string& name,
void HpackDecoderAdapter::ListenerAdapter::OnHeaderListEnd() {
QUICHE_DVLOG(2) << "HpackDecoderAdapter::ListenerAdapter::OnHeaderListEnd";
- // We don't clear the SpdyHeaderBlock here to allow access to it until the
+ // We don't clear the Http2HeaderBlock here to allow access to it until the
// next HPACK block is decoded.
if (handler_ != nullptr) {
handler_->OnHeaderBlockEnd(total_uncompressed_bytes_, total_hpack_bytes_);
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.h
index d1eefbd521f..5cd16fcbc31 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter.h
@@ -20,7 +20,7 @@
#include "quiche/http2/hpack/http2_hpack_constants.h"
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/spdy/core/hpack/hpack_header_table.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_headers_handler_interface.h"
namespace spdy {
@@ -43,7 +43,7 @@ class QUICHE_EXPORT_PRIVATE HpackDecoderAdapter {
size_t GetCurrentHeaderTableSizeSetting() const;
// If a SpdyHeadersHandlerInterface is provided, the decoder will emit
- // headers to it rather than accumulating them in a SpdyHeaderBlock.
+ // headers to it rather than accumulating them in a Http2HeaderBlock.
// Does not take ownership of the handler, but does use the pointer until
// the current HPACK block is completely decoded.
void HandleControlFrameHeadersStart(SpdyHeadersHandlerInterface* handler);
@@ -65,7 +65,7 @@ class QUICHE_EXPORT_PRIVATE HpackDecoderAdapter {
// call to HandleControlFrameHeadersData().
// TODO(birenroy): Remove this method when all users of HpackDecoder specify
// a SpdyHeadersHandlerInterface.
- const SpdyHeaderBlock& decoded_block() const;
+ const Http2HeaderBlock& decoded_block() const;
// Returns the current dynamic table size, including the 32 bytes per entry
// overhead mentioned in RFC 7541 section 4.1.
@@ -98,11 +98,11 @@ class QUICHE_EXPORT_PRIVATE HpackDecoderAdapter {
~ListenerAdapter() override;
// If a SpdyHeadersHandlerInterface is provided, the decoder will emit
- // headers to it rather than accumulating them in a SpdyHeaderBlock.
+ // headers to it rather than accumulating them in a Http2HeaderBlock.
// Does not take ownership of the handler, but does use the pointer until
// the current HPACK block is completely decoded.
void set_handler(SpdyHeadersHandlerInterface* handler);
- const SpdyHeaderBlock& decoded_block() const { return decoded_block_; }
+ const Http2HeaderBlock& decoded_block() const { return decoded_block_; }
// Override the HpackDecoderListener methods:
void OnHeaderListStart() override;
@@ -115,8 +115,8 @@ class QUICHE_EXPORT_PRIVATE HpackDecoderAdapter {
private:
// If the caller doesn't provide a handler, the header list is stored in
- // this SpdyHeaderBlock.
- SpdyHeaderBlock decoded_block_;
+ // this Http2HeaderBlock.
+ Http2HeaderBlock decoded_block_;
// If non-NULL, handles decoded headers. Not owned.
SpdyHeadersHandlerInterface* handler_;
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter_test.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter_test.cc
index 5df9d8208c5..2143807695a 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_decoder_adapter_test.cc
@@ -197,7 +197,7 @@ class HpackDecoderAdapterTest
return DecodeHeaderBlock(hbb.buffer());
}
- const SpdyHeaderBlock& decoded_block() const {
+ const Http2HeaderBlock& decoded_block() const {
if (start_choice_ == START_WITH_HANDLER) {
return handler_.decoded_block();
} else {
@@ -205,7 +205,7 @@ class HpackDecoderAdapterTest
}
}
- static size_t SizeOfHeaders(const SpdyHeaderBlock& headers) {
+ static size_t SizeOfHeaders(const Http2HeaderBlock& headers) {
size_t size = 0;
for (const auto& kv : headers) {
if (kv.first == kCookieKey) {
@@ -221,7 +221,7 @@ class HpackDecoderAdapterTest
return size;
}
- const SpdyHeaderBlock& DecodeBlockExpectingSuccess(absl::string_view str) {
+ const Http2HeaderBlock& DecodeBlockExpectingSuccess(absl::string_view str) {
EXPECT_TRUE(DecodeHeaderBlock(str));
return decoded_block();
}
@@ -234,9 +234,9 @@ class HpackDecoderAdapterTest
EXPECT_EQ(size, entry->size());
}
- SpdyHeaderBlock MakeHeaderBlock(
+ Http2HeaderBlock MakeHeaderBlock(
const std::vector<std::pair<std::string, std::string>>& headers) {
- SpdyHeaderBlock result;
+ Http2HeaderBlock result;
for (const auto& kv : headers) {
result.AppendValueOrAddHeader(kv.first, kv.second);
}
@@ -289,7 +289,7 @@ TEST_P(HpackDecoderAdapterTest,
EXPECT_TRUE(HandleControlFrameHeadersData(s.substr(s.size() / 2)));
EXPECT_FALSE(HandleControlFrameHeadersData(s));
- SpdyHeaderBlock expected_block = MakeHeaderBlock({{"a", a_value}});
+ Http2HeaderBlock expected_block = MakeHeaderBlock({{"a", a_value}});
EXPECT_EQ(expected_block, decoded_block());
}
@@ -365,7 +365,7 @@ TEST_P(HpackDecoderAdapterTest, DecodeWithIncompleteData) {
std::vector<std::pair<std::string, std::string>> expected_headers = {
{":method", "GET"}, {":path", "/index.html"}, {":method", "GET"}};
- SpdyHeaderBlock expected_block1 = MakeHeaderBlock(expected_headers);
+ Http2HeaderBlock expected_block1 = MakeHeaderBlock(expected_headers);
EXPECT_EQ(expected_block1, decoded_block());
// Full and partial headers, won't add partial to the headers.
@@ -375,7 +375,7 @@ TEST_P(HpackDecoderAdapterTest, DecodeWithIncompleteData) {
expected_headers.push_back({"goo", "gar"});
expected_headers.push_back({"goo", "gar"});
- SpdyHeaderBlock expected_block2 = MakeHeaderBlock(expected_headers);
+ Http2HeaderBlock expected_block2 = MakeHeaderBlock(expected_headers);
EXPECT_EQ(expected_block2, decoded_block());
// Add the needed data.
@@ -385,7 +385,7 @@ TEST_P(HpackDecoderAdapterTest, DecodeWithIncompleteData) {
expected_headers.push_back({"spam", "gggs"});
- SpdyHeaderBlock expected_block3 = MakeHeaderBlock(expected_headers);
+ Http2HeaderBlock expected_block3 = MakeHeaderBlock(expected_headers);
EXPECT_EQ(expected_block3, decoded_block());
}
@@ -437,44 +437,44 @@ TEST_P(HpackDecoderAdapterTest, HandleHeaderRepresentation) {
// Decoding indexed static table field should work.
TEST_P(HpackDecoderAdapterTest, IndexedHeaderStatic) {
// Reference static table entries #2 and #5.
- const SpdyHeaderBlock& header_set1 = DecodeBlockExpectingSuccess("\x82\x85");
- SpdyHeaderBlock expected_header_set1;
+ const Http2HeaderBlock& header_set1 = DecodeBlockExpectingSuccess("\x82\x85");
+ Http2HeaderBlock expected_header_set1;
expected_header_set1[":method"] = "GET";
expected_header_set1[":path"] = "/index.html";
EXPECT_EQ(expected_header_set1, header_set1);
// Reference static table entry #2.
- const SpdyHeaderBlock& header_set2 = DecodeBlockExpectingSuccess("\x82");
- SpdyHeaderBlock expected_header_set2;
+ const Http2HeaderBlock& header_set2 = DecodeBlockExpectingSuccess("\x82");
+ Http2HeaderBlock expected_header_set2;
expected_header_set2[":method"] = "GET";
EXPECT_EQ(expected_header_set2, header_set2);
}
TEST_P(HpackDecoderAdapterTest, IndexedHeaderDynamic) {
// First header block: add an entry to header table.
- const SpdyHeaderBlock& header_set1 = DecodeBlockExpectingSuccess(
+ const Http2HeaderBlock& header_set1 = DecodeBlockExpectingSuccess(
"\x40\x03"
"foo"
"\x03"
"bar");
- SpdyHeaderBlock expected_header_set1;
+ Http2HeaderBlock expected_header_set1;
expected_header_set1["foo"] = "bar";
EXPECT_EQ(expected_header_set1, header_set1);
// Second header block: add another entry to header table.
- const SpdyHeaderBlock& header_set2 = DecodeBlockExpectingSuccess(
+ const Http2HeaderBlock& header_set2 = DecodeBlockExpectingSuccess(
"\xbe\x40\x04"
"spam"
"\x04"
"eggs");
- SpdyHeaderBlock expected_header_set2;
+ Http2HeaderBlock expected_header_set2;
expected_header_set2["foo"] = "bar";
expected_header_set2["spam"] = "eggs";
EXPECT_EQ(expected_header_set2, header_set2);
// Third header block: refer to most recently added entry.
- const SpdyHeaderBlock& header_set3 = DecodeBlockExpectingSuccess("\xbe");
- SpdyHeaderBlock expected_header_set3;
+ const Http2HeaderBlock& header_set3 = DecodeBlockExpectingSuccess("\xbe");
+ Http2HeaderBlock expected_header_set3;
expected_header_set3["spam"] = "eggs";
EXPECT_EQ(expected_header_set3, header_set3);
}
@@ -608,10 +608,10 @@ TEST_P(HpackDecoderAdapterTest, LiteralHeaderNoIndexing) {
// First header with indexed name, second header with string literal
// name.
const char input[] = "\x04\x0c/sample/path\x00\x06:path2\x0e/sample/path/2";
- const SpdyHeaderBlock& header_set = DecodeBlockExpectingSuccess(
+ const Http2HeaderBlock& header_set = DecodeBlockExpectingSuccess(
absl::string_view(input, ABSL_ARRAYSIZE(input) - 1));
- SpdyHeaderBlock expected_header_set;
+ Http2HeaderBlock expected_header_set;
expected_header_set[":path"] = "/sample/path";
expected_header_set[":path2"] = "/sample/path/2";
EXPECT_EQ(expected_header_set, header_set);
@@ -621,10 +621,10 @@ TEST_P(HpackDecoderAdapterTest, LiteralHeaderNoIndexing) {
// indexing and string literal names should work.
TEST_P(HpackDecoderAdapterTest, LiteralHeaderIncrementalIndexing) {
const char input[] = "\x44\x0c/sample/path\x40\x06:path2\x0e/sample/path/2";
- const SpdyHeaderBlock& header_set = DecodeBlockExpectingSuccess(
+ const Http2HeaderBlock& header_set = DecodeBlockExpectingSuccess(
absl::string_view(input, ABSL_ARRAYSIZE(input) - 1));
- SpdyHeaderBlock expected_header_set;
+ Http2HeaderBlock expected_header_set;
expected_header_set[":path"] = "/sample/path";
expected_header_set[":path2"] = "/sample/path/2";
EXPECT_EQ(expected_header_set, header_set);
@@ -705,7 +705,7 @@ TEST_P(HpackDecoderAdapterTest, HuffmanEOSError) {
TEST_P(HpackDecoderAdapterTest, BasicC31) {
HpackEncoder encoder;
- SpdyHeaderBlock expected_header_set;
+ Http2HeaderBlock expected_header_set;
expected_header_set[":method"] = "GET";
expected_header_set[":scheme"] = "http";
expected_header_set[":path"] = "/";
@@ -744,7 +744,7 @@ TEST_P(HpackDecoderAdapterTest, SectionC4RequestHuffmanExamples) {
// | -> :authority: www.example.com
std::string first =
absl::HexStringToBytes("828684418cf1e3c2e5f23a6ba0ab90f4ff");
- const SpdyHeaderBlock& first_header_set = DecodeBlockExpectingSuccess(first);
+ const Http2HeaderBlock& first_header_set = DecodeBlockExpectingSuccess(first);
EXPECT_THAT(first_header_set,
ElementsAre(
@@ -781,7 +781,7 @@ TEST_P(HpackDecoderAdapterTest, SectionC4RequestHuffmanExamples) {
// | -> cache-control: no-cache
std::string second = absl::HexStringToBytes("828684be5886a8eb10649cbf");
- const SpdyHeaderBlock& second_header_set =
+ const Http2HeaderBlock& second_header_set =
DecodeBlockExpectingSuccess(second);
EXPECT_THAT(second_header_set,
@@ -824,7 +824,7 @@ TEST_P(HpackDecoderAdapterTest, SectionC4RequestHuffmanExamples) {
// | -> custom-key: custom-value
std::string third = absl::HexStringToBytes(
"828785bf408825a849e95ba97d7f8925a849e95bb8e8b4bf");
- const SpdyHeaderBlock& third_header_set = DecodeBlockExpectingSuccess(third);
+ const Http2HeaderBlock& third_header_set = DecodeBlockExpectingSuccess(third);
EXPECT_THAT(
third_header_set,
@@ -897,7 +897,7 @@ TEST_P(HpackDecoderAdapterTest, SectionC6ResponseHuffmanExamples) {
"941054d444a8200595040b8166e082a6"
"2d1bff6e919d29ad171863c78f0b97c8"
"e9ae82ae43d3");
- const SpdyHeaderBlock& first_header_set = DecodeBlockExpectingSuccess(first);
+ const Http2HeaderBlock& first_header_set = DecodeBlockExpectingSuccess(first);
EXPECT_THAT(first_header_set,
ElementsAre(
@@ -936,7 +936,7 @@ TEST_P(HpackDecoderAdapterTest, SectionC6ResponseHuffmanExamples) {
// | -> location:
// | https://www.example.com
std::string second = absl::HexStringToBytes("4883640effc1c0bf");
- const SpdyHeaderBlock& second_header_set =
+ const Http2HeaderBlock& second_header_set =
DecodeBlockExpectingSuccess(second);
EXPECT_THAT(second_header_set,
@@ -1013,7 +1013,7 @@ TEST_P(HpackDecoderAdapterTest, SectionC6ResponseHuffmanExamples) {
"77ad94e7821dd7f2e6c7b335dfdfcd5b"
"3960d5af27087f3672c1ab270fb5291f"
"9587316065c003ed4ee5b1063d5007");
- const SpdyHeaderBlock& third_header_set = DecodeBlockExpectingSuccess(third);
+ const Http2HeaderBlock& third_header_set = DecodeBlockExpectingSuccess(third);
EXPECT_THAT(third_header_set,
ElementsAre(
@@ -1077,12 +1077,12 @@ TEST_P(HpackDecoderAdapterTest, ReuseNameOfEvictedEntry) {
hbb.AppendIndexedHeader(62);
// Can't have DecodeHeaderBlock do the default check for size of the decoded
- // data because SpdyHeaderBlock will join multiple headers with the same
+ // data because Http2HeaderBlock will join multiple headers with the same
// name into a single entry, thus we won't see repeated occurrences of the
// name, instead seeing separators between values.
EXPECT_TRUE(DecodeHeaderBlock(hbb.buffer(), kNoCheckDecodedSize));
- SpdyHeaderBlock expected_header_set;
+ Http2HeaderBlock expected_header_set;
expected_header_set.AppendValueOrAddHeader(name, value1);
expected_header_set.AppendValueOrAddHeader(name, value1);
expected_header_set.AppendValueOrAddHeader(name, value2);
@@ -1090,7 +1090,7 @@ TEST_P(HpackDecoderAdapterTest, ReuseNameOfEvictedEntry) {
expected_header_set.AppendValueOrAddHeader(name, value3);
expected_header_set.AppendValueOrAddHeader(name, value3);
- // SpdyHeaderBlock stores these 6 strings as '\0' separated values.
+ // Http2HeaderBlock stores these 6 strings as '\0' separated values.
// Make sure that is what happened.
std::string joined_values = expected_header_set[name].as_string();
EXPECT_EQ(joined_values.size(),
@@ -1107,7 +1107,7 @@ TEST_P(HpackDecoderAdapterTest, ReuseNameOfEvictedEntry) {
// Regression test for https://crbug.com/747395.
TEST_P(HpackDecoderAdapterTest, Cookies) {
- SpdyHeaderBlock expected_header_set;
+ Http2HeaderBlock expected_header_set;
expected_header_set["cookie"] = "foo; bar";
EXPECT_TRUE(DecodeHeaderBlock(absl::HexStringToBytes("608294e76003626172")));
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc
index 7bfb8a45cd7..3b95cfe13d2 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.cc
@@ -84,7 +84,8 @@ HpackEncoder::HpackEncoder()
HpackEncoder::~HpackEncoder() = default;
-std::string HpackEncoder::EncodeHeaderBlock(const SpdyHeaderBlock& header_set) {
+std::string HpackEncoder::EncodeHeaderBlock(
+ const Http2HeaderBlock& header_set) {
// Separate header set into pseudo-headers and regular headers.
Representations pseudo_headers;
Representations regular_headers;
@@ -265,10 +266,10 @@ void HpackEncoder::DecomposeRepresentation(const Representation& header_field,
}
}
-// Iteratively encodes a SpdyHeaderBlock.
+// Iteratively encodes a Http2HeaderBlock.
class HpackEncoder::Encoderator : public ProgressiveEncoder {
public:
- Encoderator(const SpdyHeaderBlock& header_set, HpackEncoder* encoder);
+ Encoderator(const Http2HeaderBlock& header_set, HpackEncoder* encoder);
Encoderator(const Representations& representations, HpackEncoder* encoder);
// Encoderator is neither copyable nor movable.
@@ -289,7 +290,7 @@ class HpackEncoder::Encoderator : public ProgressiveEncoder {
bool has_next_;
};
-HpackEncoder::Encoderator::Encoderator(const SpdyHeaderBlock& header_set,
+HpackEncoder::Encoderator::Encoderator(const Http2HeaderBlock& header_set,
HpackEncoder* encoder)
: encoder_(encoder), has_next_(true) {
// Separate header set into pseudo-headers and regular headers.
@@ -362,7 +363,7 @@ std::string HpackEncoder::Encoderator::Next(size_t max_encoded_bytes) {
}
std::unique_ptr<HpackEncoder::ProgressiveEncoder> HpackEncoder::EncodeHeaderSet(
- const SpdyHeaderBlock& header_set) {
+ const Http2HeaderBlock& header_set) {
return std::make_unique<Encoderator>(header_set, this);
}
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.h
index 4974e198ddf..d63c9f25db2 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder.h
@@ -18,6 +18,7 @@
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/spdy/core/hpack/hpack_header_table.h"
#include "quiche/spdy/core/hpack/hpack_output_stream.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_protocol.h"
// An HpackEncoder encodes header sets as outlined in
@@ -50,7 +51,7 @@ class QUICHE_EXPORT_PRIVATE HpackEncoder {
~HpackEncoder();
// Encodes and returns the given header set as a string.
- std::string EncodeHeaderBlock(const SpdyHeaderBlock& header_set);
+ std::string EncodeHeaderBlock(const Http2HeaderBlock& header_set);
class QUICHE_EXPORT_PRIVATE ProgressiveEncoder {
public:
@@ -64,9 +65,9 @@ class QUICHE_EXPORT_PRIVATE HpackEncoder {
};
// Returns a ProgressiveEncoder which must be outlived by both the given
- // SpdyHeaderBlock and this object.
+ // Http2HeaderBlock and this object.
std::unique_ptr<ProgressiveEncoder> EncodeHeaderSet(
- const SpdyHeaderBlock& header_set);
+ const Http2HeaderBlock& header_set);
// Returns a ProgressiveEncoder which must be outlived by this HpackEncoder.
// The encoder will not attempt to split any \0-delimited values in
// |representations|. If such splitting is desired, it must be performed by
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder_test.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder_test.cc
index 94025126dbe..fe80ffea95a 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_encoder_test.cc
@@ -72,12 +72,12 @@ class HpackEncoderPeer {
// TODO(dahollings): Remove or clean up these methods when deprecating
// non-incremental encoding path.
static std::string EncodeHeaderBlock(HpackEncoder* encoder,
- const SpdyHeaderBlock& header_set) {
+ const Http2HeaderBlock& header_set) {
return encoder->EncodeHeaderBlock(header_set);
}
static bool EncodeIncremental(HpackEncoder* encoder,
- const SpdyHeaderBlock& header_set,
+ const Http2HeaderBlock& header_set,
std::string* output) {
std::unique_ptr<HpackEncoder::ProgressiveEncoder> encoderator =
encoder->EncodeHeaderSet(header_set);
@@ -209,14 +209,14 @@ class HpackEncoderTest
expected_.AppendPrefix(kHeaderTableSizeUpdateOpcode);
expected_.AppendUint32(size);
}
- Representations MakeRepresentations(const SpdyHeaderBlock& header_set) {
+ Representations MakeRepresentations(const Http2HeaderBlock& header_set) {
Representations r;
for (const auto& header : header_set) {
r.push_back(header);
}
return r;
}
- void CompareWithExpectedEncoding(const SpdyHeaderBlock& header_set) {
+ void CompareWithExpectedEncoding(const Http2HeaderBlock& header_set) {
std::string actual_out;
std::string expected_out = expected_.TakeString();
switch (strategy_) {
@@ -348,7 +348,7 @@ TEST_P(HpackEncoderTest, SingleDynamicIndex) {
ExpectIndex(DynamicIndexToWireIndex(key_2_index_));
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[key_2_->name()] = key_2_->value();
CompareWithExpectedEncoding(headers);
EXPECT_THAT(headers_observed_,
@@ -358,7 +358,7 @@ TEST_P(HpackEncoderTest, SingleDynamicIndex) {
TEST_P(HpackEncoderTest, SingleStaticIndex) {
ExpectIndex(kStaticEntryIndex);
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[static_->name()] = static_->value();
CompareWithExpectedEncoding(headers);
}
@@ -367,7 +367,7 @@ TEST_P(HpackEncoderTest, SingleStaticIndexTooLarge) {
peer_.table()->SetMaxSize(1); // Also evicts all fixtures.
ExpectIndex(kStaticEntryIndex);
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[static_->name()] = static_->value();
CompareWithExpectedEncoding(headers);
@@ -377,7 +377,7 @@ TEST_P(HpackEncoderTest, SingleStaticIndexTooLarge) {
TEST_P(HpackEncoderTest, SingleLiteralWithIndexName) {
ExpectIndexedLiteral(DynamicIndexToWireIndex(key_2_index_), "value3");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[key_2_->name()] = "value3";
CompareWithExpectedEncoding(headers);
@@ -390,7 +390,7 @@ TEST_P(HpackEncoderTest, SingleLiteralWithIndexName) {
TEST_P(HpackEncoderTest, SingleLiteralWithLiteralName) {
ExpectIndexedLiteral("key3", "value3");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["key3"] = "value3";
CompareWithExpectedEncoding(headers);
@@ -406,7 +406,7 @@ TEST_P(HpackEncoderTest, SingleLiteralTooLarge) {
// A header overflowing the header table is still emitted.
// The header table is empty.
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["key3"] = "value3";
CompareWithExpectedEncoding(headers);
@@ -419,7 +419,7 @@ TEST_P(HpackEncoderTest, EmitThanEvict) {
ExpectIndex(DynamicIndexToWireIndex(key_1_index_));
ExpectIndexedLiteral("key3", "value3");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[key_1_->name()] = key_1_->value();
headers["key3"] = "value3";
CompareWithExpectedEncoding(headers);
@@ -430,14 +430,14 @@ TEST_P(HpackEncoderTest, CookieHeaderIsCrumbled) {
ExpectIndex(DynamicIndexToWireIndex(cookie_c_index_));
ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "e=ff");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["cookie"] = "a=bb; c=dd; e=ff";
CompareWithExpectedEncoding(headers);
}
TEST_P(HpackEncoderTest, MultiValuedHeadersNotCrumbled) {
ExpectIndexedLiteral("foo", "bar, baz");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["foo"] = "bar, baz";
CompareWithExpectedEncoding(headers);
}
@@ -479,7 +479,7 @@ TEST_P(HpackEncoderTest, EncodingWithoutCompression) {
}
ExpectNonIndexedLiteral("multivalue", "value1, value2");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":path"] = "/index.html";
headers["cookie"] = "foo=bar; baz=bing";
headers["hello"] = "goodbye";
@@ -514,7 +514,7 @@ TEST_P(HpackEncoderTest, MultipleEncodingPasses) {
// Pass 1.
{
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["key1"] = "value1";
headers["cookie"] = "a=bb";
@@ -529,7 +529,7 @@ TEST_P(HpackEncoderTest, MultipleEncodingPasses) {
// 62: cookie: c=dd
// Pass 2.
{
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["key2"] = "value2";
headers["cookie"] = "c=dd; e=ff";
@@ -550,7 +550,7 @@ TEST_P(HpackEncoderTest, MultipleEncodingPasses) {
// 62: cookie: e=ff
// Pass 3.
{
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["key2"] = "value2";
headers["cookie"] = "a=bb; b=cc; c=dd";
@@ -584,7 +584,7 @@ TEST_P(HpackEncoderTest, MultipleEncodingPasses) {
}
TEST_P(HpackEncoderTest, PseudoHeadersFirst) {
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
// A pseudo-header that should not be indexed.
headers[":path"] = "/spam/eggs.html";
// A pseudo-header to be indexed.
@@ -672,7 +672,7 @@ TEST_P(HpackEncoderTest, CrumbleNullByteDelimitedValue) {
// caller must crumble null-delimited values.
return;
}
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
// A header field to be crumbled: "spam: foo\0bar".
headers["spam"] = std::string("foo\0bar", 7);
@@ -690,7 +690,7 @@ TEST_P(HpackEncoderTest, HeaderTableSizeUpdate) {
ExpectHeaderTableSizeUpdate(1024);
ExpectIndexedLiteral("key3", "value3");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["key3"] = "value3";
CompareWithExpectedEncoding(headers);
@@ -709,7 +709,7 @@ TEST_P(HpackEncoderTest, HeaderTableSizeUpdateWithMin) {
ExpectHeaderTableSizeUpdate(starting_size - 1);
ExpectIndexedLiteral("key3", "value3");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["key3"] = "value3";
CompareWithExpectedEncoding(headers);
@@ -723,7 +723,7 @@ TEST_P(HpackEncoderTest, HeaderTableSizeUpdateWithExistingSize) {
// No encoded size update.
ExpectIndexedLiteral("key3", "value3");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["key3"] = "value3";
CompareWithExpectedEncoding(headers);
@@ -740,7 +740,7 @@ TEST_P(HpackEncoderTest, HeaderTableSizeUpdatesWithGreaterSize) {
ExpectHeaderTableSizeUpdate(starting_size + 2);
ExpectIndexedLiteral("key3", "value3");
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers["key3"] = "value3";
CompareWithExpectedEncoding(headers);
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_round_trip_test.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_round_trip_test.cc
index 27e1bccddaf..44a36d3b282 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_round_trip_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/hpack/hpack_round_trip_test.cc
@@ -12,6 +12,7 @@
#include "quiche/spdy/core/hpack/hpack_constants.h"
#include "quiche/spdy/core/hpack/hpack_decoder_adapter.h"
#include "quiche/spdy/core/hpack/hpack_encoder.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/test_tools/spdy_test_utils.h"
namespace spdy {
@@ -31,7 +32,7 @@ class HpackRoundTripTest
decoder_.ApplyHeaderTableSizeSetting(256);
}
- bool RoundTrip(const SpdyHeaderBlock& header_set) {
+ bool RoundTrip(const Http2HeaderBlock& header_set) {
std::string encoded = encoder_.EncodeHeaderBlock(header_set);
bool success = true;
@@ -81,7 +82,7 @@ INSTANTIATE_TEST_SUITE_P(Tests, HpackRoundTripTest,
TEST_P(HpackRoundTripTest, ResponseFixtures) {
{
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":status"] = "302";
headers["cache-control"] = "private";
headers["date"] = "Mon, 21 Oct 2013 20:13:21 GMT";
@@ -89,7 +90,7 @@ TEST_P(HpackRoundTripTest, ResponseFixtures) {
EXPECT_TRUE(RoundTrip(headers));
}
{
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":status"] = "200";
headers["cache-control"] = "private";
headers["date"] = "Mon, 21 Oct 2013 20:13:21 GMT";
@@ -97,7 +98,7 @@ TEST_P(HpackRoundTripTest, ResponseFixtures) {
EXPECT_TRUE(RoundTrip(headers));
}
{
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":status"] = "200";
headers["cache-control"] = "private";
headers["content-encoding"] = "gzip";
@@ -113,7 +114,7 @@ TEST_P(HpackRoundTripTest, ResponseFixtures) {
TEST_P(HpackRoundTripTest, RequestFixtures) {
{
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":authority"] = "www.example.com";
headers[":method"] = "GET";
headers[":path"] = "/";
@@ -122,7 +123,7 @@ TEST_P(HpackRoundTripTest, RequestFixtures) {
EXPECT_TRUE(RoundTrip(headers));
}
{
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":authority"] = "www.example.com";
headers[":method"] = "GET";
headers[":path"] = "/";
@@ -132,7 +133,7 @@ TEST_P(HpackRoundTripTest, RequestFixtures) {
EXPECT_TRUE(RoundTrip(headers));
}
{
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
headers[":authority"] = "www.example.com";
headers[":method"] = "GET";
headers[":path"] = "/index.html";
@@ -166,7 +167,7 @@ TEST_P(HpackRoundTripTest, RandomizedExamples) {
values.push_back("baz=bing; fizzle=fazzle; garbage");
for (size_t i = 0; i != 2000; ++i) {
- SpdyHeaderBlock headers;
+ Http2HeaderBlock headers;
// Choose a random number of headers to add, and of these a random subset
// will be HTTP/2 pseudo headers.
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.cc
index 89ea6e89665..303f037086a 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.cc
@@ -27,7 +27,6 @@
#include "quiche/spdy/core/hpack/hpack_decoder_adapter.h"
#include "quiche/spdy/core/hpack/hpack_header_table.h"
#include "quiche/spdy/core/spdy_alt_svc_wire_format.h"
-#include "quiche/spdy/core/spdy_header_block.h"
#include "quiche/spdy/core/spdy_headers_handler_interface.h"
#include "quiche/spdy/core/spdy_protocol.h"
@@ -725,17 +724,19 @@ void Http2DecoderAdapter::OnPriorityUpdateEnd() {
priority_field_value_.clear();
}
-// Except for BLOCKED frames, all other unknown frames are either dropped or
-// passed to a registered extension.
void Http2DecoderAdapter::OnUnknownStart(const Http2FrameHeader& header) {
QUICHE_DVLOG(1) << "OnUnknownStart: " << header;
if (IsOkToStartFrame(header)) {
+ frame_header_ = header;
+ has_frame_header_ = true;
+ const uint8_t type = static_cast<uint8_t>(header.type);
+ const uint8_t flags = static_cast<uint8_t>(header.flags);
if (extension_ != nullptr) {
- const uint8_t type = static_cast<uint8_t>(header.type);
- const uint8_t flags = static_cast<uint8_t>(header.flags);
handling_extension_payload_ = extension_->OnFrameHeader(
header.stream_id, header.payload_length, type, flags);
}
+ visitor()->OnUnknownFrameStart(header.stream_id, header.payload_length,
+ type, flags);
}
}
@@ -745,6 +746,8 @@ void Http2DecoderAdapter::OnUnknownPayload(const char* data, size_t len) {
} else {
QUICHE_DVLOG(1) << "OnUnknownPayload: len=" << len;
}
+ visitor()->OnUnknownFramePayload(frame_header_.stream_id,
+ absl::string_view(data, len));
}
void Http2DecoderAdapter::OnUnknownEnd() {
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.h
index e0dfbd90064..f1857136315 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.h
@@ -518,7 +518,28 @@ class QUICHE_EXPORT_PRIVATE SpdyFramerVisitorInterface {
// Return true if this appears to be a valid extension frame, false otherwise.
// We distinguish between extension frames and nonsense by checking
// whether the stream id is valid.
+ // TODO(b/239060116): Remove this callback altogether.
virtual bool OnUnknownFrame(SpdyStreamId stream_id, uint8_t frame_type) = 0;
+
+ // Called when the common header for a non-standard frame is received. If the
+ // `length` is nonzero, the frame's payload will be provided via subsequent
+ // calls to OnUnknownFramePayload().
+ // |stream_id| The stream receiving the non-standard frame.
+ // |length| The length of the payload of the frame.
+ // |type| The type of the frame. This type is non-standard.
+ // |flags| The flags of the frame.
+ virtual void OnUnknownFrameStart(SpdyStreamId stream_id, size_t length,
+ uint8_t type, uint8_t flags) = 0;
+
+ // Called when a non-empty payload chunk for a non-standard frame is received.
+ // The payload for a single frame may be delivered as multiple calls to
+ // OnUnknownFramePayload(). Since the length field is passed in
+ // OnUnknownFrameStart(), there is no explicit indication of the end of the
+ // frame payload.
+ // |stream_id| The stream receiving the non-standard frame.
+ // |payload| The payload chunk, which will be non-empty.
+ virtual void OnUnknownFramePayload(SpdyStreamId stream_id,
+ absl::string_view payload) = 0;
};
class QUICHE_EXPORT_PRIVATE ExtensionVisitorInterface {
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block.cc
index fe1126077d6..8dddae50a14 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include <string.h>
@@ -37,7 +37,7 @@ absl::string_view SeparatorForKey(absl::string_view key) {
} // namespace
-Http2HeaderBlock::HeaderValue::HeaderValue(SpdyHeaderStorage* storage,
+Http2HeaderBlock::HeaderValue::HeaderValue(Http2HeaderStorage* storage,
absl::string_view key,
absl::string_view initial_value)
: storage_(storage),
@@ -63,7 +63,7 @@ Http2HeaderBlock::HeaderValue& Http2HeaderBlock::HeaderValue::operator=(
return *this;
}
-void Http2HeaderBlock::HeaderValue::set_storage(SpdyHeaderStorage* storage) {
+void Http2HeaderBlock::HeaderValue::set_storage(Http2HeaderStorage* storage) {
storage_ = storage;
}
@@ -128,7 +128,7 @@ Http2HeaderBlock::ValueProxy& Http2HeaderBlock::ValueProxy::operator=(
Http2HeaderBlock::ValueProxy::~ValueProxy() {
// If the ValueProxy is destroyed while lookup_result_ == block_->end(),
- // the assignment operator was never used, and the block's SpdyHeaderStorage
+ // the assignment operator was never used, and the block's Http2HeaderStorage
// can reclaim the memory used by the key. This makes lookup-only access to
// Http2HeaderBlock through operator[] memory-neutral.
if (valid_ && lookup_result_ == block_->map_.end()) {
@@ -139,7 +139,7 @@ Http2HeaderBlock::ValueProxy::~ValueProxy() {
Http2HeaderBlock::ValueProxy& Http2HeaderBlock::ValueProxy::operator=(
absl::string_view value) {
*spdy_header_block_value_size_ += value.size();
- SpdyHeaderStorage* storage = &block_->storage_;
+ Http2HeaderStorage* storage = &block_->storage_;
if (lookup_result_ == block_->map_.end()) {
QUICHE_DVLOG(1) << "Inserting: (" << key_ << ", " << value << ")";
lookup_result_ =
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h
index 21bde19e69d..867a5668295 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef QUICHE_SPDY_CORE_SPDY_HEADER_BLOCK_H_
-#define QUICHE_SPDY_CORE_SPDY_HEADER_BLOCK_H_
+#ifndef QUICHE_SPDY_CORE_HTTP2_HEADER_BLOCK_H_
+#define QUICHE_SPDY_CORE_HTTP2_HEADER_BLOCK_H_
#include <stddef.h>
@@ -18,7 +18,7 @@
#include "quiche/common/platform/api/quiche_logging.h"
#include "quiche/common/quiche_linked_hash_map.h"
#include "quiche/common/quiche_text_utils.h"
-#include "quiche/spdy/core/spdy_header_storage.h"
+#include "quiche/spdy/core/http2_header_storage.h"
namespace spdy {
@@ -52,14 +52,14 @@ class QUICHE_EXPORT_PRIVATE Http2HeaderBlock {
// key-dependent separator.
class QUICHE_EXPORT_PRIVATE HeaderValue {
public:
- HeaderValue(SpdyHeaderStorage* storage, absl::string_view key,
+ HeaderValue(Http2HeaderStorage* storage, absl::string_view key,
absl::string_view initial_value);
// Moves are allowed.
HeaderValue(HeaderValue&& other);
HeaderValue& operator=(HeaderValue&& other);
- void set_storage(SpdyHeaderStorage* storage);
+ void set_storage(Http2HeaderStorage* storage);
// Copies are not.
HeaderValue(const HeaderValue& other) = delete;
@@ -82,7 +82,7 @@ class QUICHE_EXPORT_PRIVATE Http2HeaderBlock {
// fragments and separators.
absl::string_view ConsolidatedValue() const;
- mutable SpdyHeaderStorage* storage_;
+ mutable Http2HeaderStorage* storage_;
mutable std::vector<absl::string_view> fragments_;
// The first element is the key; the second is the consolidated value.
mutable std::pair<absl::string_view, absl::string_view> pair_;
@@ -204,7 +204,7 @@ class QUICHE_EXPORT_PRIVATE Http2HeaderBlock {
// This object provides automatic conversions that allow Http2HeaderBlock to
// be nearly a drop-in replacement for
// SpdyLinkedHashMap<std::string, std::string>.
- // It reads data from or writes data to a SpdyHeaderStorage.
+ // It reads data from or writes data to a Http2HeaderStorage.
class QUICHE_EXPORT_PRIVATE ValueProxy {
public:
~ValueProxy();
@@ -280,15 +280,12 @@ class QUICHE_EXPORT_PRIVATE Http2HeaderBlock {
// absl::string_views held by |map_| point to memory owned by |storage_|.
MapType map_;
- SpdyHeaderStorage storage_;
+ Http2HeaderStorage storage_;
size_t key_size_ = 0;
size_t value_size_ = 0;
};
-// TODO(b/156770486): Remove this alias when the rename is complete.
-using SpdyHeaderBlock = Http2HeaderBlock;
-
} // namespace spdy
-#endif // QUICHE_SPDY_CORE_SPDY_HEADER_BLOCK_H_
+#endif // QUICHE_SPDY_CORE_HTTP2_HEADER_BLOCK_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block_hpack_listener.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block_hpack_listener.h
index 0c216327dc6..598ec96d6cd 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block_hpack_listener.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block_hpack_listener.h
@@ -5,12 +5,12 @@
#include "quiche/http2/hpack/decoder/hpack_decoder_listener.h"
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/common/platform/api/quiche_logging.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
namespace spdy {
// This class simply gathers the key-value pairs emitted by an HpackDecoder in
-// a SpdyHeaderBlock.
+// a Http2HeaderBlock.
class QUICHE_EXPORT_PRIVATE Http2HeaderBlockHpackListener
: public http2::HpackDecoderListener {
public:
@@ -32,15 +32,15 @@ class QUICHE_EXPORT_PRIVATE Http2HeaderBlockHpackListener
hpack_error_ = true;
}
- SpdyHeaderBlock release_header_block() {
- SpdyHeaderBlock block = std::move(header_block_);
+ Http2HeaderBlock release_header_block() {
+ Http2HeaderBlock block = std::move(header_block_);
header_block_ = {};
return block;
}
bool hpack_error() const { return hpack_error_; }
private:
- SpdyHeaderBlock header_block_;
+ Http2HeaderBlock header_block_;
bool hpack_error_ = false;
};
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_block_test.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block_test.cc
index 6fc604d7b24..4624d7ba4c7 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_block_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_block_test.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include <memory>
#include <utility>
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_storage.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_storage.cc
index 29eefb2f26c..653a6283962 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_storage.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_storage.cc
@@ -1,4 +1,4 @@
-#include "quiche/spdy/core/spdy_header_storage.h"
+#include "quiche/spdy/core/http2_header_storage.h"
#include <cstring>
@@ -7,22 +7,22 @@
namespace spdy {
namespace {
-// SpdyHeaderStorage allocates blocks of this size by default.
+// Http2HeaderStorage allocates blocks of this size by default.
const size_t kDefaultStorageBlockSize = 2048;
} // namespace
-SpdyHeaderStorage::SpdyHeaderStorage() : arena_(kDefaultStorageBlockSize) {}
+Http2HeaderStorage::Http2HeaderStorage() : arena_(kDefaultStorageBlockSize) {}
-absl::string_view SpdyHeaderStorage::Write(const absl::string_view s) {
+absl::string_view Http2HeaderStorage::Write(const absl::string_view s) {
return absl::string_view(arena_.Memdup(s.data(), s.size()), s.size());
}
-void SpdyHeaderStorage::Rewind(const absl::string_view s) {
+void Http2HeaderStorage::Rewind(const absl::string_view s) {
arena_.Free(const_cast<char*>(s.data()), s.size());
}
-absl::string_view SpdyHeaderStorage::WriteFragments(
+absl::string_view Http2HeaderStorage::WriteFragments(
const std::vector<absl::string_view>& fragments,
absl::string_view separator) {
if (fragments.empty()) {
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_storage.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_storage.h
index 8f28de9ee2a..fd49cc395a5 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_storage.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_storage.h
@@ -1,5 +1,5 @@
-#ifndef QUICHE_SPDY_CORE_SPDY_HEADER_STORAGE_H_
-#define QUICHE_SPDY_CORE_SPDY_HEADER_STORAGE_H_
+#ifndef QUICHE_SPDY_CORE_HTTP2_HEADER_STORAGE_H_
+#define QUICHE_SPDY_CORE_HTTP2_HEADER_STORAGE_H_
#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_export.h"
@@ -9,22 +9,22 @@ namespace spdy {
// This class provides a backing store for absl::string_views. It previously
// used custom allocation logic, but now uses an UnsafeArena instead. It has the
-// property that absl::string_views that refer to data in SpdyHeaderStorage are
-// never invalidated until the SpdyHeaderStorage is deleted or Clear() is
+// property that absl::string_views that refer to data in Http2HeaderStorage are
+// never invalidated until the Http2HeaderStorage is deleted or Clear() is
// called.
//
// Write operations always append to the last block. If there is not enough
// space to perform the write, a new block is allocated, and any unused space
// is wasted.
-class QUICHE_EXPORT_PRIVATE SpdyHeaderStorage {
+class QUICHE_EXPORT_PRIVATE Http2HeaderStorage {
public:
- SpdyHeaderStorage();
+ Http2HeaderStorage();
- SpdyHeaderStorage(const SpdyHeaderStorage&) = delete;
- SpdyHeaderStorage& operator=(const SpdyHeaderStorage&) = delete;
+ Http2HeaderStorage(const Http2HeaderStorage&) = delete;
+ Http2HeaderStorage& operator=(const Http2HeaderStorage&) = delete;
- SpdyHeaderStorage(SpdyHeaderStorage&& other) = default;
- SpdyHeaderStorage& operator=(SpdyHeaderStorage&& other) = default;
+ Http2HeaderStorage(Http2HeaderStorage&& other) = default;
+ Http2HeaderStorage& operator=(Http2HeaderStorage&& other) = default;
absl::string_view Write(absl::string_view s);
@@ -55,4 +55,4 @@ Join(char* dst, const std::vector<absl::string_view>& fragments,
} // namespace spdy
-#endif // QUICHE_SPDY_CORE_SPDY_HEADER_STORAGE_H_
+#endif // QUICHE_SPDY_CORE_HTTP2_HEADER_STORAGE_H_
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_storage_test.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_storage_test.cc
index 474b01e4fed..bfe9b5e4cf6 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_header_storage_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/http2_header_storage_test.cc
@@ -1,4 +1,4 @@
-#include "quiche/spdy/core/spdy_header_storage.h"
+#include "quiche/spdy/core/http2_header_storage.h"
#include "quiche/common/platform/api/quiche_test.h"
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.cc
index 0993b99b60e..7fa32ece50d 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.cc
@@ -9,7 +9,6 @@
#include "quiche/http2/hpack/decoder/hpack_decoder.h"
#include "quiche/common/platform/api/quiche_bug_tracker.h"
#include "quiche/common/platform/api/quiche_logging.h"
-#include "quiche/spdy/core/hpack/hpack_encoder.h"
#include "quiche/spdy/core/http2_header_block_hpack_listener.h"
namespace spdy {
@@ -23,50 +22,38 @@ namespace {
const size_t kMaxMetadataBlockSize = 1 << 20; // 1 MB
-// This class uses an HpackEncoder to serialize a METADATA block as a series of
-// METADATA frames.
-class MetadataFrameSequence : public MetadataSerializer::FrameSequence {
- public:
- MetadataFrameSequence(SpdyStreamId stream_id, spdy::SpdyHeaderBlock payload)
- : stream_id_(stream_id), payload_(std::move(payload)) {
- // Metadata should not use HPACK compression.
- encoder_.DisableCompression();
- HpackEncoder::Representations r;
- for (const auto& kv_pair : payload_) {
- r.push_back(kv_pair);
- }
- progressive_encoder_ = encoder_.EncodeRepresentations(r);
- }
-
- // Copies are not allowed.
- MetadataFrameSequence(const MetadataFrameSequence& other) = delete;
- MetadataFrameSequence& operator=(const MetadataFrameSequence& other) = delete;
+} // anonymous namespace
- std::unique_ptr<spdy::SpdyFrameIR> Next() override;
+MetadataFrameSequence::MetadataFrameSequence(SpdyStreamId stream_id,
+ spdy::Http2HeaderBlock payload)
+ : stream_id_(stream_id), payload_(std::move(payload)) {
+ // Metadata should not use HPACK compression.
+ encoder_.DisableCompression();
+ HpackEncoder::Representations r;
+ for (const auto& kv_pair : payload_) {
+ r.push_back(kv_pair);
+ }
+ progressive_encoder_ = encoder_.EncodeRepresentations(r);
+}
- private:
- SpdyStreamId stream_id_;
- SpdyHeaderBlock payload_;
- HpackEncoder encoder_;
- std::unique_ptr<HpackEncoder::ProgressiveEncoder> progressive_encoder_;
-};
+bool MetadataFrameSequence::HasNext() const {
+ return progressive_encoder_->HasNext();
+}
std::unique_ptr<spdy::SpdyFrameIR> MetadataFrameSequence::Next() {
- if (!progressive_encoder_->HasNext()) {
+ if (!HasNext()) {
return nullptr;
}
// METADATA frames obey the HTTP/2 maximum frame size.
std::string payload =
progressive_encoder_->Next(spdy::kHttp2DefaultFramePayloadLimit);
- const bool end_metadata = (!progressive_encoder_->HasNext());
+ const bool end_metadata = !HasNext();
const uint8_t flags = end_metadata ? MetadataVisitor::kEndMetadataFlag : 0;
return absl::make_unique<spdy::SpdyUnknownIR>(
stream_id_, MetadataVisitor::kMetadataFrameType, flags,
std::move(payload));
}
-} // anonymous namespace
-
struct MetadataVisitor::MetadataPayloadState {
MetadataPayloadState(size_t remaining, bool end)
: bytes_remaining(remaining), end_metadata(end) {}
@@ -185,11 +172,4 @@ void MetadataVisitor::OnFramePayload(const char* data, size_t len) {
}
}
-std::unique_ptr<MetadataSerializer::FrameSequence>
-MetadataSerializer::FrameSequenceForPayload(SpdyStreamId stream_id,
- MetadataPayload payload) {
- return absl::make_unique<MetadataFrameSequence>(stream_id,
- std::move(payload));
-}
-
} // namespace spdy
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.h
index 4eaf95c29a6..6b171b5ccdf 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension.h
@@ -7,8 +7,9 @@
#include "absl/container/flat_hash_map.h"
#include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/spdy/core/hpack/hpack_encoder.h"
#include "quiche/spdy/core/http2_frame_decoder_adapter.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_protocol.h"
#include "quiche/spdy/core/zero_copy_output_buffer.h"
@@ -23,7 +24,7 @@ namespace spdy {
class QUICHE_EXPORT_PRIVATE MetadataVisitor
: public spdy::ExtensionVisitorInterface {
public:
- using MetadataPayload = spdy::SpdyHeaderBlock;
+ using MetadataPayload = spdy::Http2HeaderBlock;
static_assert(!std::is_copy_constructible<MetadataPayload>::value,
"MetadataPayload should be a move-only type!");
@@ -90,27 +91,29 @@ class QUICHE_EXPORT_PRIVATE MetadataVisitor
MetadataSupportState peer_supports_metadata_;
};
-// A class that serializes metadata blocks as sequences of frames.
-class QUICHE_EXPORT_PRIVATE MetadataSerializer {
+// This class uses an HpackEncoder to serialize a METADATA block as a series of
+// METADATA frames.
+class QUICHE_EXPORT_PRIVATE MetadataFrameSequence {
public:
- using MetadataPayload = spdy::SpdyHeaderBlock;
+ MetadataFrameSequence(SpdyStreamId stream_id, spdy::Http2HeaderBlock payload);
- class QUICHE_EXPORT_PRIVATE FrameSequence {
- public:
- virtual ~FrameSequence() {}
+ // Copies are not allowed.
+ MetadataFrameSequence(const MetadataFrameSequence& other) = delete;
+ MetadataFrameSequence& operator=(const MetadataFrameSequence& other) = delete;
- // Returns nullptr once the sequence has been exhausted.
- virtual std::unique_ptr<spdy::SpdyFrameIR> Next() = 0;
- };
-
- MetadataSerializer() {}
+ // True if Next() would return non-nullptr.
+ bool HasNext() const;
- MetadataSerializer(const MetadataSerializer&) = delete;
- MetadataSerializer& operator=(const MetadataSerializer&) = delete;
+ // Returns the next HTTP/2 METADATA frame for this block, unless the block has
+ // been entirely serialized in frames returned by previous calls of Next(), in
+ // which case returns nullptr.
+ std::unique_ptr<spdy::SpdyFrameIR> Next();
- // Returns nullptr on failure.
- std::unique_ptr<FrameSequence> FrameSequenceForPayload(
- spdy::SpdyStreamId stream_id, MetadataPayload payload);
+ private:
+ SpdyStreamId stream_id_;
+ Http2HeaderBlock payload_;
+ HpackEncoder encoder_;
+ std::unique_ptr<HpackEncoder::ProgressiveEncoder> progressive_encoder_;
};
} // namespace spdy
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension_test.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension_test.cc
index 26f98f4bbce..4c47b919ad1 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/metadata_extension_test.cc
@@ -7,7 +7,6 @@
#include "quiche/common/platform/api/quiche_test.h"
#include "quiche/spdy/core/array_output_buffer.h"
#include "quiche/spdy/core/spdy_framer.h"
-#include "quiche/spdy/core/spdy_header_block.h"
#include "quiche/spdy/core/spdy_no_op_visitor.h"
#include "quiche/spdy/core/spdy_protocol.h"
#include "quiche/spdy/test_tools/mock_spdy_framer_visitor.h"
@@ -17,11 +16,9 @@ namespace test {
namespace {
using ::absl::bind_front;
-using ::spdy::SpdyFramer;
-using ::spdy::SpdyHeaderBlock;
-using ::spdy::test::MockSpdyFramerVisitor;
using ::testing::_;
using ::testing::ElementsAre;
+using ::testing::HasSubstr;
using ::testing::IsEmpty;
const size_t kBufferSize = 64 * 1024;
@@ -48,14 +45,14 @@ class MetadataExtensionTest : public quiche::test::QuicheTest {
received_metadata_support_.push_back(peer_supports_metadata);
}
- MetadataSerializer::MetadataPayload PayloadForData(absl::string_view data) {
- SpdyHeaderBlock block;
+ Http2HeaderBlock PayloadForData(absl::string_view data) {
+ Http2HeaderBlock block;
block["example-payload"] = data;
return block;
}
std::unique_ptr<MetadataVisitor> extension_;
- absl::flat_hash_map<spdy::SpdyStreamId, SpdyHeaderBlock>
+ absl::flat_hash_map<spdy::SpdyStreamId, Http2HeaderBlock>
received_payload_map_;
std::vector<bool> received_metadata_support_;
size_t received_count_ = 0;
@@ -83,16 +80,14 @@ TEST_F(MetadataExtensionTest, MetadataSupported) {
EXPECT_THAT(received_metadata_support_, ElementsAre(true, false));
}
-TEST_F(MetadataExtensionTest, MetadataIgnoredWithoutExtension) {
+TEST_F(MetadataExtensionTest, MetadataDeliveredToUnknownFrameCallbacks) {
const char kData[] = "some payload";
- SpdyHeaderBlock payload = PayloadForData(kData);
+ Http2HeaderBlock payload = PayloadForData(kData);
extension_->OnSetting(MetadataVisitor::kMetadataExtensionId, 1);
ASSERT_TRUE(extension_->PeerSupportsMetadata());
- MetadataSerializer serializer;
- auto sequence = serializer.FrameSequenceForPayload(3, std::move(payload));
- ASSERT_TRUE(sequence != nullptr);
+ MetadataFrameSequence sequence(3, std::move(payload));
http2::Http2DecoderAdapter deframer;
::testing::StrictMock<MockSpdyFramerVisitor> visitor;
@@ -103,9 +98,13 @@ TEST_F(MetadataExtensionTest, MetadataIgnoredWithoutExtension) {
// The Return(true) should not be necessary. http://b/36023792
EXPECT_CALL(visitor, OnUnknownFrame(3, MetadataVisitor::kMetadataFrameType))
.WillOnce(::testing::Return(true));
+ EXPECT_CALL(visitor,
+ OnUnknownFrameStart(3, _, MetadataVisitor::kMetadataFrameType,
+ MetadataVisitor::kEndMetadataFlag));
+ EXPECT_CALL(visitor, OnUnknownFramePayload(3, HasSubstr(kData)));
SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
- auto frame = sequence->Next();
+ auto frame = sequence.Next();
ASSERT_TRUE(frame != nullptr);
while (frame != nullptr) {
const size_t frame_size = framer.SerializeFrame(*frame, &test_buffer_);
@@ -114,7 +113,7 @@ TEST_F(MetadataExtensionTest, MetadataIgnoredWithoutExtension) {
ASSERT_EQ(frame_size, test_buffer_.Size());
EXPECT_EQ(frame_size, deframer.ProcessInput(kBuffer, frame_size));
test_buffer_.Reset();
- frame = sequence->Next();
+ frame = sequence.Next();
}
EXPECT_FALSE(deframer.HasError());
EXPECT_THAT(received_metadata_support_, ElementsAre(true));
@@ -123,9 +122,9 @@ TEST_F(MetadataExtensionTest, MetadataIgnoredWithoutExtension) {
// This test verifies that the METADATA frame emitted by a MetadataExtension
// can be parsed by another SpdyFramer with a MetadataVisitor.
TEST_F(MetadataExtensionTest, MetadataPayloadEndToEnd) {
- SpdyHeaderBlock block1;
+ Http2HeaderBlock block1;
block1["foo"] = "Some metadata value.";
- SpdyHeaderBlock block2;
+ Http2HeaderBlock block2;
block2["bar"] =
"The color taupe truly represents a triumph of the human spirit over "
"adversity.";
@@ -135,22 +134,18 @@ TEST_F(MetadataExtensionTest, MetadataPayloadEndToEnd) {
const absl::string_view binary_payload{"binary\0payload", 14};
block2["qux"] = binary_payload;
EXPECT_EQ(binary_payload, block2["qux"]);
- for (const SpdyHeaderBlock& payload_block :
+ for (const Http2HeaderBlock& payload_block :
{std::move(block1), std::move(block2)}) {
extension_->OnSetting(MetadataVisitor::kMetadataExtensionId, 1);
ASSERT_TRUE(extension_->PeerSupportsMetadata());
- MetadataSerializer serializer;
- auto sequence =
- serializer.FrameSequenceForPayload(3, payload_block.Clone());
- ASSERT_TRUE(sequence != nullptr);
-
+ MetadataFrameSequence sequence(3, payload_block.Clone());
http2::Http2DecoderAdapter deframer;
::spdy::SpdyNoOpVisitor visitor;
deframer.set_visitor(&visitor);
deframer.set_extension_visitor(extension_.get());
SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
- auto frame = sequence->Next();
+ auto frame = sequence.Next();
ASSERT_TRUE(frame != nullptr);
while (frame != nullptr) {
const size_t frame_size = framer.SerializeFrame(*frame, &test_buffer_);
@@ -159,7 +154,7 @@ TEST_F(MetadataExtensionTest, MetadataPayloadEndToEnd) {
ASSERT_EQ(frame_size, test_buffer_.Size());
EXPECT_EQ(frame_size, deframer.ProcessInput(kBuffer, frame_size));
test_buffer_.Reset();
- frame = sequence->Next();
+ frame = sequence.Next();
}
EXPECT_EQ(1u, received_count_);
auto it = received_payload_map_.find(3);
@@ -177,18 +172,14 @@ TEST_F(MetadataExtensionTest, MetadataPayloadEndToEnd) {
TEST_F(MetadataExtensionTest, MetadataPayloadInterleaved) {
const std::string kData1 = std::string(65 * 1024, 'a');
const std::string kData2 = std::string(65 * 1024, 'b');
- const SpdyHeaderBlock payload1 = PayloadForData(kData1);
- const SpdyHeaderBlock payload2 = PayloadForData(kData2);
+ const Http2HeaderBlock payload1 = PayloadForData(kData1);
+ const Http2HeaderBlock payload2 = PayloadForData(kData2);
extension_->OnSetting(MetadataVisitor::kMetadataExtensionId, 1);
ASSERT_TRUE(extension_->PeerSupportsMetadata());
- MetadataSerializer serializer;
- auto sequence1 = serializer.FrameSequenceForPayload(3, payload1.Clone());
- ASSERT_TRUE(sequence1 != nullptr);
-
- auto sequence2 = serializer.FrameSequenceForPayload(5, payload2.Clone());
- ASSERT_TRUE(sequence2 != nullptr);
+ MetadataFrameSequence sequence1(3, payload1.Clone());
+ MetadataFrameSequence sequence2(5, payload2.Clone());
http2::Http2DecoderAdapter deframer;
::spdy::SpdyNoOpVisitor visitor;
@@ -196,9 +187,9 @@ TEST_F(MetadataExtensionTest, MetadataPayloadInterleaved) {
deframer.set_extension_visitor(extension_.get());
SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
- auto frame1 = sequence1->Next();
+ auto frame1 = sequence1.Next();
ASSERT_TRUE(frame1 != nullptr);
- auto frame2 = sequence2->Next();
+ auto frame2 = sequence2.Next();
ASSERT_TRUE(frame2 != nullptr);
while (frame1 != nullptr || frame2 != nullptr) {
for (auto frame : {frame1.get(), frame2.get()}) {
@@ -211,8 +202,8 @@ TEST_F(MetadataExtensionTest, MetadataPayloadInterleaved) {
test_buffer_.Reset();
}
}
- frame1 = sequence1->Next();
- frame2 = sequence2->Next();
+ frame1 = sequence1.Next();
+ frame2 = sequence2.Next();
}
EXPECT_EQ(2u, received_count_);
auto it = received_payload_map_.find(3);
@@ -224,6 +215,65 @@ TEST_F(MetadataExtensionTest, MetadataPayloadInterleaved) {
EXPECT_EQ(payload2, it->second);
}
+// Test that an empty metadata block is serialized as a single frame with
+// END_METADATA set and empty frame payload.
+TEST_F(MetadataExtensionTest, EmptyBlock) {
+ MetadataFrameSequence sequence(1, Http2HeaderBlock{});
+
+ EXPECT_TRUE(sequence.HasNext());
+ std::unique_ptr<SpdyFrameIR> frame = sequence.Next();
+ EXPECT_FALSE(sequence.HasNext());
+
+ auto* const metadata_frame = static_cast<SpdyUnknownIR*>(frame.get());
+ EXPECT_EQ(MetadataVisitor::kEndMetadataFlag,
+ metadata_frame->flags() & MetadataVisitor::kEndMetadataFlag);
+ EXPECT_TRUE(metadata_frame->payload().empty());
+}
+
+// Test that a small metadata block is serialized as a single frame with
+// END_METADATA set and non-empty frame payload.
+TEST_F(MetadataExtensionTest, SmallBlock) {
+ Http2HeaderBlock metadata_block;
+ metadata_block["foo"] = "bar";
+ MetadataFrameSequence sequence(1, std::move(metadata_block));
+
+ EXPECT_TRUE(sequence.HasNext());
+ std::unique_ptr<SpdyFrameIR> frame = sequence.Next();
+ EXPECT_FALSE(sequence.HasNext());
+
+ auto* const metadata_frame = static_cast<SpdyUnknownIR*>(frame.get());
+ EXPECT_EQ(MetadataVisitor::kEndMetadataFlag,
+ metadata_frame->flags() & MetadataVisitor::kEndMetadataFlag);
+ EXPECT_LT(0u, metadata_frame->payload().size());
+}
+
+// Test that a large metadata block is serialized as multiple frames,
+// with END_METADATA set only on the last one.
+TEST_F(MetadataExtensionTest, LargeBlock) {
+ Http2HeaderBlock metadata_block;
+ metadata_block["foo"] = std::string(65 * 1024, 'a');
+ MetadataFrameSequence sequence(1, std::move(metadata_block));
+
+ int frame_count = 0;
+ while (sequence.HasNext()) {
+ std::unique_ptr<SpdyFrameIR> frame = sequence.Next();
+ ++frame_count;
+
+ auto* const metadata_frame = static_cast<SpdyUnknownIR*>(frame.get());
+ EXPECT_LT(0u, metadata_frame->payload().size());
+
+ if (sequence.HasNext()) {
+ EXPECT_EQ(0u,
+ metadata_frame->flags() & MetadataVisitor::kEndMetadataFlag);
+ } else {
+ EXPECT_EQ(MetadataVisitor::kEndMetadataFlag,
+ metadata_frame->flags() & MetadataVisitor::kEndMetadataFlag);
+ }
+ }
+
+ EXPECT_LE(2, frame_count);
+}
+
} // anonymous namespace
} // namespace test
} // namespace spdy
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/recording_headers_handler.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/recording_headers_handler.h
index a2c06ecaace..a6059449c95 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/recording_headers_handler.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/recording_headers_handler.h
@@ -11,7 +11,7 @@
#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_export.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_headers_handler_interface.h"
namespace spdy {
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.cc
index a127c1ba35b..8b7d69ed803 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.cc
@@ -90,7 +90,7 @@ uint8_t SerializePushPromiseFrameFlags(const SpdyPushPromiseIR& push_promise_ir,
}
// Serializes a HEADERS frame from the given SpdyHeadersIR and encoded header
-// block. Does not need or use the SpdyHeaderBlock inside SpdyHeadersIR.
+// block. Does not need or use the Http2HeaderBlock inside SpdyHeadersIR.
// Return false if the serialization fails. |encoding| should not be empty.
bool SerializeHeadersGivenEncoding(const SpdyHeadersIR& headers,
const std::string& encoding,
@@ -133,7 +133,7 @@ bool SerializeHeadersGivenEncoding(const SpdyHeadersIR& headers,
}
// Serializes a PUSH_PROMISE frame from the given SpdyPushPromiseIR and
-// encoded header block. Does not need or use the SpdyHeaderBlock inside
+// encoded header block. Does not need or use the Http2HeaderBlock inside
// SpdyPushPromiseIR.
bool SerializePushPromiseGivenEncoding(const SpdyPushPromiseIR& push_promise,
const std::string& encoding,
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h
index 8af13f5c23a..db8a64ac718 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h
@@ -16,8 +16,8 @@
#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/spdy/core/hpack/hpack_encoder.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_alt_svc_wire_format.h"
-#include "quiche/spdy/core/spdy_header_block.h"
#include "quiche/spdy/core/spdy_headers_handler_interface.h"
#include "quiche/spdy/core/spdy_protocol.h"
#include "quiche/spdy/core/zero_copy_output_buffer.h"
@@ -293,7 +293,7 @@ class QUICHE_EXPORT_PRIVATE SpdyFramer {
};
// Iteratively converts a SpdyHeadersIR (with a possibly huge
- // SpdyHeaderBlock) into an appropriate sequence of SpdySerializedFrames, and
+ // Http2HeaderBlock) into an appropriate sequence of SpdySerializedFrames, and
// write to the output.
class QUICHE_EXPORT_PRIVATE SpdyHeaderFrameIterator
: public SpdyFrameIterator {
@@ -314,7 +314,7 @@ class QUICHE_EXPORT_PRIVATE SpdyFramer {
};
// Iteratively converts a SpdyPushPromiseIR (with a possibly huge
- // SpdyHeaderBlock) into an appropriate sequence of SpdySerializedFrames, and
+ // Http2HeaderBlock) into an appropriate sequence of SpdySerializedFrames, and
// write to the output.
class QUICHE_EXPORT_PRIVATE SpdyPushPromiseFrameIterator
: public SpdyFrameIterator {
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer_test.cc b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer_test.cc
index 909f43a7a57..dbc6073222a 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer_test.cc
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_framer_test.cc
@@ -239,6 +239,7 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface,
continuation_count_(0),
altsvc_count_(0),
priority_count_(0),
+ unknown_frame_count_(0),
on_unknown_frame_result_(false),
last_window_update_stream_(0),
last_window_update_delta_(0),
@@ -253,6 +254,7 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface,
data_frame_count_(0),
last_payload_len_(0),
last_frame_len_(0),
+ unknown_payload_len_(0),
header_buffer_(new char[kDefaultHeaderBufferSize]),
header_buffer_length_(0),
header_buffer_size_(kDefaultHeaderBufferSize),
@@ -428,6 +430,21 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface,
return on_unknown_frame_result_;
}
+ void OnUnknownFrameStart(SpdyStreamId stream_id, size_t length, uint8_t type,
+ uint8_t flags) override {
+ QUICHE_VLOG(1) << "OnUnknownFrameStart(" << stream_id << ", " << length
+ << ", " << static_cast<int>(type) << ", "
+ << static_cast<int>(flags) << ")";
+ ++unknown_frame_count_;
+ }
+
+ void OnUnknownFramePayload(SpdyStreamId stream_id,
+ absl::string_view payload) override {
+ QUICHE_VLOG(1) << "OnUnknownFramePayload(" << stream_id << ", " << payload
+ << ")";
+ unknown_payload_len_ += payload.length();
+ }
+
void OnSendCompressedFrame(SpdyStreamId stream_id, SpdyFrameType type,
size_t payload_len, size_t frame_len) override {
QUICHE_VLOG(1) << "OnSendCompressedFrame(" << stream_id << ", " << type
@@ -501,6 +518,7 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface,
int altsvc_count_;
int priority_count_;
std::unique_ptr<SpdyAltSvcIR> test_altsvc_ir_;
+ int unknown_frame_count_;
bool on_unknown_frame_result_;
SpdyStreamId last_window_update_stream_;
int last_window_update_delta_;
@@ -516,6 +534,7 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface,
int data_frame_count_;
size_t last_payload_len_;
size_t last_frame_len_;
+ size_t unknown_payload_len_;
// Header block streaming state:
std::unique_ptr<char[]> header_buffer_;
@@ -610,7 +629,7 @@ class SpdyFramerTest : public quiche::test::QuicheTestWithParam<Output> {
INSTANTIATE_TEST_SUITE_P(SpdyFramerTests, SpdyFramerTest,
::testing::Values(USE, NOT_USE));
-// Test that we can encode and decode a SpdyHeaderBlock in serialized form.
+// Test that we can encode and decode a Http2HeaderBlock in serialized form.
TEST_P(SpdyFramerTest, HeaderBlockInBuffer) {
SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION);
@@ -3802,6 +3821,8 @@ TEST_P(SpdyFramerTest, ReadUnknownExtensionFrame) {
visitor.on_unknown_frame_result_ = true;
visitor.SimulateInFramer(unknown_frame, ABSL_ARRAYSIZE(unknown_frame));
EXPECT_EQ(0, visitor.error_count_);
+ EXPECT_EQ(1, visitor.unknown_frame_count_);
+ EXPECT_EQ(8, visitor.unknown_payload_len_);
// Follow it up with a valid control frame to make sure we handle
// subsequent frames correctly.
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_no_op_visitor.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_no_op_visitor.h
index 78fe2d15428..e8fd79dadfe 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_no_op_visitor.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_no_op_visitor.h
@@ -66,6 +66,10 @@ class QUICHE_EXPORT_PRIVATE SpdyNoOpVisitor
absl::string_view /*priority_field_value*/) override {}
bool OnUnknownFrame(SpdyStreamId /*stream_id*/,
uint8_t /*frame_type*/) override;
+ void OnUnknownFrameStart(SpdyStreamId /*stream_id*/, size_t /*length*/,
+ uint8_t /*type*/, uint8_t /*flags*/) override {}
+ void OnUnknownFramePayload(SpdyStreamId /*stream_id*/,
+ absl::string_view /*payload*/) override {}
// SpdyFramerDebugVisitorInterface methods:
void OnSendCompressedFrame(SpdyStreamId /*stream_id*/, SpdyFrameType /*type*/,
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h
index 81db503747a..1166125d6d3 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h
@@ -22,9 +22,9 @@
#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_alt_svc_wire_format.h"
#include "quiche/spdy/core/spdy_bitmasks.h"
-#include "quiche/spdy/core/spdy_header_block.h"
namespace spdy {
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/test_tools/mock_spdy_framer_visitor.h b/chromium/net/third_party/quiche/src/quiche/spdy/test_tools/mock_spdy_framer_visitor.h
index 373a2dbd46d..93a5ca7221b 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/test_tools/mock_spdy_framer_visitor.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/test_tools/mock_spdy_framer_visitor.h
@@ -87,6 +87,12 @@ class QUICHE_NO_EXPORT MockSpdyFramerVisitor
(override));
MOCK_METHOD(bool, OnUnknownFrame,
(SpdyStreamId stream_id, uint8_t frame_type), (override));
+ MOCK_METHOD(void, OnUnknownFrameStart,
+ (SpdyStreamId stream_id, size_t length, uint8_t type,
+ uint8_t flags),
+ (override));
+ MOCK_METHOD(void, OnUnknownFramePayload,
+ (SpdyStreamId stream_id, absl::string_view payload), (override));
void DelegateHeaderHandling() {
ON_CALL(*this, OnHeaderFrameStart(testing::_))
diff --git a/chromium/net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h b/chromium/net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h
index ccbba8ce992..366f2490adb 100644
--- a/chromium/net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h
+++ b/chromium/net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h
@@ -10,7 +10,7 @@
#include <string>
#include "absl/strings/string_view.h"
-#include "quiche/spdy/core/spdy_header_block.h"
+#include "quiche/spdy/core/http2_header_block.h"
#include "quiche/spdy/core/spdy_protocol.h"
namespace spdy {
diff --git a/chromium/net/third_party/uri_template/OWNERS b/chromium/net/third_party/uri_template/OWNERS
index 53e68eb7787..e69de29bb2d 100644
--- a/chromium/net/third_party/uri_template/OWNERS
+++ b/chromium/net/third_party/uri_template/OWNERS
@@ -1 +0,0 @@
-mmenke@chromium.org
diff --git a/chromium/net/tools/cache_transparency/generate_checksums.py b/chromium/net/tools/cache_transparency/generate_checksums.py
new file mode 100644
index 00000000000..f99a9b5ca94
--- /dev/null
+++ b/chromium/net/tools/cache_transparency/generate_checksums.py
@@ -0,0 +1,122 @@
+# Copyright 2022 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 checksums for URLs in the Pervasive Payload list."""
+
+import argparse
+import csv
+import requests
+import hashlib
+import urllib.parse
+
+INCLUDE_HEADERS = frozenset([
+ "access-control-allow-credentials", "access-control-allow-headers",
+ "access-control-allow-methods", "access-control-allow-origin",
+ "access-control-expose-headers", "access-control-max-age",
+ "access-control-request-headers", "access-control-request-method",
+ "clear-site-data", "content-encoding", "content-security-policy",
+ "content-type", "cross-origin-embedder-policy",
+ "cross-origin-opener-policy", "cross-origin-resource-policy", "location",
+ "sec-websocket-accept", "sec-websocket-extensions", "sec-websocket-key",
+ "sec-websocket-protocol", "sec-websocket-version", "upgrade", "vary"
+])
+
+
+def generate_list_with_checksums(data):
+ pairs_list = []
+ flat_list = []
+ for i, url_info in enumerate(data):
+ checksum_input = ""
+ url = url_info[0]
+ print(f"[{i}/{len(data)}] Fetching {url}")
+
+ with requests.get(url,
+ headers={"Accept-Encoding": "gzip, deflate, br"},
+ stream=True) as response:
+
+ headers = list(response.headers.items())
+ headers = [(name.lower(), value) for name, value in headers]
+ headers.sort()
+
+ for header in headers:
+ if header[0] in INCLUDE_HEADERS:
+ checksum_input += header[0] + ": " + header[1] + "\n"
+
+ checksum_input += "\n"
+ checksum_input = checksum_input.encode()
+
+ raw_body = response.raw.data
+ checksum_input += raw_body
+
+ checksum = hashlib.sha256(checksum_input).hexdigest().upper()
+ pairs_list.append([url, checksum])
+ flat_list.append(str(url))
+ flat_list.append(str(checksum))
+
+ return pairs_list, flat_list
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description=__doc__, formatter_class=argparse.RawTextHelpFormatter)
+
+ parser.add_argument(
+ "input",
+ type=str,
+ nargs=1,
+ help="path for input csv file containing pervasive payloads list")
+
+ parser.add_argument("-v",
+ "--list-version",
+ "--version",
+ dest="list_version",
+ default="1",
+ help="version of pervasive payloads list")
+
+ parser.add_argument("-f",
+ "--format",
+ dest="format",
+ default="csv",
+ choices=["csv", "comma_separated", "url_encoded"],
+ help="output format to use. Default: csv")
+
+ parser.add_argument("output",
+ type=str,
+ nargs=1,
+ help="path for output file for URLs and checksums")
+
+ args = parser.parse_args()
+
+ filename = args.input[0]
+
+ data = []
+ with open(filename, mode="r", newline="") as csvfile:
+ datareader = csv.reader(csvfile)
+ data = list(datareader)
+
+ pairs_list, flat_list = generate_list_with_checksums(data)
+
+ if args.format == "csv":
+ with open(args.output[0], mode="w", newline="") as f:
+ writer = csv.writer(f)
+ writer.writerows(pairs_list)
+
+ elif args.format == "comma_separated":
+ flat_list.insert(0, str(args.list_version))
+ with open(args.output[0], mode="w") as file:
+ file.write(",\n".join(flat_list))
+
+ elif args.format == "url_encoded":
+ concatenated = str(args.list_version) + ","
+ concatenated += ",".join(flat_list)
+ url_encoded_list = urllib.parse.quote_plus(concatenated)
+ with open(args.output[0], mode="w") as file:
+ file.write(url_encoded_list)
+ print(
+ "NOTE: To run the feature via commandline, use the following command:\n"
+ "out/Default/chrome --enable-features='PervasivePayloadsList:pervasive-payloads/(url_encoded_list),CacheTransparency,SplitCacheByNetworkIsolationKey'"
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/chromium/net/tools/cache_transparency/sample_pervasive_payloads_list.csv b/chromium/net/tools/cache_transparency/sample_pervasive_payloads_list.csv
new file mode 100644
index 00000000000..8133c0c3e7a
--- /dev/null
+++ b/chromium/net/tools/cache_transparency/sample_pervasive_payloads_list.csv
@@ -0,0 +1,100 @@
+https://c.amazon-adsystem.com/aax2/apstag.js
+https://c.disquscdn.com/next/embed/common.bundle.9450cde9dd2c9d366781a8fc5ff6e933.js
+https://c.disquscdn.com/next/embed/styles/lounge.7ab903feba7624935283ca4c7d8c7203.css
+https://cdn.cookielaw.org/scripttemplates/otSDKStub.js
+https://cdn.onesignal.com/sdks/OneSignalPageSDKES6.js?v=151513
+https://cdn.onesignal.com/sdks/OneSignalSDK.js
+https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css
+https://connect.facebook.net/en_US/sdk.js
+https://connect.facebook.net/en_US/sdk.js?hash=80773c822cd6e51f7e963a4bf6a9793f
+https://connect.facebook.net/en_US/sdk.js?hash=a572daf7c4ec88ffab229a636a49a105
+https://disqus.com/next/config.js
+https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2
+https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu4mxP.ttf
+https://fonts.gstatic.com/s/roboto/v29/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2
+https://imasdk.googleapis.com/js/sdkloader/ima3.js
+https://js-agent.newrelic.com/nr-1215.min.js
+https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css
+https://mc.yandex.com/metrika/advert.gif
+https://mc.yandex.com/sync_cookie_image_check
+https://mc.yandex.ru/metrika/advert.gif
+https://mc.yandex.ru/metrika/tag.js
+https://platform.twitter.com/embed/embed.i18n.0b77ee78a8e28a636331.js
+https://platform.twitter.com/embed/embed.i18n.293ca00a272b34d032a9.js
+https://platform.twitter.com/embed/embed.modules.aef85bf61d706d7edafa.js
+https://platform.twitter.com/embed/embed.modules.cb647a8c9f5f97575bd9.js
+https://platform.twitter.com/embed/embed.ondemand.en-js.77f81b914ed04ced0591.js
+https://platform.twitter.com/embed/embed.ondemand.en-js.e84cb370ed3e40856450.js
+https://platform.twitter.com/embed/embed.ondemand.i18n.en-js.536c09da9f27ad91baac.js
+https://platform.twitter.com/embed/embed.ondemand.i18n.en-js.5cdc09e4a37a07720433.js
+https://platform.twitter.com/embed/embed.ondemand.TimelineList~ondemand.TimelineProfile~ondemand.Tweet.44711848a6d644a51d82.js
+https://platform.twitter.com/embed/embed.ondemand.TimelineList~ondemand.TimelineProfile~ondemand.Tweet.4ec913c179dde91427eb.js
+https://platform.twitter.com/embed/embed.ondemand.Tweet.066c1f940105261b852e.js
+https://platform.twitter.com/embed/embed.ondemand.Tweet.3debca4342f31b7db9e1.js
+https://platform.twitter.com/embed/embed.ondemand.TweetVideo.40b1938448f69544d784.js
+https://platform.twitter.com/embed/embed.ondemand.TweetVideo.9677ea422e19142d19ec.js
+https://platform.twitter.com/embed/embed.runtime.1724480d574190f6b381.js
+https://platform.twitter.com/embed/embed.runtime.6b5d3661e7231f9606f3.js
+https://platform.twitter.com/embed/embed.Tweet.7e4521689aa2dd8195db.js
+https://platform.twitter.com/embed/embed.Tweet.c31baac24debe5533d7c.js
+https://platform.twitter.com/embed/embed.vendors~loaders.video.VideoPlayerDefaultUI.36474e74c34ad6f52990.js
+https://platform.twitter.com/embed/embed.vendors~loaders.video.VideoPlayerDefaultUI.96cf684c2f96172ada41.js
+https://platform.twitter.com/embed/embed.vendors~ondemand.en-js.2db7d4fd25a0403a936f.js
+https://platform.twitter.com/embed/embed.vendors~ondemand.en-js.fb959cd7154f3c56a8da.js
+https://platform.twitter.com/embed/embed.vendors~ondemand.TimelineList~ondemand.TimelineProfile~ondemand.Tweet.784c14fad3ed09aa7f26.js
+https://platform.twitter.com/embed/embed.vendors~ondemand.TimelineList~ondemand.TimelineProfile~ondemand.Tweet.8fd70d21755f2bcfae49.js
+https://platform.twitter.com/embed/embed.vendors~ondemand.TimelineList~ondemand.TimelineProfile~ondemand.TweetVideo.2690210765db59fa9244.js
+https://platform.twitter.com/embed/embed.vendors~ondemand.TimelineList~ondemand.TimelineProfile~ondemand.TweetVideo.bf89920680446a7cdc95.js
+https://platform.twitter.com/embed/embed.vendors~ondemand.Tweet.d4dc6d9f20302d27b041.js
+https://platform.twitter.com/embed/embed.vendors~ondemand.TweetVideo.98357008a9809fa238b9.js
+https://platform.twitter.com/embed/embed.vendors~ondemand.TweetVideo.c8873d7e5545d6c609c7.js
+https://platform.twitter.com/jot.html
+https://platform.twitter.com/js/button.1c2a6e168692ffea6cc8d4efc5b6f6bc.js
+https://platform.twitter.com/js/horizon_tweet.b9ac0a13a4a1d52c80651179f4fe9b68.js
+https://platform.twitter.com/js/moment~timeline.4391e0bf4053fbaa2a022e3fad2a1e1a.js
+https://platform.twitter.com/js/timeline.34cf38a85ac899f1d6a0438a1659decc.js
+https://platform.twitter.com/widgets.js
+https://s7.addthis.com/js/300/addthis_widget.js
+https://s7.addthis.com/static/layers.fa6cd1947ce26e890d3d.js
+https://s7.addthis.com/static/sh.f48a1a04fe8dbf021b4cda1d.html
+https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022031601.js
+https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022032101.js?cb=31065754
+https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022032101.js?cb=31065822
+https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022032201.js?cb=31065823
+https://snap.licdn.com/li.lms-analytics/insight.min.js
+https://ssl.google-analytics.com/ga.js
+https://static.addtoany.com/menu/page.js
+https://static.addtoany.com/menu/sm.23.html
+https://static.addtoany.com/menu/svg/icons.30.svg.js
+https://static.chartbeat.com/js/chartbeat.js
+https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194
+https://static.criteo.net/js/ld/ld.js
+https://static.doubleclick.net/instream/ad_status.js
+https://stats.wp.com/e-202212.js
+https://test.quantcast.mgr.consensu.org/GVL-v2/cmp-list.json
+https://www.google-analytics.com/analytics.js
+https://www.google-analytics.com/plugins/ua/ec.js
+https://www.google-analytics.com/plugins/ua/linkid.js
+https://www.google.com/js/th/Css0RoSI-HS3Ke9AuoQSWaa8zK9spjRs2QEDJP_UMgo.js
+https://www.google.com/js/th/eC3m08BWsKAgXdD56g8v-hRF27m9BLFWuq71lBVmRb0.js
+https://www.google.com/js/th/EplzmgSwEq1haJy_K7VkvamGBwhWugpG90UbraTSS_o.js
+https://www.google.com/js/th/GK9RXoYhzM9BS2DwszrzkGxxQbY5VR2mx9ED2vYLgv8.js
+https://www.google.com/js/th/iIdjuWWH5BicNn2_JadGpKIgqGW7lVC4-WD5EB_vw2g.js
+https://www.google.com/js/th/lgrQep_cHvWFMgJTnyMczGzKq0lFy3dFEtoDT0eWErg.js
+https://www.google.com/js/th/MKcwde2W9EpBjeUz-X8Qp_8IcWz9bCTkaBfeh4Am-J4.js
+https://www.google.com/js/th/nZvBJ6n5TdZ62aCM6LFj0MJnwO5NiOq1Qq9v_oTz3HU.js
+https://www.google.com/js/th/vUdUDDAd66Cx-AHksaT_xANRkhOhr-b_V9vr9VFFHpQ.js
+https://www.gstatic.com/recaptcha/releases/2uoiJ4hP3NUoP9v_eBNfU6CR/recaptcha__en.js
+https://www.instagram.com/embed.js
+https://www.instagram.com/static/bundles/metro/EmbedAsyncLogger.js/be2bbf5fd5e9.js
+https://www.instagram.com/static/bundles/metro/EmbedSDK.js/d9addf525b6a.js
+https://www.instagram.com/static/bundles/metro/EmbedSimple.js/0db99b108ff7.js
+https://www.instagram.com/static/bundles/metro/EmbedSimpleBase.css/d5d1c8482c44.css
+https://www.instagram.com/static/bundles/metro/en_US.js/23f9fb9aea85.js
+https://www.instagram.com/static/bundles/metro/en_US.js/2ec0b7dcc41c.js
+https://www.instagram.com/static/bundles/metro/Polyfills.js/a76474cce8e5.js
+https://www.instagram.com/static/bundles/metro/Polyfills.js/b1f149405b0e.js
+https://www.instagram.com/static/bundles/metro/Polyfills.js/fecde0d9ec0a.js
+https://www.instagram.com/static/bundles/metro/sprite_core_2x_bcd90c1d4868.png/bcd90c1d4868.png
+https://www.instagram.com/static/bundles/metro/sprite_embed_2x_644bc47b3106.png/644bc47b3106.png
+https://z.moatads.com/addthismoatframe568911941483/moatframe.js
diff --git a/chromium/net/tools/cachetool/cachetool.cc b/chromium/net/tools/cachetool/cachetool.cc
index 6b7634e0e63..1735d871d6d 100644
--- a/chromium/net/tools/cachetool/cachetool.cc
+++ b/chromium/net/tools/cachetool/cachetool.cc
@@ -29,6 +29,7 @@
#include "net/http/http_util.h"
using disk_cache::Backend;
+using disk_cache::BackendResult;
using disk_cache::Entry;
using disk_cache::EntryResult;
@@ -604,7 +605,8 @@ void UpdateRawResponseHeaders(CommandMarshal* command_marshal) {
if (truncated_response_info)
std::cerr << "WARNING: Truncated HTTP response." << std::endl;
- response_info.headers = new net::HttpResponseHeaders(raw_headers);
+ response_info.headers =
+ base::MakeRefCounted<net::HttpResponseHeaders>(raw_headers);
PersistResponseInfo(command_marshal, key, response_info);
}
@@ -750,16 +752,17 @@ int main(int argc, char* argv[]) {
return 1;
}
- std::unique_ptr<Backend> cache_backend;
- net::TestCompletionCallback cb;
- int rv = disk_cache::CreateCacheBackend(
+ TestBackendResultCompletionCallback cb;
+ BackendResult result = disk_cache::CreateCacheBackend(
net::DISK_CACHE, backend_type, /*file_operations=*/nullptr, cache_path,
- INT_MAX, disk_cache::ResetHandling::kNeverReset, nullptr, &cache_backend,
+ INT_MAX, disk_cache::ResetHandling::kNeverReset, /*net_log=*/nullptr,
cb.callback());
- if (cb.GetResult(rv) != net::OK) {
+ result = cb.GetResult(std::move(result));
+ if (result.net_error != net::OK) {
std::cerr << "Invalid cache." << std::endl;
return 1;
}
+ std::unique_ptr<Backend> cache_backend = std::move(result.backend);
ProgramArgumentCommandMarshal program_argument_marshal(
cache_backend.get(),
diff --git a/chromium/net/tools/cert_verify_tool/verify_using_cert_verify_proc.cc b/chromium/net/tools/cert_verify_tool/verify_using_cert_verify_proc.cc
index 81221a97665..bd722e313e8 100644
--- a/chromium/net/tools/cert_verify_tool/verify_using_cert_verify_proc.cc
+++ b/chromium/net/tools/cert_verify_tool/verify_using_cert_verify_proc.cc
@@ -129,14 +129,13 @@ bool VerifyUsingCertVerifyProc(
net::TestRootCerts* test_root_certs = net::TestRootCerts::GetInstance();
CHECK(test_root_certs->IsEmpty());
+ net::ScopedTestRoot scoped_test_roots;
if (!x509_additional_trust_anchors.empty() &&
!cert_verify_proc->SupportsAdditionalTrustAnchors()) {
std::cerr << "NOTE: Additional trust anchors not supported on this "
"platform. Using TestRootCerts instead.\n";
- for (const auto& trust_anchor : x509_additional_trust_anchors)
- test_root_certs->Add(trust_anchor.get());
-
+ scoped_test_roots.Reset(x509_additional_trust_anchors);
x509_additional_trust_anchors.clear();
}
@@ -147,9 +146,6 @@ bool VerifyUsingCertVerifyProc(
/*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
crl_set, x509_additional_trust_anchors, &result, net::NetLogWithSource());
- // Remove any temporary trust anchors.
- test_root_certs->Clear();
-
std::cout << "CertVerifyProc result: " << net::ErrorToShortString(rv) << "\n";
PrintCertVerifyResult(result);
if (!dump_path.empty() && result.verified_cert) {
diff --git a/chromium/net/tools/cert_verify_tool/verify_using_path_builder.cc b/chromium/net/tools/cert_verify_tool/verify_using_path_builder.cc
index 70bb8782aba..49aecf25df9 100644
--- a/chromium/net/tools/cert_verify_tool/verify_using_path_builder.cc
+++ b/chromium/net/tools/cert_verify_tool/verify_using_path_builder.cc
@@ -13,14 +13,14 @@
#include "crypto/sha2.h"
#include "net/cert/cert_net_fetcher.h"
#include "net/cert/internal/cert_issuer_source_aia.h"
-#include "net/cert/internal/cert_issuer_source_static.h"
-#include "net/cert/internal/parse_name.h"
-#include "net/cert/internal/parsed_certificate.h"
-#include "net/cert/internal/path_builder.h"
-#include "net/cert/internal/simple_path_builder_delegate.h"
#include "net/cert/internal/system_trust_store.h"
-#include "net/cert/internal/trust_store_collection.h"
-#include "net/cert/internal/trust_store_in_memory.h"
+#include "net/cert/pki/cert_issuer_source_static.h"
+#include "net/cert/pki/parse_name.h"
+#include "net/cert/pki/parsed_certificate.h"
+#include "net/cert/pki/path_builder.h"
+#include "net/cert/pki/simple_path_builder_delegate.h"
+#include "net/cert/pki/trust_store_collection.h"
+#include "net/cert/pki/trust_store_in_memory.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "net/tools/cert_verify_tool/cert_verify_tool_util.h"
diff --git a/chromium/net/tools/content_decoder_tool/content_decoder_tool_unittest.cc b/chromium/net/tools/content_decoder_tool/content_decoder_tool_unittest.cc
index 24cc0c4f897..83656cfa93d 100644
--- a/chromium/net/tools/content_decoder_tool/content_decoder_tool_unittest.cc
+++ b/chromium/net/tools/content_decoder_tool/content_decoder_tool_unittest.cc
@@ -88,7 +88,7 @@ TEST_F(ContentDecoderToolTest, TestGzip) {
TEST_F(ContentDecoderToolTest, TestBrotli) {
// In Cronet build, brotli sources are excluded due to binary size concern.
// In such cases, skip the test.
- std::unique_ptr<MockSourceStream> mock_source_stream(new MockSourceStream());
+ auto mock_source_stream = std::make_unique<MockSourceStream>();
bool brotli_disabled =
CreateBrotliSourceStream(std::move(mock_source_stream)) == nullptr;
if (brotli_disabled)
diff --git a/chromium/net/tools/crash_cache/crash_cache.cc b/chromium/net/tools/crash_cache/crash_cache.cc
index 6aa41aedb00..a506819f2f6 100644
--- a/chromium/net/tools/crash_cache/crash_cache.cc
+++ b/chromium/net/tools/crash_cache/crash_cache.cc
@@ -147,9 +147,9 @@ bool CreateCache(const base::FilePath& path,
net::DISK_CACHE, /* net_log = */ nullptr);
backend->SetMaxSize(size);
backend->SetFlags(disk_cache::kNoRandom);
- int rv = backend->Init(cb->callback());
+ backend->Init(cb->callback());
*cache = backend;
- return (cb->GetResult(rv) == net::OK && !(*cache)->GetEntryCount());
+ return (cb->WaitForResult() == net::OK && !(*cache)->GetEntryCount());
}
// Generates the files for an empty and one item cache.
@@ -286,8 +286,8 @@ int LoadOperations(const base::FilePath& path, RankCrashes action,
// No experiments and use a simple LRU.
cache->SetFlags(disk_cache::kNoRandom);
net::TestCompletionCallback cb;
- int rv = cache->Init(cb.callback());
- if (cb.GetResult(rv) != net::OK || cache->GetEntryCount())
+ cache->Init(cb.callback());
+ if (cb.WaitForResult() != net::OK || cache->GetEntryCount())
return GENERIC;
int seed = static_cast<int>(Time::Now().ToInternalValue());
diff --git a/chromium/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc b/chromium/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc
index b34703324e1..9f64051a51c 100644
--- a/chromium/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc
+++ b/chromium/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc
@@ -15,6 +15,7 @@
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/logging.h"
+#include "base/memory/ptr_util.h"
#include "base/message_loop/message_pump_type.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
@@ -56,7 +57,7 @@ struct CacheSpec {
return nullptr;
if (tokens[1] != kDiskCacheType && tokens[1] != kAppCacheType)
return nullptr;
- return std::unique_ptr<CacheSpec>(new CacheSpec(
+ return base::WrapUnique(new CacheSpec(
tokens[0] == kBlockFileBackendType ? net::CACHE_BACKEND_BLOCKFILE
: net::CACHE_BACKEND_SIMPLE,
tokens[1] == kDiskCacheType ? net::DISK_CACHE : net::APP_CACHE,
@@ -89,43 +90,43 @@ void SetSuccessCodeOnCompletion(base::RunLoop* run_loop,
}
std::unique_ptr<Backend> CreateAndInitBackend(const CacheSpec& spec) {
- std::unique_ptr<Backend> result;
- std::unique_ptr<Backend> backend;
- bool succeeded = false;
base::RunLoop run_loop;
- net::CompletionOnceCallback callback =
- base::BindOnce(&SetSuccessCodeOnCompletion, &run_loop, &succeeded);
- const int net_error = CreateCacheBackend(
+ BackendResult result;
+ result = CreateCacheBackend(
spec.cache_type, spec.backend_type, /*file_operations=*/nullptr,
- spec.path, 0, disk_cache::ResetHandling::kNeverReset, nullptr, &backend,
- std::move(callback));
- if (net_error == net::OK)
- SetSuccessCodeOnCompletion(&run_loop, &succeeded, net::OK);
- else
+ spec.path, 0, disk_cache::ResetHandling::kNeverReset, /*net_log=*/nullptr,
+ base::BindOnce(
+ [](BackendResult* out, base::RunLoop* run_loop,
+ BackendResult async_result) {
+ *out = std::move(async_result);
+ run_loop->Quit();
+ },
+ &result, &run_loop));
+ if (result.net_error == net::ERR_IO_PENDING)
run_loop.Run();
- if (!succeeded) {
+ if (result.net_error != net::OK) {
LOG(ERROR) << "Could not initialize backend in "
<< spec.path.LossyDisplayName();
- return result;
+ return nullptr;
}
// For the simple cache, the index may not be initialized yet.
+ bool succeeded = false;
if (spec.backend_type == net::CACHE_BACKEND_SIMPLE) {
base::RunLoop index_run_loop;
net::CompletionOnceCallback index_callback = base::BindOnce(
&SetSuccessCodeOnCompletion, &index_run_loop, &succeeded);
SimpleBackendImpl* simple_backend =
- static_cast<SimpleBackendImpl*>(backend.get());
+ static_cast<SimpleBackendImpl*>(result.backend.get());
simple_backend->index()->ExecuteWhenReady(std::move(index_callback));
index_run_loop.Run();
if (!succeeded) {
LOG(ERROR) << "Could not initialize Simple Cache in "
<< spec.path.LossyDisplayName();
- return result;
+ return nullptr;
}
}
- DCHECK(backend);
- result.swap(backend);
- return result;
+ DCHECK(result.backend);
+ return std::move(result.backend);
}
// Parses range lines from /proc/<PID>/smaps, e.g. (anonymous read write):
diff --git a/chromium/net/tools/dump_cache/dump_files.cc b/chromium/net/tools/dump_cache/dump_files.cc
index 34253344895..037618d6c00 100644
--- a/chromium/net/tools/dump_cache/dump_files.cc
+++ b/chromium/net/tools/dump_cache/dump_files.cc
@@ -82,7 +82,7 @@ void DumpStats(const base::FilePath& path, disk_cache::CacheAddr addr) {
size_t offset = address.start_block() * address.BlockSize() +
disk_cache::kBlockHeaderSize;
- std::unique_ptr<int32_t[]> buffer(new int32_t[length]);
+ auto buffer = std::make_unique<int32_t[]>(length);
if (!file->Read(buffer.get(), length, offset))
return;
@@ -109,7 +109,7 @@ void DumpIndexHeader(const base::FilePath& name,
printf("magic: %x\n", header.magic);
printf("version: %d.%d\n", header.version >> 16, header.version & 0xffff);
printf("entries: %d\n", header.num_entries);
- printf("total bytes: %d\n", header.num_bytes);
+ printf("total bytes: %" PRId64 "\n", header.num_bytes);
printf("last file number: %d\n", header.last_file);
printf("current id: %d\n", header.this_id);
printf("table length: %d\n", header.table_len);
@@ -196,7 +196,7 @@ bool CacheDumper::Init() {
}
base::FilePath index_name(path_.Append(kIndexName));
- index_file_ = new disk_cache::MappedFile;
+ index_file_ = base::MakeRefCounted<disk_cache::MappedFile>();
index_ = reinterpret_cast<disk_cache::Index*>(
index_file_->Init(index_name, 0));
if (!index_) {
@@ -294,7 +294,7 @@ bool CacheDumper::HexDump(disk_cache::CacheAddr addr, std::string* out) {
return false;
size_t size = address.num_blocks() * address.BlockSize();
- std::unique_ptr<char[]> buffer(new char[size]);
+ auto buffer = std::make_unique<char[]>(size);
size_t offset = address.start_block() * address.BlockSize() +
disk_cache::kBlockHeaderSize;
@@ -574,9 +574,9 @@ int DumpEntryAt(const base::FilePath& input_path, const std::string& at) {
if (entry.long_key && CanDump(entry.long_key))
dumper.HexDump(entry.long_key, &hex_dump);
- for (int i = 0; i < 4; i++) {
- if (entry.data_addr[i] && CanDump(entry.data_addr[i]))
- dumper.HexDump(entry.data_addr[i], &hex_dump);
+ for (disk_cache::CacheAddr data_addr : entry.data_addr) {
+ if (data_addr && CanDump(data_addr))
+ dumper.HexDump(data_addr, &hex_dump);
}
}
diff --git a/chromium/net/tools/huffman_trie/bit_writer.cc b/chromium/net/tools/huffman_trie/bit_writer.cc
index 74f5e5ecfb8..077024862a9 100644
--- a/chromium/net/tools/huffman_trie/bit_writer.cc
+++ b/chromium/net/tools/huffman_trie/bit_writer.cc
@@ -6,9 +6,7 @@
#include "base/check.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
BitWriter::BitWriter() = default;
@@ -40,6 +38,4 @@ void BitWriter::Flush() {
current_byte_ = 0;
}
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
diff --git a/chromium/net/tools/huffman_trie/bit_writer.h b/chromium/net/tools/huffman_trie/bit_writer.h
index eae701c7f10..e91b487c1b0 100644
--- a/chromium/net/tools/huffman_trie/bit_writer.h
+++ b/chromium/net/tools/huffman_trie/bit_writer.h
@@ -9,9 +9,7 @@
#include <vector>
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
// BitWriter acts as a buffer to which bits can be written. The bits are stored
// as bytes in a vector. BitWriter will buffer bits until it contains 8 bits at
@@ -55,8 +53,6 @@ class BitWriter {
std::vector<uint8_t> bytes_;
};
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
#endif // NET_TOOLS_HUFFMAN_TRIE_BIT_WRITER_H_
diff --git a/chromium/net/tools/huffman_trie/bit_writer_unittest.cc b/chromium/net/tools/huffman_trie/bit_writer_unittest.cc
index 3301174cb0d..deb373167df 100644
--- a/chromium/net/tools/huffman_trie/bit_writer_unittest.cc
+++ b/chromium/net/tools/huffman_trie/bit_writer_unittest.cc
@@ -6,9 +6,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
namespace {
@@ -112,6 +110,4 @@ TEST(BitWriterTest, WriteBoth) {
} // namespace
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
diff --git a/chromium/net/tools/huffman_trie/huffman/huffman_builder.cc b/chromium/net/tools/huffman_trie/huffman/huffman_builder.cc
index 8551d8effe9..cc7945a1180 100644
--- a/chromium/net/tools/huffman_trie/huffman/huffman_builder.cc
+++ b/chromium/net/tools/huffman_trie/huffman/huffman_builder.cc
@@ -9,9 +9,7 @@
#include "base/check.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
namespace {
@@ -149,8 +147,8 @@ std::unique_ptr<HuffmanNode> HuffmanBuilder::BuildTree() {
uint32_t count_a = a->count();
uint32_t count_b = b->count();
- std::unique_ptr<HuffmanNode> parent(
- new HuffmanNode(0, count_a + count_b, std::move(a), std::move(b)));
+ auto parent = std::make_unique<HuffmanNode>(0, count_a + count_b,
+ std::move(a), std::move(b));
nodes.erase(nodes.begin());
nodes[0] = std::move(parent);
@@ -161,6 +159,4 @@ std::unique_ptr<HuffmanNode> HuffmanBuilder::BuildTree() {
return std::move(nodes[0]);
}
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
diff --git a/chromium/net/tools/huffman_trie/huffman/huffman_builder.h b/chromium/net/tools/huffman_trie/huffman/huffman_builder.h
index b185e8b287c..3126650db6f 100644
--- a/chromium/net/tools/huffman_trie/huffman/huffman_builder.h
+++ b/chromium/net/tools/huffman_trie/huffman/huffman_builder.h
@@ -11,9 +11,7 @@
#include <memory>
#include <vector>
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
namespace {
class HuffmanNode;
@@ -78,8 +76,6 @@ class HuffmanBuilder {
std::map<uint8_t, uint32_t> counts_;
};
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
#endif // NET_TOOLS_HUFFMAN_TRIE_HUFFMAN_HUFFMAN_BUILDER_H_
diff --git a/chromium/net/tools/huffman_trie/huffman/huffman_builder_unittest.cc b/chromium/net/tools/huffman_trie/huffman/huffman_builder_unittest.cc
index c68a85a8ddc..249065d218f 100644
--- a/chromium/net/tools/huffman_trie/huffman/huffman_builder_unittest.cc
+++ b/chromium/net/tools/huffman_trie/huffman/huffman_builder_unittest.cc
@@ -6,9 +6,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
namespace {
@@ -153,6 +151,4 @@ TEST(HuffmanBuilderTest, ToVectorSingle) {
} // namespace
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
diff --git a/chromium/net/tools/huffman_trie/trie/trie_bit_buffer.cc b/chromium/net/tools/huffman_trie/trie/trie_bit_buffer.cc
index 33b2aad37b8..920f5b616e9 100644
--- a/chromium/net/tools/huffman_trie/trie/trie_bit_buffer.cc
+++ b/chromium/net/tools/huffman_trie/trie/trie_bit_buffer.cc
@@ -10,9 +10,7 @@
#include "base/check.h"
#include "net/tools/huffman_trie/bit_writer.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
TrieBitBuffer::TrieBitBuffer() = default;
@@ -146,6 +144,4 @@ void TrieBitBuffer::Flush() {
}
}
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
diff --git a/chromium/net/tools/huffman_trie/trie/trie_bit_buffer.h b/chromium/net/tools/huffman_trie/trie/trie_bit_buffer.h
index 51ad4b7777c..02cd1e3f38e 100644
--- a/chromium/net/tools/huffman_trie/trie/trie_bit_buffer.h
+++ b/chromium/net/tools/huffman_trie/trie/trie_bit_buffer.h
@@ -11,9 +11,7 @@
#include "net/tools/huffman_trie/huffman/huffman_builder.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
class BitWriter;
@@ -83,8 +81,6 @@ class TrieBitBuffer {
std::vector<BitsOrPosition> elements_;
};
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
#endif // NET_TOOLS_HUFFMAN_TRIE_TRIE_TRIE_BIT_BUFFER_H_
diff --git a/chromium/net/tools/huffman_trie/trie/trie_bit_buffer_unittest.cc b/chromium/net/tools/huffman_trie/trie/trie_bit_buffer_unittest.cc
index 73929ad07b6..19289a1a1c7 100644
--- a/chromium/net/tools/huffman_trie/trie/trie_bit_buffer_unittest.cc
+++ b/chromium/net/tools/huffman_trie/trie/trie_bit_buffer_unittest.cc
@@ -8,9 +8,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
namespace {
@@ -221,6 +219,4 @@ TEST(TrieBitBufferTest, WriteMix) {
} // namespace
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
diff --git a/chromium/net/tools/huffman_trie/trie/trie_writer.cc b/chromium/net/tools/huffman_trie/trie/trie_writer.cc
index 6c4ff8b0092..61217051791 100644
--- a/chromium/net/tools/huffman_trie/trie/trie_writer.cc
+++ b/chromium/net/tools/huffman_trie/trie/trie_writer.cc
@@ -10,9 +10,7 @@
#include "base/check.h"
#include "net/tools/huffman_trie/trie/trie_bit_buffer.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
namespace {
@@ -107,8 +105,8 @@ bool TrieWriter::WriteEntries(const TrieEntries& entries,
ReversedEntries reversed_entries;
for (auto* const entry : entries) {
- std::unique_ptr<ReversedEntry> reversed_entry(
- new ReversedEntry(ReverseName(entry->name()), entry));
+ auto reversed_entry =
+ std::make_unique<ReversedEntry>(ReverseName(entry->name()), entry);
reversed_entries.push_back(std::move(reversed_entry));
}
@@ -130,8 +128,8 @@ bool TrieWriter::WriteDispatchTables(ReversedEntries::iterator start,
writer.WriteSize(prefix.size());
if (prefix.size()) {
- for (size_t i = 0; i < prefix.size(); ++i) {
- writer.WriteChar(prefix.at(i), huffman_table_, huffman_builder_);
+ for (uint8_t c : prefix) {
+ writer.WriteChar(c, huffman_table_, huffman_builder_);
}
}
@@ -186,6 +184,4 @@ void TrieWriter::Flush() {
buffer_.Flush();
}
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
diff --git a/chromium/net/tools/huffman_trie/trie/trie_writer.h b/chromium/net/tools/huffman_trie/trie/trie_writer.h
index 9fdc1ee362f..51863ca22de 100644
--- a/chromium/net/tools/huffman_trie/trie/trie_writer.h
+++ b/chromium/net/tools/huffman_trie/trie/trie_writer.h
@@ -11,9 +11,7 @@
#include "net/tools/huffman_trie/huffman/huffman_builder.h"
#include "net/tools/huffman_trie/trie_entry.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
enum : uint8_t { kTerminalValue = 0, kEndOfTableValue = 127 };
@@ -56,8 +54,6 @@ class TrieWriter {
HuffmanBuilder* huffman_builder_;
};
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
#endif // NET_TOOLS_HUFFMAN_TRIE_TRIE_TRIE_WRITER_H_
diff --git a/chromium/net/tools/huffman_trie/trie_entry.cc b/chromium/net/tools/huffman_trie/trie_entry.cc
index 81c8da69476..a2dc0e62972 100644
--- a/chromium/net/tools/huffman_trie/trie_entry.cc
+++ b/chromium/net/tools/huffman_trie/trie_entry.cc
@@ -4,14 +4,10 @@
#include "net/tools/huffman_trie/trie_entry.h"
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
TrieEntry::TrieEntry() = default;
TrieEntry::~TrieEntry() = default;
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
diff --git a/chromium/net/tools/huffman_trie/trie_entry.h b/chromium/net/tools/huffman_trie/trie_entry.h
index fe70260f981..9cf03587014 100644
--- a/chromium/net/tools/huffman_trie/trie_entry.h
+++ b/chromium/net/tools/huffman_trie/trie_entry.h
@@ -9,9 +9,7 @@
#include <string>
#include <vector>
-namespace net {
-
-namespace huffman_trie {
+namespace net::huffman_trie {
class TrieBitBuffer;
@@ -42,8 +40,6 @@ struct ReversedEntry {
using ReversedEntries = std::vector<std::unique_ptr<ReversedEntry>>;
-} // namespace huffman_trie
-
-} // namespace net
+} // namespace net::huffman_trie
#endif // NET_TOOLS_HUFFMAN_TRIE_TRIE_ENTRY_H_
diff --git a/chromium/net/tools/net_watcher/net_watcher.cc b/chromium/net/tools/net_watcher/net_watcher.cc
index 7c75c37b7b1..00fbd793dd1 100644
--- a/chromium/net/tools/net_watcher/net_watcher.cc
+++ b/chromium/net/tools/net_watcher/net_watcher.cc
@@ -28,9 +28,9 @@
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "net/base/network_change_notifier.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
#include "net/proxy_resolution/proxy_config.h"
#include "net/proxy_resolution/proxy_config_service.h"
+#include "net/proxy_resolution/proxy_config_with_annotation.h"
// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
// of lacros-chrome is complete.
@@ -180,8 +180,8 @@ int main(int argc, char* argv[]) {
ignored_interfaces.insert(ignored_netif);
}
}
- std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier(
- new net::NetworkChangeNotifierLinux(ignored_interfaces));
+ auto network_change_notifier =
+ std::make_unique<net::NetworkChangeNotifierLinux>(ignored_interfaces);
#else
std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier(
net::NetworkChangeNotifier::CreateIfNeeded());
@@ -189,7 +189,7 @@ int main(int argc, char* argv[]) {
// Use the network loop as the file loop also.
std::unique_ptr<net::ProxyConfigService> proxy_config_service(
- net::ConfiguredProxyResolutionService::CreateSystemProxyConfigService(
+ net::ProxyConfigService::CreateSystemProxyConfigService(
io_task_executor.task_runner()));
// Uses |network_change_notifier|.
diff --git a/chromium/net/tools/quic/crypto_message_printer_bin.cc b/chromium/net/tools/quic/crypto_message_printer_bin.cc
index b33e54deb38..51156bd5843 100644
--- a/chromium/net/tools/quic/crypto_message_printer_bin.cc
+++ b/chromium/net/tools/quic/crypto_message_printer_bin.cc
@@ -22,7 +22,7 @@ namespace net {
class CryptoMessagePrinter : public quic::CryptoFramerVisitorInterface {
public:
- explicit CryptoMessagePrinter() {}
+ explicit CryptoMessagePrinter() = default;
void OnHandshakeMessage(
const quic::CryptoHandshakeMessage& message) override {
diff --git a/chromium/net/tools/quic/quic_client_message_loop_network_helper.cc b/chromium/net/tools/quic/quic_client_message_loop_network_helper.cc
index 4bd223f848a..fa4e7cd697f 100644
--- a/chromium/net/tools/quic/quic_client_message_loop_network_helper.cc
+++ b/chromium/net/tools/quic/quic_client_message_loop_network_helper.cc
@@ -28,7 +28,7 @@
#include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_server_id.h"
#include "net/third_party/quiche/src/quiche/quic/platform/api/quic_flags.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
using std::string;
diff --git a/chromium/net/tools/quic/quic_simple_client.cc b/chromium/net/tools/quic/quic_simple_client.cc
index e355be16b4d..ff8703ee7e7 100644
--- a/chromium/net/tools/quic/quic_simple_client.cc
+++ b/chromium/net/tools/quic/quic_simple_client.cc
@@ -27,7 +27,7 @@
#include "net/third_party/quiche/src/quiche/quic/core/quic_server_id.h"
#include "net/third_party/quiche/src/quiche/quic/platform/api/quic_flags.h"
#include "net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
using std::string;
@@ -45,8 +45,7 @@ QuicSimpleClient::QuicSimpleClient(
config,
CreateQuicConnectionHelper(),
CreateQuicAlarmFactory(),
- base::WrapUnique(
- new QuicClientMessageLooplNetworkHelper(&clock_, this)),
+ std::make_unique<QuicClientMessageLooplNetworkHelper>(&clock_, this),
std::move(proof_verifier),
nullptr) {
set_server_address(server_address);
diff --git a/chromium/net/tools/quic/quic_simple_client_bin.cc b/chromium/net/tools/quic/quic_simple_client_bin.cc
index 249d4d542b0..a4c88a5fbe6 100644
--- a/chromium/net/tools/quic/quic_simple_client_bin.cc
+++ b/chromium/net/tools/quic/quic_simple_client_bin.cc
@@ -46,7 +46,7 @@
#include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h"
#include "net/third_party/quiche/src/quiche/quic/platform/api/quic_socket_address.h"
#include "net/third_party/quiche/src/quiche/quic/tools/quic_toy_client.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/tools/quic/quic_simple_client.h"
#include "net/tools/quic/synchronous_host_resolver.h"
#include "url/scheme_host_port.h"
diff --git a/chromium/net/tools/quic/quic_simple_client_test.cc b/chromium/net/tools/quic/quic_simple_client_test.cc
index dada0c6cf68..8bc6d16a58e 100644
--- a/chromium/net/tools/quic/quic_simple_client_test.cc
+++ b/chromium/net/tools/quic/quic_simple_client_test.cc
@@ -10,8 +10,7 @@
#include "net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace test {
+namespace net::test {
TEST(QuicSimpleClientTest, Initialize) {
base::test::TaskEnvironment task_environment;
@@ -24,5 +23,4 @@ TEST(QuicSimpleClientTest, Initialize) {
EXPECT_TRUE(client.Initialize());
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/tools/quic/quic_simple_server.cc b/chromium/net/tools/quic/quic_simple_server.cc
index 7d993f947e8..e3fe44894c8 100644
--- a/chromium/net/tools/quic/quic_simple_server.cc
+++ b/chromium/net/tools/quic/quic_simple_server.cc
@@ -111,8 +111,8 @@ bool QuicSimpleServer::Listen(const IPEndPoint& address) {
dispatcher_ = std::make_unique<quic::QuicSimpleDispatcher>(
&config_, &crypto_config_, &version_manager_,
std::unique_ptr<quic::QuicConnectionHelperInterface>(helper_),
- std::unique_ptr<quic::QuicCryptoServerStreamBase::Helper>(
- new QuicSimpleServerSessionHelper(quic::QuicRandom::GetInstance())),
+ std::make_unique<QuicSimpleServerSessionHelper>(
+ quic::QuicRandom::GetInstance()),
std::unique_ptr<quic::QuicAlarmFactory>(alarm_factory_),
quic_simple_server_backend_, quic::kQuicDefaultConnectionIdLength);
QuicSimpleServerPacketWriter* writer =
diff --git a/chromium/net/tools/quic/quic_simple_server_test.cc b/chromium/net/tools/quic/quic_simple_server_test.cc
index 716d7450d7e..9681310e155 100644
--- a/chromium/net/tools/quic/quic_simple_server_test.cc
+++ b/chromium/net/tools/quic/quic_simple_server_test.cc
@@ -20,8 +20,7 @@
using ::testing::_;
-namespace net {
-namespace test {
+namespace net::test {
// TODO(dmz) Remove "Chrome" part of name once net/tools/quic is deleted.
class QuicChromeServerDispatchPacketTest : public ::testing::Test {
@@ -36,9 +35,8 @@ class QuicChromeServerDispatchPacketTest : public ::testing::Test {
&crypto_config_,
&version_manager_,
std::make_unique<quic::test::MockQuicConnectionHelper>(),
- std::unique_ptr<quic::QuicCryptoServerStreamBase::Helper>(
- new QuicSimpleServerSessionHelper(
- quic::QuicRandom::GetInstance())),
+ std::make_unique<QuicSimpleServerSessionHelper>(
+ quic::QuicRandom::GetInstance()),
std::make_unique<quic::test::MockAlarmFactory>(),
&memory_cache_backend_) {
dispatcher_.InitializeWithWriter(nullptr);
@@ -76,5 +74,4 @@ TEST_F(QuicChromeServerDispatchPacketTest, DispatchPacket) {
DispatchPacket(encrypted_valid_packet);
}
-} // namespace test
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/tools/stress_cache/stress_cache.cc b/chromium/net/tools/stress_cache/stress_cache.cc
index 64187c80a06..4561e5e0b03 100644
--- a/chromium/net/tools/stress_cache/stress_cache.cc
+++ b/chromium/net/tools/stress_cache/stress_cache.cc
@@ -321,9 +321,9 @@ void StressTheCache(int iteration) {
g_data->cache->SetFlags(disk_cache::kNoLoadProtection);
net::TestCompletionCallback cb;
- int rv = g_data->cache->Init(cb.callback());
+ g_data->cache->Init(cb.callback());
- if (cb.GetResult(rv) != net::OK) {
+ if (cb.WaitForResult() != net::OK) {
printf("Unable to initialize cache.\n");
return;
}
@@ -333,8 +333,8 @@ void StressTheCache(int iteration) {
int seed = static_cast<int>(Time::Now().ToInternalValue());
srand(seed);
- for (int i = 0; i < kNumKeys; i++)
- g_data->keys[i] = GenerateStressKey();
+ for (auto& key : g_data->keys)
+ key = GenerateStressKey();
base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
base::BindOnce(&LoopTask));
diff --git a/chromium/net/tools/tld_cleanup/tld_cleanup_util.cc b/chromium/net/tools/tld_cleanup/tld_cleanup_util.cc
index 288a88b678f..b2eee20f156 100644
--- a/chromium/net/tools/tld_cleanup/tld_cleanup_util.cc
+++ b/chromium/net/tools/tld_cleanup/tld_cleanup_util.cc
@@ -21,8 +21,7 @@ const int kWildcardRule = 2;
const int kPrivateRule = 4;
}
-namespace net {
-namespace tld_cleanup {
+namespace net::tld_cleanup {
// Writes the list of domain rules contained in the 'rules' set to the
// 'outfile', with each rule terminated by a LF. The file must already have
@@ -43,16 +42,16 @@ bool WriteRules(const RuleMap& rules, const base::FilePath& outfile) {
"};\n"
"%%\n");
- for (auto i = rules.begin(); i != rules.end(); ++i) {
- data.append(i->first);
+ for (const auto& rule : rules) {
+ data.append(rule.first);
data.append(", ");
int type = 0;
- if (i->second.exception) {
+ if (rule.second.exception) {
type = kExceptionRule;
- } else if (i->second.wildcard) {
+ } else if (rule.second.wildcard) {
type = kWildcardRule;
}
- if (i->second.is_private) {
+ if (rule.second.is_private) {
type += kPrivateRule;
}
data.append(base::NumberToString(type));
@@ -250,6 +249,4 @@ NormalizeResult NormalizeFile(const base::FilePath& in_filename,
return result;
}
-
-} // namespace tld_cleanup
-} // namespace net
+} // namespace net::tld_cleanup
diff --git a/chromium/net/tools/tld_cleanup/tld_cleanup_util.h b/chromium/net/tools/tld_cleanup/tld_cleanup_util.h
index 5900206bac8..0919a74d0d3 100644
--- a/chromium/net/tools/tld_cleanup/tld_cleanup_util.h
+++ b/chromium/net/tools/tld_cleanup/tld_cleanup_util.h
@@ -12,8 +12,7 @@ namespace base {
class FilePath;
} // namespace base
-namespace net {
-namespace tld_cleanup {
+namespace net::tld_cleanup {
struct Rule {
bool exception;
@@ -42,7 +41,6 @@ NormalizeResult NormalizeFile(const base::FilePath& in_filename,
NormalizeResult NormalizeDataToRuleMap(const std::string data,
RuleMap* rules);
-} // namespace tld_cleanup
-} // namespace net
+} // namespace net::tld_cleanup
#endif // NET_TOOLS_TLD_CLEANUP_TLD_CLEANUP_UTIL_H_
diff --git a/chromium/net/tools/tld_cleanup/tld_cleanup_util_unittest.cc b/chromium/net/tools/tld_cleanup/tld_cleanup_util_unittest.cc
index d2b970e71f8..85f691ce7c9 100644
--- a/chromium/net/tools/tld_cleanup/tld_cleanup_util_unittest.cc
+++ b/chromium/net/tools/tld_cleanup/tld_cleanup_util_unittest.cc
@@ -7,8 +7,7 @@
#include "base/files/file_path.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-namespace tld_cleanup {
+namespace net::tld_cleanup {
std::string SetupData(const std::string& icann_domains,
const std::string& private_domains) {
@@ -164,5 +163,4 @@ TEST(TldCleanupUtilTest, WildcardAndExceptionParsedCorrectly) {
EXPECT_TRUE(baz_bar_iter->second.is_private);
}
-} // namespace tld_cleanup
-} // namespace net
+} // namespace net::tld_cleanup
diff --git a/chromium/net/tools/transport_security_state_generator/cert_util.h b/chromium/net/tools/transport_security_state_generator/cert_util.h
index e857cada180..572246d695a 100644
--- a/chromium/net/tools/transport_security_state_generator/cert_util.h
+++ b/chromium/net/tools/transport_security_state_generator/cert_util.h
@@ -10,13 +10,9 @@
#include "base/strings/string_piece.h"
#include "third_party/boringssl/src/include/openssl/x509v3.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
class SPKIHash;
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
// Decodes the PEM block in |pem_data| and attempts to parse the resulting
// structure. Returns a pointer to a X509 instance if successful and NULL
diff --git a/chromium/net/tools/transport_security_state_generator/cert_util_unittest.cc b/chromium/net/tools/transport_security_state_generator/cert_util_unittest.cc
index 5bc294fa5bb..5f741fa114b 100644
--- a/chromium/net/tools/transport_security_state_generator/cert_util_unittest.cc
+++ b/chromium/net/tools/transport_security_state_generator/cert_util_unittest.cc
@@ -11,9 +11,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/boringssl/src/include/openssl/x509v3.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
namespace {
@@ -212,6 +210,4 @@ TEST(CertUtilTest, ExtractSubjectNameFromCertificate) {
} // namespace
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
diff --git a/chromium/net/tools/transport_security_state_generator/input_file_parsers.cc b/chromium/net/tools/transport_security_state_generator/input_file_parsers.cc
index 0345fd0e2da..1edd25ac014 100644
--- a/chromium/net/tools/transport_security_state_generator/input_file_parsers.cc
+++ b/chromium/net/tools/transport_security_state_generator/input_file_parsers.cc
@@ -24,9 +24,7 @@
#include "net/tools/transport_security_state_generator/spki_hash.h"
#include "third_party/boringssl/src/include/openssl/x509v3.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
namespace {
@@ -357,8 +355,7 @@ bool ParseJSON(base::StringPiece json,
return false;
}
- std::unique_ptr<TransportSecurityStateEntry> entry(
- new TransportSecurityStateEntry());
+ auto entry = std::make_unique<TransportSecurityStateEntry>();
const std::string* maybe_hostname = parsed.FindStringKey(kNameJSONKey);
if (!maybe_hostname) {
LOG(ERROR) << "Could not extract the hostname for entry "
@@ -441,7 +438,7 @@ bool ParseJSON(base::StringPiece json,
std::string report_uri =
maybe_report_uri ? *maybe_report_uri : std::string();
- std::unique_ptr<Pinset> pinset(new Pinset(name, report_uri));
+ auto pinset = std::make_unique<Pinset>(name, report_uri);
const base::Value* pinset_static_hashes_list =
parsed.FindListKey("static_spki_hashes");
@@ -476,6 +473,4 @@ bool ParseJSON(base::StringPiece json,
return true;
}
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
diff --git a/chromium/net/tools/transport_security_state_generator/input_file_parsers.h b/chromium/net/tools/transport_security_state_generator/input_file_parsers.h
index a2e67d6110a..abf5a921279 100644
--- a/chromium/net/tools/transport_security_state_generator/input_file_parsers.h
+++ b/chromium/net/tools/transport_security_state_generator/input_file_parsers.h
@@ -12,9 +12,7 @@ namespace base {
class Time;
}
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
class Pinsets;
@@ -36,8 +34,6 @@ bool ParseJSON(base::StringPiece json,
TransportSecurityStateEntries* entries,
Pinsets* pinsets);
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
#endif // NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_INPUT_FILE_PARSERS_H_
diff --git a/chromium/net/tools/transport_security_state_generator/input_file_parsers_unittest.cc b/chromium/net/tools/transport_security_state_generator/input_file_parsers_unittest.cc
index 28031f429d8..28980fea2f9 100644
--- a/chromium/net/tools/transport_security_state_generator/input_file_parsers_unittest.cc
+++ b/chromium/net/tools/transport_security_state_generator/input_file_parsers_unittest.cc
@@ -10,9 +10,7 @@
#include "net/tools/transport_security_state_generator/transport_security_state_entry.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
namespace {
@@ -449,6 +447,4 @@ TEST(InputFileParsersTest, ParseCertificatesFileInvalidTimestamp) {
} // namespace
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
diff --git a/chromium/net/tools/transport_security_state_generator/pinset.cc b/chromium/net/tools/transport_security_state_generator/pinset.cc
index dffd86c2580..edef5e6efe1 100644
--- a/chromium/net/tools/transport_security_state_generator/pinset.cc
+++ b/chromium/net/tools/transport_security_state_generator/pinset.cc
@@ -4,9 +4,7 @@
#include "net/tools/transport_security_state_generator/pinset.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
Pinset::Pinset(std::string name, std::string report_uri)
: name_(name), report_uri_(report_uri) {}
@@ -21,6 +19,4 @@ void Pinset::AddBadStaticSPKIHash(const std::string& hash_name) {
bad_static_spki_hashes_.push_back(hash_name);
}
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
diff --git a/chromium/net/tools/transport_security_state_generator/pinset.h b/chromium/net/tools/transport_security_state_generator/pinset.h
index ddd17f3a03d..e27eb4b9859 100644
--- a/chromium/net/tools/transport_security_state_generator/pinset.h
+++ b/chromium/net/tools/transport_security_state_generator/pinset.h
@@ -8,9 +8,7 @@
#include <string>
#include <vector>
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
// A Pinset represents the data a website would send in a HPKP header. A pinset
// is given a name so that multiple entries in the preload list can reference
@@ -51,8 +49,6 @@ class Pinset {
std::vector<std::string> bad_static_spki_hashes_;
};
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
#endif // NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_PINSET_H_
diff --git a/chromium/net/tools/transport_security_state_generator/pinsets.cc b/chromium/net/tools/transport_security_state_generator/pinsets.cc
index a9c9e090331..d768659788a 100644
--- a/chromium/net/tools/transport_security_state_generator/pinsets.cc
+++ b/chromium/net/tools/transport_security_state_generator/pinsets.cc
@@ -7,9 +7,7 @@
#include "base/strings/string_piece.h"
#include "net/tools/transport_security_state_generator/spki_hash.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
Pinsets::Pinsets() = default;
@@ -25,6 +23,4 @@ void Pinsets::RegisterPinset(std::unique_ptr<Pinset> pinset) {
pinset->name(), std::move(pinset)));
}
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
diff --git a/chromium/net/tools/transport_security_state_generator/pinsets.h b/chromium/net/tools/transport_security_state_generator/pinsets.h
index db87d76caba..89e8e15a53d 100644
--- a/chromium/net/tools/transport_security_state_generator/pinsets.h
+++ b/chromium/net/tools/transport_security_state_generator/pinsets.h
@@ -14,9 +14,7 @@
#include "net/tools/transport_security_state_generator/pinset.h"
#include "net/tools/transport_security_state_generator/spki_hash.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
// Contains SPKIHashes and their names. The names are used to reference
// the hashes from Pinset's.
@@ -49,8 +47,6 @@ class Pinsets {
PinsetMap pinsets_;
};
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
#endif // NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_PINSETS_H_
diff --git a/chromium/net/tools/transport_security_state_generator/preloaded_state_generator.cc b/chromium/net/tools/transport_security_state_generator/preloaded_state_generator.cc
index 95269a973f5..4023b18f0a9 100644
--- a/chromium/net/tools/transport_security_state_generator/preloaded_state_generator.cc
+++ b/chromium/net/tools/transport_security_state_generator/preloaded_state_generator.cc
@@ -13,9 +13,7 @@
#include "net/tools/transport_security_state_generator/cert_util.h"
#include "net/tools/transport_security_state_generator/spki_hash.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
namespace {
@@ -146,9 +144,8 @@ std::string PreloadedStateGenerator::Generate(
std::vector<std::unique_ptr<TransportSecurityStateTrieEntry>> trie_entries;
std::vector<huffman_trie::TrieEntry*> raw_trie_entries;
for (const auto& entry : entries) {
- std::unique_ptr<TransportSecurityStateTrieEntry> trie_entry(
- new TransportSecurityStateTrieEntry(expect_ct_report_uri_map,
- pinsets_map, entry.get()));
+ auto trie_entry = std::make_unique<TransportSecurityStateTrieEntry>(
+ expect_ct_report_uri_map, pinsets_map, entry.get());
raw_trie_entries.push_back(trie_entry.get());
trie_entries.push_back(std::move(trie_entry));
}
@@ -313,6 +310,4 @@ void PreloadedStateGenerator::ProcessPinsets(const Pinsets& pinset,
ReplaceTag("PINSETS", pinsets_output, tpl);
}
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
diff --git a/chromium/net/tools/transport_security_state_generator/preloaded_state_generator.h b/chromium/net/tools/transport_security_state_generator/preloaded_state_generator.h
index 2d1c83d0d99..de50e3f29f3 100644
--- a/chromium/net/tools/transport_security_state_generator/preloaded_state_generator.h
+++ b/chromium/net/tools/transport_security_state_generator/preloaded_state_generator.h
@@ -16,9 +16,7 @@
#include "net/tools/transport_security_state_generator/pinsets.h"
#include "net/tools/transport_security_state_generator/transport_security_state_entry.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
// PreloadedStateGenerator generates C++ code that contains the preloaded
// entries in a way the Chromium code understands. The code that reads the
@@ -45,8 +43,6 @@ class PreloadedStateGenerator {
std::string* tpl);
};
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
#endif // NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_PRELOADED_STATE_GENERATOR_H_
diff --git a/chromium/net/tools/transport_security_state_generator/spki_hash.cc b/chromium/net/tools/transport_security_state_generator/spki_hash.cc
index 6374aedc7fc..0474671d686 100644
--- a/chromium/net/tools/transport_security_state_generator/spki_hash.cc
+++ b/chromium/net/tools/transport_security_state_generator/spki_hash.cc
@@ -10,9 +10,7 @@
#include "base/strings/string_util.h"
#include "third_party/boringssl/src/include/openssl/sha.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
SPKIHash::SPKIHash() = default;
@@ -44,6 +42,4 @@ void SPKIHash::CalculateFromBytes(const uint8_t* input, size_t input_length) {
SHA256(input, input_length, data_);
}
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
diff --git a/chromium/net/tools/transport_security_state_generator/spki_hash.h b/chromium/net/tools/transport_security_state_generator/spki_hash.h
index 12619dd6dbf..93627b08473 100644
--- a/chromium/net/tools/transport_security_state_generator/spki_hash.h
+++ b/chromium/net/tools/transport_security_state_generator/spki_hash.h
@@ -9,9 +9,7 @@
#include "base/strings/string_piece.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
class SPKIHash {
public:
@@ -42,8 +40,6 @@ class SPKIHash {
uint8_t data_[kLength];
};
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
#endif // NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_SPKI_HASH_H_
diff --git a/chromium/net/tools/transport_security_state_generator/spki_hash_unittest.cc b/chromium/net/tools/transport_security_state_generator/spki_hash_unittest.cc
index 1914208c93f..0f46d51d854 100644
--- a/chromium/net/tools/transport_security_state_generator/spki_hash_unittest.cc
+++ b/chromium/net/tools/transport_security_state_generator/spki_hash_unittest.cc
@@ -7,9 +7,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
namespace {
@@ -59,6 +57,4 @@ TEST(SPKIHashTest, FromString) {
} // namespace
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
diff --git a/chromium/net/tools/transport_security_state_generator/transport_security_state_entry.cc b/chromium/net/tools/transport_security_state_generator/transport_security_state_entry.cc
index 2aa3cb42309..2871b48ca06 100644
--- a/chromium/net/tools/transport_security_state_generator/transport_security_state_entry.cc
+++ b/chromium/net/tools/transport_security_state_generator/transport_security_state_entry.cc
@@ -5,9 +5,7 @@
#include "net/tools/transport_security_state_generator/transport_security_state_entry.h"
#include "net/tools/huffman_trie/trie/trie_bit_buffer.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
namespace {
@@ -32,7 +30,7 @@ TransportSecurityStateTrieEntry::TransportSecurityStateTrieEntry(
pinsets_map_(pinsets_map),
entry_(entry) {}
-TransportSecurityStateTrieEntry::~TransportSecurityStateTrieEntry() {}
+TransportSecurityStateTrieEntry::~TransportSecurityStateTrieEntry() = default;
std::string TransportSecurityStateTrieEntry::name() const {
return entry_->hostname;
@@ -106,6 +104,4 @@ bool TransportSecurityStateTrieEntry::WriteEntry(
return true;
}
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
diff --git a/chromium/net/tools/transport_security_state_generator/transport_security_state_entry.h b/chromium/net/tools/transport_security_state_generator/transport_security_state_entry.h
index 59059d88f6d..0646bb5cb96 100644
--- a/chromium/net/tools/transport_security_state_generator/transport_security_state_entry.h
+++ b/chromium/net/tools/transport_security_state_generator/transport_security_state_entry.h
@@ -11,9 +11,7 @@
#include <vector>
#include "net/tools/huffman_trie/trie_entry.h"
-namespace net {
-
-namespace transport_security_state {
+namespace net::transport_security_state {
// Maps a name to an index. This is used to track the index of several values
// in the C++ code. The trie refers to the array index of the values. For
@@ -58,8 +56,6 @@ class TransportSecurityStateTrieEntry : public huffman_trie::TrieEntry {
TransportSecurityStateEntry* entry_;
};
-} // namespace transport_security_state
-
-} // namespace net
+} // namespace net::transport_security_state
#endif // NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_TRANSPORT_SECURITY_STATE_ENTRY_H_
diff --git a/chromium/net/traffic_annotation/network_traffic_annotation.h b/chromium/net/traffic_annotation/network_traffic_annotation.h
index 27746d6a350..108717e5ab9 100644
--- a/chromium/net/traffic_annotation/network_traffic_annotation.h
+++ b/chromium/net/traffic_annotation/network_traffic_annotation.h
@@ -21,8 +21,9 @@ namespace {
// Recursively compute hash code of the given string as a constant expression.
template <int N>
constexpr uint32_t recursive_hash(const char* str) {
- return static_cast<uint32_t>((recursive_hash<N - 1>(str) * 31 + str[N - 1]) %
- 138003713);
+ return (recursive_hash<N - 1>(str) * 31u +
+ static_cast<uint32_t>(str[N - 1])) %
+ 138003713u;
}
// Recursion stopper for the above function. Note that string of size 0 will
@@ -87,7 +88,7 @@ struct NetworkTrafficAnnotationTag {
friend struct MutableNetworkTrafficAnnotationTag;
private:
- constexpr NetworkTrafficAnnotationTag(int32_t unique_id_hash_code_)
+ constexpr explicit NetworkTrafficAnnotationTag(int32_t unique_id_hash_code_)
: unique_id_hash_code(unique_id_hash_code_) {}
};
@@ -123,7 +124,8 @@ struct PartialNetworkTrafficAnnotationTag {
: unique_id_hash_code(unique_id_hash_code_),
completing_id_hash_code(completing_id_hash_code_) {}
#else
- constexpr PartialNetworkTrafficAnnotationTag(int32_t unique_id_hash_code_)
+ constexpr explicit PartialNetworkTrafficAnnotationTag(
+ int32_t unique_id_hash_code_)
: unique_id_hash_code(unique_id_hash_code_) {}
#endif
};
diff --git a/chromium/net/url_request/http_with_dns_over_https_unittest.cc b/chromium/net/url_request/http_with_dns_over_https_unittest.cc
index 43c94daca53..3707c5a17c8 100644
--- a/chromium/net/url_request/http_with_dns_over_https_unittest.cc
+++ b/chromium/net/url_request/http_with_dns_over_https_unittest.cc
@@ -34,6 +34,8 @@
#include "net/http/http_stream_factory_test_util.h"
#include "net/log/net_log.h"
#include "net/socket/transport_client_socket_pool.h"
+#include "net/ssl/ssl_config_service.h"
+#include "net/ssl/test_ssl_config_service.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
@@ -72,7 +74,7 @@ class TestHostResolverProc : public HostResolverProc {
AddressList* addrlist,
int* os_error) override {
insecure_queries_served_++;
- *addrlist = AddressList::CreateFromIPAddress(IPAddress(127, 0, 0, 1), 443);
+ *addrlist = AddressList::CreateFromIPAddress(IPAddress(127, 0, 0, 1), 0);
return OK;
}
@@ -159,11 +161,14 @@ class DnsOverHttpsIntegrationTest : public TestWithTaskEnvironment {
// HostResolverManager::HaveTestProcOverride disables the built-in DNS
// client.
auto* resolver_raw = resolver.get();
- resolver->SetProcParamsForTesting(
- ProcTaskParams(host_resolver_proc_.get(), 1));
+ resolver->SetProcParamsForTesting(ProcTaskParams(host_resolver_proc_, 1));
auto context_builder = CreateTestURLRequestContextBuilder();
context_builder->set_host_resolver(std::move(resolver));
+ auto ssl_config_service =
+ std::make_unique<TestSSLConfigService>(SSLContextConfig());
+ ssl_config_service_ = ssl_config_service.get();
+ context_builder->set_ssl_config_service(std::move(ssl_config_service));
request_context_ = context_builder->Build();
if (mode == SecureDnsMode::kAutomatic) {
@@ -172,7 +177,7 @@ class DnsOverHttpsIntegrationTest : public TestWithTaskEnvironment {
}
}
- void AddHostWithEch(const url::SchemeHostPort host,
+ void AddHostWithEch(const url::SchemeHostPort& host,
const IPAddress& address,
base::span<const uint8_t> ech_config_list) {
doh_server_.AddAddressRecord(host.host(), address);
@@ -186,6 +191,7 @@ class DnsOverHttpsIntegrationTest : public TestWithTaskEnvironment {
TestDohServer doh_server_;
scoped_refptr<net::TestHostResolverProc> host_resolver_proc_;
std::unique_ptr<URLRequestContext> request_context_;
+ raw_ptr<TestSSLConfigService> ssl_config_service_;
};
// A convenience wrapper over `DnsOverHttpsIntegrationTest` that also starts an
@@ -206,8 +212,7 @@ class HttpsWithDnsOverHttpsTest : public DnsOverHttpsIntegrationTest {
std::unique_ptr<test_server::HttpResponse> HandleDefaultRequest(
const test_server::HttpRequest& request) {
- std::unique_ptr<test_server::BasicHttpResponse> http_response(
- new test_server::BasicHttpResponse);
+ auto http_response = std::make_unique<test_server::BasicHttpResponse>();
test_https_requests_served_++;
http_response->set_content(kTestBody);
http_response->set_content_type("text/html");
@@ -365,6 +370,7 @@ TEST_F(HttpsWithDnsOverHttpsTest, HttpsUpgrade) {
base::test::ScopedFeatureList features;
features.InitAndEnableFeatureWithParameters(
features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbHttpUpgrade", "true"}});
+ ResetContext();
GURL https_url = https_server_.GetURL(kHostname, "/test");
EXPECT_TRUE(https_url.SchemeIs(url::kHttpsScheme));
@@ -408,6 +414,7 @@ TEST_F(HttpsWithDnsOverHttpsTest, HttpsMetadata) {
base::test::ScopedFeatureList features;
features.InitAndEnableFeatureWithParameters(
features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbHttpUpgrade", "true"}});
+ ResetContext();
GURL main_url = https_server_.GetURL(kHostname, "/test");
EXPECT_TRUE(main_url.SchemeIs(url::kHttpsScheme));
@@ -457,10 +464,10 @@ TEST_F(DnsOverHttpsIntegrationTest, EncryptedClientHello) {
AddHostWithEch(url::SchemeHostPort(url), addr.front().address(),
ech_config_list);
- for (bool ech_enabled : {true, false}) {
- SCOPED_TRACE(ech_enabled);
+ for (bool feature_enabled : {true, false}) {
+ SCOPED_TRACE(feature_enabled);
base::test::ScopedFeatureList features;
- if (ech_enabled) {
+ if (feature_enabled) {
features.InitWithFeatures(
/*enabled_features=*/{features::kUseDnsHttpsSvcb,
features::kEncryptedClientHello},
@@ -471,22 +478,32 @@ TEST_F(DnsOverHttpsIntegrationTest, EncryptedClientHello) {
/*disabled_features=*/{features::kEncryptedClientHello});
}
- // Create a new `URLRequestContext`, to ensure there are no cached sockets,
- // etc., from the previous loop iteration.
- ResetContext();
- TestDelegate d;
- std::unique_ptr<URLRequest> r = context()->CreateRequest(
- url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS);
- r->Start();
- EXPECT_TRUE(r->is_pending());
+ for (bool config_enabled : {true, false}) {
+ SCOPED_TRACE(config_enabled);
+ bool ech_enabled = feature_enabled && config_enabled;
- d.RunUntilComplete();
+ // Create a new `URLRequestContext`, to ensure there are no cached
+ // sockets, etc., from the previous loop iteration.
+ ResetContext();
- EXPECT_THAT(d.request_status(), IsOk());
- EXPECT_EQ(1, d.response_started_count());
- EXPECT_FALSE(d.received_data_before_response());
- EXPECT_NE(0, d.bytes_received());
- EXPECT_EQ(ech_enabled, r->ssl_info().encrypted_client_hello);
+ SSLContextConfig config;
+ config.ech_enabled = config_enabled;
+ ssl_config_service_->UpdateSSLConfigAndNotify(config);
+
+ TestDelegate d;
+ std::unique_ptr<URLRequest> r = context()->CreateRequest(
+ url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS);
+ r->Start();
+ EXPECT_TRUE(r->is_pending());
+
+ d.RunUntilComplete();
+
+ EXPECT_THAT(d.request_status(), IsOk());
+ EXPECT_EQ(1, d.response_started_count());
+ EXPECT_FALSE(d.received_data_before_response());
+ EXPECT_NE(0, d.bytes_received());
+ EXPECT_EQ(ech_enabled, r->ssl_info().encrypted_client_hello);
+ }
}
}
@@ -499,6 +516,7 @@ TEST_F(DnsOverHttpsIntegrationTest, EncryptedClientHelloStaleKey) {
/*enabled_features=*/{features::kEncryptedClientHello,
features::kUseDnsHttpsSvcb},
/*disabled_features=*/{});
+ ResetContext();
static constexpr char kRealNameStale[] = "secret1.example";
static constexpr char kRealNameWrongPublicName[] = "secret2.example";
@@ -579,6 +597,7 @@ TEST_F(DnsOverHttpsIntegrationTest, EncryptedClientHelloFallback) {
/*enabled_features=*/{features::kEncryptedClientHello,
features::kUseDnsHttpsSvcb},
/*disabled_features=*/{});
+ ResetContext();
static constexpr char kRealNameStale[] = "secret1.example";
static constexpr char kRealNameWrongPublicName[] = "secret2.example";
@@ -649,6 +668,7 @@ TEST_F(DnsOverHttpsIntegrationTest, EncryptedClientHelloFallbackTLS12) {
/*enabled_features=*/{features::kEncryptedClientHello,
features::kUseDnsHttpsSvcb},
/*disabled_features=*/{});
+ ResetContext();
static constexpr char kRealNameStale[] = "secret1.example";
static constexpr char kRealNameWrongPublicName[] = "secret2.example";
diff --git a/chromium/net/url_request/report_sender.cc b/chromium/net/url_request/report_sender.cc
index 269658b6314..e2deec544c7 100644
--- a/chromium/net/url_request/report_sender.cc
+++ b/chromium/net/url_request/report_sender.cc
@@ -80,8 +80,7 @@ void ReportSender::Send(const GURL& report_uri,
url_request->set_method("POST");
std::vector<char> report_data(report.begin(), report.end());
- std::unique_ptr<UploadElementReader> reader(
- new UploadOwnedBytesElementReader(&report_data));
+ auto reader = std::make_unique<UploadOwnedBytesElementReader>(&report_data);
url_request->set_upload(
ElementsUploadDataStream::CreateWithReader(std::move(reader), 0));
diff --git a/chromium/net/url_request/report_sender_unittest.cc b/chromium/net/url_request/report_sender_unittest.cc
index e1f5d814892..56eec03aed9 100644
--- a/chromium/net/url_request/report_sender_unittest.cc
+++ b/chromium/net/url_request/report_sender_unittest.cc
@@ -91,7 +91,7 @@ class MockServerErrorJob : public URLRequestJob {
protected:
void GetResponseInfo(HttpResponseInfo* info) override {
- info->headers = new HttpResponseHeaders(
+ info->headers = base::MakeRefCounted<HttpResponseHeaders>(
"HTTP/1.1 500 Internal Server Error\n"
"Content-type: text/plain\n"
"Content-Length: 0\n");
@@ -215,8 +215,7 @@ class ReportSenderTest : public TestWithTaskEnvironment {
URLRequestMockDataJob::AddUrlHandler();
URLRequestFilter::GetInstance()->AddHostnameInterceptor(
"http", kServerErrorHostname,
- std::unique_ptr<URLRequestInterceptor>(
- new MockServerErrorJobInterceptor()));
+ std::make_unique<MockServerErrorJobInterceptor>());
}
void TearDown() override { URLRequestFilter::GetInstance()->ClearHandlers(); }
@@ -334,8 +333,8 @@ TEST_F(ReportSenderTest, PendingRequestGetsDeleted) {
EXPECT_EQ(0u, network_delegate().num_requests());
- std::unique_ptr<ReportSender> reporter(
- new ReportSender(context(), TRAFFIC_ANNOTATION_FOR_TESTS));
+ auto reporter =
+ std::make_unique<ReportSender>(context(), TRAFFIC_ANNOTATION_FOR_TESTS);
reporter->Send(url, "application/foobar", kDummyReport, NetworkIsolationKey(),
base::OnceCallback<void()>(),
base::OnceCallback<void(const GURL&, int, int)>());
diff --git a/chromium/net/url_request/test_url_fetcher_factory.cc b/chromium/net/url_request/test_url_fetcher_factory.cc
deleted file mode 100644
index 76af8176afb..00000000000
--- a/chromium/net/url_request/test_url_fetcher_factory.cc
+++ /dev/null
@@ -1,397 +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.
-
-#include "net/url_request/test_url_fetcher_factory.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/files/file_util.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/memory/weak_ptr.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread_restrictions.h"
-#include "net/base/completion_once_callback.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/base/upload_data_stream.h"
-#include "net/http/http_response_headers.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "net/url_request/url_fetcher_impl.h"
-#include "net/url_request/url_fetcher_response_writer.h"
-
-namespace net {
-
-ScopedURLFetcherFactory::ScopedURLFetcherFactory(
- URLFetcherFactory* factory) {
- DCHECK(!URLFetcherImpl::factory());
- URLFetcherImpl::set_factory(factory);
-}
-
-ScopedURLFetcherFactory::~ScopedURLFetcherFactory() {
- DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- DCHECK(URLFetcherImpl::factory());
- URLFetcherImpl::set_factory(nullptr);
-}
-
-TestURLFetcher::TestURLFetcher(int id, const GURL& url, URLFetcherDelegate* d)
- : id_(id), original_url_(url), delegate_(d) {
- CHECK(original_url_.is_valid());
-}
-
-TestURLFetcher::~TestURLFetcher() {
- if (delegate_for_tests_)
- delegate_for_tests_->OnRequestEnd(id_);
-}
-
-void TestURLFetcher::SetUploadData(const std::string& upload_content_type,
- const std::string& upload_content) {
- upload_content_type_ = upload_content_type;
- upload_data_ = upload_content;
-}
-
-void TestURLFetcher::SetUploadFilePath(
- const std::string& upload_content_type,
- const base::FilePath& file_path,
- uint64_t range_offset,
- uint64_t range_length,
- scoped_refptr<base::TaskRunner> file_task_runner) {
- upload_file_path_ = file_path;
-}
-
-void TestURLFetcher::SetUploadStreamFactory(
- const std::string& upload_content_type,
- const CreateUploadStreamCallback& factory) {
-}
-
-void TestURLFetcher::SetChunkedUpload(const std::string& upload_content_type) {
-}
-
-void TestURLFetcher::AppendChunkToUpload(const std::string& data,
- bool is_last_chunk) {
- DCHECK(!did_receive_last_chunk_);
- did_receive_last_chunk_ = is_last_chunk;
- chunks_.push_back(data);
- if (delegate_for_tests_)
- delegate_for_tests_->OnChunkUpload(id_);
-}
-
-void TestURLFetcher::SetLoadFlags(int load_flags) {
- fake_load_flags_= load_flags;
-}
-
-int TestURLFetcher::GetLoadFlags() const {
- return fake_load_flags_;
-}
-
-void TestURLFetcher::SetReferrer(const std::string& referrer) {
-}
-
-void TestURLFetcher::SetReferrerPolicy(ReferrerPolicy referrer_policy) {}
-
-void TestURLFetcher::ClearExtraRequestHeaders() {
- fake_extra_request_headers_.Clear();
-}
-
-void TestURLFetcher::AddExtraRequestHeader(const std::string& name,
- const std::string& value) {
- fake_extra_request_headers_.SetHeader(name, value);
-}
-
-void TestURLFetcher::SetRequestContext(
- URLRequestContextGetter* request_context_getter) {
-}
-
-void TestURLFetcher::SetInitiator(
- const absl::optional<url::Origin>& initiator) {}
-
-void TestURLFetcher::SetURLRequestUserData(
- const void* key,
- const CreateDataCallback& create_data_callback) {
-}
-
-void TestURLFetcher::SetStopOnRedirect(bool stop_on_redirect) {
-}
-
-void TestURLFetcher::SetAutomaticallyRetryOn5xx(bool retry) {
-}
-
-void TestURLFetcher::SetMaxRetriesOn5xx(int max_retries) {
- fake_max_retries_ = max_retries;
-}
-
-int TestURLFetcher::GetMaxRetriesOn5xx() const {
- return fake_max_retries_;
-}
-
-base::TimeDelta TestURLFetcher::GetBackoffDelay() const {
- return base::TimeDelta();
-}
-
-void TestURLFetcher::SetAutomaticallyRetryOnNetworkChanges(int max_retries) {
-}
-
-void TestURLFetcher::SaveResponseToFileAtPath(
- const base::FilePath& file_path,
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
- write_response_file_ = true;
- SetResponseFilePath(file_path);
- // Asynchronous IO is not supported, so file_task_runner is ignored.
-}
-
-void TestURLFetcher::SaveResponseToTemporaryFile(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
- base::FilePath path;
- if (!base::CreateTemporaryFile(&path))
- DLOG(ERROR) << "SaveResponseToTemporaryFile failed creating temp file";
- SaveResponseToFileAtPath(path, file_task_runner);
-}
-
-void TestURLFetcher::SaveResponseWithWriter(
- std::unique_ptr<URLFetcherResponseWriter> response_writer) {
- // In class URLFetcherCore this method is called by all three:
- // GetResponseAsString() / SaveResponseToFileAtPath() /
- // SaveResponseToTemporaryFile(). But here (in TestURLFetcher), this method
- // is never used by any of these three methods. So, file writing is expected
- // to be done in SaveResponseToFileAtPath(), and this method supports only
- // URLFetcherStringWriter (for testing of this method only).
- if (fake_response_destination_ == STRING) {
- response_writer_ = std::move(response_writer);
- int response = response_writer_->Initialize(CompletionOnceCallback());
- // The TestURLFetcher doesn't handle asynchronous writes.
- DCHECK_EQ(OK, response);
-
- scoped_refptr<IOBuffer> buffer =
- base::MakeRefCounted<StringIOBuffer>(fake_response_string_);
- response = response_writer_->Write(
- buffer.get(), fake_response_string_.size(), CompletionOnceCallback());
- DCHECK_EQ(static_cast<int>(fake_response_string_.size()), response);
- response = response_writer_->Finish(OK, CompletionOnceCallback());
- DCHECK_EQ(OK, response);
- } else if (fake_response_destination_ == TEMP_FILE) {
- // SaveResponseToFileAtPath() should be called instead of this method to
- // save file. Asynchronous file writing using URLFetcherFileWriter is not
- // supported.
- NOTIMPLEMENTED();
- } else {
- NOTREACHED();
- }
-}
-
-HttpResponseHeaders* TestURLFetcher::GetResponseHeaders() const {
- return fake_response_headers_.get();
-}
-
-IPEndPoint TestURLFetcher::GetSocketAddress() const {
- NOTIMPLEMENTED();
- return IPEndPoint();
-}
-
-const ProxyServer& TestURLFetcher::ProxyServerUsed() const {
- return fake_proxy_server_;
-}
-
-bool TestURLFetcher::WasCached() const {
- return fake_was_cached_;
-}
-
-int64_t TestURLFetcher::GetReceivedResponseContentLength() const {
- return fake_response_bytes_;
-}
-
-int64_t TestURLFetcher::GetTotalReceivedBytes() const {
- return fake_was_cached_ ? 0 : fake_response_bytes_;
-}
-
-void TestURLFetcher::Start() {
- // Overriden to do nothing. It is assumed the caller will notify the delegate.
- if (delegate_for_tests_)
- delegate_for_tests_->OnRequestStart(id_);
-
- // If the response should go into a file, write it out now.
- if (fake_error_ == net::OK && fake_response_code_ == net::HTTP_OK &&
- write_response_file_ && !fake_response_file_path_.empty()) {
- base::ScopedAllowBlockingForTesting allow_blocking;
- size_t written_bytes =
- base::WriteFile(fake_response_file_path_, fake_response_string_.c_str(),
- fake_response_string_.size());
- DCHECK_EQ(fake_response_string_.size(), written_bytes);
- }
-}
-
-const GURL& TestURLFetcher::GetOriginalURL() const {
- return original_url_;
-}
-
-const GURL& TestURLFetcher::GetURL() const {
- return fake_url_;
-}
-
-Error TestURLFetcher::GetError() const {
- return fake_error_;
-}
-
-int TestURLFetcher::GetResponseCode() const {
- return fake_response_code_;
-}
-
-void TestURLFetcher::ReceivedContentWasMalformed() {
-}
-
-bool TestURLFetcher::GetResponseAsString(
- std::string* out_response_string) const {
- if (fake_response_destination_ != STRING)
- return false;
-
- *out_response_string = fake_response_string_;
- return true;
-}
-
-bool TestURLFetcher::GetResponseAsFilePath(
- bool take_ownership, base::FilePath* out_response_path) const {
- if (fake_response_destination_ != TEMP_FILE)
- return false;
-
- *out_response_path = fake_response_file_path_;
- return true;
-}
-
-void TestURLFetcher::GetExtraRequestHeaders(
- HttpRequestHeaders* headers) const {
- *headers = fake_extra_request_headers_;
-}
-
-void TestURLFetcher::set_was_cached(bool flag) {
- fake_was_cached_ = flag;
-}
-
-void TestURLFetcher::set_response_headers(
- scoped_refptr<HttpResponseHeaders> headers) {
- fake_response_headers_ = headers;
-}
-
-void TestURLFetcher::SetDelegateForTests(DelegateForTests* delegate_for_tests) {
- delegate_for_tests_ = delegate_for_tests;
-}
-
-void TestURLFetcher::SetResponseString(const std::string& response) {
- fake_response_destination_ = STRING;
- fake_response_string_ = response;
- fake_response_bytes_ = response.size();
-}
-
-void TestURLFetcher::SetResponseFilePath(const base::FilePath& path) {
- fake_response_destination_ = TEMP_FILE;
- fake_response_file_path_ = path;
-}
-
-FakeURLFetcher::FakeURLFetcher(const GURL& url,
- URLFetcherDelegate* d,
- const std::string& response_data,
- HttpStatusCode response_code,
- Error error)
- : TestURLFetcher(0, url, d) {
- set_error(error);
- set_response_code(response_code);
- SetResponseString(response_data);
- response_bytes_ = response_data.size();
-}
-
-FakeURLFetcher::~FakeURLFetcher() = default;
-
-void FakeURLFetcher::Start() {
- TestURLFetcher::Start();
- base::SequencedTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::BindOnce(&FakeURLFetcher::RunDelegate, weak_factory_.GetWeakPtr()));
-}
-
-void FakeURLFetcher::RunDelegate() {
- // OnURLFetchDownloadProgress may delete this URLFetcher. We keep track of
- // this with a weak pointer, and only call OnURLFetchComplete if this still
- // exists.
- auto weak_this = weak_factory_.GetWeakPtr();
- delegate()->OnURLFetchDownloadProgress(this, response_bytes_, response_bytes_,
- response_bytes_);
- if (weak_this.get())
- delegate()->OnURLFetchComplete(this);
-}
-
-const GURL& FakeURLFetcher::GetURL() const {
- return TestURLFetcher::GetOriginalURL();
-}
-
-FakeURLFetcherFactory::FakeURLFetcherFactory(URLFetcherFactory* default_factory)
- : ScopedURLFetcherFactory(this),
- creator_(base::BindRepeating(&DefaultFakeURLFetcherCreator)),
- default_factory_(default_factory) {}
-
-FakeURLFetcherFactory::FakeURLFetcherFactory(
- URLFetcherFactory* default_factory,
- const FakeURLFetcherCreator& creator)
- : ScopedURLFetcherFactory(this),
- creator_(creator),
- default_factory_(default_factory) {
-}
-
-std::unique_ptr<FakeURLFetcher>
-FakeURLFetcherFactory::DefaultFakeURLFetcherCreator(
- const GURL& url,
- URLFetcherDelegate* delegate,
- const std::string& response_data,
- HttpStatusCode response_code,
- Error error) {
- return std::make_unique<FakeURLFetcher>(url, delegate, response_data,
- response_code, error);
-}
-
-FakeURLFetcherFactory::~FakeURLFetcherFactory() = default;
-
-std::unique_ptr<URLFetcher> FakeURLFetcherFactory::CreateURLFetcher(
- int id,
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d,
- NetworkTrafficAnnotationTag traffic_annotation) {
- FakeResponseMap::const_iterator it = fake_responses_.find(url);
- if (it == fake_responses_.end()) {
- if (default_factory_ == nullptr) {
- // If we don't have a baked response for that URL we return NULL.
- DLOG(ERROR) << "No baked response for URL: " << url.spec();
- return nullptr;
- } else {
- return default_factory_->CreateURLFetcher(id, url, request_type, d,
- traffic_annotation);
- }
- }
-
- std::unique_ptr<URLFetcher> fake_fetcher =
- creator_.Run(url, d, it->second.response_data, it->second.response_code,
- it->second.error);
- return fake_fetcher;
-}
-
-void FakeURLFetcherFactory::SetFakeResponse(const GURL& url,
- const std::string& response_data,
- HttpStatusCode response_code,
- Error error) {
- // Overwrite existing URL if it already exists.
- FakeURLResponse response;
- response.response_data = response_data;
- response.response_code = response_code;
- response.error = error;
- fake_responses_[url] = response;
-}
-
-void FakeURLFetcherFactory::ClearFakeResponses() {
- fake_responses_.clear();
-}
-
-} // namespace net
diff --git a/chromium/net/url_request/test_url_fetcher_factory.h b/chromium/net/url_request/test_url_fetcher_factory.h
deleted file mode 100644
index 412c1514d5d..00000000000
--- a/chromium/net/url_request/test_url_fetcher_factory.h
+++ /dev/null
@@ -1,429 +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.
-
-#ifndef NET_URL_REQUEST_TEST_URL_FETCHER_FACTORY_H_
-#define NET_URL_REQUEST_TEST_URL_FETCHER_FACTORY_H_
-
-#include <stdint.h>
-
-#include <list>
-#include <map>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/files/file_path.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/threading/thread_checker.h"
-#include "net/base/ip_endpoint.h"
-#include "net/base/net_errors.h"
-#include "net/base/proxy_server.h"
-#include "net/http/http_request_headers.h"
-#include "net/http/http_status_code.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/referrer_policy.h"
-#include "net/url_request/url_fetcher_factory.h"
-#include "url/gurl.h"
-
-namespace net {
-
-// Changes URLFetcher's Factory for the lifetime of the object.
-// Note that this scoper cannot be nested (to make it even harder to misuse).
-class ScopedURLFetcherFactory {
- public:
- explicit ScopedURLFetcherFactory(URLFetcherFactory* factory);
-
- ScopedURLFetcherFactory(const ScopedURLFetcherFactory&) = delete;
- ScopedURLFetcherFactory& operator=(const ScopedURLFetcherFactory&) = delete;
-
- virtual ~ScopedURLFetcherFactory();
-
- private:
- THREAD_CHECKER(thread_checker_);
-};
-
-// TestURLFetcher and TestURLFetcherFactory are used for testing consumers of
-// URLFetcher. TestURLFetcherFactory is a URLFetcherFactory that creates
-// TestURLFetchers. TestURLFetcher::Start is overriden to do nothing. It is
-// expected that you'll grab the delegate from the TestURLFetcher and invoke
-// the callback method when appropriate. In this way it's easy to mock a
-// URLFetcher.
-// Typical usage:
-// // TestURLFetcher requires a MessageLoop and an IO thread to release
-// // URLRequestContextGetter in URLFetcher::Core.
-// BrowserTaskEnvironment task_environment_;
-// // Create factory (it automatically sets itself as URLFetcher's factory).
-// TestURLFetcherFactory factory;
-// // Do something that triggers creation of a URLFetcher.
-// ...
-// TestURLFetcher* fetcher = factory.GetFetcherByID(expected_id);
-// DCHECK(fetcher);
-// // Notify delegate with whatever data you want.
-// fetcher->delegate()->OnURLFetchComplete(...);
-// // Make sure consumer of URLFetcher does the right thing.
-// ...
-//
-// Note: if you don't know when your request objects will be created you
-// might want to use the FakeURLFetcher and FakeURLFetcherFactory classes
-// below.
-
-class TestURLFetcherFactory;
-class TestURLFetcher : public URLFetcher {
- public:
- // Interface for tests to intercept production code classes using URLFetcher.
- // Allows even-driven mock server classes to analyze the correctness of
- // requests / uploads events and forge responses back at the right moment.
- class DelegateForTests {
- public:
- // Callback issued correspondingly to the call to the |Start()| method.
- virtual void OnRequestStart(int fetcher_id) = 0;
-
- // Callback issued correspondingly to the call to |AppendChunkToUpload|.
- // Uploaded chunks can be retrieved with the |upload_chunks()| getter.
- virtual void OnChunkUpload(int fetcher_id) = 0;
-
- // Callback issued correspondingly to the destructor.
- virtual void OnRequestEnd(int fetcher_id) = 0;
- };
-
- TestURLFetcher(int id,
- const GURL& url,
- URLFetcherDelegate* d);
-
- TestURLFetcher(const TestURLFetcher&) = delete;
- TestURLFetcher& operator=(const TestURLFetcher&) = delete;
-
- ~TestURLFetcher() override;
-
- // URLFetcher implementation
- void SetUploadData(const std::string& upload_content_type,
- const std::string& upload_content) override;
- void SetUploadFilePath(
- const std::string& upload_content_type,
- const base::FilePath& file_path,
- uint64_t range_offset,
- uint64_t range_length,
- scoped_refptr<base::TaskRunner> file_task_runner) override;
- void SetUploadStreamFactory(
- const std::string& upload_content_type,
- const CreateUploadStreamCallback& callback) override;
- void SetChunkedUpload(const std::string& upload_content_type) override;
- // Overriden to cache the chunks uploaded. Caller can read back the uploaded
- // chunks with the upload_chunks() accessor.
- void AppendChunkToUpload(const std::string& data,
- bool is_last_chunk) override;
- void SetLoadFlags(int load_flags) override;
- int GetLoadFlags() const override;
- void SetAllowCredentials(bool allow_credentials) override {}
- void SetReferrer(const std::string& referrer) override;
- void SetReferrerPolicy(ReferrerPolicy referrer_policy) override;
- void ClearExtraRequestHeaders() override;
- void AddExtraRequestHeader(const std::string& name,
- const std::string& value) override;
- void SetRequestContext(
- URLRequestContextGetter* request_context_getter) override;
- void SetInitiator(const absl::optional<url::Origin>& initiator) override;
- void SetURLRequestUserData(
- const void* key,
- const CreateDataCallback& create_data_callback) override;
- void SetStopOnRedirect(bool stop_on_redirect) override;
- void SetAutomaticallyRetryOn5xx(bool retry) override;
- void SetMaxRetriesOn5xx(int max_retries) override;
- int GetMaxRetriesOn5xx() const override;
- base::TimeDelta GetBackoffDelay() const override;
- void SetAutomaticallyRetryOnNetworkChanges(int max_retries) override;
- void SaveResponseToFileAtPath(
- const base::FilePath& file_path,
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) override;
- void SaveResponseToTemporaryFile(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) override;
- void SaveResponseWithWriter(
- std::unique_ptr<URLFetcherResponseWriter> response_writer) override;
- HttpResponseHeaders* GetResponseHeaders() const override;
- IPEndPoint GetSocketAddress() const override;
- const ProxyServer& ProxyServerUsed() const override;
- bool WasCached() const override;
- // Only valid when the response was set via SetResponseString().
- int64_t GetReceivedResponseContentLength() const override;
- // Only valid when the response was set via SetResponseString(), or
- // set_was_cached(true) was called.
- int64_t GetTotalReceivedBytes() const override;
- void Start() override;
-
- // URL we were created with. Because of how we're using URLFetcher GetURL()
- // always returns an empty URL. Chances are you'll want to use
- // GetOriginalURL() in your tests.
- const GURL& GetOriginalURL() const override;
- const GURL& GetURL() const override;
- Error GetError() const override;
- int GetResponseCode() const override;
- void ReceivedContentWasMalformed() override;
- // Override response access functions to return fake data.
- bool GetResponseAsString(std::string* out_response_string) const override;
- bool GetResponseAsFilePath(bool take_ownership,
- base::FilePath* out_response_path) const override;
-
- void GetExtraRequestHeaders(HttpRequestHeaders* headers) const;
-
- // Unique ID in our factory.
- int id() const { return id_; }
-
- // Returns the data uploaded on this URLFetcher.
- const std::string& upload_content_type() const {
- return upload_content_type_;
- }
- const std::string& upload_data() const { return upload_data_; }
- const base::FilePath& upload_file_path() const { return upload_file_path_; }
-
- // Returns the chunks of data uploaded on this URLFetcher.
- const std::list<std::string>& upload_chunks() const { return chunks_; }
-
- // Checks whether the last call to |AppendChunkToUpload(...)| was final.
- bool did_receive_last_chunk() const { return did_receive_last_chunk_; }
-
- // Returns the delegate installed on the URLFetcher.
- URLFetcherDelegate* delegate() const { return delegate_; }
-
- void set_url(const GURL& url) { fake_url_ = url; }
- void set_error(Error error) { fake_error_ = error; }
- void set_response_code(int response_code) {
- fake_response_code_ = response_code;
- }
- void set_was_cached(bool flag);
- void set_response_headers(scoped_refptr<HttpResponseHeaders> headers);
- void SetDelegateForTests(DelegateForTests* delegate_for_tests);
-
- // Set string data.
- void SetResponseString(const std::string& response);
-
- // Set File data.
- void SetResponseFilePath(const base::FilePath& path);
-
- private:
- enum ResponseDestinationType {
- STRING, // Default: In a std::string
- TEMP_FILE // Write to a temp file
- };
-
- const int id_;
- const GURL original_url_;
- raw_ptr<URLFetcherDelegate> delegate_;
- raw_ptr<DelegateForTests> delegate_for_tests_ = nullptr;
- std::string upload_content_type_;
- std::string upload_data_;
- base::FilePath upload_file_path_;
- std::list<std::string> chunks_;
- bool did_receive_last_chunk_ = false;
-
- // User can use set_* methods to provide values returned by getters.
- // Setting the real values is not possible, because the real class
- // has no setters. The data is a private member of a class defined
- // in a .cc file, so we can't get at it with friendship.
- int fake_load_flags_ = 0;
- GURL fake_url_;
- Error fake_error_;
- int fake_response_code_ = -1;
- ResponseDestinationType fake_response_destination_ = STRING;
- std::string fake_response_string_;
- base::FilePath fake_response_file_path_;
- bool write_response_file_ = false;
- ProxyServer fake_proxy_server_;
- bool fake_was_cached_ = false;
- int64_t fake_response_bytes_ = 0;
- scoped_refptr<HttpResponseHeaders> fake_response_headers_;
- HttpRequestHeaders fake_extra_request_headers_;
- int fake_max_retries_ = 0;
- std::unique_ptr<URLFetcherResponseWriter> response_writer_;
-};
-
-// The FakeURLFetcher and FakeURLFetcherFactory classes are similar to the
-// ones above but don't require you to know when exactly the URLFetcher objects
-// will be created.
-//
-// These classes let you set pre-baked HTTP responses for particular URLs.
-// E.g., if the user requests http://a.com/ then respond with an HTTP/500.
-//
-// We assume that the thread that is calling Start() on the URLFetcher object
-// has a message loop running.
-
-// FakeURLFetcher can be used to create a URLFetcher that will emit a fake
-// response when started. This class can be used in place of an actual
-// URLFetcher.
-//
-// Example usage:
-// FakeURLFetcher fake_fetcher("http://a.com", some_delegate,
-// "<html><body>hello world</body></html>",
-// HTTP_OK);
-//
-// // Will schedule a call to some_delegate->OnURLFetchComplete(&fake_fetcher).
-// fake_fetcher.Start();
-class FakeURLFetcher : public TestURLFetcher {
- public:
- // Normal URL fetcher constructor but also takes in a pre-baked response.
- FakeURLFetcher(const GURL& url,
- URLFetcherDelegate* d,
- const std::string& response_data,
- HttpStatusCode response_code,
- Error error);
-
- // Start the request. This will call the given delegate asynchronously
- // with the pre-baked response as parameter.
- void Start() override;
-
- const GURL& GetURL() const override;
-
- FakeURLFetcher(const FakeURLFetcher&) = delete;
- FakeURLFetcher& operator=(const FakeURLFetcher&) = delete;
-
- ~FakeURLFetcher() override;
-
- private:
- // This is the method which actually calls the delegate that is passed in the
- // constructor.
- void RunDelegate();
-
- int64_t response_bytes_;
- base::WeakPtrFactory<FakeURLFetcher> weak_factory_{this};
-};
-
-// FakeURLFetcherFactory is a factory for FakeURLFetcher objects. When
-// instantiated, it sets itself up as the default URLFetcherFactory. Fake
-// responses for given URLs can be set using SetFakeResponse.
-//
-// This class is not thread-safe. You should not call SetFakeResponse or
-// ClearFakeResponse at the same time you call CreateURLFetcher. However, it is
-// OK to start URLFetcher objects while setting or clearing fake responses
-// since already created URLFetcher objects will not be affected by any changes
-// made to the fake responses (once a URLFetcher object is created you cannot
-// change its fake response).
-//
-// Example usage:
-// FakeURLFetcherFactory factory;
-//
-// // You know that class SomeService will request http://a.com/success and you
-// // want to respond with a simple html page and an HTTP/200 code.
-// factory.SetFakeResponse("http://a.com/success",
-// "<html><body>hello world</body></html>",
-// HTTP_OK,
-// OK);
-// // You know that class SomeService will request url http://a.com/servererror
-// // and you want to test the service class by returning a server error.
-// factory.SetFakeResponse("http://a.com/servererror",
-// "",
-// HTTP_INTERNAL_SERVER_ERROR,
-// OK);
-// // You know that class SomeService will request url http://a.com/autherror
-// // and you want to test the service class by returning a specific error
-// // code, say, a HTTP/401 error.
-// factory.SetFakeResponse("http://a.com/autherror",
-// "some_response",
-// HTTP_UNAUTHORIZED,
-// OK);
-//
-// // You know that class SomeService will request url http://a.com/failure
-// // and you want to test the service class by returning a failure in the
-// // network layer.
-// factory.SetFakeResponse("http://a.com/failure",
-// "",
-// HTTP_INTERNAL_SERVER_ERROR,
-// ERR_FAILED);
-//
-// SomeService service;
-// service.Run(); // Will eventually request these three URLs.
-class FakeURLFetcherFactory : public URLFetcherFactory,
- public ScopedURLFetcherFactory {
- public:
- // Parameters to FakeURLFetcherCreator: url, delegate, response_data,
- // response_code
- // |url| URL for instantiated FakeURLFetcher
- // |delegate| Delegate for FakeURLFetcher
- // |response_data| response data for FakeURLFetcher
- // |response_code| response code for FakeURLFetcher
- // |error| URL fetch error for FakeURLFetcher
- // These arguments should by default be used in instantiating FakeURLFetcher
- // like so:
- // new FakeURLFetcher(url, delegate, response_data, response_code, error)
- typedef base::RepeatingCallback<std::unique_ptr<FakeURLFetcher>(
- const GURL&,
- URLFetcherDelegate*,
- const std::string&,
- HttpStatusCode,
- Error)>
- FakeURLFetcherCreator;
-
- // |default_factory|, which can be NULL, is a URLFetcherFactory that
- // will be used to construct a URLFetcher in case the URL being created
- // has no pre-baked response. If it is NULL, a URLFetcherImpl will be
- // created in this case.
- explicit FakeURLFetcherFactory(URLFetcherFactory* default_factory);
-
- // |default_factory|, which can be NULL, is a URLFetcherFactory that
- // will be used to construct a URLFetcher in case the URL being created
- // has no pre-baked response. If it is NULL, a URLFetcherImpl will be
- // created in this case.
- // |creator| is a callback that returns will be called to create a
- // FakeURLFetcher if a response is found to a given URL. It can be
- // set to MakeFakeURLFetcher.
- FakeURLFetcherFactory(URLFetcherFactory* default_factory,
- const FakeURLFetcherCreator& creator);
-
- FakeURLFetcherFactory(const FakeURLFetcherFactory&) = delete;
- FakeURLFetcherFactory& operator=(const FakeURLFetcherFactory&) = delete;
-
- ~FakeURLFetcherFactory() override;
-
- // If no fake response is set for the given URL this method will delegate the
- // call to |default_factory_| if it is not NULL, or return NULL if it is
- // NULL.
- // Otherwise, it will return a URLFetcher object which will respond with the
- // pre-baked response that the client has set by calling SetFakeResponse().
- std::unique_ptr<URLFetcher> CreateURLFetcher(
- int id,
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d,
- NetworkTrafficAnnotationTag traffic_annotation) override;
-
- // Sets the fake response for a given URL. The |response_data| may be empty.
- // The |response_code| may be any HttpStatusCode. For instance, HTTP_OK will
- // return an HTTP/200 and HTTP_INTERNAL_SERVER_ERROR will return an HTTP/500.
- // The |error| argument may be any Error value. Typically, requests that
- // return a valid HttpStatusCode have the OK error, while requests that
- // indicate a failure to connect to the server have the ERR_FAILED error.
- void SetFakeResponse(const GURL& url,
- const std::string& response_data,
- HttpStatusCode response_code,
- Error error);
-
- // Clear all the fake responses that were previously set via
- // SetFakeResponse().
- void ClearFakeResponses();
-
- private:
- struct FakeURLResponse {
- std::string response_data;
- HttpStatusCode response_code;
- Error error;
- };
- typedef std::map<GURL, FakeURLResponse> FakeResponseMap;
-
- const FakeURLFetcherCreator creator_;
- FakeResponseMap fake_responses_;
- const raw_ptr<URLFetcherFactory> default_factory_;
-
- static std::unique_ptr<FakeURLFetcher> DefaultFakeURLFetcherCreator(
- const GURL& url,
- URLFetcherDelegate* delegate,
- const std::string& response_data,
- HttpStatusCode response_code,
- Error error);
-};
-
-} // namespace net
-
-#endif // NET_URL_REQUEST_TEST_URL_FETCHER_FACTORY_H_
diff --git a/chromium/net/url_request/url_fetcher.cc b/chromium/net/url_request/url_fetcher.cc
deleted file mode 100644
index 7057dc89623..00000000000
--- a/chromium/net/url_request/url_fetcher.cc
+++ /dev/null
@@ -1,71 +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.
-
-#include "net/url_request/url_fetcher.h"
-
-#include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
-#include "net/url_request/url_fetcher_factory.h"
-#include "net/url_request/url_fetcher_impl.h"
-
-namespace net {
-
-URLFetcher::~URLFetcher() = default;
-
-// static
-void URLFetcher::CancelAll() {
- URLFetcherImpl::CancelAll();
-}
-
-// static
-void URLFetcher::SetIgnoreCertificateRequests(bool ignored) {
- URLFetcherImpl::SetIgnoreCertificateRequests(ignored);
-}
-
-// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
-// complete.
-#if !BUILDFLAG(IS_WIN) && \
- !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
-// static
-std::unique_ptr<URLFetcher> URLFetcher::Create(
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d) {
- return URLFetcher::Create(0, url, request_type, d);
-}
-
-// static
-std::unique_ptr<URLFetcher> URLFetcher::Create(
- int id,
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d) {
- return Create(id, url, request_type, d, MISSING_TRAFFIC_ANNOTATION);
-}
-#endif
-
-// static
-std::unique_ptr<URLFetcher> URLFetcher::Create(
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d,
- NetworkTrafficAnnotationTag traffic_annotation) {
- return URLFetcher::Create(0, url, request_type, d, traffic_annotation);
-}
-
-// static
-std::unique_ptr<URLFetcher> URLFetcher::Create(
- int id,
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d,
- NetworkTrafficAnnotationTag traffic_annotation) {
- URLFetcherFactory* factory = URLFetcherImpl::factory();
- return factory ? factory->CreateURLFetcher(id, url, request_type, d,
- traffic_annotation)
- : std::unique_ptr<URLFetcher>(new URLFetcherImpl(
- url, request_type, d, traffic_annotation));
-}
-
-} // namespace net
diff --git a/chromium/net/url_request/url_fetcher.h b/chromium/net/url_request/url_fetcher.h
deleted file mode 100644
index f9c7120cc8e..00000000000
--- a/chromium/net/url_request/url_fetcher.h
+++ /dev/null
@@ -1,401 +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.
-
-#ifndef NET_URL_REQUEST_URL_FETCHER_H_
-#define NET_URL_REQUEST_URL_FETCHER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback_forward.h"
-#include "base/memory/ref_counted.h"
-#include "base/supports_user_data.h"
-#include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
-#include "net/base/ip_endpoint.h"
-#include "net/base/net_errors.h"
-#include "net/base/net_export.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
-#include "net/url_request/referrer_policy.h"
-#include "net/url_request/url_request.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-
-class GURL;
-
-namespace base {
-class FilePath;
-class SequencedTaskRunner;
-class TaskRunner;
-class TimeDelta;
-}
-
-namespace url {
-class Origin;
-}
-
-namespace remoting {
-class GstaticJsonFetcher;
-}
-
-namespace net {
-class HttpResponseHeaders;
-class URLFetcherDelegate;
-class URLFetcherResponseWriter;
-class URLRequestContextGetter;
-
-// NOTE: This class should not be used by content embedders, as it requires an
-// in-process network stack. Content embedders should use
-// network::SimpleURLLoader instead, which works with both in-process and
-// out-of-process network stacks.
-//
-// To use this class, create an instance with the desired URL and a pointer to
-// the object to be notified when the URL has been loaded:
-// std::unique_ptr<URLFetcher> fetcher =
-// URLFetcher::Create(GURL("http://www.google.com"),
-// URLFetcher::GET,
-// this);
-//
-// You must also set a request context getter:
-//
-// fetcher->SetRequestContext(&my_request_context_getter);
-//
-// Then, optionally set properties on this object, like the request context or
-// extra headers:
-// fetcher->AddExtraRequestHeader("X-Foo: bar");
-//
-// Finally, start the request:
-// fetcher->Start();
-//
-// You may cancel the request by destroying the URLFetcher:
-// fetcher.reset();
-//
-// The object you supply as a delegate must inherit from URLFetcherDelegate.
-// When the fetch is completed, OnURLFetchComplete() will be called with a
-// pointer to the URLFetcher. From that point until the original URLFetcher
-// instance is destroyed, you may use accessor methods to see the result of the
-// fetch. You should copy these objects if you need them to live longer than
-// the URLFetcher instance. If the URLFetcher instance is destroyed before the
-// callback happens, the fetch will be canceled and no callback will occur.
-//
-// You may create the URLFetcher instance on any sequence; OnURLFetchComplete()
-// will be called back on the same sequence you use to create the instance.
-//
-//
-// NOTE: By default URLFetcher requests are NOT intercepted, except when
-// interception is explicitly enabled in tests.
-class NET_EXPORT URLFetcher {
- public:
- // Imposible http response code. Used to signal that no http response code
- // was received.
- enum ResponseCode {
- RESPONSE_CODE_INVALID = -1
- };
-
- enum RequestType {
- GET,
- POST,
- HEAD,
- DELETE_REQUEST, // DELETE is already taken on Windows.
- // <winnt.h> defines a DELETE macro.
- PUT,
- PATCH,
- };
-
- // Used by SetURLRequestUserData. The callback should make a fresh
- // base::SupportsUserData::Data object every time it's called.
- typedef base::RepeatingCallback<
- std::unique_ptr<base::SupportsUserData::Data>()>
- CreateDataCallback;
-
- // Used by SetUploadStreamFactory. The callback should assign a fresh upload
- // data stream every time it's called.
- typedef base::RepeatingCallback<std::unique_ptr<UploadDataStream>()>
- CreateUploadStreamCallback;
-
- virtual ~URLFetcher();
-
- // Cancels all existing URLFetchers. Will notify the URLFetcherDelegates.
- // Note that any new URLFetchers created while this is running will not be
- // cancelled. Typically, one would call this in the CleanUp() method of an IO
- // thread, so that no new URLRequests would be able to start on the IO thread
- // anyway. This doesn't prevent new URLFetchers from trying to post to the IO
- // thread though, even though the task won't ever run.
- static void CancelAll();
-
- // Normally, URLFetcher will abort loads that request SSL client certificate
- // authentication, but this method may be used to cause URLFetchers to ignore
- // requests for client certificates and continue anonymously. Because such
- // behaviour affects the URLRequestContext's shared network state and socket
- // pools, it should only be used for testing.
- static void SetIgnoreCertificateRequests(bool ignored);
-
- // Sets data only needed by POSTs. All callers making POST requests should
- // call one of the SetUpload* methods before the request is started.
- // |upload_content_type| is the MIME type of the content, while
- // |upload_content| is the data to be sent (the Content-Length header value
- // will be set to the length of this data).
- virtual void SetUploadData(const std::string& upload_content_type,
- const std::string& upload_content) = 0;
-
- // Sets data only needed by POSTs. All callers making POST requests should
- // call one of the SetUpload* methods before the request is started.
- // |upload_content_type| is the MIME type of the content, while
- // |file_path| is the path to the file containing the data to be sent (the
- // Content-Length header value will be set to the length of this file).
- // |range_offset| and |range_length| specify the range of the part
- // to be uploaded. To upload the whole file, (0, kuint64max) can be used.
- // |file_task_runner| will be used for all file operations.
- virtual void SetUploadFilePath(
- const std::string& upload_content_type,
- const base::FilePath& file_path,
- uint64_t range_offset,
- uint64_t range_length,
- scoped_refptr<base::TaskRunner> file_task_runner) = 0;
-
- // Sets data only needed by POSTs. All callers making POST requests should
- // call one of the SetUpload* methods before the request is started.
- // |upload_content_type| is the MIME type of the content, while |callback| is
- // the callback to create the upload data stream (the Content-Length header
- // value will be set to the length of this data). |callback| may be called
- // mutliple times if the request is retried.
- virtual void SetUploadStreamFactory(
- const std::string& upload_content_type,
- const CreateUploadStreamCallback& callback) = 0;
-
- // Indicates that the POST data is sent via chunked transfer encoding.
- // This may only be called before calling Start().
- // Use AppendChunkToUpload() to give the data chunks after calling Start().
- virtual void SetChunkedUpload(const std::string& upload_content_type) = 0;
-
- // Adds the given bytes to a request's POST data transmitted using chunked
- // transfer encoding.
- // This method should be called ONLY after calling Start().
- virtual void AppendChunkToUpload(const std::string& data,
- bool is_last_chunk) = 0;
-
- // Set one or more load flags as defined in net/base/load_flags.h. Must be
- // called before the request is started.
- virtual void SetLoadFlags(int load_flags) = 0;
-
- // Set whether credentials should be included on the request. Must be called
- // before the request is started.
- virtual void SetAllowCredentials(bool allow_credentials) = 0;
-
- // Returns the current load flags.
- virtual int GetLoadFlags() const = 0;
-
- // The referrer URL for the request. Must be called before the request is
- // started.
- virtual void SetReferrer(const std::string& referrer) = 0;
-
- // The referrer policy to apply when updating the referrer during redirects.
- // The referrer policy may only be changed before Start() is called.
- virtual void SetReferrerPolicy(ReferrerPolicy referrer_policy) = 0;
-
- // Clear all extra headers on the request (if any have been set before).
- // Must be called before the request is started.
- virtual void ClearExtraRequestHeaders() = 0;
-
- // Add an extra header to the request headers. Must be called before the
- // request is started.
- // This appends the header to the current extra request headers.
- virtual void AddExtraRequestHeader(const std::string& name,
- const std::string& value) = 0;
-
- // Set the URLRequestContext on the request. Must be called before the
- // request is started.
- virtual void SetRequestContext(
- URLRequestContextGetter* request_context_getter) = 0;
-
- // Set the origin that should be considered as "initiating" the fetch. This
- // URL will be considered the "first-party" when applying cookie blocking
- // policy to requests, and treated as the request's initiator.
- virtual void SetInitiator(const absl::optional<url::Origin>& initiator) = 0;
-
- // Set the key and data callback that is used when setting the user
- // data on any URLRequest objects this object creates.
- virtual void SetURLRequestUserData(
- const void* key,
- const CreateDataCallback& create_data_callback) = 0;
-
- // If |stop_on_redirect| is true, 3xx responses will cause the fetch to halt
- // immediately rather than continue through the redirect. OnURLFetchComplete
- // will be called, with the URLFetcher's URL set to the redirect destination,
- // its status set to CANCELED, and its response code set to the relevant 3xx
- // server response code.
- virtual void SetStopOnRedirect(bool stop_on_redirect) = 0;
-
- // If |retry| is false, 5xx responses will be propagated to the observer. If
- // it is true URLFetcher will automatically re-execute the request, after
- // backoff_delay() elapses, up to the maximum number of retries allowed by
- // SetMaxRetriesOn5xx. Defaults to true.
- virtual void SetAutomaticallyRetryOn5xx(bool retry) = 0;
-
- // |max_retries| is the maximum number of times URLFetcher will retry a
- // request that receives a 5XX response. Depends on
- // SetAutomaticallyRetryOn5xx. Defaults to 0.
- virtual void SetMaxRetriesOn5xx(int max_retries) = 0;
- virtual int GetMaxRetriesOn5xx() const = 0;
-
- // Returns the back-off delay before the request will be retried,
- // when a 5xx response was received.
- virtual base::TimeDelta GetBackoffDelay() const = 0;
-
- // Retries up to |max_retries| times when requests fail with
- // ERR_NETWORK_CHANGED. If ERR_NETWORK_CHANGED is received after having
- // retried |max_retries| times then it is propagated to the observer.
- virtual void SetAutomaticallyRetryOnNetworkChanges(int max_retries) = 0;
-
- // By default, the response is saved in a string. Call this method to save the
- // response to a file instead. Must be called before Start().
- // |file_task_runner| will be used for all file operations.
- // To save to a temporary file, use SaveResponseToTemporaryFile().
- // The created file is removed when the URLFetcher is deleted unless you
- // take ownership by calling GetResponseAsFilePath().
- virtual void SaveResponseToFileAtPath(
- const base::FilePath& file_path,
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) = 0;
-
- // By default, the response is saved in a string. Call this method to save the
- // response to a temporary file instead. Must be called before Start().
- // |file_task_runner| will be used for all file operations.
- // The created file is removed when the URLFetcher is deleted unless you
- // take ownership by calling GetResponseAsFilePath().
- virtual void SaveResponseToTemporaryFile(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) = 0;
-
- // By default, the response is saved in a string. Call this method to use the
- // specified writer to save the response. Must be called before Start().
- virtual void SaveResponseWithWriter(
- std::unique_ptr<URLFetcherResponseWriter> response_writer) = 0;
-
- // Retrieve the response headers from the request. Must only be called after
- // the OnURLFetchComplete callback has run.
- virtual HttpResponseHeaders* GetResponseHeaders() const = 0;
-
- // Retrieve the remote socket address from the request. Must only
- // be called after the OnURLFetchComplete callback has run and if
- // the request has not failed.
- virtual IPEndPoint GetSocketAddress() const = 0;
-
- // Returns the proxy server that proxied the request. Must only be called
- // after the OnURLFetchComplete callback has run and the request has not
- // failed.
- virtual const ProxyServer& ProxyServerUsed() const = 0;
-
- // Returns true if the response body was served from the cache. This includes
- // responses for which revalidation was required.
- virtual bool WasCached() const = 0;
-
- // The number of bytes in the raw response body (before response filters are
- // applied, to decompress it, for instance).
- virtual int64_t GetReceivedResponseContentLength() const = 0;
-
- // The number of bytes received over the network during the processing of this
- // request. This includes redirect headers, but not redirect bodies. It also
- // excludes SSL and proxy handshakes.
- virtual int64_t GetTotalReceivedBytes() const = 0;
-
- // Start the request. After this is called, you may not change any other
- // settings.
- virtual void Start() = 0;
-
- // Return the URL that we were asked to fetch.
- virtual const GURL& GetOriginalURL() const = 0;
-
- // Return the URL that this fetcher is processing.
- virtual const GURL& GetURL() const = 0;
-
- // The error from the URL fetch.
- virtual Error GetError() const = 0;
-
- // The http response code received. Will return RESPONSE_CODE_INVALID
- // if an error prevented any response from being received.
- virtual int GetResponseCode() const = 0;
-
- // Reports that the received content was malformed.
- virtual void ReceivedContentWasMalformed() = 0;
-
- // Get the response as a string. Return false if the fetcher was not
- // set to store the response as a string.
- virtual bool GetResponseAsString(std::string* out_response_string) const = 0;
-
- // Get the path to the file containing the response body. Returns false
- // if the response body was not saved to a file. If take_ownership is
- // true, caller takes responsibility for the file, and it will not
- // be removed once the URLFetcher is destroyed. User should not take
- // ownership more than once, or call this method after taking ownership.
- virtual bool GetResponseAsFilePath(
- bool take_ownership,
- base::FilePath* out_response_path) const = 0;
-
- private:
- // This class is deprecated, and no new code should be using it. Construction
- // methods are private and pre-existing consumers are friended.
- friend class remoting::GstaticJsonFetcher;
-
- // The unannotated Create() methods are not available on desktop Linux +
- // Windows. They are available on other platforms, since we only audit network
- // annotations on Linux & Windows.
-// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
-// complete.
-#if (!BUILDFLAG(IS_WIN) && \
- !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))) || \
- BUILDFLAG(IS_CHROMEOS)
- // |url| is the URL to send the request to. It must be valid.
- // |request_type| is the type of request to make.
- // |d| the object that will receive the callback on fetch completion.
- // This function should not be used in Chromium, please use the version with
- // NetworkTrafficAnnotationTag below instead.
- static std::unique_ptr<URLFetcher> Create(
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d);
-
- // Like above, but if there's a URLFetcherFactory registered with the
- // implementation it will be used. |id| may be used during testing to identify
- // who is creating the URLFetcher.
- // This function should not be used in Chromium, please use the version with
- // NetworkTrafficAnnotationTag below instead.
- static std::unique_ptr<URLFetcher> Create(
- int id,
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d);
-#endif
-
- // |url| is the URL to send the request to. It must be valid.
- // |request_type| is the type of request to make.
- // |d| the object that will receive the callback on fetch completion.
- // |traffic_annotation| metadata about the network traffic send via this
- // URLFetcher, see net::DefineNetworkTrafficAnnotation. Note that:
- // - net provides the API for tagging requests with an opaque identifier.
- // - chrome/browser/privacy/traffic_annotation.proto contains the Chrome
- // specific .proto describing the verbose annotation format that Chrome's
- // callsites are expected to follow.
- // - tools/traffic_annotation/ contains sample and template for annotation and
- // tools will be added for verification following crbug.com/690323.
- static std::unique_ptr<URLFetcher> Create(
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d,
- NetworkTrafficAnnotationTag traffic_annotation);
-
- // Like above, but if there's a URLFetcherFactory registered with the
- // implementation it will be used. |id| may be used during testing to identify
- // who is creating the URLFetcher.
- static std::unique_ptr<URLFetcher> Create(
- int id,
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d,
- NetworkTrafficAnnotationTag traffic_annotation);
-};
-
-} // namespace net
-
-#endif // NET_URL_REQUEST_URL_FETCHER_H_
diff --git a/chromium/net/url_request/url_fetcher_core.cc b/chromium/net/url_request/url_fetcher_core.cc
deleted file mode 100644
index 05fd10cbce3..00000000000
--- a/chromium/net/url_request/url_fetcher_core.cc
+++ /dev/null
@@ -1,932 +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.
-
-#include "net/url_request/url_fetcher_core.h"
-
-#include <stdint.h>
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/check_op.h"
-#include "base/containers/contains.h"
-#include "base/notreached.h"
-#include "base/stl_util.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "net/base/elements_upload_data_stream.h"
-#include "net/base/io_buffer.h"
-#include "net/base/load_flags.h"
-#include "net/base/net_errors.h"
-#include "net/base/request_priority.h"
-#include "net/base/upload_bytes_element_reader.h"
-#include "net/base/upload_data_stream.h"
-#include "net/base/upload_file_element_reader.h"
-#include "net/cert/x509_certificate.h"
-#include "net/http/http_response_headers.h"
-#include "net/ssl/ssl_private_key.h"
-#include "net/url_request/redirect_info.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "net/url_request/url_fetcher_response_writer.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "net/url_request/url_request_throttler_manager.h"
-#include "url/origin.h"
-
-namespace {
-
-const int kBufferSize = 4096;
-const int kUploadProgressTimerInterval = 100;
-bool g_ignore_certificate_requests = false;
-
-} // namespace
-
-namespace net {
-
-// URLFetcherCore::Registry ---------------------------------------------------
-
-URLFetcherCore::Registry::Registry() = default;
-URLFetcherCore::Registry::~Registry() = default;
-
-void URLFetcherCore::Registry::AddURLFetcherCore(URLFetcherCore* core) {
- DCHECK(!base::Contains(fetchers_, core));
- fetchers_.insert(core);
-}
-
-void URLFetcherCore::Registry::RemoveURLFetcherCore(URLFetcherCore* core) {
- DCHECK(base::Contains(fetchers_, core));
- fetchers_.erase(core);
-}
-
-void URLFetcherCore::Registry::CancelAll() {
- while (!fetchers_.empty())
- (*fetchers_.begin())->CancelURLRequest(ERR_ABORTED);
-}
-
-// URLFetcherCore -------------------------------------------------------------
-
-// static
-base::LazyInstance<URLFetcherCore::Registry>::DestructorAtExit
- URLFetcherCore::g_registry = LAZY_INSTANCE_INITIALIZER;
-
-URLFetcherCore::URLFetcherCore(
- URLFetcher* fetcher,
- const GURL& original_url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d,
- net::NetworkTrafficAnnotationTag traffic_annotation)
- : fetcher_(fetcher),
- original_url_(original_url),
- request_type_(request_type),
- delegate_(d),
- delegate_task_runner_(base::SequencedTaskRunnerHandle::Get()),
- allow_credentials_(absl::nullopt),
- traffic_annotation_(traffic_annotation) {
- CHECK(original_url_.is_valid());
-}
-
-void URLFetcherCore::Start() {
- DCHECK(delegate_task_runner_);
- DCHECK(request_context_getter_.get()) << "We need an URLRequestContext!";
- if (network_task_runner_.get()) {
- DCHECK_EQ(network_task_runner_,
- request_context_getter_->GetNetworkTaskRunner());
- } else {
- network_task_runner_ = request_context_getter_->GetNetworkTaskRunner();
- }
- DCHECK(network_task_runner_.get()) << "We need an IO task runner";
-
- network_task_runner_->PostTask(
- FROM_HERE, base::BindOnce(&URLFetcherCore::StartOnIOThread, this));
-}
-
-void URLFetcherCore::Stop() {
- if (delegate_task_runner_) // May be NULL in tests.
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
-
- delegate_ = nullptr;
- fetcher_ = nullptr;
- if (!network_task_runner_.get())
- return;
- if (network_task_runner_->RunsTasksInCurrentSequence()) {
- CancelURLRequest(ERR_ABORTED);
- } else {
- network_task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(&URLFetcherCore::CancelURLRequest, this, ERR_ABORTED));
- }
-}
-
-void URLFetcherCore::SetUploadData(const std::string& upload_content_type,
- const std::string& upload_content) {
- AssertHasNoUploadData();
- DCHECK(!is_chunked_upload_);
- DCHECK(upload_content_type_.empty());
-
- // Empty |upload_content_type| is allowed iff the |upload_content| is empty.
- DCHECK(upload_content.empty() || !upload_content_type.empty());
-
- upload_content_type_ = upload_content_type;
- upload_content_ = upload_content;
- upload_content_set_ = true;
-}
-
-void URLFetcherCore::SetUploadFilePath(
- const std::string& upload_content_type,
- const base::FilePath& file_path,
- uint64_t range_offset,
- uint64_t range_length,
- scoped_refptr<base::TaskRunner> file_task_runner) {
- AssertHasNoUploadData();
- DCHECK(!is_chunked_upload_);
- DCHECK_EQ(upload_range_offset_, 0ULL);
- DCHECK_EQ(upload_range_length_, 0ULL);
- DCHECK(upload_content_type_.empty());
- DCHECK(!upload_content_type.empty());
-
- upload_content_type_ = upload_content_type;
- upload_file_path_ = file_path;
- upload_range_offset_ = range_offset;
- upload_range_length_ = range_length;
- upload_file_task_runner_ = file_task_runner;
- upload_content_set_ = true;
-}
-
-void URLFetcherCore::SetUploadStreamFactory(
- const std::string& upload_content_type,
- const URLFetcher::CreateUploadStreamCallback& factory) {
- AssertHasNoUploadData();
- DCHECK(!is_chunked_upload_);
- DCHECK(upload_content_type_.empty());
-
- upload_content_type_ = upload_content_type;
- upload_stream_factory_ = factory;
- upload_content_set_ = true;
-}
-
-void URLFetcherCore::SetChunkedUpload(const std::string& content_type) {
- if (!is_chunked_upload_) {
- AssertHasNoUploadData();
- DCHECK(upload_content_type_.empty());
- }
-
- // Empty |content_type| is not allowed here, because it is impossible
- // to ensure non-empty upload content as it is not yet supplied.
- DCHECK(!content_type.empty());
-
- upload_content_type_ = content_type;
- base::STLClearObject(&upload_content_);
- is_chunked_upload_ = true;
-}
-
-void URLFetcherCore::AppendChunkToUpload(const std::string& content,
- bool is_last_chunk) {
- DCHECK(delegate_task_runner_);
- DCHECK(network_task_runner_.get());
- DCHECK(is_chunked_upload_);
- network_task_runner_->PostTask(
- FROM_HERE, base::BindOnce(&URLFetcherCore::CompleteAddingUploadDataChunk,
- this, content, is_last_chunk));
-}
-
-void URLFetcherCore::SetLoadFlags(int load_flags) {
- load_flags_ = load_flags;
-}
-
-void URLFetcherCore::SetAllowCredentials(bool allow_credentials) {
- allow_credentials_ = absl::make_optional<bool>(allow_credentials);
-}
-
-int URLFetcherCore::GetLoadFlags() const {
- return load_flags_;
-}
-
-void URLFetcherCore::SetReferrer(const std::string& referrer) {
- referrer_ = referrer;
-}
-
-void URLFetcherCore::SetReferrerPolicy(ReferrerPolicy referrer_policy) {
- referrer_policy_ = referrer_policy;
-}
-
-void URLFetcherCore::ClearExtraRequestHeaders() {
- extra_request_headers_.Clear();
-}
-
-void URLFetcherCore::AddExtraRequestHeader(const std::string& name,
- const std::string& value) {
- extra_request_headers_.SetHeader(name, value);
-}
-
-void URLFetcherCore::SetRequestContext(
- URLRequestContextGetter* request_context_getter) {
- DCHECK(!request_context_getter_.get());
- DCHECK(request_context_getter);
- request_context_getter_ = request_context_getter;
-}
-
-void URLFetcherCore::SetInitiator(
- const absl::optional<url::Origin>& initiator) {
- DCHECK(!initiator_.has_value());
- initiator_ = initiator;
-}
-
-void URLFetcherCore::SetURLRequestUserData(
- const void* key,
- const URLFetcher::CreateDataCallback& create_data_callback) {
- DCHECK(key);
- DCHECK(!create_data_callback.is_null());
- url_request_data_key_ = key;
- url_request_create_data_callback_ = create_data_callback;
-}
-
-void URLFetcherCore::SetStopOnRedirect(bool stop_on_redirect) {
- stop_on_redirect_ = stop_on_redirect;
-}
-
-void URLFetcherCore::SetAutomaticallyRetryOn5xx(bool retry) {
- automatically_retry_on_5xx_ = retry;
-}
-
-void URLFetcherCore::SetMaxRetriesOn5xx(int max_retries) {
- max_retries_on_5xx_ = max_retries;
-}
-
-int URLFetcherCore::GetMaxRetriesOn5xx() const {
- return max_retries_on_5xx_;
-}
-
-base::TimeDelta URLFetcherCore::GetBackoffDelay() const {
- return backoff_delay_;
-}
-
-void URLFetcherCore::SetAutomaticallyRetryOnNetworkChanges(int max_retries) {
- max_retries_on_network_changes_ = max_retries;
-}
-
-void URLFetcherCore::SaveResponseToFileAtPath(
- const base::FilePath& file_path,
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
- SaveResponseWithWriter(std::unique_ptr<URLFetcherResponseWriter>(
- new URLFetcherFileWriter(file_task_runner, file_path)));
-}
-
-void URLFetcherCore::SaveResponseToTemporaryFile(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
- SaveResponseWithWriter(std::unique_ptr<URLFetcherResponseWriter>(
- new URLFetcherFileWriter(file_task_runner, base::FilePath())));
-}
-
-void URLFetcherCore::SaveResponseWithWriter(
- std::unique_ptr<URLFetcherResponseWriter> response_writer) {
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
- response_writer_ = std::move(response_writer);
-}
-
-HttpResponseHeaders* URLFetcherCore::GetResponseHeaders() const {
- return response_headers_.get();
-}
-
-// TODO(panayiotis): remote_endpoint_ is written in the IO thread,
-// if this is accessed in the UI thread, this could result in a race.
-// Same for response_headers_ above.
-IPEndPoint URLFetcherCore::GetSocketAddress() const {
- return remote_endpoint_;
-}
-
-const ProxyServer& URLFetcherCore::ProxyServerUsed() const {
- return proxy_server_;
-}
-
-bool URLFetcherCore::WasCached() const {
- return was_cached_;
-}
-
-int64_t URLFetcherCore::GetReceivedResponseContentLength() const {
- return received_response_content_length_;
-}
-
-int64_t URLFetcherCore::GetTotalReceivedBytes() const {
- return total_received_bytes_;
-}
-
-const GURL& URLFetcherCore::GetOriginalURL() const {
- return original_url_;
-}
-
-const GURL& URLFetcherCore::GetURL() const {
- return url_;
-}
-
-Error URLFetcherCore::GetError() const {
- return error_;
-}
-
-int URLFetcherCore::GetResponseCode() const {
- return response_code_;
-}
-
-void URLFetcherCore::ReceivedContentWasMalformed() {
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
- if (network_task_runner_.get()) {
- network_task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(&URLFetcherCore::NotifyMalformedContent, this));
- }
-}
-
-bool URLFetcherCore::GetResponseAsString(
- std::string* out_response_string) const {
- URLFetcherStringWriter* string_writer =
- response_writer_ ? response_writer_->AsStringWriter() : nullptr;
- if (!string_writer)
- return false;
-
- *out_response_string = string_writer->data();
- return true;
-}
-
-bool URLFetcherCore::GetResponseAsFilePath(bool take_ownership,
- base::FilePath* out_response_path) {
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
-
- URLFetcherFileWriter* file_writer =
- response_writer_ ? response_writer_->AsFileWriter() : nullptr;
- if (!file_writer)
- return false;
-
- *out_response_path = file_writer->file_path();
-
- if (take_ownership) {
- // Intentionally calling a file_writer_ method directly without posting
- // the task to network_task_runner_.
- //
- // This is for correctly handling the case when file_writer_->DisownFile()
- // is soon followed by URLFetcherCore::Stop(). We have to make sure that
- // DisownFile takes effect before Stop deletes file_writer_.
- //
- // This direct call should be thread-safe, since DisownFile itself does no
- // file operation. It just flips the state to be referred in destruction.
- file_writer->DisownFile();
- }
- return true;
-}
-
-void URLFetcherCore::OnReceivedRedirect(URLRequest* request,
- const RedirectInfo& redirect_info,
- bool* defer_redirect) {
- DCHECK_EQ(request, request_.get());
- DCHECK(network_task_runner_->BelongsToCurrentThread());
- if (stop_on_redirect_) {
- stopped_on_redirect_ = true;
- url_ = redirect_info.new_url;
- response_code_ = request_->GetResponseCode();
- response_headers_ = request_->response_headers();
- proxy_server_ = request_->proxy_server();
- was_cached_ = request_->was_cached();
- total_received_bytes_ += request_->GetTotalReceivedBytes();
- int result = request->Cancel();
- OnReadCompleted(request, result);
- }
-}
-
-void URLFetcherCore::OnResponseStarted(URLRequest* request, int net_error) {
- DCHECK_EQ(request, request_.get());
- DCHECK(network_task_runner_->BelongsToCurrentThread());
- DCHECK_NE(ERR_IO_PENDING, net_error);
-
- if (net_error == OK) {
- response_code_ = request_->GetResponseCode();
- response_headers_ = request_->response_headers();
- remote_endpoint_ = request_->GetResponseRemoteEndpoint();
- proxy_server_ = request_->proxy_server();
- was_cached_ = request_->was_cached();
- total_response_bytes_ = request_->GetExpectedContentSize();
- }
-
- DCHECK(!buffer_);
- if (request_type_ != URLFetcher::HEAD)
- buffer_ = base::MakeRefCounted<IOBuffer>(kBufferSize);
- ReadResponse();
-}
-
-void URLFetcherCore::OnCertificateRequested(
- URLRequest* request,
- SSLCertRequestInfo* cert_request_info) {
- DCHECK_EQ(request, request_.get());
- DCHECK(network_task_runner_->BelongsToCurrentThread());
-
- if (g_ignore_certificate_requests) {
- request->ContinueWithCertificate(nullptr, nullptr);
- } else {
- request->Cancel();
- }
-}
-
-void URLFetcherCore::OnReadCompleted(URLRequest* request,
- int bytes_read) {
- DCHECK_EQ(request, request_.get());
- DCHECK(network_task_runner_->BelongsToCurrentThread());
-
- if (!stopped_on_redirect_)
- url_ = request->url();
- URLRequestThrottlerManager* throttler_manager =
- request->context()->throttler_manager();
- if (throttler_manager)
- url_throttler_entry_ = throttler_manager->RegisterRequestUrl(url_);
-
- while (bytes_read > 0) {
- current_response_bytes_ += bytes_read;
- InformDelegateDownloadProgress();
-
- const int result = WriteBuffer(
- base::MakeRefCounted<DrainableIOBuffer>(buffer_, bytes_read));
- if (result < 0) {
- // Write failed or waiting for write completion.
- return;
- }
- bytes_read = request_->Read(buffer_.get(), kBufferSize);
- }
-
- // See comments re: HEAD requests in ReadResponse().
- if (bytes_read != ERR_IO_PENDING || request_type_ == URLFetcher::HEAD) {
- error_ = static_cast<Error>(bytes_read);
- received_response_content_length_ =
- request_->received_response_content_length();
- total_received_bytes_ += request_->GetTotalReceivedBytes();
- ReleaseRequest();
-
- // No more data to write.
- const int result = response_writer_->Finish(
- bytes_read > 0 ? OK : bytes_read,
- base::BindOnce(&URLFetcherCore::DidFinishWriting, this));
- if (result != ERR_IO_PENDING)
- DidFinishWriting(result);
- }
-}
-
-void URLFetcherCore::OnContextShuttingDown() {
- DCHECK(request_);
- CancelRequestAndInformDelegate(ERR_CONTEXT_SHUT_DOWN);
-}
-
-void URLFetcherCore::CancelAll() {
- g_registry.Get().CancelAll();
-}
-
-int URLFetcherCore::GetNumFetcherCores() {
- return g_registry.Get().size();
-}
-
-void URLFetcherCore::SetIgnoreCertificateRequests(bool ignored) {
- g_ignore_certificate_requests = ignored;
-}
-
-URLFetcherCore::~URLFetcherCore() {
- // |request_| should be NULL. If not, it's unsafe to delete it here since we
- // may not be on the IO thread.
- DCHECK(!request_.get());
-}
-
-void URLFetcherCore::StartOnIOThread() {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
-
- // Create ChunkedUploadDataStream, if needed, so the consumer can start
- // appending data. Have to do it here because StartURLRequest() may be called
- // asynchonously.
- if (is_chunked_upload_) {
- chunked_stream_ = std::make_unique<ChunkedUploadDataStream>(0);
- chunked_stream_writer_ = chunked_stream_->CreateWriter();
- }
-
- if (!response_writer_)
- response_writer_ = std::make_unique<URLFetcherStringWriter>();
-
- const int result = response_writer_->Initialize(
- base::BindOnce(&URLFetcherCore::DidInitializeWriter, this));
- if (result != ERR_IO_PENDING)
- DidInitializeWriter(result);
-}
-
-void URLFetcherCore::StartURLRequest() {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
-
- if (was_cancelled_) {
- // Since StartURLRequest() is posted as a *delayed* task, it may
- // run after the URLFetcher was already stopped.
- return;
- }
-
- DCHECK(request_context_getter_);
- if (!request_context_getter_->GetURLRequestContext()) {
- CancelRequestAndInformDelegate(ERR_CONTEXT_SHUT_DOWN);
- return;
- }
-
- DCHECK(!request_.get());
-
- g_registry.Get().AddURLFetcherCore(this);
- current_response_bytes_ = 0;
- request_context_getter_->AddObserver(this);
- request_ = request_context_getter_->GetURLRequestContext()->CreateRequest(
- original_url_, DEFAULT_PRIORITY, this, traffic_annotation_);
- int flags = request_->load_flags() | load_flags_;
-
- // TODO(mmenke): This should really be with the other code to set the upload
- // body, below.
- if (chunked_stream_)
- request_->set_upload(std::move(chunked_stream_));
-
- request_->SetLoadFlags(flags);
- if (allow_credentials_) {
- request_->set_allow_credentials(allow_credentials_.value());
- }
- request_->SetReferrer(referrer_);
- request_->set_referrer_policy(referrer_policy_);
- request_->set_site_for_cookies(SiteForCookies::FromUrl(
- initiator_.has_value() && !initiator_.value().opaque()
- ? initiator_.value().GetURL()
- : original_url_));
- request_->set_initiator(initiator_);
- if (url_request_data_key_ && !url_request_create_data_callback_.is_null()) {
- request_->SetUserData(url_request_data_key_,
- url_request_create_data_callback_.Run());
- }
-
- switch (request_type_) {
- case URLFetcher::GET:
- break;
-
- case URLFetcher::POST:
- case URLFetcher::PUT:
- case URLFetcher::PATCH: {
- // Upload content must be set.
- DCHECK(is_chunked_upload_ || upload_content_set_);
-
- request_->set_method(
- request_type_ == URLFetcher::POST ? "POST" :
- request_type_ == URLFetcher::PUT ? "PUT" : "PATCH");
- if (!upload_content_type_.empty()) {
- extra_request_headers_.SetHeader(HttpRequestHeaders::kContentType,
- upload_content_type_);
- }
- if (!upload_content_.empty()) {
- std::unique_ptr<UploadElementReader> reader(
- new UploadBytesElementReader(upload_content_.data(),
- upload_content_.size()));
- request_->set_upload(
- ElementsUploadDataStream::CreateWithReader(std::move(reader), 0));
- } else if (!upload_file_path_.empty()) {
- std::unique_ptr<UploadElementReader> reader(new UploadFileElementReader(
- upload_file_task_runner_.get(), upload_file_path_,
- upload_range_offset_, upload_range_length_, base::Time()));
- request_->set_upload(
- ElementsUploadDataStream::CreateWithReader(std::move(reader), 0));
- } else if (!upload_stream_factory_.is_null()) {
- std::unique_ptr<UploadDataStream> stream = upload_stream_factory_.Run();
- DCHECK(stream);
- request_->set_upload(std::move(stream));
- }
-
- current_upload_bytes_ = -1;
- // TODO(kinaba): http://crbug.com/118103. Implement upload callback in the
- // layer and avoid using timer here.
- upload_progress_checker_timer_ = std::make_unique<base::RepeatingTimer>();
- upload_progress_checker_timer_->Start(
- FROM_HERE, base::Milliseconds(kUploadProgressTimerInterval), this,
- &URLFetcherCore::InformDelegateUploadProgress);
- break;
- }
-
- case URLFetcher::HEAD:
- request_->set_method("HEAD");
- break;
-
- case URLFetcher::DELETE_REQUEST:
- request_->set_method("DELETE");
- break;
-
- default:
- NOTREACHED();
- }
-
- if (!extra_request_headers_.IsEmpty())
- request_->SetExtraRequestHeaders(extra_request_headers_);
-
- request_->Start();
-}
-
-void URLFetcherCore::DidInitializeWriter(int result) {
- if (result != OK) {
- CancelRequestAndInformDelegate(result);
- return;
- }
- StartURLRequestWhenAppropriate();
-}
-
-void URLFetcherCore::StartURLRequestWhenAppropriate() {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
-
- if (was_cancelled_)
- return;
-
- DCHECK(request_context_getter_.get());
-
- // Check if the request should be delayed, and if so, post a task to start it
- // after the delay has expired. Otherwise, start it now.
-
- URLRequestContext* context = request_context_getter_->GetURLRequestContext();
- // If the context has been shut down, or there's no ThrottlerManager, just
- // start the request. In the former case, StartURLRequest() will just inform
- // the URLFetcher::Delegate the request has been canceled.
- if (context && context->throttler_manager()) {
- if (!original_url_throttler_entry_.get()) {
- original_url_throttler_entry_ =
- context->throttler_manager()->RegisterRequestUrl(original_url_);
- }
-
- if (original_url_throttler_entry_.get()) {
- int64_t delay =
- original_url_throttler_entry_->ReserveSendingTimeForNextRequest(
- GetBackoffReleaseTime());
- if (delay != 0) {
- network_task_runner_->PostDelayedTask(
- FROM_HERE, base::BindOnce(&URLFetcherCore::StartURLRequest, this),
- base::Milliseconds(delay));
- return;
- }
- }
- }
-
- StartURLRequest();
-}
-
-void URLFetcherCore::CancelURLRequest(int error) {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
-
- if (request_.get()) {
- request_->CancelWithError(error);
- ReleaseRequest();
- }
- error_ = static_cast<Error>(error);
-
- // Release the reference to the request context. There could be multiple
- // references to URLFetcher::Core at this point so it may take a while to
- // delete the object, but we cannot delay the destruction of the request
- // context.
- request_context_getter_ = nullptr;
- initiator_.reset();
- url_request_data_key_ = nullptr;
- url_request_create_data_callback_.Reset();
- was_cancelled_ = true;
-}
-
-void URLFetcherCore::OnCompletedURLRequest(
- base::TimeDelta backoff_delay) {
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
-
- // Save the status and backoff_delay so that delegates can read it.
- if (delegate_) {
- backoff_delay_ = backoff_delay;
- InformDelegateFetchIsComplete();
- }
-}
-
-void URLFetcherCore::InformDelegateFetchIsComplete() {
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
- if (delegate_)
- delegate_->OnURLFetchComplete(fetcher_);
-}
-
-void URLFetcherCore::NotifyMalformedContent() {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
- if (url_throttler_entry_.get()) {
- int status_code = response_code_;
- if (status_code == URLFetcher::RESPONSE_CODE_INVALID) {
- // The status code will generally be known by the time clients
- // call the |ReceivedContentWasMalformed()| function (which ends up
- // calling the current function) but if it's not, we need to assume
- // the response was successful so that the total failure count
- // used to calculate exponential back-off goes up.
- status_code = 200;
- }
- url_throttler_entry_->ReceivedContentWasMalformed(status_code);
- }
-}
-
-void URLFetcherCore::DidFinishWriting(int result) {
- if (result != OK) {
- CancelRequestAndInformDelegate(result);
- return;
- }
- // If the file was successfully closed, then the URL request is complete.
- RetryOrCompleteUrlFetch();
-}
-
-void URLFetcherCore::RetryOrCompleteUrlFetch() {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
- base::TimeDelta backoff_delay;
-
- // Checks the response from server.
- if (response_code_ >= 500 || error_ == ERR_TEMPORARILY_THROTTLED) {
- // When encountering a server error, we will send the request again
- // after backoff time.
- ++num_retries_on_5xx_;
-
- // Note that backoff_delay may be 0 because (a) the
- // URLRequestThrottlerManager and related code does not
- // necessarily back off on the first error, (b) it only backs off
- // on some of the 5xx status codes, (c) not all URLRequestContexts
- // have a throttler manager.
- base::TimeTicks backoff_release_time = GetBackoffReleaseTime();
- backoff_delay = backoff_release_time - base::TimeTicks::Now();
- if (backoff_delay.is_negative())
- backoff_delay = base::TimeDelta();
-
- if (automatically_retry_on_5xx_ &&
- num_retries_on_5xx_ <= max_retries_on_5xx_) {
- StartOnIOThread();
- return;
- }
- } else {
- backoff_delay = base::TimeDelta();
- }
-
- // Retry if the request failed due to network changes.
- if (error_ == ERR_NETWORK_CHANGED &&
- num_retries_on_network_changes_ < max_retries_on_network_changes_) {
- ++num_retries_on_network_changes_;
-
- // Retry soon, after flushing all the current tasks which may include
- // further network change observers.
- network_task_runner_->PostTask(
- FROM_HERE, base::BindOnce(&URLFetcherCore::StartOnIOThread, this));
- return;
- }
-
- request_context_getter_ = nullptr;
- initiator_.reset();
- url_request_data_key_ = nullptr;
- url_request_create_data_callback_.Reset();
- bool posted = delegate_task_runner_->PostTask(
- FROM_HERE, base::BindOnce(&URLFetcherCore::OnCompletedURLRequest, this,
- backoff_delay));
-
- // If the delegate message loop does not exist any more, then the delegate
- // should be gone too.
- DCHECK(posted || !delegate_);
-}
-
-void URLFetcherCore::CancelRequestAndInformDelegate(int result) {
- CancelURLRequest(result);
- delegate_task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(&URLFetcherCore::InformDelegateFetchIsComplete, this));
-}
-
-void URLFetcherCore::ReleaseRequest() {
- request_context_getter_->RemoveObserver(this);
- upload_progress_checker_timer_.reset();
- request_.reset();
- buffer_ = nullptr;
- g_registry.Get().RemoveURLFetcherCore(this);
-}
-
-base::TimeTicks URLFetcherCore::GetBackoffReleaseTime() {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
-
- if (!original_url_throttler_entry_.get())
- return base::TimeTicks();
-
- base::TimeTicks original_url_backoff =
- original_url_throttler_entry_->GetExponentialBackoffReleaseTime();
- base::TimeTicks destination_url_backoff;
- if (url_throttler_entry_.get() &&
- original_url_throttler_entry_.get() != url_throttler_entry_.get()) {
- destination_url_backoff =
- url_throttler_entry_->GetExponentialBackoffReleaseTime();
- }
-
- return original_url_backoff > destination_url_backoff ?
- original_url_backoff : destination_url_backoff;
-}
-
-void URLFetcherCore::CompleteAddingUploadDataChunk(
- const std::string& content, bool is_last_chunk) {
- DCHECK(is_chunked_upload_);
- DCHECK(!content.empty());
- chunked_stream_writer_->AppendData(
- content.data(), static_cast<int>(content.length()), is_last_chunk);
-}
-
-int URLFetcherCore::WriteBuffer(scoped_refptr<DrainableIOBuffer> data) {
- while (data->BytesRemaining() > 0) {
- const int result = response_writer_->Write(
- data.get(), data->BytesRemaining(),
- base::BindOnce(&URLFetcherCore::DidWriteBuffer, this, data));
- if (result < 0) {
- if (result != ERR_IO_PENDING)
- DidWriteBuffer(data, result);
- return result;
- }
- data->DidConsume(result);
- }
- return OK;
-}
-
-void URLFetcherCore::DidWriteBuffer(scoped_refptr<DrainableIOBuffer> data,
- int result) {
- if (result < 0) { // Handle errors.
- response_writer_->Finish(result, base::DoNothing());
- CancelRequestAndInformDelegate(result);
- return;
- }
-
- // Continue writing.
- data->DidConsume(result);
- if (WriteBuffer(data) < 0)
- return;
-
- // Finished writing buffer_. Read some more, unless the request has been
- // cancelled and deleted.
- DCHECK_EQ(0, data->BytesRemaining());
- if (request_.get())
- ReadResponse();
-}
-
-void URLFetcherCore::ReadResponse() {
- // Some servers may treat HEAD requests as GET requests. To free up the
- // network connection as soon as possible, signal that the request has
- // completed immediately, without trying to read any data back (all we care
- // about is the response code and headers, which we already have).
- int bytes_read = 0;
- if (request_type_ != URLFetcher::HEAD)
- bytes_read = request_->Read(buffer_.get(), kBufferSize);
-
- OnReadCompleted(request_.get(), bytes_read);
-}
-
-void URLFetcherCore::InformDelegateUploadProgress() {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
- if (request_.get()) {
- int64_t current = request_->GetUploadProgress().position();
- if (current_upload_bytes_ != current) {
- current_upload_bytes_ = current;
- int64_t total = -1;
- if (!is_chunked_upload_) {
- total = static_cast<int64_t>(request_->GetUploadProgress().size());
- // Total may be zero if the UploadDataStream::Init has not been called
- // yet. Don't send the upload progress until the size is initialized.
- if (!total)
- return;
- }
- delegate_task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(
- &URLFetcherCore::InformDelegateUploadProgressInDelegateSequence,
- this, current, total));
- }
- }
-}
-
-void URLFetcherCore::InformDelegateUploadProgressInDelegateSequence(
- int64_t current,
- int64_t total) {
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
- if (delegate_)
- delegate_->OnURLFetchUploadProgress(fetcher_, current, total);
-}
-
-void URLFetcherCore::InformDelegateDownloadProgress() {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
- delegate_task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(
- &URLFetcherCore::InformDelegateDownloadProgressInDelegateSequence,
- this, current_response_bytes_, total_response_bytes_,
- request_->GetTotalReceivedBytes()));
-}
-
-void URLFetcherCore::InformDelegateDownloadProgressInDelegateSequence(
- int64_t current,
- int64_t total,
- int64_t current_network_bytes) {
- DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
- if (delegate_)
- delegate_->OnURLFetchDownloadProgress(fetcher_, current, total,
- current_network_bytes);
-}
-
-void URLFetcherCore::AssertHasNoUploadData() const {
- DCHECK(!upload_content_set_);
- DCHECK(upload_content_.empty());
- DCHECK(upload_file_path_.empty());
- DCHECK(upload_stream_factory_.is_null());
-}
-
-} // namespace net
diff --git a/chromium/net/url_request/url_fetcher_core.h b/chromium/net/url_request/url_fetcher_core.h
deleted file mode 100644
index e030539981e..00000000000
--- a/chromium/net/url_request/url_fetcher_core.h
+++ /dev/null
@@ -1,373 +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.
-
-#ifndef NET_URL_REQUEST_URL_FETCHER_CORE_H_
-#define NET_URL_REQUEST_URL_FETCHER_CORE_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <set>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/files/file_path.h"
-#include "base/lazy_instance.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/time/time.h"
-#include "base/timer/timer.h"
-#include "net/base/chunked_upload_data_stream.h"
-#include "net/base/ip_endpoint.h"
-#include "net/base/net_errors.h"
-#include "net/base/proxy_server.h"
-#include "net/http/http_request_headers.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
-#include "net/url_request/referrer_policy.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_context_getter_observer.h"
-#include "url/gurl.h"
-
-namespace base {
-class SequencedTaskRunner;
-class SingleThreadTaskRunner;
-} // namespace base
-
-namespace net {
-class DrainableIOBuffer;
-class HttpResponseHeaders;
-class IOBuffer;
-class URLFetcherDelegate;
-class URLFetcherResponseWriter;
-class URLRequestContextGetter;
-class URLRequestThrottlerEntryInterface;
-
-class URLFetcherCore : public base::RefCountedThreadSafe<URLFetcherCore>,
- public URLRequest::Delegate,
- public URLRequestContextGetterObserver {
- public:
- URLFetcherCore(URLFetcher* fetcher,
- const GURL& original_url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* d,
- net::NetworkTrafficAnnotationTag traffic_annotation);
-
- URLFetcherCore(const URLFetcherCore&) = delete;
- URLFetcherCore& operator=(const URLFetcherCore&) = delete;
-
- // Starts the load. It's important that this not happen in the constructor
- // because it causes the IO thread to begin AddRef()ing and Release()ing
- // us. If our caller hasn't had time to fully construct us and take a
- // reference, the IO thread could interrupt things, run a task, Release()
- // us, and destroy us, leaving the caller with an already-destroyed object
- // when construction finishes.
- void Start();
-
- // Stops any in-progress load and ensures no callback will happen. It is
- // safe to call this multiple times.
- void Stop();
-
- // URLFetcher-like functions.
-
- // For POST requests, set |content_type| to the MIME type of the
- // content and set |content| to the data to upload.
- void SetUploadData(const std::string& upload_content_type,
- const std::string& upload_content);
- void SetUploadFilePath(const std::string& upload_content_type,
- const base::FilePath& file_path,
- uint64_t range_offset,
- uint64_t range_length,
- scoped_refptr<base::TaskRunner> file_task_runner);
- void SetUploadStreamFactory(
- const std::string& upload_content_type,
- const URLFetcher::CreateUploadStreamCallback& callback);
- void SetChunkedUpload(const std::string& upload_content_type);
- // Adds a block of data to be uploaded in a POST body. This can only be
- // called after Start().
- void AppendChunkToUpload(const std::string& data, bool is_last_chunk);
- // |flags| are flags to apply to the load operation--these should be
- // one or more of the LOAD_* flags defined in net/base/load_flags.h.
- void SetLoadFlags(int load_flags);
- int GetLoadFlags() const;
- void SetAllowCredentials(bool allow_credentials);
- void SetReferrer(const std::string& referrer);
- void SetReferrerPolicy(ReferrerPolicy referrer_policy);
- void ClearExtraRequestHeaders();
- void AddExtraRequestHeader(const std::string& name, const std::string& value);
- void SetRequestContext(URLRequestContextGetter* request_context_getter);
- // Set the origin that should be considered as "initiating" the fetch. This
- // URL
- // will be considered the "first-party" when applying cookie blocking policy
- // to requests, and treated as the request's initiator.
- void SetInitiator(const absl::optional<url::Origin>& initiator);
- // Set the key and data callback that is used when setting the user
- // data on any URLRequest objects this object creates.
- void SetURLRequestUserData(
- const void* key,
- const URLFetcher::CreateDataCallback& create_data_callback);
- void SetStopOnRedirect(bool stop_on_redirect);
- void SetAutomaticallyRetryOn5xx(bool retry);
- void SetMaxRetriesOn5xx(int max_retries);
- int GetMaxRetriesOn5xx() const;
- base::TimeDelta GetBackoffDelay() const;
- void SetAutomaticallyRetryOnNetworkChanges(int max_retries);
- void SaveResponseToFileAtPath(
- const base::FilePath& file_path,
- scoped_refptr<base::SequencedTaskRunner> file_task_runner);
- void SaveResponseToTemporaryFile(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner);
- void SaveResponseWithWriter(
- std::unique_ptr<URLFetcherResponseWriter> response_writer);
- HttpResponseHeaders* GetResponseHeaders() const;
- IPEndPoint GetSocketAddress() const;
- const ProxyServer& ProxyServerUsed() const;
- bool WasFetchedViaProxy() const;
- bool WasCached() const;
- const GURL& GetOriginalURL() const;
- const GURL& GetURL() const;
- Error GetError() const;
- int GetResponseCode() const;
- int64_t GetReceivedResponseContentLength() const;
- int64_t GetTotalReceivedBytes() const;
- // Reports that the received content was malformed (i.e. failed parsing
- // or validation). This makes the throttling logic that does exponential
- // back-off when servers are having problems treat the current request as
- // a failure. Your call to this method will be ignored if your request is
- // already considered a failure based on the HTTP response code or response
- // headers.
- void ReceivedContentWasMalformed();
- bool GetResponseAsString(std::string* out_response_string) const;
- bool GetResponseAsFilePath(bool take_ownership,
- base::FilePath* out_response_path);
-
- // Overridden from URLRequest::Delegate:
- void OnReceivedRedirect(URLRequest* request,
- const RedirectInfo& redirect_info,
- bool* defer_redirect) override;
- void OnResponseStarted(URLRequest* request, int net_error) override;
- void OnReadCompleted(URLRequest* request, int bytes_read) override;
- void OnCertificateRequested(URLRequest* request,
- SSLCertRequestInfo* cert_request_info) override;
-
- // Overridden from URLRequestContextGetterObserver:
- void OnContextShuttingDown() override;
-
- URLFetcherDelegate* delegate() const { return delegate_; }
- static void CancelAll();
- static int GetNumFetcherCores();
- static void SetEnableInterceptionForTests(bool enabled);
- static void SetIgnoreCertificateRequests(bool ignored);
-
- private:
- friend class base::RefCountedThreadSafe<URLFetcherCore>;
-
- // TODO(mmenke): Remove this class.
- class Registry {
- public:
- Registry();
-
- Registry(const Registry&) = delete;
- Registry& operator=(const Registry&) = delete;
-
- ~Registry();
-
- void AddURLFetcherCore(URLFetcherCore* core);
- void RemoveURLFetcherCore(URLFetcherCore* core);
-
- void CancelAll();
-
- int size() const {
- return fetchers_.size();
- }
-
- private:
- std::set<URLFetcherCore*> fetchers_;
- };
-
- ~URLFetcherCore() override;
-
- // Wrapper functions that allow us to ensure actions happen on the right
- // thread.
- void StartOnIOThread();
- void StartURLRequest();
- void DidInitializeWriter(int result);
- void StartURLRequestWhenAppropriate();
- void CancelURLRequest(int error);
- void OnCompletedURLRequest(base::TimeDelta backoff_delay);
- void InformDelegateFetchIsComplete();
- void NotifyMalformedContent();
- void DidFinishWriting(int result);
- void RetryOrCompleteUrlFetch();
-
- // Cancels the URLRequest and informs the delegate that it failed with the
- // specified error. Must be called on network thread.
- void CancelRequestAndInformDelegate(int result);
-
- // Deletes the request, removes it from the registry, and removes the
- // destruction observer.
- void ReleaseRequest();
-
- // Returns the max value of exponential back-off release time for
- // |original_url_| and |url_|.
- base::TimeTicks GetBackoffReleaseTime();
-
- void CompleteAddingUploadDataChunk(const std::string& data,
- bool is_last_chunk);
-
- // Writes all bytes stored in |data| with |response_writer_|.
- // Returns OK if all bytes in |data| get written synchronously. Otherwise,
- // returns ERR_IO_PENDING or a network error code.
- int WriteBuffer(scoped_refptr<DrainableIOBuffer> data);
-
- // Used to implement WriteBuffer().
- void DidWriteBuffer(scoped_refptr<DrainableIOBuffer> data, int result);
-
- // Read response bytes from the request.
- void ReadResponse();
-
- // Notify Delegate about the progress of upload/download.
- void InformDelegateUploadProgress();
- void InformDelegateUploadProgressInDelegateSequence(int64_t current,
- int64_t total);
- void InformDelegateDownloadProgress();
- void InformDelegateDownloadProgressInDelegateSequence(
- int64_t current,
- int64_t total,
- int64_t current_network_bytes);
-
- // Check if any upload data is set or not.
- void AssertHasNoUploadData() const;
-
- raw_ptr<URLFetcher> fetcher_; // Corresponding fetcher object
- GURL original_url_; // The URL we were asked to fetch
- GURL url_; // The URL we eventually wound up at
- URLFetcher::RequestType request_type_; // What type of request is this?
- Error error_; // Error from the request
- raw_ptr<URLFetcherDelegate> delegate_; // Object to notify on completion
- // Task runner for the creating sequence. Used to interact with the delegate.
- const scoped_refptr<base::SequencedTaskRunner> delegate_task_runner_;
- // Task runner for network operations.
- scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
- // Task runner for upload file access.
- scoped_refptr<base::TaskRunner> upload_file_task_runner_;
- std::unique_ptr<URLRequest> request_; // The actual request this wraps
- int load_flags_ = LOAD_NORMAL; // Flags for the load operation
- // Whether credentials are sent along with the request.
- absl::optional<bool> allow_credentials_;
- int response_code_ =
- URLFetcher::RESPONSE_CODE_INVALID; // HTTP status code for the request
- scoped_refptr<IOBuffer> buffer_;
- // Read buffer
- scoped_refptr<URLRequestContextGetter> request_context_getter_;
- // Cookie/cache info for the request
- absl::optional<url::Origin> initiator_; // The request's initiator
- // The user data to add to each newly-created URLRequest.
- raw_ptr<const void> url_request_data_key_ = nullptr;
- URLFetcher::CreateDataCallback url_request_create_data_callback_;
- HttpRequestHeaders extra_request_headers_;
- scoped_refptr<HttpResponseHeaders> response_headers_;
- ProxyServer proxy_server_;
- bool was_cached_ = false;
- int64_t received_response_content_length_ = 0;
- int64_t total_received_bytes_ = 0;
- IPEndPoint remote_endpoint_;
-
- bool upload_content_set_ = false; // SetUploadData has been called
- std::string upload_content_; // HTTP POST payload
- base::FilePath upload_file_path_; // Path to file containing POST payload
- uint64_t upload_range_offset_ = 0; // Offset from the beginning of the file
- // to be uploaded.
- uint64_t upload_range_length_ = 0; // The length of the part of file to be
- // uploaded.
- URLFetcher::CreateUploadStreamCallback
- upload_stream_factory_; // Callback to create HTTP POST payload.
- std::string upload_content_type_; // MIME type of POST payload
- std::string referrer_; // HTTP Referer header value and policy
- ReferrerPolicy referrer_policy_ =
- ReferrerPolicy::CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
- bool is_chunked_upload_ = false; // True if using chunked transfer encoding
-
- // Used to write to |chunked_stream|, even after ownership has been passed to
- // the URLRequest. Continues to be valid even after the request deletes its
- // upload data.
- std::unique_ptr<ChunkedUploadDataStream::Writer> chunked_stream_writer_;
-
- // Temporary storage of ChunkedUploadDataStream, before request is created.
- std::unique_ptr<ChunkedUploadDataStream> chunked_stream_;
-
- // Used to determine how long to wait before making a request or doing a
- // retry.
- //
- // Both of them can only be accessed on the IO thread.
- //
- // To determine the proper backoff timing, throttler entries for
- // both |original_URL| and |url| are needed. For example, consider
- // the case that URL A redirects to URL B, for which the server
- // returns a 500 response. In this case, the exponential back-off
- // release time of URL A won't increase. If only the backoff
- // constraints for URL A are considered, too many requests for URL A
- // may be sent in a short period of time.
- //
- // Both of these will be NULL if
- // URLRequestContext::throttler_manager() is NULL.
- scoped_refptr<URLRequestThrottlerEntryInterface>
- original_url_throttler_entry_;
- scoped_refptr<URLRequestThrottlerEntryInterface> url_throttler_entry_;
-
- // True if the URLFetcher has been cancelled.
- bool was_cancelled_ = false;
-
- // Writer object to write response to the destination like file and string.
- std::unique_ptr<URLFetcherResponseWriter> response_writer_;
-
- // By default any server-initiated redirects are automatically followed. If
- // this flag is set to true, however, a redirect will halt the fetch and call
- // back to to the delegate immediately.
- bool stop_on_redirect_ = false;
- // True when we're actually stopped due to a redirect halted by the above. We
- // use this to ensure that |url_| is set to the redirect destination rather
- // than the originally-fetched URL.
- bool stopped_on_redirect_ = false;
-
- // If |automatically_retry_on_5xx_| is false, 5xx responses will be
- // propagated to the observer, if it is true URLFetcher will automatically
- // re-execute the request, after the back-off delay has expired.
- // true by default.
- bool automatically_retry_on_5xx_ = true;
- // |num_retries_on_5xx_| indicates how many times we've failed to successfully
- // fetch this URL due to 5xx responses. Once this value exceeds the maximum
- // number of retries specified by the owner URLFetcher instance,
- // we'll give up.
- int num_retries_on_5xx_ = 0;
- // Maximum retries allowed when 5xx responses are received.
- int max_retries_on_5xx_ = 0;
- // Back-off time delay. 0 by default.
- base::TimeDelta backoff_delay_;
-
- // The number of retries that have been attempted due to ERR_NETWORK_CHANGED.
- int num_retries_on_network_changes_ = 0;
- // Maximum retries allowed when the request fails with ERR_NETWORK_CHANGED.
- // 0 by default.
- int max_retries_on_network_changes_ = 0;
-
- // Timer to poll the progress of uploading for POST and PUT requests.
- // When crbug.com/119629 is fixed, scoped_ptr is not necessary here.
- std::unique_ptr<base::RepeatingTimer> upload_progress_checker_timer_;
- // Number of bytes sent so far.
- int64_t current_upload_bytes_ = -1;
- // Number of bytes received so far.
- int64_t current_response_bytes_ = 0;
- // Total expected bytes to receive (-1 if it cannot be determined).
- int64_t total_response_bytes_ = -1;
-
- const net::NetworkTrafficAnnotationTag traffic_annotation_;
-
- static base::LazyInstance<Registry>::DestructorAtExit g_registry;
-};
-
-} // namespace net
-
-#endif // NET_URL_REQUEST_URL_FETCHER_CORE_H_
diff --git a/chromium/net/url_request/url_fetcher_delegate.cc b/chromium/net/url_request/url_fetcher_delegate.cc
deleted file mode 100644
index 359b8172725..00000000000
--- a/chromium/net/url_request/url_fetcher_delegate.cc
+++ /dev/null
@@ -1,21 +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.
-
-#include "net/url_request/url_fetcher_delegate.h"
-
-namespace net {
-
-void URLFetcherDelegate::OnURLFetchDownloadProgress(
- const URLFetcher* source,
- int64_t current,
- int64_t total,
- int64_t current_network_bytes) {}
-
-void URLFetcherDelegate::OnURLFetchUploadProgress(const URLFetcher* source,
- int64_t current,
- int64_t total) {}
-
-URLFetcherDelegate::~URLFetcherDelegate() = default;
-
-} // namespace net
diff --git a/chromium/net/url_request/url_fetcher_delegate.h b/chromium/net/url_request/url_fetcher_delegate.h
deleted file mode 100644
index 1d3f260863f..00000000000
--- a/chromium/net/url_request/url_fetcher_delegate.h
+++ /dev/null
@@ -1,46 +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.
-
-#ifndef NET_URL_REQUEST_URL_FETCHER_DELEGATE_H_
-#define NET_URL_REQUEST_URL_FETCHER_DELEGATE_H_
-
-#include <stdint.h>
-
-#include "net/base/net_export.h"
-
-namespace net {
-
-class URLFetcher;
-
-// A delegate interface for users of URLFetcher.
-class NET_EXPORT URLFetcherDelegate {
- public:
- // This will be called when the URL has been fetched, successfully or not.
- // Use accessor methods on |source| to get the results.
- virtual void OnURLFetchComplete(const URLFetcher* source) = 0;
-
- // This will be called when some part of the response is read. |current|
- // denotes the number of bytes received up to the call, and |total| is the
- // expected total size of the response (or -1 if not determined).
- // |current_network_bytes| denotes the number of network bytes received
- // up to the call, excluding redirect bodies, SSL and proxy handshakes.
- virtual void OnURLFetchDownloadProgress(const URLFetcher* source,
- int64_t current,
- int64_t total,
- int64_t current_network_bytes);
-
- // This will be called when uploading of POST or PUT requests proceeded.
- // |current| denotes the number of bytes sent so far, and |total| is the
- // total size of uploading data (or -1 if chunked upload is enabled).
- virtual void OnURLFetchUploadProgress(const URLFetcher* source,
- int64_t current,
- int64_t total);
-
- protected:
- virtual ~URLFetcherDelegate();
-};
-
-} // namespace net
-
-#endif // NET_URL_REQUEST_URL_FETCHER_DELEGATE_H_
diff --git a/chromium/net/url_request/url_fetcher_factory.h b/chromium/net/url_request/url_fetcher_factory.h
deleted file mode 100644
index 2a771bf48bc..00000000000
--- a/chromium/net/url_request/url_fetcher_factory.h
+++ /dev/null
@@ -1,30 +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.
-
-#ifndef NET_URL_REQUEST_URL_FETCHER_FACTORY_H_
-#define NET_URL_REQUEST_URL_FETCHER_FACTORY_H_
-
-#include "net/url_request/url_fetcher.h"
-
-namespace net {
-class URLFetcherDelegate;
-
-// URLFetcher::Create uses the currently registered Factory to create the
-// URLFetcher. Factory is intended for testing.
-class URLFetcherFactory {
- public:
- virtual std::unique_ptr<URLFetcher> CreateURLFetcher(
- int id,
- const GURL& url,
- URLFetcher::RequestType request_type,
- URLFetcherDelegate* delegate,
- NetworkTrafficAnnotationTag traffic_annotation) = 0;
-
- protected:
- virtual ~URLFetcherFactory() {}
-};
-
-} // namespace net
-
-#endif // NET_URL_REQUEST_URL_FETCHER_FACTORY_H_
diff --git a/chromium/net/url_request/url_fetcher_impl.cc b/chromium/net/url_request/url_fetcher_impl.cc
deleted file mode 100644
index 7fc9de2fd10..00000000000
--- a/chromium/net/url_request/url_fetcher_impl.cc
+++ /dev/null
@@ -1,240 +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.
-
-#include "net/url_request/url_fetcher_impl.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/task/sequenced_task_runner.h"
-#include "net/base/upload_data_stream.h"
-#include "net/url_request/url_fetcher_core.h"
-#include "net/url_request/url_fetcher_factory.h"
-#include "net/url_request/url_fetcher_response_writer.h"
-
-namespace net {
-
-static URLFetcherFactory* g_factory = nullptr;
-
-URLFetcherImpl::~URLFetcherImpl() {
- core_->Stop();
-}
-
-void URLFetcherImpl::SetUploadData(const std::string& upload_content_type,
- const std::string& upload_content) {
- core_->SetUploadData(upload_content_type, upload_content);
-}
-
-void URLFetcherImpl::SetUploadFilePath(
- const std::string& upload_content_type,
- const base::FilePath& file_path,
- uint64_t range_offset,
- uint64_t range_length,
- scoped_refptr<base::TaskRunner> file_task_runner) {
- core_->SetUploadFilePath(upload_content_type,
- file_path,
- range_offset,
- range_length,
- file_task_runner);
-}
-
-void URLFetcherImpl::SetUploadStreamFactory(
- const std::string& upload_content_type,
- const CreateUploadStreamCallback& callback) {
- core_->SetUploadStreamFactory(upload_content_type, callback);
-}
-
-void URLFetcherImpl::SetChunkedUpload(const std::string& content_type) {
- core_->SetChunkedUpload(content_type);
-}
-
-void URLFetcherImpl::AppendChunkToUpload(const std::string& data,
- bool is_last_chunk) {
- DCHECK(data.length());
- core_->AppendChunkToUpload(data, is_last_chunk);
-}
-
-void URLFetcherImpl::SetReferrer(const std::string& referrer) {
- core_->SetReferrer(referrer);
-}
-
-void URLFetcherImpl::SetReferrerPolicy(ReferrerPolicy referrer_policy) {
- core_->SetReferrerPolicy(referrer_policy);
-}
-
-void URLFetcherImpl::SetLoadFlags(int load_flags) {
- core_->SetLoadFlags(load_flags);
-}
-
-void URLFetcherImpl::SetAllowCredentials(bool allow_credentials) {
- core_->SetAllowCredentials(allow_credentials);
-}
-
-int URLFetcherImpl::GetLoadFlags() const {
- return core_->GetLoadFlags();
-}
-
-void URLFetcherImpl::ClearExtraRequestHeaders() {
- core_->ClearExtraRequestHeaders();
-}
-
-void URLFetcherImpl::AddExtraRequestHeader(const std::string& name,
- const std::string& value) {
- core_->AddExtraRequestHeader(name, value);
-}
-
-void URLFetcherImpl::SetRequestContext(
- URLRequestContextGetter* request_context_getter) {
- core_->SetRequestContext(request_context_getter);
-}
-
-void URLFetcherImpl::SetInitiator(
- const absl::optional<url::Origin>& initiator) {
- core_->SetInitiator(initiator);
-}
-
-void URLFetcherImpl::SetURLRequestUserData(
- const void* key,
- const CreateDataCallback& create_data_callback) {
- core_->SetURLRequestUserData(key, create_data_callback);
-}
-
-void URLFetcherImpl::SetStopOnRedirect(bool stop_on_redirect) {
- core_->SetStopOnRedirect(stop_on_redirect);
-}
-
-void URLFetcherImpl::SetAutomaticallyRetryOn5xx(bool retry) {
- core_->SetAutomaticallyRetryOn5xx(retry);
-}
-
-void URLFetcherImpl::SetMaxRetriesOn5xx(int max_retries) {
- core_->SetMaxRetriesOn5xx(max_retries);
-}
-
-int URLFetcherImpl::GetMaxRetriesOn5xx() const {
- return core_->GetMaxRetriesOn5xx();
-}
-
-
-base::TimeDelta URLFetcherImpl::GetBackoffDelay() const {
- return core_->GetBackoffDelay();
-}
-
-void URLFetcherImpl::SetAutomaticallyRetryOnNetworkChanges(int max_retries) {
- core_->SetAutomaticallyRetryOnNetworkChanges(max_retries);
-}
-
-void URLFetcherImpl::SaveResponseToFileAtPath(
- const base::FilePath& file_path,
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
- core_->SaveResponseToFileAtPath(file_path, file_task_runner);
-}
-
-void URLFetcherImpl::SaveResponseToTemporaryFile(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
- core_->SaveResponseToTemporaryFile(file_task_runner);
-}
-
-void URLFetcherImpl::SaveResponseWithWriter(
- std::unique_ptr<URLFetcherResponseWriter> response_writer) {
- core_->SaveResponseWithWriter(std::move(response_writer));
-}
-
-HttpResponseHeaders* URLFetcherImpl::GetResponseHeaders() const {
- return core_->GetResponseHeaders();
-}
-
-IPEndPoint URLFetcherImpl::GetSocketAddress() const {
- return core_->GetSocketAddress();
-}
-
-const ProxyServer& URLFetcherImpl::ProxyServerUsed() const {
- return core_->ProxyServerUsed();
-}
-
-bool URLFetcherImpl::WasCached() const {
- return core_->WasCached();
-}
-
-int64_t URLFetcherImpl::GetReceivedResponseContentLength() const {
- return core_->GetReceivedResponseContentLength();
-}
-
-int64_t URLFetcherImpl::GetTotalReceivedBytes() const {
- return core_->GetTotalReceivedBytes();
-}
-
-void URLFetcherImpl::Start() {
- core_->Start();
-}
-
-const GURL& URLFetcherImpl::GetOriginalURL() const {
- return core_->GetOriginalURL();
-}
-
-const GURL& URLFetcherImpl::GetURL() const {
- return core_->GetURL();
-}
-
-Error URLFetcherImpl::GetError() const {
- return core_->GetError();
-}
-
-int URLFetcherImpl::GetResponseCode() const {
- return core_->GetResponseCode();
-}
-
-void URLFetcherImpl::ReceivedContentWasMalformed() {
- core_->ReceivedContentWasMalformed();
-}
-
-bool URLFetcherImpl::GetResponseAsString(
- std::string* out_response_string) const {
- return core_->GetResponseAsString(out_response_string);
-}
-
-bool URLFetcherImpl::GetResponseAsFilePath(
- bool take_ownership,
- base::FilePath* out_response_path) const {
- return core_->GetResponseAsFilePath(take_ownership, out_response_path);
-}
-
-// static
-void URLFetcherImpl::CancelAll() {
- URLFetcherCore::CancelAll();
-}
-
-// static
-void URLFetcherImpl::SetIgnoreCertificateRequests(bool ignored) {
- URLFetcherCore::SetIgnoreCertificateRequests(ignored);
-}
-
-// static
-int URLFetcherImpl::GetNumFetcherCores() {
- return URLFetcherCore::GetNumFetcherCores();
-}
-
-URLFetcherDelegate* URLFetcherImpl::delegate() const {
- return core_->delegate();
-}
-
-// static
-URLFetcherFactory* URLFetcherImpl::factory() {
- return g_factory;
-}
-
-// static
-void URLFetcherImpl::set_factory(URLFetcherFactory* factory) {
- g_factory = factory;
-}
-
-URLFetcherImpl::URLFetcherImpl(
- const GURL& url,
- RequestType request_type,
- URLFetcherDelegate* d,
- net::NetworkTrafficAnnotationTag traffic_annotation)
- : core_(
- new URLFetcherCore(this, url, request_type, d, traffic_annotation)) {}
-
-} // namespace net
diff --git a/chromium/net/url_request/url_fetcher_impl.h b/chromium/net/url_request/url_fetcher_impl.h
deleted file mode 100644
index 78c8a2e3920..00000000000
--- a/chromium/net/url_request/url_fetcher_impl.h
+++ /dev/null
@@ -1,140 +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.
-
-// This file contains URLFetcher, a wrapper around URLRequest that handles
-// low-level details like thread safety, ref counting, and incremental buffer
-// reading. This is useful for callers who simply want to get the data from a
-// URL and don't care about all the nitty-gritty details.
-//
-// NOTE(willchan): Only one "IO" thread is supported for URLFetcher. This is a
-// temporary situation. We will work on allowing support for multiple "io"
-// threads per process.
-
-#ifndef NET_URL_REQUEST_URL_FETCHER_IMPL_H_
-#define NET_URL_REQUEST_URL_FETCHER_IMPL_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/task/sequenced_task_runner.h"
-#include "net/base/ip_endpoint.h"
-#include "net/base/net_export.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
-#include "net/url_request/referrer_policy.h"
-#include "net/url_request/url_fetcher.h"
-
-namespace net {
-class URLFetcherCore;
-class URLFetcherDelegate;
-class URLFetcherFactory;
-
-class NET_EXPORT_PRIVATE URLFetcherImpl : public URLFetcher {
- public:
- URLFetcherImpl(const URLFetcherImpl&) = delete;
- URLFetcherImpl& operator=(const URLFetcherImpl&) = delete;
-
- ~URLFetcherImpl() override;
-
- // URLFetcher implementation:
- void SetUploadData(const std::string& upload_content_type,
- const std::string& upload_content) override;
- void SetUploadFilePath(
- const std::string& upload_content_type,
- const base::FilePath& file_path,
- uint64_t range_offset,
- uint64_t range_length,
- scoped_refptr<base::TaskRunner> file_task_runner) override;
- void SetUploadStreamFactory(
- const std::string& upload_content_type,
- const CreateUploadStreamCallback& callback) override;
- void SetChunkedUpload(const std::string& upload_content_type) override;
- void AppendChunkToUpload(const std::string& data,
- bool is_last_chunk) override;
- void SetLoadFlags(int load_flags) override;
- void SetAllowCredentials(bool allow_credentials) override;
- int GetLoadFlags() const override;
- void SetReferrer(const std::string& referrer) override;
- void SetReferrerPolicy(ReferrerPolicy referrer_policy) override;
- void ClearExtraRequestHeaders() override;
- void AddExtraRequestHeader(const std::string& name,
- const std::string& value) override;
- void SetRequestContext(
- URLRequestContextGetter* request_context_getter) override;
- void SetInitiator(const absl::optional<url::Origin>& initiator) override;
- void SetURLRequestUserData(
- const void* key,
- const CreateDataCallback& create_data_callback) override;
- void SetStopOnRedirect(bool stop_on_redirect) override;
- void SetAutomaticallyRetryOn5xx(bool retry) override;
- void SetMaxRetriesOn5xx(int max_retries) override;
- int GetMaxRetriesOn5xx() const override;
- base::TimeDelta GetBackoffDelay() const override;
- void SetAutomaticallyRetryOnNetworkChanges(int max_retries) override;
- void SaveResponseToFileAtPath(
- const base::FilePath& file_path,
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) override;
- void SaveResponseToTemporaryFile(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) override;
- void SaveResponseWithWriter(
- std::unique_ptr<URLFetcherResponseWriter> response_writer) override;
- HttpResponseHeaders* GetResponseHeaders() const override;
- IPEndPoint GetSocketAddress() const override;
- const ProxyServer& ProxyServerUsed() const override;
- bool WasCached() const override;
- int64_t GetReceivedResponseContentLength() const override;
- int64_t GetTotalReceivedBytes() const override;
- void Start() override;
- const GURL& GetOriginalURL() const override;
- const GURL& GetURL() const override;
- Error GetError() const override;
- int GetResponseCode() const override;
- void ReceivedContentWasMalformed() override;
- bool GetResponseAsString(std::string* out_response_string) const override;
- bool GetResponseAsFilePath(bool take_ownership,
- base::FilePath* out_response_path) const override;
-
- static void CancelAll();
-
- static void SetIgnoreCertificateRequests(bool ignored);
-
- // TODO(akalin): Make these private again once URLFetcher::Create()
- // is in net/.
-
- static URLFetcherFactory* factory();
-
- // Sets the factory used by the static method Create to create a URLFetcher.
- // URLFetcher does not take ownership of |factory|. A value of NULL results
- // in a URLFetcher being created directly.
- //
- // NOTE: for safety, this should only be used through ScopedURLFetcherFactory!
- static void set_factory(URLFetcherFactory* factory);
-
- protected:
- // Returns the delegate.
- URLFetcherDelegate* delegate() const;
-
- private:
- friend class URLFetcherTest;
- friend class URLFetcher;
- friend class WaitingURLFetcherDelegate;
-
- // |url| is the URL to send the request to.
- // |request_type| is the type of request to make.
- // |d| the object that will receive the callback on fetch completion.
- URLFetcherImpl(const GURL& url,
- RequestType request_type,
- URLFetcherDelegate* d,
- net::NetworkTrafficAnnotationTag traffic_annotation);
-
- // Only used by URLFetcherTest, returns the number of URLFetcher::Core objects
- // actively running.
- static int GetNumFetcherCores();
-
- const scoped_refptr<URLFetcherCore> core_;
-};
-
-} // namespace net
-
-#endif // NET_URL_REQUEST_URL_FETCHER_IMPL_H_
diff --git a/chromium/net/url_request/url_fetcher_impl_unittest.cc b/chromium/net/url_request/url_fetcher_impl_unittest.cc
deleted file mode 100644
index dad77942da7..00000000000
--- a/chromium/net/url_request/url_fetcher_impl_unittest.cc
+++ /dev/null
@@ -1,1637 +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.
-
-#include "net/url_request/url_fetcher_impl.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include <algorithm>
-#include <limits>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/location.h"
-#include "base/memory/raw_ptr.h"
-#include "base/message_loop/message_pump_type.h"
-#include "base/path_service.h"
-#include "base/run_loop.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/task/thread_pool.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "net/base/elements_upload_data_stream.h"
-#include "net/base/network_change_notifier.h"
-#include "net/base/proxy_string_util.h"
-#include "net/base/upload_bytes_element_reader.h"
-#include "net/base/upload_element_reader.h"
-#include "net/base/upload_file_element_reader.h"
-#include "net/dns/mock_host_resolver.h"
-#include "net/http/http_response_headers.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "net/test/gtest_util.h"
-#include "net/test/test_with_task_environment.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_builder.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "net/url_request/url_request_test_util.h"
-#include "net/url_request/url_request_throttler_manager.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace net {
-
-using base::Time;
-using net::test::IsError;
-using net::test::IsOk;
-
-// Simple URLRequestDelegate that waits for the specified fetcher to complete.
-// Can only be used once.
-class WaitingURLFetcherDelegate : public URLFetcherDelegate {
- public:
- WaitingURLFetcherDelegate() = default;
-
- WaitingURLFetcherDelegate(const WaitingURLFetcherDelegate&) = delete;
- WaitingURLFetcherDelegate& operator=(const WaitingURLFetcherDelegate&) =
- delete;
-
- void CreateFetcher(
- const GURL& url,
- URLFetcher::RequestType request_type,
- scoped_refptr<net::URLRequestContextGetter> context_getter) {
- if (!on_complete_or_cancel_) {
- run_loop_ = std::make_unique<base::RunLoop>();
- on_complete_or_cancel_ = run_loop_->QuitClosure();
- }
- fetcher_.reset(new URLFetcherImpl(url, request_type, this,
- TRAFFIC_ANNOTATION_FOR_TESTS));
- fetcher_->SetRequestContext(context_getter.get());
- }
-
- URLFetcher* fetcher() const { return fetcher_.get(); }
-
- // Wait until the request has completed or been canceled.
- void StartFetcherAndWait() {
- fetcher_->Start();
- WaitForComplete();
- }
-
- // Wait until the request has completed or been canceled. Does not start the
- // request.
- void WaitForComplete() {
- EXPECT_TRUE(task_runner_->RunsTasksInCurrentSequence());
- run_loop_->Run();
- }
-
- // Cancels the fetch by deleting the fetcher.
- void CancelFetch() {
- EXPECT_TRUE(fetcher_);
- fetcher_.reset();
- std::move(on_complete_or_cancel_).Run();
- }
-
- // URLFetcherDelegate:
- void OnURLFetchComplete(const URLFetcher* source) override {
- EXPECT_FALSE(did_complete_);
- EXPECT_TRUE(fetcher_);
- EXPECT_EQ(fetcher_.get(), source);
- did_complete_ = true;
- std::move(on_complete_or_cancel_).Run();
- }
-
- void OnURLFetchDownloadProgress(const URLFetcher* source,
- int64_t current,
- int64_t total,
- int64_t current_network_bytes) override {
- // Note that the current progress may be greater than the previous progress,
- // in the case of retrying the request.
- EXPECT_FALSE(did_complete_);
- EXPECT_TRUE(fetcher_);
- EXPECT_EQ(source, fetcher_.get());
-
- EXPECT_LE(0, current);
- // If file size is not known, |total| is -1.
- if (total >= 0)
- EXPECT_LE(current, total);
- }
-
- void OnURLFetchUploadProgress(const URLFetcher* source,
- int64_t current,
- int64_t total) override {
- // Note that the current progress may be greater than the previous progress,
- // in the case of retrying the request.
- EXPECT_FALSE(did_complete_);
- EXPECT_TRUE(fetcher_);
- EXPECT_EQ(source, fetcher_.get());
-
- EXPECT_LE(0, current);
- // If file size is not known, |total| is -1.
- if (total >= 0)
- EXPECT_LE(current, total);
- }
-
- bool did_complete() const { return did_complete_; }
-
- void set_on_complete_or_cancel_closure(base::OnceClosure closure) {
- on_complete_or_cancel_ = std::move(closure);
- }
-
- private:
- bool did_complete_ = false;
-
- std::unique_ptr<URLFetcherImpl> fetcher_;
- const scoped_refptr<base::SequencedTaskRunner> task_runner_ =
- base::SequencedTaskRunnerHandle::Get();
- std::unique_ptr<base::RunLoop> run_loop_;
- base::OnceClosure on_complete_or_cancel_;
-};
-
-namespace {
-
-// TODO(akalin): Move all the test data to somewhere under net/.
-const base::FilePath::CharType kDocRoot[] =
- FILE_PATH_LITERAL("net/data/url_fetcher_impl_unittest");
-const char kTestServerFilePrefix[] = "/";
-
-// Test server path and response body for the default URL used by many of the
-// tests.
-const char kDefaultResponsePath[] = "/defaultresponse";
-const char kDefaultResponseBody[] =
- "Default response given for path: /defaultresponse";
-
-// Request body for streams created by CreateUploadStream.
-const char kCreateUploadStreamBody[] = "rosebud";
-
-base::FilePath GetUploadFileTestPath() {
- base::FilePath path;
- base::PathService::Get(base::DIR_SOURCE_ROOT, &path);
- return path.Append(
- FILE_PATH_LITERAL("net/data/url_request_unittest/BullRunSpeech.txt"));
-}
-
-class FetcherTestURLRequestContextGetter : public URLRequestContextGetter {
- public:
- FetcherTestURLRequestContextGetter(
- scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
- const std::string& hanging_domain)
- : network_task_runner_(network_task_runner),
- hanging_domain_(hanging_domain) {}
-
- FetcherTestURLRequestContextGetter(
- const FetcherTestURLRequestContextGetter&) = delete;
- FetcherTestURLRequestContextGetter& operator=(
- const FetcherTestURLRequestContextGetter&) = delete;
-
- // Sets callback to be invoked when the getter is destroyed.
- void set_on_destruction_callback(base::OnceClosure on_destruction_callback) {
- on_destruction_callback_ = std::move(on_destruction_callback);
- }
-
- MockHostResolver* mock_resolver() {
- DCHECK(context_);
- // This cast is safe because we set a MockHostResolver in the constructor.
- return static_cast<MockHostResolver*>(context_->host_resolver());
- }
-
- // URLRequestContextGetter:
- URLRequestContext* GetURLRequestContext() override {
- // Calling this on the wrong thread may be either a bug in the test or a bug
- // in production code.
- EXPECT_TRUE(network_task_runner_->BelongsToCurrentThread());
-
- if (shutting_down_)
- return nullptr;
-
- if (!context_) {
- auto mock_resolver = std::make_unique<MockHostResolver>();
- mock_resolver->set_ondemand_mode(true);
- mock_resolver->rules()->AddRule(hanging_domain_, "127.0.0.1");
-
- auto builder = CreateTestURLRequestContextBuilder();
- builder->set_host_resolver(std::move(mock_resolver));
- builder->set_throttling_enabled(true);
- if (proxy_resolution_service_) {
- builder->set_proxy_resolution_service(
- std::move(proxy_resolution_service_));
- }
-
- context_ = builder->Build();
- }
-
- return context_.get();
- }
-
- scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
- const override {
- return network_task_runner_;
- }
-
- // Adds a throttler entry with the specified parameters. Does this
- // synchronously if the context lives on the current thread, or posts a task
- // to the relevant thread otherwise.
- //
- // If |reserve_sending_time_for_next_request|, will start backoff early, as
- // if there has already been a request for |url|.
- void AddThrottlerEntry(const GURL& url,
- const std::string& url_id,
- int sliding_window_period_ms,
- int max_send_threshold,
- int initial_backoff_ms,
- double multiply_factor,
- double jitter_factor,
- int maximum_backoff_ms,
- bool reserve_sending_time_for_next_request) {
- if (!network_task_runner_->RunsTasksInCurrentSequence()) {
- network_task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(&FetcherTestURLRequestContextGetter::AddThrottlerEntry,
- this, url, url_id, sliding_window_period_ms,
- max_send_threshold, initial_backoff_ms,
- multiply_factor, jitter_factor, maximum_backoff_ms,
- reserve_sending_time_for_next_request));
- return;
- }
- scoped_refptr<URLRequestThrottlerEntry> entry(new URLRequestThrottlerEntry(
- GetURLRequestContext()->throttler_manager(), url_id,
- sliding_window_period_ms, max_send_threshold, initial_backoff_ms,
- multiply_factor, jitter_factor, maximum_backoff_ms));
-
- GetURLRequestContext()->throttler_manager()->OverrideEntryForTests(
- url, entry.get());
-
- if (reserve_sending_time_for_next_request)
- entry->ReserveSendingTimeForNextRequest(base::TimeTicks());
- }
-
- // Tells the getter to act as if the URLRequestContext is about to be shut
- // down.
- void Shutdown() {
- if (!network_task_runner_->RunsTasksInCurrentSequence()) {
- network_task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(&FetcherTestURLRequestContextGetter::Shutdown, this));
- return;
- }
-
- shutting_down_ = true;
- NotifyContextShuttingDown();
- // Should now be safe to destroy the context. Context will check it has no
- // pending requests.
- context_.reset();
- }
-
- // Convenience method to access the context.
- URLRequestContext* context() {
- DCHECK(network_task_runner_->BelongsToCurrentThread());
- return context_.get();
- }
-
- void set_proxy_resolution_service(
- std::unique_ptr<ProxyResolutionService> proxy_resolution_service) {
- DCHECK(proxy_resolution_service);
- proxy_resolution_service_ = std::move(proxy_resolution_service);
- }
-
- protected:
- ~FetcherTestURLRequestContextGetter() override {
- // |context_| may only be deleted on the network thread. Fortunately,
- // the parent class already ensures it's deleted on the network thread.
- DCHECK(network_task_runner_->BelongsToCurrentThread());
- if (!on_destruction_callback_.is_null())
- std::move(on_destruction_callback_).Run();
- }
-
- private:
- scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
- const std::string hanging_domain_;
-
- // May be null.
- std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
-
- std::unique_ptr<URLRequestContext> context_;
- bool shutting_down_ = false;
-
- base::OnceClosure on_destruction_callback_;
-};
-
-} // namespace
-
-class URLFetcherTest : public TestWithTaskEnvironment {
- public:
- URLFetcherTest() = default;
-
- static int GetNumFetcherCores() {
- return URLFetcherImpl::GetNumFetcherCores();
- }
-
- // Creates a URLRequestContextGetter with a URLRequestContext that lives on
- // the current thread.
- scoped_refptr<FetcherTestURLRequestContextGetter>
- CreateSameThreadContextGetter() {
- return scoped_refptr<FetcherTestURLRequestContextGetter>(
- new FetcherTestURLRequestContextGetter(
- base::ThreadTaskRunnerHandle::Get(), hanging_url().host()));
- }
-
- // Creates a URLRequestContextGetter with a URLRequestContext that lives on
- // a separate network thread.
- scoped_refptr<FetcherTestURLRequestContextGetter>
- CreateCrossThreadContextGetter() {
- if (!network_thread_) {
- network_thread_ = std::make_unique<base::Thread>("network thread");
- base::Thread::Options network_thread_options;
- network_thread_options.message_pump_type = base::MessagePumpType::IO;
- bool result =
- network_thread_->StartWithOptions(std::move(network_thread_options));
- CHECK(result);
- }
-
- return scoped_refptr<FetcherTestURLRequestContextGetter>(
- new FetcherTestURLRequestContextGetter(network_thread_->task_runner(),
- hanging_url().host()));
- }
-
- // Callback passed to URLFetcher to create upload stream by some tests.
- std::unique_ptr<UploadDataStream> CreateUploadStream() {
- ++num_upload_streams_created_;
- std::vector<char> buffer(
- kCreateUploadStreamBody,
- kCreateUploadStreamBody + strlen(kCreateUploadStreamBody));
- return ElementsUploadDataStream::CreateWithReader(
- std::unique_ptr<UploadElementReader>(
- new UploadOwnedBytesElementReader(&buffer)),
- 0);
- }
-
- // Number of streams created by CreateUploadStream.
- size_t num_upload_streams_created() const {
- return num_upload_streams_created_;
- }
-
- // Downloads |file_to_fetch| and checks the contents when done. If
- // |save_to_temporary_file| is true, saves it to a temporary file, and
- // |requested_out_path| is ignored. Otherwise, saves it to
- // |requested_out_path|. Takes ownership of the file if |take_ownership| is
- // true. Deletes file when done.
- void SaveFileTest(const char* file_to_fetch,
- bool save_to_temporary_file,
- const base::FilePath& requested_out_path,
- bool take_ownership) {
- std::unique_ptr<WaitingURLFetcherDelegate> delegate(
- new WaitingURLFetcherDelegate());
- delegate->CreateFetcher(
- test_server_->GetURL(std::string(kTestServerFilePrefix) +
- file_to_fetch),
- URLFetcher::GET, CreateSameThreadContextGetter());
- if (save_to_temporary_file) {
- delegate->fetcher()->SaveResponseToTemporaryFile(
- scoped_refptr<base::SequencedTaskRunner>(
- base::SequencedTaskRunnerHandle::Get()));
- } else {
- delegate->fetcher()->SaveResponseToFileAtPath(
- requested_out_path, scoped_refptr<base::SequencedTaskRunner>(
- base::SequencedTaskRunnerHandle::Get()));
- }
- delegate->StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate->fetcher()->GetError());
- EXPECT_EQ(200, delegate->fetcher()->GetResponseCode());
-
- base::FilePath out_path;
- EXPECT_TRUE(
- delegate->fetcher()->GetResponseAsFilePath(take_ownership, &out_path));
- if (!save_to_temporary_file) {
- EXPECT_EQ(requested_out_path, out_path);
- }
-
- base::FilePath server_root;
- base::PathService::Get(base::DIR_SOURCE_ROOT, &server_root);
-
- EXPECT_TRUE(base::ContentsEqual(
- server_root.Append(kDocRoot).AppendASCII(file_to_fetch), out_path));
-
- // Delete the delegate and run the message loop to give the fetcher's
- // destructor a chance to delete the file.
- delegate.reset();
- base::RunLoop().RunUntilIdle();
-
- // File should only exist if |take_ownership| was true.
- EXPECT_EQ(take_ownership, base::PathExists(out_path));
-
- // Cleanup.
- if (base::PathExists(out_path))
- base::DeleteFile(out_path);
- }
-
- // Returns a URL that hangs on DNS resolution when using a context created by
- // the test fixture.
- const GURL& hanging_url() const { return hanging_url_; }
-
- // testing::Test:
- void SetUp() override {
- SetUpServer();
- ASSERT_TRUE(test_server_->Start());
-
- // URL that will hang when lookups reach the host resolver.
- hanging_url_ = GURL(base::StringPrintf(
- "http://example.com:%d%s", test_server_->host_port_pair().port(),
- kDefaultResponsePath));
- ASSERT_TRUE(hanging_url_.is_valid());
- }
-
- // Initializes |test_server_| without starting it. Allows subclasses to use
- // their own server configuration.
- virtual void SetUpServer() {
- test_server_ = std::make_unique<EmbeddedTestServer>();
- test_server_->AddDefaultHandlers(base::FilePath(kDocRoot));
- }
-
- // Network thread for cross-thread tests. Most threads just use the main
- // thread for network activity.
- std::unique_ptr<base::Thread> network_thread_;
-
- std::unique_ptr<EmbeddedTestServer> test_server_;
- GURL hanging_url_;
-
- size_t num_upload_streams_created_ = 0;
-};
-
-namespace {
-
-// Version of URLFetcherTest that tests bad HTTPS requests.
-class URLFetcherBadHTTPSTest : public URLFetcherTest {
- public:
- URLFetcherBadHTTPSTest() = default;
-
- // URLFetcherTest:
- void SetUpServer() override {
- test_server_ = std::make_unique<EmbeddedTestServer>(
- net::EmbeddedTestServer::TYPE_HTTPS);
- test_server_->SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
- test_server_->ServeFilesFromSourceDirectory("net/data/ssl");
- }
-};
-
-// Verifies that the fetcher succesfully fetches resources over proxy, and
-// correctly returns the value of the proxy server used.
-TEST_F(URLFetcherTest, FetchedUsingProxy) {
- WaitingURLFetcherDelegate delegate;
-
- scoped_refptr<net::FetcherTestURLRequestContextGetter> context_getter =
- CreateSameThreadContextGetter();
-
- const net::ProxyServer proxy_server(ProxyServer::SCHEME_HTTP,
- test_server_->host_port_pair());
-
- std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
- ProxyServerToPacResultElement(proxy_server),
- TRAFFIC_ANNOTATION_FOR_TESTS);
- context_getter->set_proxy_resolution_service(
- std::move(proxy_resolution_service));
-
- delegate.CreateFetcher(
- GURL(std::string("http://does.not.resolve.test") + kDefaultResponsePath),
- URLFetcher::GET, context_getter);
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kDefaultResponseBody, data);
-
- EXPECT_EQ(proxy_server, delegate.fetcher()->ProxyServerUsed());
-}
-
-// Create the fetcher on the main thread. Since network IO will happen on the
-// main thread, this will test URLFetcher's ability to do everything on one
-// thread.
-TEST_F(URLFetcherTest, SameThreadTest) {
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL(kDefaultResponsePath),
- URLFetcher::GET, CreateSameThreadContextGetter());
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kDefaultResponseBody, data);
-
- EXPECT_EQ(static_cast<int64_t>(strlen(kDefaultResponseBody)),
- delegate.fetcher()->GetReceivedResponseContentLength());
- std::string parsed_headers;
- base::ReplaceChars(delegate.fetcher()->GetResponseHeaders()->raw_headers(),
- std::string("\0", 1), "\n\r", &parsed_headers);
- EXPECT_EQ(static_cast<int64_t>(parsed_headers.size() +
- strlen(kDefaultResponseBody)),
- delegate.fetcher()->GetTotalReceivedBytes());
- EXPECT_EQ(ProxyServer::SCHEME_DIRECT,
- delegate.fetcher()->ProxyServerUsed().scheme());
-}
-
-// Create a separate thread that will create the URLFetcher. A separate thread
-// acts as the network thread.
-TEST_F(URLFetcherTest, DifferentThreadsTest) {
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL(kDefaultResponsePath),
- URLFetcher::GET, CreateCrossThreadContextGetter());
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kDefaultResponseBody, data);
-}
-
-// Verifies that a URLFetcher works correctly on a ThreadPool Sequence.
-TEST_F(URLFetcherTest, SequencedTaskTest) {
- auto sequenced_task_runner = base::ThreadPool::CreateSequencedTaskRunner({});
-
- // Since we cannot use StartFetchAndWait(), which runs a nested RunLoop owned
- // by the Delegate, in the ThreadPool, this test is split into two Callbacks,
- // both run on |sequenced_task_runner_|. The test main thread then runs its
- // own RunLoop, which the second of the Callbacks will quit.
- base::RunLoop run_loop;
-
- // Actually start the test fetch, on the Sequence.
- sequenced_task_runner->PostTask(
- FROM_HERE,
- base::BindOnce(
- [](scoped_refptr<FetcherTestURLRequestContextGetter> context_getter,
- const GURL& response_path, base::OnceClosure quit_closure) {
- std::unique_ptr<WaitingURLFetcherDelegate> delegate =
- std::make_unique<WaitingURLFetcherDelegate>();
- WaitingURLFetcherDelegate* raw_delegate = delegate.get();
-
- // Configure the delegate to run our |on_complete_closure_| rather
- // than quitting its own |run_loop_|, on completion.
- raw_delegate->set_on_complete_or_cancel_closure(base::BindOnce(
- [](base::OnceClosure quit_closure,
- std::unique_ptr<WaitingURLFetcherDelegate> delegate) {
- EXPECT_EQ(OK, delegate->fetcher()->GetError());
- EXPECT_EQ(200, delegate->fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate->fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kDefaultResponseBody, data);
- std::move(quit_closure).Run();
- },
- std::move(quit_closure), std::move(delegate)));
-
- raw_delegate->CreateFetcher(response_path, URLFetcher::GET,
- context_getter);
- raw_delegate->fetcher()->Start();
- },
- CreateCrossThreadContextGetter(),
- test_server_->GetURL(kDefaultResponsePath), run_loop.QuitClosure()));
-
- run_loop.Run();
- RunUntilIdle();
-}
-
-// Tests to make sure CancelAll() will successfully cancel existing URLFetchers.
-TEST_F(URLFetcherTest, CancelAll) {
- EXPECT_EQ(0, GetNumFetcherCores());
-
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
- // Force context creation.
- context_getter->GetURLRequestContext();
- MockHostResolver* mock_resolver = context_getter->mock_resolver();
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
- delegate.fetcher()->Start();
- // Wait for the request to reach the mock resolver and hang, to ensure the
- // request has actually started.
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(mock_resolver->has_pending_requests());
-
- EXPECT_EQ(1, URLFetcherTest::GetNumFetcherCores());
- URLFetcherImpl::CancelAll();
- EXPECT_EQ(0, URLFetcherTest::GetNumFetcherCores());
-}
-
-TEST_F(URLFetcherTest, DontRetryOnNetworkChangedByDefault) {
- EXPECT_EQ(0, GetNumFetcherCores());
-
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
- // Force context creation.
- context_getter->GetURLRequestContext();
- MockHostResolver* mock_resolver = context_getter->mock_resolver();
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
- EXPECT_FALSE(mock_resolver->has_pending_requests());
-
- // This posts a task to start the fetcher.
- delegate.fetcher()->Start();
- base::RunLoop().RunUntilIdle();
-
- // The fetcher is now running, but is pending the host resolve.
- EXPECT_EQ(1, GetNumFetcherCores());
- EXPECT_TRUE(mock_resolver->has_pending_requests());
- ASSERT_FALSE(delegate.did_complete());
-
- // A network change notification aborts the connect job.
- NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
- delegate.WaitForComplete();
- EXPECT_FALSE(mock_resolver->has_pending_requests());
-
- // And the owner of the fetcher gets the ERR_NETWORK_CHANGED error.
- EXPECT_EQ(hanging_url(), delegate.fetcher()->GetOriginalURL());
- EXPECT_THAT(delegate.fetcher()->GetError(), IsError(ERR_NETWORK_CHANGED));
-}
-
-TEST_F(URLFetcherTest, RetryOnNetworkChangedAndFail) {
- EXPECT_EQ(0, GetNumFetcherCores());
-
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
- // Force context creation.
- context_getter->GetURLRequestContext();
- MockHostResolver* mock_resolver = context_getter->mock_resolver();
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
- delegate.fetcher()->SetAutomaticallyRetryOnNetworkChanges(3);
- EXPECT_FALSE(mock_resolver->has_pending_requests());
-
- // This posts a task to start the fetcher.
- delegate.fetcher()->Start();
- base::RunLoop().RunUntilIdle();
-
- // The fetcher is now running, but is pending the host resolve.
- EXPECT_EQ(1, GetNumFetcherCores());
- EXPECT_TRUE(mock_resolver->has_pending_requests());
- ASSERT_FALSE(delegate.did_complete());
-
- // Make it fail 3 times.
- for (int i = 0; i < 3; ++i) {
- // A network change notification aborts the connect job.
- NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
- base::RunLoop().RunUntilIdle();
-
- // But the fetcher retries automatically.
- EXPECT_EQ(1, GetNumFetcherCores());
- EXPECT_TRUE(mock_resolver->has_pending_requests());
- ASSERT_FALSE(delegate.did_complete());
- }
-
- // A 4th failure doesn't trigger another retry, and propagates the error
- // to the owner of the fetcher.
- NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
- delegate.WaitForComplete();
- EXPECT_FALSE(mock_resolver->has_pending_requests());
-
- // And the owner of the fetcher gets the ERR_NETWORK_CHANGED error.
- EXPECT_EQ(hanging_url(), delegate.fetcher()->GetOriginalURL());
- EXPECT_THAT(delegate.fetcher()->GetError(), IsError(ERR_NETWORK_CHANGED));
-}
-
-TEST_F(URLFetcherTest, RetryOnNetworkChangedAndSucceed) {
- EXPECT_EQ(0, GetNumFetcherCores());
-
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
- // Force context creation.
- context_getter->GetURLRequestContext();
- MockHostResolver* mock_resolver = context_getter->mock_resolver();
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
- delegate.fetcher()->SetAutomaticallyRetryOnNetworkChanges(3);
- EXPECT_FALSE(mock_resolver->has_pending_requests());
-
- // This posts a task to start the fetcher.
- delegate.fetcher()->Start();
- base::RunLoop().RunUntilIdle();
-
- // The fetcher is now running, but is pending the host resolve.
- EXPECT_EQ(1, GetNumFetcherCores());
- EXPECT_TRUE(mock_resolver->has_pending_requests());
- ASSERT_FALSE(delegate.did_complete());
-
- // Make it fail 3 times.
- for (int i = 0; i < 3; ++i) {
- // A network change notification aborts the connect job.
- NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
- base::RunLoop().RunUntilIdle();
-
- // But the fetcher retries automatically.
- EXPECT_EQ(1, GetNumFetcherCores());
- EXPECT_TRUE(mock_resolver->has_pending_requests());
- ASSERT_FALSE(delegate.did_complete());
- }
-
- // Now let it succeed by resolving the pending request.
- mock_resolver->ResolveAllPending();
- delegate.WaitForComplete();
- EXPECT_FALSE(mock_resolver->has_pending_requests());
-
- // This time the request succeeded.
- EXPECT_EQ(hanging_url(), delegate.fetcher()->GetOriginalURL());
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
-
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kDefaultResponseBody, data);
-}
-
-TEST_F(URLFetcherTest, PostString) {
- const char kUploadData[] = "bobsyeruncle";
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL("/echo"), URLFetcher::POST,
- CreateSameThreadContextGetter());
- delegate.fetcher()->SetUploadData("application/x-www-form-urlencoded",
- kUploadData);
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kUploadData, data);
-}
-
-TEST_F(URLFetcherTest, PostEmptyString) {
- const char kUploadData[] = "";
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL("/echo"), URLFetcher::POST,
- CreateSameThreadContextGetter());
- delegate.fetcher()->SetUploadData("application/x-www-form-urlencoded",
- kUploadData);
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kUploadData, data);
-}
-
-TEST_F(URLFetcherTest, PostEntireFile) {
- base::FilePath upload_path = GetUploadFileTestPath();
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL("/echo"), URLFetcher::POST,
- CreateSameThreadContextGetter());
- delegate.fetcher()->SetUploadFilePath("application/x-www-form-urlencoded",
- upload_path, 0,
- std::numeric_limits<uint64_t>::max(),
- base::SequencedTaskRunnerHandle::Get());
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
-
- std::string expected;
- ASSERT_TRUE(base::ReadFileToString(upload_path, &expected));
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(expected, data);
-}
-
-TEST_F(URLFetcherTest, PostFileRange) {
- const size_t kRangeStart = 30;
- const size_t kRangeLength = 100;
- base::FilePath upload_path = GetUploadFileTestPath();
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL("/echo"), URLFetcher::POST,
- CreateSameThreadContextGetter());
- delegate.fetcher()->SetUploadFilePath("application/x-www-form-urlencoded",
- upload_path, kRangeStart, kRangeLength,
- base::SequencedTaskRunnerHandle::Get());
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
-
- std::string expected;
- ASSERT_TRUE(base::ReadFileToString(upload_path, &expected));
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(expected.substr(kRangeStart, kRangeLength), data);
-}
-
-TEST_F(URLFetcherTest, PostWithUploadStreamFactory) {
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL("/echo"), URLFetcher::POST,
- CreateSameThreadContextGetter());
- delegate.fetcher()->SetUploadStreamFactory(
- "text/plain", base::BindRepeating(&URLFetcherTest::CreateUploadStream,
- base::Unretained(this)));
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kCreateUploadStreamBody, data);
- EXPECT_EQ(1u, num_upload_streams_created());
-}
-
-TEST_F(URLFetcherTest, PostWithUploadStreamFactoryAndRetries) {
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL("/echo?status=500"),
- URLFetcher::POST, CreateSameThreadContextGetter());
- delegate.fetcher()->SetAutomaticallyRetryOn5xx(true);
- delegate.fetcher()->SetMaxRetriesOn5xx(1);
- delegate.fetcher()->SetUploadStreamFactory(
- "text/plain", base::BindRepeating(&URLFetcherTest::CreateUploadStream,
- base::Unretained(this)));
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(500, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kCreateUploadStreamBody, data);
- EXPECT_EQ(2u, num_upload_streams_created());
-}
-
-// Tests simple chunked POST case.
-TEST_F(URLFetcherTest, PostChunked) {
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateCrossThreadContextGetter());
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL("/echo"), URLFetcher::POST,
- CreateCrossThreadContextGetter());
-
- delegate.fetcher()->SetChunkedUpload("text/plain");
-
- // This posts a task to start the fetcher.
- delegate.fetcher()->Start();
-
- delegate.fetcher()->AppendChunkToUpload(kCreateUploadStreamBody, false);
- delegate.fetcher()->AppendChunkToUpload(kCreateUploadStreamBody, true);
-
- delegate.WaitForComplete();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(std::string(kCreateUploadStreamBody) +
- std::string(kCreateUploadStreamBody),
- data);
-}
-
-// Tests that data can be appended to a request after it fails. This is needed
-// because the consumer may try to append data to a request after it failed, but
-// before the consumer learns that it failed.
-TEST_F(URLFetcherTest, PostAppendChunkAfterError) {
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateCrossThreadContextGetter());
-
- WaitingURLFetcherDelegate delegate;
- // Request that will fail almost immediately after being started, due to using
- // a reserved port.
- delegate.CreateFetcher(GURL("http://127.0.0.1:7"), URLFetcher::POST,
- context_getter);
-
- delegate.fetcher()->SetChunkedUpload("text/plain");
-
- // This posts a task to start the fetcher.
- delegate.fetcher()->Start();
-
- // Give the request a chance to fail, and inform the fetcher of the failure,
- // while blocking the current thread so the error doesn't reach the delegate.
- base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-
- // Try to append data.
- delegate.fetcher()->AppendChunkToUpload("kCreateUploadStreamBody", false);
- delegate.fetcher()->AppendChunkToUpload("kCreateUploadStreamBody", true);
-
- delegate.WaitForComplete();
-
- // Make sure the request failed, as expected.
- EXPECT_THAT(delegate.fetcher()->GetError(), IsError(ERR_UNSAFE_PORT));
-}
-
-// Checks that upload progress increases over time, never exceeds what's already
-// been sent, and adds a chunk whenever all previously appended chunks have
-// been uploaded.
-class CheckUploadProgressDelegate : public WaitingURLFetcherDelegate {
- public:
- CheckUploadProgressDelegate() : chunk_(1 << 16, 'a') {}
-
- CheckUploadProgressDelegate(const CheckUploadProgressDelegate&) = delete;
- CheckUploadProgressDelegate& operator=(const CheckUploadProgressDelegate&) =
- delete;
-
- ~CheckUploadProgressDelegate() override = default;
-
- void OnURLFetchUploadProgress(const URLFetcher* source,
- int64_t current,
- int64_t total) override {
- // Run default checks.
- WaitingURLFetcherDelegate::OnURLFetchUploadProgress(source, current, total);
-
- EXPECT_LE(last_seen_progress_, current);
- EXPECT_LE(current, bytes_appended());
- last_seen_progress_ = current;
- MaybeAppendChunk();
- }
-
- // Append the next chunk if all previously appended chunks have been sent.
- void MaybeAppendChunk() {
- const int kNumChunks = 5;
- if (last_seen_progress_ == bytes_appended() &&
- num_chunks_appended_ < kNumChunks) {
- ++num_chunks_appended_;
- fetcher()->AppendChunkToUpload(chunk_,
- num_chunks_appended_ == kNumChunks);
- }
- }
-
- private:
- int64_t bytes_appended() const {
- return num_chunks_appended_ * chunk_.size();
- }
-
- const std::string chunk_;
-
- int64_t num_chunks_appended_ = 0;
- int64_t last_seen_progress_ = 0;
-};
-
-TEST_F(URLFetcherTest, UploadProgress) {
- CheckUploadProgressDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL("/echo"), URLFetcher::POST,
- CreateSameThreadContextGetter());
- // Use a chunked upload so that the upload can be paused after uploading data.
- // Since upload progress uses a timer, the delegate may not receive any
- // notification otherwise.
- delegate.fetcher()->SetChunkedUpload("application/x-www-form-urlencoded");
-
- delegate.fetcher()->Start();
- // Append the first chunk. Others will be appended automatically in response
- // to OnURLFetchUploadProgress events.
- delegate.MaybeAppendChunk();
- delegate.WaitForComplete();
-
- // Make sure there are no pending events that cause problems when run.
- base::RunLoop().RunUntilIdle();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- EXPECT_TRUE(delegate.did_complete());
-}
-
-// Checks that download progress never decreases, never exceeds file size, and
-// that file size is correctly reported.
-class CheckDownloadProgressDelegate : public WaitingURLFetcherDelegate {
- public:
- explicit CheckDownloadProgressDelegate(int64_t file_size)
- : file_size_(file_size) {}
-
- CheckDownloadProgressDelegate(const CheckDownloadProgressDelegate&) = delete;
- CheckDownloadProgressDelegate& operator=(
- const CheckDownloadProgressDelegate&) = delete;
-
- ~CheckDownloadProgressDelegate() override = default;
-
- void OnURLFetchDownloadProgress(const URLFetcher* source,
- int64_t current,
- int64_t total,
- int64_t current_network_bytes) override {
- // Run default checks.
- WaitingURLFetcherDelegate::OnURLFetchDownloadProgress(
- source, current, total, current_network_bytes);
-
- EXPECT_LE(last_seen_progress_, current);
- EXPECT_EQ(file_size_, total);
- last_seen_progress_ = current;
- }
-
- private:
- int64_t file_size_;
- int64_t last_seen_progress_ = 0;
-};
-
-TEST_F(URLFetcherTest, DownloadProgress) {
- // Get a file large enough to require more than one read into
- // URLFetcher::Core's IOBuffer.
- const char kFileToFetch[] = "animate1.gif";
-
- std::string file_contents;
-
- base::FilePath server_root;
- base::PathService::Get(base::DIR_SOURCE_ROOT, &server_root);
-
- ASSERT_TRUE(base::ReadFileToString(
- server_root.Append(kDocRoot).AppendASCII(kFileToFetch), &file_contents));
-
- CheckDownloadProgressDelegate delegate(file_contents.size());
- delegate.CreateFetcher(
- test_server_->GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
- URLFetcher::GET, CreateSameThreadContextGetter());
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(file_contents, data);
-}
-
-class CancelOnUploadProgressDelegate : public WaitingURLFetcherDelegate {
- public:
- CancelOnUploadProgressDelegate() = default;
-
- CancelOnUploadProgressDelegate(const CancelOnUploadProgressDelegate&) =
- delete;
- CancelOnUploadProgressDelegate& operator=(
- const CancelOnUploadProgressDelegate&) = delete;
-
- ~CancelOnUploadProgressDelegate() override = default;
-
- void OnURLFetchUploadProgress(const URLFetcher* source,
- int64_t current,
- int64_t total) override {
- CancelFetch();
- }
-};
-
-// Check that a fetch can be safely cancelled/deleted during an upload progress
-// callback.
-TEST_F(URLFetcherTest, CancelInUploadProgressCallback) {
- CancelOnUploadProgressDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL("/echo"), URLFetcher::POST,
- CreateSameThreadContextGetter());
- delegate.fetcher()->SetChunkedUpload("application/x-www-form-urlencoded");
- delegate.fetcher()->Start();
- // Use a chunked upload so that the upload can be paused after uploading data.
- // Since uploads progress uses a timer, may not receive any notification,
- // otherwise.
- std::string upload_data(1 << 16, 'a');
- delegate.fetcher()->AppendChunkToUpload(upload_data, false);
- delegate.WaitForComplete();
-
- // Make sure there are no pending events that cause problems when run.
- base::RunLoop().RunUntilIdle();
-
- EXPECT_FALSE(delegate.did_complete());
- EXPECT_FALSE(delegate.fetcher());
-}
-
-class CancelOnDownloadProgressDelegate : public WaitingURLFetcherDelegate {
- public:
- CancelOnDownloadProgressDelegate() = default;
-
- CancelOnDownloadProgressDelegate(const CancelOnDownloadProgressDelegate&) =
- delete;
- CancelOnDownloadProgressDelegate& operator=(
- const CancelOnDownloadProgressDelegate&) = delete;
-
- ~CancelOnDownloadProgressDelegate() override = default;
-
- void OnURLFetchDownloadProgress(const URLFetcher* source,
- int64_t current,
- int64_t total,
- int64_t current_network_bytes) override {
- CancelFetch();
- }
-};
-
-// Check that a fetch can be safely cancelled/deleted during a download progress
-// callback.
-TEST_F(URLFetcherTest, CancelInDownloadProgressCallback) {
- // Get a file large enough to require more than one read into
- // URLFetcher::Core's IOBuffer.
- static const char kFileToFetch[] = "animate1.gif";
- CancelOnDownloadProgressDelegate delegate;
- delegate.CreateFetcher(
- test_server_->GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
- URLFetcher::GET, CreateSameThreadContextGetter());
- delegate.StartFetcherAndWait();
-
- // Make sure there are no pending events that cause problems when run.
- base::RunLoop().RunUntilIdle();
-
- EXPECT_FALSE(delegate.did_complete());
- EXPECT_FALSE(delegate.fetcher());
-}
-
-TEST_F(URLFetcherTest, Headers) {
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(
- test_server_->GetURL("/set-header?cache-control: private"),
- URLFetcher::GET, CreateSameThreadContextGetter());
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string header;
- ASSERT_TRUE(delegate.fetcher()->GetResponseHeaders()->GetNormalizedHeader(
- "cache-control", &header));
- EXPECT_EQ("private", header);
-}
-
-TEST_F(URLFetcherTest, SocketAddress) {
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL(kDefaultResponsePath),
- URLFetcher::GET, CreateSameThreadContextGetter());
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- EXPECT_EQ(test_server_->host_port_pair().port(),
- delegate.fetcher()->GetSocketAddress().port());
- EXPECT_EQ(test_server_->host_port_pair().host(),
- delegate.fetcher()->GetSocketAddress().ToStringWithoutPort());
-}
-
-TEST_F(URLFetcherTest, StopOnRedirect) {
- const char kRedirectTarget[] = "http://redirect.target.com";
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(
- test_server_->GetURL(std::string("/server-redirect?") + kRedirectTarget),
- URLFetcher::GET, CreateSameThreadContextGetter());
- delegate.fetcher()->SetStopOnRedirect(true);
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(GURL(kRedirectTarget), delegate.fetcher()->GetURL());
- EXPECT_THAT(delegate.fetcher()->GetError(), IsError(ERR_ABORTED));
- EXPECT_EQ(301, delegate.fetcher()->GetResponseCode());
- ASSERT_TRUE(delegate.fetcher()->GetResponseHeaders());
- EXPECT_TRUE(delegate.fetcher()->GetResponseHeaders()->HasHeaderValue(
- "Location", std::string(kRedirectTarget)));
-}
-
-TEST_F(URLFetcherTest, ThrottleOnRepeatedFetches) {
- base::Time start_time = Time::Now();
- GURL url(test_server_->GetURL(kDefaultResponsePath));
-
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
-
- // Registers an entry for test url. It only allows 3 requests to be sent
- // in 200 milliseconds.
- context_getter->AddThrottlerEntry(
- url, std::string() /* url_id */, 200 /* sliding_window_period_ms */,
- 3 /* max_send_threshold */, 1 /* initial_backoff_ms */,
- 2.0 /* multiply_factor */, 0.0 /* jitter_factor */,
- 256 /* maximum_backoff_ms */,
- false /* reserve_sending_time_for_next_request*/);
-
- for (int i = 0; i < 20; ++i) {
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(url, URLFetcher::GET, context_getter);
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- }
-
- // 20 requests were sent. Due to throttling, they should have collectively
- // taken over 1 second.
- EXPECT_GE(Time::Now() - start_time, base::Seconds(1));
-}
-
-// If throttling kicks in for a chunked upload, there should be no crash.
-TEST_F(URLFetcherTest, ThrottleChunkedUpload) {
- GURL url(test_server_->GetURL("/echo"));
-
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
-
- // Registers an entry for test url. It only allows 3 requests to be sent
- // in 200 milliseconds.
- context_getter->AddThrottlerEntry(
- url, std::string() /* url_id */, 200 /* sliding_window_period_ms */,
- 3 /* max_send_threshold */, 1 /* initial_backoff_ms */,
- 2.0 /* multiply_factor */, 0.0 /* jitter_factor */,
- 256 /* maximum_backoff_ms */,
- false /* reserve_sending_time_for_next_request*/);
-
- for (int i = 0; i < 20; ++i) {
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(url, URLFetcher::POST, context_getter);
- delegate.fetcher()->SetChunkedUpload("text/plain");
- delegate.fetcher()->Start();
- delegate.fetcher()->AppendChunkToUpload(kCreateUploadStreamBody, true);
- delegate.WaitForComplete();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ(kCreateUploadStreamBody, data);
- }
-}
-
-TEST_F(URLFetcherTest, ThrottleOn5xxRetries) {
- base::Time start_time = Time::Now();
- GURL url(test_server_->GetURL("/server-unavailable.html"));
-
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
-
- // Registers an entry for test url. The backoff time is calculated by:
- // new_backoff = 2.0 * old_backoff + 0
- // and maximum backoff time is 256 milliseconds.
- // Maximum retries allowed is set to 11.
- context_getter->AddThrottlerEntry(
- url, std::string() /* url_id */, 200 /* sliding_window_period_ms */,
- 3 /* max_send_threshold */, 1 /* initial_backoff_ms */,
- 2.0 /* multiply_factor */, 0.0 /* jitter_factor */,
- 256 /* maximum_backoff_ms */,
- false /* reserve_sending_time_for_next_request*/);
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(url, URLFetcher::GET, context_getter);
- delegate.fetcher()->SetAutomaticallyRetryOn5xx(true);
- delegate.fetcher()->SetMaxRetriesOn5xx(11);
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(503, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_FALSE(data.empty());
-
- // The request should have been retried 11 times (12 times including the first
- // attempt). Due to throttling, they should have collectively taken over 1
- // second.
- EXPECT_GE(Time::Now() - start_time, base::Seconds(1));
-}
-
-// Tests overload protection, when responses passed through.
-TEST_F(URLFetcherTest, ProtectTestPassedThrough) {
- base::Time start_time = Time::Now();
- GURL url(test_server_->GetURL("/server-unavailable.html"));
-
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
-
- // Registers an entry for test url. The backoff time is calculated by:
- // new_backoff = 2.0 * old_backoff + 0
- // and maximum backoff time is 150000 milliseconds.
- // Maximum retries allowed is set to 11.
- // Total time if *not* for not doing automatic backoff would be 150s.
- // In reality it should be "as soon as server responds".
- context_getter->AddThrottlerEntry(
- url, std::string() /* url_id */, 200 /* sliding_window_period_ms */,
- 3 /* max_send_threshold */, 10000 /* initial_backoff_ms */,
- 2.0 /* multiply_factor */, 0.0 /* jitter_factor */,
- 150000 /* maximum_backoff_ms */,
- false /* reserve_sending_time_for_next_request*/);
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(url, URLFetcher::GET, context_getter);
- delegate.fetcher()->SetAutomaticallyRetryOn5xx(false);
- delegate.fetcher()->SetMaxRetriesOn5xx(11);
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(503, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_FALSE(data.empty());
- EXPECT_GT(delegate.fetcher()->GetBackoffDelay().InMicroseconds(), 0);
-
- // The request should not have been retried at all. If it had attempted all
- // 11 retries, that should have taken 2.5 minutes.
- EXPECT_TRUE(Time::Now() - start_time < base::Minutes(1));
-}
-
-// Used to check if a callback has been invoked.
-void SetBoolToTrue(bool* ptr) {
- *ptr = true;
-}
-
-// Make sure that the URLFetcher cancels the URLRequest and releases its context
-// getter pointer synchronously when the fetcher and request context live on
-// the same thread.
-TEST_F(URLFetcherTest, CancelSameThread) {
- WaitingURLFetcherDelegate delegate;
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
- bool getter_was_destroyed = false;
- context_getter->set_on_destruction_callback(
- base::BindOnce(&SetBoolToTrue, &getter_was_destroyed));
- delegate.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
-
- // The getter won't be destroyed if the test holds on to a reference to it.
- context_getter = nullptr;
-
- delegate.fetcher()->Start();
- // Give the fetcher a chance to start the request.
- base::RunLoop().RunUntilIdle();
- EXPECT_EQ(1, URLFetcherTest::GetNumFetcherCores());
-
- // On same-thread cancel, the request should be canceled and getter destroyed
- // synchronously, for safe shutdown.
- delegate.CancelFetch();
- EXPECT_EQ(0, URLFetcherTest::GetNumFetcherCores());
- EXPECT_TRUE(getter_was_destroyed);
-}
-
-// Make sure that the URLFetcher releases its context getter pointer on
-// cancellation, cross-thread case.
-TEST_F(URLFetcherTest, CancelDifferentThreads) {
- base::RunLoop run_loop;
-
- WaitingURLFetcherDelegate delegate;
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateCrossThreadContextGetter());
- context_getter->set_on_destruction_callback(
- base::BindOnce(base::IgnoreResult(&base::SequencedTaskRunner::PostTask),
- base::SequencedTaskRunnerHandle::Get(), FROM_HERE,
- run_loop.QuitClosure()));
- delegate.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
-
- // The getter won't be destroyed if the test holds on to a reference to it.
- context_getter = nullptr;
-
- delegate.fetcher()->Start();
- delegate.CancelFetch();
- run_loop.Run();
-
- EXPECT_FALSE(delegate.did_complete());
-}
-
-TEST_F(URLFetcherTest, CancelWhileDelayedByThrottleDifferentThreads) {
- GURL url = test_server_->GetURL(kDefaultResponsePath);
- base::RunLoop run_loop;
-
- WaitingURLFetcherDelegate delegate;
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateCrossThreadContextGetter());
- context_getter->set_on_destruction_callback(
- base::BindOnce(base::IgnoreResult(&base::SequencedTaskRunner::PostTask),
- base::SequencedTaskRunnerHandle::Get(), FROM_HERE,
- run_loop.QuitClosure()));
- delegate.CreateFetcher(url, URLFetcher::GET, context_getter);
-
- // Register an entry for test url using a sliding window of 400 seconds, and
- // max of 1 request. Also simulate a request having just started, so the
- // next request will be affected by backoff of ~400 seconds.
- context_getter->AddThrottlerEntry(
- url, std::string() /* url_id */, 400000 /* sliding_window_period_ms */,
- 1 /* max_send_threshold */, 200000 /* initial_backoff_ms */,
- 2.0 /* multiply_factor */, 0.0 /* jitter_factor */,
- 400000 /* maximum_backoff_ms */,
- true /* reserve_sending_time_for_next_request*/);
-
- // The getter won't be destroyed if the test holds on to a reference to it.
- context_getter = nullptr;
-
- delegate.fetcher()->Start();
- delegate.CancelFetch();
- run_loop.Run();
-
- EXPECT_FALSE(delegate.did_complete());
-}
-
-// A URLFetcherDelegate that expects to receive a response body of "request1"
-// and then reuses the fetcher for the same URL, setting the "test" request
-// header to "request2".
-class ReuseFetcherDelegate : public WaitingURLFetcherDelegate {
- public:
- // |second_request_context_getter| is the context getter used for the second
- // request. Can't reuse the old one because fetchers release it on completion.
- ReuseFetcherDelegate(
- scoped_refptr<URLRequestContextGetter> second_request_context_getter)
- : second_request_context_getter_(second_request_context_getter) {}
-
- ReuseFetcherDelegate(const ReuseFetcherDelegate&) = delete;
- ReuseFetcherDelegate& operator=(const ReuseFetcherDelegate&) = delete;
-
- ~ReuseFetcherDelegate() override = default;
-
- void OnURLFetchComplete(const URLFetcher* source) override {
- EXPECT_EQ(fetcher(), source);
- if (!first_request_complete_) {
- first_request_complete_ = true;
- EXPECT_EQ(OK, fetcher()->GetError());
- EXPECT_EQ(200, fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(fetcher()->GetResponseAsString(&data));
- EXPECT_EQ("request1", data);
-
- fetcher()->SetRequestContext(second_request_context_getter_.get());
- fetcher()->ClearExtraRequestHeaders();
- fetcher()->AddExtraRequestHeader("test", "request2");
- fetcher()->Start();
- return;
- }
- WaitingURLFetcherDelegate::OnURLFetchComplete(source);
- }
-
- private:
- bool first_request_complete_ = false;
- scoped_refptr<URLRequestContextGetter> second_request_context_getter_;
-};
-
-TEST_F(URLFetcherTest, ReuseFetcherForSameURL) {
- // TODO(mmenke): It's really weird that this is supported, particularly
- // some fields can be modified between requests, but some (Like upload body)
- // cannot be. Can we get rid of support for this?
- scoped_refptr<URLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
- ReuseFetcherDelegate delegate(context_getter);
- delegate.CreateFetcher(test_server_->GetURL("/echoheader?test"),
- URLFetcher::GET, context_getter);
- delegate.fetcher()->ClearExtraRequestHeaders();
- delegate.fetcher()->AddExtraRequestHeader("test", "request1");
- delegate.StartFetcherAndWait();
-
- EXPECT_EQ(OK, delegate.fetcher()->GetError());
- EXPECT_EQ(200, delegate.fetcher()->GetResponseCode());
- std::string data;
- ASSERT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_EQ("request2", data);
-}
-
-TEST_F(URLFetcherTest, ShutdownSameThread) {
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateSameThreadContextGetter());
-
- // Create a fetcher and wait for it to create a request.
- WaitingURLFetcherDelegate delegate1;
- delegate1.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
- delegate1.fetcher()->Start();
- // Need to spin the loop to ensure the URLRequest is created and started.
- base::RunLoop().RunUntilIdle();
-
- // Create and start another fetcher, but don't wait for it to start. The task
- // to start the request should be in the message loop.
- WaitingURLFetcherDelegate delegate2;
- delegate2.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
- delegate2.fetcher()->Start();
-
- // Check that shutting down the getter cancels the request synchronously,
- // allowing the context to be destroyed.
- context_getter->Shutdown();
-
- // Wait for the first fetcher, make sure it failed.
- delegate1.WaitForComplete();
- EXPECT_THAT(delegate1.fetcher()->GetError(), IsError(ERR_CONTEXT_SHUT_DOWN));
-
- // Wait for the second fetcher, make sure it failed.
- delegate2.WaitForComplete();
- EXPECT_THAT(delegate2.fetcher()->GetError(), IsError(ERR_CONTEXT_SHUT_DOWN));
-
- // New fetchers should automatically fail without making new requests. This
- // should follow the same path as the second fetcher, but best to be safe.
- WaitingURLFetcherDelegate delegate3;
- delegate3.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
- delegate3.fetcher()->Start();
- delegate3.WaitForComplete();
- EXPECT_THAT(delegate3.fetcher()->GetError(), IsError(ERR_CONTEXT_SHUT_DOWN));
-}
-
-TEST_F(URLFetcherTest, ShutdownCrossThread) {
- scoped_refptr<FetcherTestURLRequestContextGetter> context_getter(
- CreateCrossThreadContextGetter());
-
- WaitingURLFetcherDelegate delegate1;
- delegate1.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
- delegate1.fetcher()->Start();
- // Check that shutting the context getter lets the context be destroyed safely
- // and cancels the request.
- context_getter->Shutdown();
- delegate1.WaitForComplete();
- EXPECT_THAT(delegate1.fetcher()->GetError(), IsError(ERR_CONTEXT_SHUT_DOWN));
-
- // New requests should automatically fail without making new requests.
- WaitingURLFetcherDelegate delegate2;
- delegate2.CreateFetcher(hanging_url(), URLFetcher::GET, context_getter);
- delegate2.StartFetcherAndWait();
- EXPECT_THAT(delegate2.fetcher()->GetError(), IsError(ERR_CONTEXT_SHUT_DOWN));
-}
-
-// Get a small file.
-TEST_F(URLFetcherTest, FileTestSmallGet) {
- const char kFileToFetch[] = "simple.html";
-
- base::ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- base::FilePath out_path = temp_dir.GetPath().AppendASCII(kFileToFetch);
- SaveFileTest(kFileToFetch, false, out_path, false);
-}
-
-// Get a file large enough to require more than one read into URLFetcher::Core's
-// IOBuffer.
-TEST_F(URLFetcherTest, FileTestLargeGet) {
- const char kFileToFetch[] = "animate1.gif";
-
- base::ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- base::FilePath out_path = temp_dir.GetPath().AppendASCII(kFileToFetch);
- SaveFileTest(kFileToFetch, false, out_path, false);
-}
-
-// If the caller takes the ownership of the output file, the file should persist
-// even after URLFetcher is gone.
-TEST_F(URLFetcherTest, FileTestTakeOwnership) {
- const char kFileToFetch[] = "simple.html";
-
- base::ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- base::FilePath out_path = temp_dir.GetPath().AppendASCII(kFileToFetch);
- SaveFileTest(kFileToFetch, false, out_path, true);
-}
-
-// Test that an existing file can be overwritten be a fetcher.
-TEST_F(URLFetcherTest, FileTestOverwriteExisting) {
- base::ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
- // Create a file before trying to fetch.
- const char kFileToFetch[] = "simple.html";
- std::string data(10000, '?'); // Meant to be larger than simple.html.
- base::FilePath out_path = temp_dir.GetPath().AppendASCII(kFileToFetch);
- ASSERT_EQ(static_cast<int>(data.size()),
- base::WriteFile(out_path, data.data(), data.size()));
- ASSERT_TRUE(base::PathExists(out_path));
-
- SaveFileTest(kFileToFetch, false, out_path, true);
-}
-
-// Test trying to overwrite a directory with a file when using a fetcher fails.
-TEST_F(URLFetcherTest, FileTestTryToOverwriteDirectory) {
- base::ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
- // Create a directory before trying to fetch.
- static const char kFileToFetch[] = "simple.html";
- base::FilePath out_path = temp_dir.GetPath().AppendASCII(kFileToFetch);
- ASSERT_TRUE(base::CreateDirectory(out_path));
- ASSERT_TRUE(base::PathExists(out_path));
-
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(
- test_server_->GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
- URLFetcher::GET, CreateSameThreadContextGetter());
- delegate.fetcher()->SaveResponseToFileAtPath(
- out_path, scoped_refptr<base::SequencedTaskRunner>(
- base::SequencedTaskRunnerHandle::Get()));
- delegate.StartFetcherAndWait();
-
- EXPECT_THAT(delegate.fetcher()->GetError(), IsError(ERR_ACCESS_DENIED));
-}
-
-// Get a small file and save it to a temp file.
-TEST_F(URLFetcherTest, TempFileTestSmallGet) {
- SaveFileTest("simple.html", true, base::FilePath(), false);
-}
-
-// Get a file large enough to require more than one read into URLFetcher::Core's
-// IOBuffer and save it to a temp file.
-TEST_F(URLFetcherTest, TempFileTestLargeGet) {
- SaveFileTest("animate1.gif", true, base::FilePath(), false);
-}
-
-// If the caller takes the ownership of the temp file, check that the file
-// persists even after URLFetcher is gone.
-TEST_F(URLFetcherTest, TempFileTestTakeOwnership) {
- SaveFileTest("simple.html", true, base::FilePath(), true);
-}
-
-TEST_F(URLFetcherBadHTTPSTest, BadHTTPS) {
- WaitingURLFetcherDelegate delegate;
- delegate.CreateFetcher(test_server_->GetURL(kDefaultResponsePath),
- URLFetcher::GET, CreateSameThreadContextGetter());
- delegate.StartFetcherAndWait();
-
- EXPECT_THAT(delegate.fetcher()->GetError(), IsError(ERR_ABORTED));
- EXPECT_EQ(-1, delegate.fetcher()->GetResponseCode());
- EXPECT_FALSE(delegate.fetcher()->GetResponseHeaders());
- std::string data;
- EXPECT_TRUE(delegate.fetcher()->GetResponseAsString(&data));
- EXPECT_TRUE(data.empty());
-}
-
-} // namespace
-
-} // namespace net
diff --git a/chromium/net/url_request/url_fetcher_response_writer.cc b/chromium/net/url_request/url_fetcher_response_writer.cc
deleted file mode 100644
index b3064d92038..00000000000
--- a/chromium/net/url_request/url_fetcher_response_writer.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright (c) 2013 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.
-
-#include "net/url_request/url_fetcher_response_writer.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/files/file_util.h"
-#include "base/location.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/task/task_runner_util.h"
-#include "net/base/file_stream.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-
-namespace net {
-
-URLFetcherStringWriter* URLFetcherResponseWriter::AsStringWriter() {
- return nullptr;
-}
-
-URLFetcherFileWriter* URLFetcherResponseWriter::AsFileWriter() {
- return nullptr;
-}
-
-URLFetcherStringWriter::URLFetcherStringWriter() = default;
-
-URLFetcherStringWriter::~URLFetcherStringWriter() = default;
-
-int URLFetcherStringWriter::Initialize(CompletionOnceCallback callback) {
- data_.clear();
- return OK;
-}
-
-int URLFetcherStringWriter::Write(IOBuffer* buffer,
- int num_bytes,
- CompletionOnceCallback callback) {
- data_.append(buffer->data(), num_bytes);
- return num_bytes;
-}
-
-int URLFetcherStringWriter::Finish(int net_error,
- CompletionOnceCallback callback) {
- // Do nothing.
- return OK;
-}
-
-URLFetcherStringWriter* URLFetcherStringWriter::AsStringWriter() {
- return this;
-}
-
-URLFetcherFileWriter::URLFetcherFileWriter(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner,
- const base::FilePath& file_path)
- : file_task_runner_(file_task_runner), file_path_(file_path) {
- DCHECK(file_task_runner_.get());
-}
-
-URLFetcherFileWriter::~URLFetcherFileWriter() {
- CloseAndDeleteFile();
-}
-
-int URLFetcherFileWriter::Initialize(CompletionOnceCallback callback) {
- DCHECK(!callback_);
-
- file_stream_ = std::make_unique<FileStream>(file_task_runner_);
-
- int result = ERR_IO_PENDING;
- owns_file_ = true;
- if (file_path_.empty()) {
- base::FilePath* temp_file_path = new base::FilePath;
- base::PostTaskAndReplyWithResult(
- file_task_runner_.get(), FROM_HERE,
- base::BindOnce(&base::CreateTemporaryFile, temp_file_path),
- base::BindOnce(&URLFetcherFileWriter::DidCreateTempFile,
- weak_factory_.GetWeakPtr(),
- base::Owned(temp_file_path)));
- } else {
- result =
- file_stream_->Open(file_path_,
- base::File::FLAG_WRITE | base::File::FLAG_ASYNC |
- base::File::FLAG_CREATE_ALWAYS,
- base::BindOnce(&URLFetcherFileWriter::OnIOCompleted,
- weak_factory_.GetWeakPtr()));
- DCHECK_NE(OK, result);
- }
-
- if (result == ERR_IO_PENDING) {
- callback_ = std::move(callback);
- return result;
- }
- if (result < 0)
- CloseAndDeleteFile();
- return result;
-}
-
-int URLFetcherFileWriter::Write(IOBuffer* buffer,
- int num_bytes,
- CompletionOnceCallback callback) {
- DCHECK(file_stream_) << "Call Initialize() first.";
- DCHECK(owns_file_);
- DCHECK(!callback_);
-
- int result =
- file_stream_->Write(buffer, num_bytes,
- base::BindOnce(&URLFetcherFileWriter::OnIOCompleted,
- weak_factory_.GetWeakPtr()));
- if (result == ERR_IO_PENDING) {
- callback_ = std::move(callback);
- return result;
- }
- if (result < 0)
- CloseAndDeleteFile();
- return result;
-}
-
-int URLFetcherFileWriter::Finish(int net_error,
- CompletionOnceCallback callback) {
- DCHECK_NE(ERR_IO_PENDING, net_error);
-
- // If an error occurred, simply delete the file after any pending operation
- // is done. Do not call file_stream_->Close() because there might be an
- // operation pending. See crbug.com/487732.
- if (net_error < 0) {
- // Cancel callback and invalid weak ptrs so as to cancel any posted task.
- callback_.Reset();
- weak_factory_.InvalidateWeakPtrs();
- CloseAndDeleteFile();
- return OK;
- }
- DCHECK(!callback_);
- // If the file_stream_ still exists at this point, close it.
- if (file_stream_) {
- int result = file_stream_->Close(base::BindOnce(
- &URLFetcherFileWriter::CloseComplete, weak_factory_.GetWeakPtr()));
- if (result == ERR_IO_PENDING) {
- callback_ = std::move(callback);
- return result;
- }
- file_stream_.reset();
- return result;
- }
- return OK;
-}
-
-URLFetcherFileWriter* URLFetcherFileWriter::AsFileWriter() {
- return this;
-}
-
-void URLFetcherFileWriter::DisownFile() {
- // Disowning is done by the delegate's OnURLFetchComplete method.
- // The file should be closed by the time that method is called.
- DCHECK(!file_stream_);
-
- owns_file_ = false;
-}
-
-void URLFetcherFileWriter::CloseAndDeleteFile() {
- if (!owns_file_)
- return;
-
- file_stream_.reset();
- DisownFile();
- file_task_runner_->PostTask(FROM_HERE,
- base::GetDeleteFileCallback(file_path_));
-}
-
-void URLFetcherFileWriter::DidCreateTempFile(base::FilePath* temp_file_path,
- bool success) {
- if (!success) {
- OnIOCompleted(ERR_FILE_NOT_FOUND);
- return;
- }
- file_path_ = *temp_file_path;
- const int result = file_stream_->Open(
- file_path_,
- base::File::FLAG_WRITE | base::File::FLAG_ASYNC | base::File::FLAG_OPEN,
- base::BindOnce(&URLFetcherFileWriter::OnIOCompleted,
- weak_factory_.GetWeakPtr()));
- if (result != ERR_IO_PENDING)
- OnIOCompleted(result);
-}
-
-void URLFetcherFileWriter::OnIOCompleted(int result) {
- if (result < OK)
- CloseAndDeleteFile();
-
- if (!callback_.is_null())
- std::move(callback_).Run(result);
-}
-
-void URLFetcherFileWriter::CloseComplete(int result) {
- // Destroy |file_stream_| whether or not the close succeeded.
- file_stream_.reset();
- if (!callback_.is_null())
- std::move(callback_).Run(result);
-}
-
-} // namespace net
diff --git a/chromium/net/url_request/url_fetcher_response_writer.h b/chromium/net/url_request/url_fetcher_response_writer.h
deleted file mode 100644
index 474087c35fa..00000000000
--- a/chromium/net/url_request/url_fetcher_response_writer.h
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2013 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.
-
-#ifndef NET_URL_REQUEST_URL_FETCHER_RESPONSE_WRITER_H_
-#define NET_URL_REQUEST_URL_FETCHER_RESPONSE_WRITER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/files/file_path.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "net/base/completion_once_callback.h"
-#include "net/base/net_export.h"
-
-namespace base {
-class SequencedTaskRunner;
-} // namespace base
-
-namespace net {
-
-class FileStream;
-class IOBuffer;
-class URLFetcherFileWriter;
-class URLFetcherStringWriter;
-
-// This class encapsulates all state involved in writing URLFetcher response
-// bytes to the destination.
-class NET_EXPORT URLFetcherResponseWriter {
- public:
- virtual ~URLFetcherResponseWriter() {}
-
- // Initializes this instance. Returns an error code defined in
- // //net/base/net_errors.h. If ERR_IO_PENDING is returned, |callback| will be
- // run later with the result. If anything else is returned, |callback| will
- // *not* be called. Calling this method again after a Initialize() success
- // results in discarding already written data.
- virtual int Initialize(CompletionOnceCallback callback) = 0;
-
- // Writes |num_bytes| bytes in |buffer|, and returns the number of bytes
- // written or an error code defined in //net/base/net_errors.h. If
- // ERR_IO_PENDING is returned, |callback| will be run later with the result.
- // If anything else is returned, |callback| will *not* be called.
- virtual int Write(IOBuffer* buffer,
- int num_bytes,
- CompletionOnceCallback callback) = 0;
-
- // Finishes writing. If |net_error| is not OK, this method can be called
- // in the middle of another operation (eg. Initialize() and Write()). On
- // errors (|net_error| not OK), this method may be called before the previous
- // operation completed. In this case, URLFetcherResponseWriter may skip
- // graceful shutdown and completion of the pending operation. After such a
- // failure, the URLFetcherResponseWriter may be reused. Returns an error code
- // defined in //net/base/net_errors.h. If ERR_IO_PENDING is returned,
- // |callback| will be run later with the result. If anything else is returned,
- // |callback| will *not* be called.
- virtual int Finish(int net_error, CompletionOnceCallback callback) = 0;
-
- // Returns this instance's pointer as URLFetcherStringWriter when possible.
- virtual URLFetcherStringWriter* AsStringWriter();
-
- // Returns this instance's pointer as URLFetcherFileWriter when possible.
- virtual URLFetcherFileWriter* AsFileWriter();
-};
-
-// URLFetcherResponseWriter implementation for std::string.
-class NET_EXPORT URLFetcherStringWriter : public URLFetcherResponseWriter {
- public:
- URLFetcherStringWriter();
-
- URLFetcherStringWriter(const URLFetcherStringWriter&) = delete;
- URLFetcherStringWriter& operator=(const URLFetcherStringWriter&) = delete;
-
- ~URLFetcherStringWriter() override;
-
- const std::string& data() const { return data_; }
-
- // URLFetcherResponseWriter overrides:
- int Initialize(CompletionOnceCallback callback) override;
- int Write(IOBuffer* buffer,
- int num_bytes,
- CompletionOnceCallback callback) override;
- int Finish(int net_error, CompletionOnceCallback callback) override;
- URLFetcherStringWriter* AsStringWriter() override;
-
- private:
- std::string data_;
-};
-
-// URLFetcherResponseWriter implementation for files.
-class NET_EXPORT URLFetcherFileWriter : public URLFetcherResponseWriter {
- public:
- // |file_path| is used as the destination path. If |file_path| is empty,
- // Initialize() will create a temporary file. The destination file is deleted
- // when a URLFetcherFileWriter instance is destructed unless DisownFile() is
- // called.
- URLFetcherFileWriter(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner,
- const base::FilePath& file_path);
-
- URLFetcherFileWriter(const URLFetcherFileWriter&) = delete;
- URLFetcherFileWriter& operator=(const URLFetcherFileWriter&) = delete;
-
- ~URLFetcherFileWriter() override;
-
- const base::FilePath& file_path() const { return file_path_; }
-
- // URLFetcherResponseWriter overrides:
- int Initialize(CompletionOnceCallback callback) override;
- int Write(IOBuffer* buffer,
- int num_bytes,
- CompletionOnceCallback callback) override;
- int Finish(int net_error, CompletionOnceCallback callback) override;
- URLFetcherFileWriter* AsFileWriter() override;
-
- // Drops ownership of the file at |file_path_|.
- // This class will not delete it or write to it again.
- void DisownFile();
-
- private:
- // Closes the file if it is open and then delete it.
- void CloseAndDeleteFile();
-
- // Callback which gets the result of a temporary file creation.
- void DidCreateTempFile(base::FilePath* temp_file_path, bool success);
-
- // Run |callback_| if it is non-null when FileStream::Open or
- // FileStream::Write is completed.
- void OnIOCompleted(int result);
-
- // Callback which gets the result of closing a file.
- void CloseComplete(int result);
-
- // Task runner on which file operations should happen.
- scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
-
- // Destination file path.
- // Initialize() creates a temporary file if this variable is empty.
- base::FilePath file_path_;
-
- // True when this instance is responsible to delete the file at |file_path_|.
- bool owns_file_ = false;
-
- std::unique_ptr<FileStream> file_stream_;
-
- CompletionOnceCallback callback_;
-
- base::WeakPtrFactory<URLFetcherFileWriter> weak_factory_{this};
-};
-
-} // namespace net
-
-#endif // NET_URL_REQUEST_URL_FETCHER_RESPONSE_WRITER_H_
diff --git a/chromium/net/url_request/url_fetcher_response_writer_unittest.cc b/chromium/net/url_request/url_fetcher_response_writer_unittest.cc
deleted file mode 100644
index 89faf9786fa..00000000000
--- a/chromium/net/url_request/url_fetcher_response_writer_unittest.cc
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2014 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.
-
-#include "net/url_request/url_fetcher_response_writer.h"
-
-#include <memory>
-
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/base/test_completion_callback.h"
-#include "net/test/gtest_util.h"
-#include "net/test/test_with_task_environment.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/platform_test.h"
-
-using net::test::IsOk;
-
-namespace net {
-
-namespace {
-
-const char kData[] = "Hello!";
-
-} // namespace
-
-class URLFetcherStringWriterTest : public PlatformTest {
- protected:
- void SetUp() override {
- writer_ = std::make_unique<URLFetcherStringWriter>();
- buf_ = base::MakeRefCounted<StringIOBuffer>(kData);
- }
-
- std::unique_ptr<URLFetcherStringWriter> writer_;
- scoped_refptr<StringIOBuffer> buf_;
-};
-
-TEST_F(URLFetcherStringWriterTest, Basic) {
- int rv = 0;
- // Initialize(), Write() and Finish().
- TestCompletionCallback callback;
- rv = writer_->Initialize(callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
- rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
- EXPECT_EQ(buf_->size(), callback.GetResult(rv));
- rv = writer_->Finish(OK, callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
-
- // Verify the result.
- EXPECT_EQ(kData, writer_->data());
-
- // Initialize() again to reset.
- rv = writer_->Initialize(callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
- EXPECT_TRUE(writer_->data().empty());
-}
-
-class URLFetcherFileWriterTest : public PlatformTest,
- public WithTaskEnvironment {
- protected:
- void SetUp() override {
- PlatformTest::SetUp();
- ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
- file_path_ = temp_dir_.GetPath().AppendASCII("test.txt");
- writer_ = std::make_unique<URLFetcherFileWriter>(
- base::ThreadTaskRunnerHandle::Get(), file_path_);
- buf_ = base::MakeRefCounted<StringIOBuffer>(kData);
- }
-
- void TearDown() override {
- ASSERT_TRUE(temp_dir_.Delete());
- PlatformTest::TearDown();
- }
-
- base::ScopedTempDir temp_dir_;
- base::FilePath file_path_;
- std::unique_ptr<URLFetcherFileWriter> writer_;
- scoped_refptr<StringIOBuffer> buf_;
-};
-
-TEST_F(URLFetcherFileWriterTest, WriteToFile) {
- int rv = 0;
- // Initialize(), Write() and Finish().
- TestCompletionCallback callback;
- rv = writer_->Initialize(callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
- rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
- EXPECT_EQ(buf_->size(), callback.GetResult(rv));
- rv = writer_->Finish(OK, callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
-
- // Verify the result.
- EXPECT_EQ(file_path_.value(), writer_->file_path().value());
- std::string file_contents;
- EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents));
- EXPECT_EQ(kData, file_contents);
-
- // Destroy the writer. File should be deleted.
- writer_.reset();
- base::RunLoop().RunUntilIdle();
- EXPECT_FALSE(base::PathExists(file_path_));
-}
-
-TEST_F(URLFetcherFileWriterTest, InitializeAgain) {
- int rv = 0;
- // Initialize(), Write() and Finish().
- TestCompletionCallback callback;
- rv = writer_->Initialize(callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
- rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
- EXPECT_EQ(buf_->size(), callback.GetResult(rv));
- rv = writer_->Finish(OK, callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
-
- // Verify the result.
- std::string file_contents;
- EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents));
- EXPECT_EQ(kData, file_contents);
-
- // Initialize() again to reset. Write different data.
- const std::string data2 = "Bye!";
- scoped_refptr<StringIOBuffer> buf2 =
- base::MakeRefCounted<StringIOBuffer>(data2);
-
- rv = writer_->Initialize(callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
- rv = writer_->Write(buf2.get(), buf2->size(), callback.callback());
- EXPECT_EQ(buf2->size(), callback.GetResult(rv));
- rv = writer_->Finish(OK, callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
-
- // Verify the result.
- file_contents.clear();
- EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents));
- EXPECT_EQ(data2, file_contents);
-}
-
-TEST_F(URLFetcherFileWriterTest, FinishWhileWritePending) {
- int rv = 0;
- // Initialize(), Write() and Finish().
- TestCompletionCallback callback;
- rv = writer_->Initialize(callback.callback());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_THAT(callback.WaitForResult(), IsOk());
- TestCompletionCallback callback2;
- rv = writer_->Write(buf_.get(), buf_->size(), callback2.callback());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- TestCompletionCallback callback3;
- rv = writer_->Finish(ERR_FAILED, callback3.callback());
- EXPECT_EQ(OK, rv);
-
- base::RunLoop().RunUntilIdle();
- // Verify the result.
- EXPECT_FALSE(base::PathExists(file_path_));
-}
-
-TEST_F(URLFetcherFileWriterTest, FinishWhileOpenPending) {
- int rv = 0;
- // Initialize() and Finish().
- TestCompletionCallback callback;
- rv = writer_->Initialize(callback.callback());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- TestCompletionCallback callback2;
- rv = writer_->Finish(ERR_FAILED, callback2.callback());
- EXPECT_EQ(OK, rv);
-
- base::RunLoop().RunUntilIdle();
- // Verify the result.
- EXPECT_FALSE(base::PathExists(file_path_));
-}
-
-TEST_F(URLFetcherFileWriterTest, InitializeAgainAfterFinishWithError) {
- int rv = 0;
- // Initialize(), Write() and Finish().
- TestCompletionCallback callback;
- rv = writer_->Initialize(callback.callback());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_THAT(callback.WaitForResult(), IsOk());
- TestCompletionCallback callback2;
- rv = writer_->Write(buf_.get(), buf_->size(), callback2.callback());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- TestCompletionCallback callback3;
- rv = writer_->Finish(ERR_FAILED, callback3.callback());
- EXPECT_EQ(OK, rv);
-
- base::RunLoop().RunUntilIdle();
- // Initialize() again and wait for it to complete.
- TestCompletionCallback callback4;
- rv = writer_->Initialize(callback4.callback());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_THAT(callback4.WaitForResult(), IsOk());
- // Verify the result.
- EXPECT_TRUE(base::PathExists(file_path_));
-
- // Destroy the writer and allow all files to be closed.
- writer_.reset();
- base::RunLoop().RunUntilIdle();
-}
-
-TEST_F(URLFetcherFileWriterTest, DisownFile) {
- int rv = 0;
- // Initialize() and Finish() to create a file.
- TestCompletionCallback callback;
- rv = writer_->Initialize(callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
- rv = writer_->Finish(OK, callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
-
- // Disown file.
- writer_->DisownFile();
-
- // File is not deleted even after the writer gets destroyed.
- writer_.reset();
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(base::PathExists(file_path_));
-}
-
-class URLFetcherFileWriterTemporaryFileTest : public PlatformTest,
- public WithTaskEnvironment {
- protected:
- void SetUp() override {
- writer_ = std::make_unique<URLFetcherFileWriter>(
- base::ThreadTaskRunnerHandle::Get(), base::FilePath());
- buf_ = base::MakeRefCounted<StringIOBuffer>(kData);
- }
-
- std::unique_ptr<URLFetcherFileWriter> writer_;
- scoped_refptr<StringIOBuffer> buf_;
-};
-
-TEST_F(URLFetcherFileWriterTemporaryFileTest, WriteToTemporaryFile) {
- int rv = 0;
- // Initialize(), Write() and Finish().
- TestCompletionCallback callback;
- rv = writer_->Initialize(callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
- rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
- EXPECT_EQ(buf_->size(), callback.GetResult(rv));
- rv = writer_->Finish(OK, callback.callback());
- EXPECT_THAT(callback.GetResult(rv), IsOk());
-
- // Verify the result.
- std::string file_contents;
- EXPECT_TRUE(base::ReadFileToString(writer_->file_path(), &file_contents));
- EXPECT_EQ(kData, file_contents);
-
- // Destroy the writer. File should be deleted.
- const base::FilePath file_path = writer_->file_path();
- writer_.reset();
- base::RunLoop().RunUntilIdle();
- EXPECT_FALSE(base::PathExists(file_path));
-}
-
-} // namespace net
diff --git a/chromium/net/url_request/url_request.cc b/chromium/net/url_request/url_request.cc
index 59c2435ac0c..ccb85ec9ff8 100644
--- a/chromium/net/url_request/url_request.cc
+++ b/chromium/net/url_request/url_request.cc
@@ -283,37 +283,37 @@ LoadStateWithParam URLRequest::GetLoadState() const {
}
base::Value URLRequest::GetStateAsValue() const {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("url", original_url().possibly_invalid_spec());
+ base::Value::Dict dict;
+ dict.Set("url", original_url().possibly_invalid_spec());
if (url_chain_.size() > 1) {
base::Value list(base::Value::Type::LIST);
for (const GURL& url : url_chain_) {
list.Append(url.possibly_invalid_spec());
}
- dict.SetKey("url_chain", std::move(list));
+ dict.Set("url_chain", std::move(list));
}
- dict.SetIntKey("load_flags", load_flags_);
+ dict.Set("load_flags", load_flags_);
LoadStateWithParam load_state = GetLoadState();
- dict.SetIntKey("load_state", load_state.state);
+ dict.Set("load_state", load_state.state);
if (!load_state.param.empty())
- dict.SetStringKey("load_state_param", load_state.param);
+ dict.Set("load_state_param", load_state.param);
if (!blocked_by_.empty())
- dict.SetStringKey("delegate_blocked_by", blocked_by_);
+ dict.Set("delegate_blocked_by", blocked_by_);
- dict.SetStringKey("method", method_);
- dict.SetStringKey("network_isolation_key",
- isolation_info_.network_isolation_key().ToDebugString());
- dict.SetBoolKey("has_upload", has_upload());
- dict.SetBoolKey("is_pending", is_pending_);
+ dict.Set("method", method_);
+ dict.Set("network_isolation_key",
+ isolation_info_.network_isolation_key().ToDebugString());
+ dict.Set("has_upload", has_upload());
+ dict.Set("is_pending", is_pending_);
- dict.SetIntKey("traffic_annotation", traffic_annotation_.unique_id_hash_code);
+ dict.Set("traffic_annotation", traffic_annotation_.unique_id_hash_code);
if (status_ != OK)
- dict.SetIntKey("net_error", status_);
- return dict;
+ dict.Set("net_error", status_);
+ return base::Value(std::move(dict));
}
void URLRequest::LogBlockedBy(const char* blocked_by) {
@@ -808,6 +808,7 @@ int URLRequest::NotifyConnected(const TransportInfo& info,
void URLRequest::NotifyReceivedRedirect(const RedirectInfo& redirect_info,
bool* defer_redirect) {
+ DCHECK_EQ(OK, status_);
is_redirecting_ = true;
OnCallToDelegate(NetLogEventType::URL_REQUEST_DELEGATE_RECEIVED_REDIRECT);
delegate_->OnReceivedRedirect(this, redirect_info, defer_redirect);
@@ -1019,6 +1020,7 @@ void URLRequest::SetPriority(RequestPriority priority) {
void URLRequest::NotifyAuthRequired(
std::unique_ptr<AuthChallengeInfo> auth_info) {
+ DCHECK_EQ(OK, status_);
DCHECK(auth_info);
// Check that there are no callbacks to already failed or cancelled requests.
DCHECK(!failed());
@@ -1047,9 +1049,7 @@ bool URLRequest::CanSetCookie(const net::CanonicalCookie& cookie,
DCHECK(!(load_flags_ & LOAD_DO_NOT_SAVE_COOKIES));
bool can_set_cookies = g_default_can_use_cookies;
if (network_delegate()) {
- can_set_cookies =
- network_delegate()->CanSetCookie(*this, cookie, options,
- /*allowed_from_caller=*/true);
+ can_set_cookies = network_delegate()->CanSetCookie(*this, cookie, options);
}
if (!can_set_cookies)
net_log_.AddEvent(NetLogEventType::COOKIE_SET_BLOCKED_BY_NETWORK_DELEGATE);
@@ -1080,6 +1080,10 @@ void URLRequest::NotifyReadCompleted(int bytes_read) {
}
void URLRequest::OnHeadersComplete() {
+ // The URLRequest status should still be IO_PENDING, which it was set to
+ // before the URLRequestJob was started. On error or cancellation, this
+ // method should not be called.
+ DCHECK_EQ(ERR_IO_PENDING, status_);
set_status(OK);
// Cache load timing information now, as information will be lost once the
// socket is closed and the ClientSocketHandle is Reset, which will happen
diff --git a/chromium/net/url_request/url_request.h b/chromium/net/url_request/url_request.h
index 10840b06182..532ce5207e6 100644
--- a/chromium/net/url_request/url_request.h
+++ b/chromium/net/url_request/url_request.h
@@ -85,13 +85,6 @@ class X509Certificate;
//
class NET_EXPORT URLRequest : public base::SupportsUserData {
public:
- // Callback function implemented by protocol handlers to create new jobs.
- // The factory may return NULL to indicate an error, which will cause other
- // factories to be queried. If no factory handles the request, then the
- // default job will be used.
- typedef URLRequestJob*(ProtocolFactory)(URLRequest* request,
- const std::string& scheme);
-
// Max number of http redirects to follow. The Fetch spec says: "If
// request's redirect count is twenty, return a network error."
// https://fetch.spec.whatwg.org/#http-redirect-fetch
@@ -208,7 +201,7 @@ class NET_EXPORT URLRequest : public base::SupportsUserData {
virtual void OnReadCompleted(URLRequest* request, int bytes_read) = 0;
protected:
- virtual ~Delegate() {}
+ virtual ~Delegate() = default;
};
URLRequest(const URLRequest&) = delete;
@@ -715,12 +708,6 @@ class NET_EXPORT URLRequest : public base::SupportsUserData {
return traffic_annotation_;
}
- bool Supports(const net::SourceStream::SourceType& type) const {
- if (!accepted_stream_types_)
- return true;
- return accepted_stream_types_->contains(type);
- }
-
const absl::optional<base::flat_set<net::SourceStream::SourceType>>&
accepted_stream_types() const {
return accepted_stream_types_;
@@ -1061,8 +1048,8 @@ class NET_EXPORT URLRequest : public base::SupportsUserData {
int pervasive_payloads_index_for_logging_ = -1;
// A SHA-256 checksum of the response and selected headers, stored as
- // upper-case hexadecimal. This is only used if the
- // LOAD_USE_SINGLE_KEYED_CACHE flag is set. On failure to match the cache
+ // upper-case hexadecimal. If this is set to a non-empty value the transaction
+ // will attempt to use the single-keyed cache. On failure to match the cache
// entry will be marked as unusable and will not be re-used.
std::string expected_response_checksum_;
diff --git a/chromium/net/url_request/url_request_context.cc b/chromium/net/url_request/url_request_context.cc
index f14a84efeae..a2fd9ff84a0 100644
--- a/chromium/net/url_request/url_request_context.cc
+++ b/chromium/net/url_request/url_request_context.cc
@@ -32,7 +32,7 @@ namespace net {
URLRequestContext::URLRequestContext(
base::PassKey<URLRequestContextBuilder> pass_key)
: url_requests_(std::make_unique<std::set<const URLRequest*>>()),
- bound_network_(NetworkChangeNotifier::kInvalidNetworkHandle) {}
+ bound_network_(handles::kInvalidNetworkHandle) {}
URLRequestContext::~URLRequestContext() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
diff --git a/chromium/net/url_request/url_request_context.h b/chromium/net/url_request/url_request_context.h
index 7795b87134b..68a212dac89 100644
--- a/chromium/net/url_request/url_request_context.h
+++ b/chromium/net/url_request/url_request_context.h
@@ -21,7 +21,7 @@
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
+#include "net/base/network_handle.h"
#include "net/base/request_priority.h"
#include "net/log/net_log_source.h"
#include "net/net_buildflags.h"
@@ -227,11 +227,9 @@ class NET_EXPORT URLRequestContext {
return require_network_isolation_key_;
}
- // If != NetworkChangeNotifier::kInvalidNetworkHandle, the network which this
+ // If != handles::kInvalidNetworkHandle, the network which this
// context has been bound to.
- NetworkChangeNotifier::NetworkHandle bound_network() const {
- return bound_network_;
- }
+ handles::NetworkHandle bound_network() const { return bound_network_; }
void AssertCalledOnValidThread() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -319,34 +317,42 @@ class NET_EXPORT URLRequestContext {
void set_require_network_isolation_key(bool require_network_isolation_key) {
require_network_isolation_key_ = require_network_isolation_key;
}
- void set_bound_network(NetworkChangeNotifier::NetworkHandle network) {
+ void set_bound_network(handles::NetworkHandle network) {
bound_network_ = network;
}
// Ownership for these members are not defined here. Clients should either
// provide storage elsewhere or have a subclass take ownership.
raw_ptr<NetLog> net_log_ = nullptr;
- raw_ptr<HostResolver> host_resolver_ = nullptr;
- raw_ptr<CertVerifier> cert_verifier_ = nullptr;
- raw_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_ = nullptr;
- raw_ptr<ProxyResolutionService> proxy_resolution_service_ = nullptr;
+ raw_ptr<HostResolver, DanglingUntriaged> host_resolver_ = nullptr;
+ raw_ptr<CertVerifier, DanglingUntriaged> cert_verifier_ = nullptr;
+ raw_ptr<HttpAuthHandlerFactory, DanglingUntriaged>
+ http_auth_handler_factory_ = nullptr;
+ raw_ptr<ProxyResolutionService, DanglingUntriaged> proxy_resolution_service_ =
+ nullptr;
raw_ptr<ProxyDelegate> proxy_delegate_ = nullptr;
- raw_ptr<SSLConfigService> ssl_config_service_ = nullptr;
- raw_ptr<NetworkDelegate> network_delegate_ = nullptr;
- raw_ptr<HttpServerProperties> http_server_properties_ = nullptr;
- raw_ptr<const HttpUserAgentSettings> http_user_agent_settings_ = nullptr;
- raw_ptr<CookieStore> cookie_store_ = nullptr;
- raw_ptr<TransportSecurityState> transport_security_state_ = nullptr;
- raw_ptr<CTPolicyEnforcer> ct_policy_enforcer_ = nullptr;
- raw_ptr<SCTAuditingDelegate> sct_auditing_delegate_ = nullptr;
- raw_ptr<HttpTransactionFactory> http_transaction_factory_ = nullptr;
- raw_ptr<const URLRequestJobFactory> job_factory_ = nullptr;
+ raw_ptr<SSLConfigService, DanglingUntriaged> ssl_config_service_ = nullptr;
+ raw_ptr<NetworkDelegate, DanglingUntriaged> network_delegate_ = nullptr;
+ raw_ptr<HttpServerProperties, DanglingUntriaged> http_server_properties_ =
+ nullptr;
+ raw_ptr<const HttpUserAgentSettings, DanglingUntriaged>
+ http_user_agent_settings_ = nullptr;
+ raw_ptr<CookieStore, DanglingUntriaged> cookie_store_ = nullptr;
+ raw_ptr<TransportSecurityState, DanglingUntriaged> transport_security_state_ =
+ nullptr;
+ raw_ptr<CTPolicyEnforcer, DanglingUntriaged> ct_policy_enforcer_ = nullptr;
+ raw_ptr<SCTAuditingDelegate, DanglingUntriaged> sct_auditing_delegate_ =
+ nullptr;
+ raw_ptr<HttpTransactionFactory, DanglingUntriaged> http_transaction_factory_ =
+ nullptr;
+ raw_ptr<const URLRequestJobFactory, DanglingUntriaged> job_factory_ = nullptr;
raw_ptr<URLRequestThrottlerManager> throttler_manager_ = nullptr;
- raw_ptr<QuicContext> quic_context_ = nullptr;
+ raw_ptr<QuicContext, DanglingUntriaged> quic_context_ = nullptr;
raw_ptr<NetworkQualityEstimator> network_quality_estimator_ = nullptr;
#if BUILDFLAG(ENABLE_REPORTING)
- raw_ptr<ReportingService> reporting_service_ = nullptr;
- raw_ptr<NetworkErrorLoggingService> network_error_logging_service_ = nullptr;
+ raw_ptr<ReportingService, DanglingUntriaged> reporting_service_ = nullptr;
+ raw_ptr<NetworkErrorLoggingService, DanglingUntriaged>
+ network_error_logging_service_ = nullptr;
#endif // BUILDFLAG(ENABLE_REPORTING)
std::unique_ptr<std::set<const URLRequest*>> url_requests_;
@@ -361,7 +367,7 @@ class NET_EXPORT URLRequestContext {
// a request when true.
bool require_network_isolation_key_ = false;
- NetworkChangeNotifier::NetworkHandle bound_network_;
+ handles::NetworkHandle bound_network_;
THREAD_CHECKER(thread_checker_);
};
diff --git a/chromium/net/url_request/url_request_context_builder.cc b/chromium/net/url_request/url_request_context_builder.cc
index d8a383a69dd..50c1b5a964d 100644
--- a/chromium/net/url_request/url_request_context_builder.cc
+++ b/chromium/net/url_request/url_request_context_builder.cc
@@ -310,7 +310,8 @@ void URLRequestContextBuilder::SetCreateHttpTransactionFactoryCallback(
}
void URLRequestContextBuilder::BindToNetwork(
- NetworkChangeNotifier::NetworkHandle network) {
+ handles::NetworkHandle network,
+ absl::optional<HostResolver::ManagerOptions> options) {
#if BUILDFLAG(IS_ANDROID)
DCHECK(NetworkChangeNotifier::AreNetworkHandlesSupported());
// DNS lookups for this context will need to target `network`. NDK to do that
@@ -321,6 +322,7 @@ void URLRequestContextBuilder::BindToNetwork(
CHECK(base::android::BuildInfo::GetInstance()->sdk_int() >=
base::android::SDK_VERSION_MARSHMALLOW);
bound_network_ = network;
+ manager_options_ = options.value_or(manager_options_);
#else
NOTIMPLEMENTED();
#endif // BUILDFLAG(IS_ANDROID)
@@ -356,8 +358,8 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() {
context->set_net_log(NetLog::Get());
}
- if (bound_network_ != NetworkChangeNotifier::kInvalidNetworkHandle) {
- DCHECK(!client_socket_factory_);
+ if (bound_network_ != handles::kInvalidNetworkHandle) {
+ DCHECK(!client_socket_factory_raw_);
DCHECK(!host_resolver_);
DCHECK(!host_resolver_manager_);
DCHECK(!host_resolver_factory_);
@@ -371,11 +373,8 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() {
set_client_socket_factory(client_socket_factory.get());
storage->set_client_socket_factory(std::move(client_socket_factory));
- HostResolver::ManagerOptions manager_options;
- manager_options.insecure_dns_client_enabled = false;
- manager_options.additional_types_via_insecure_dns_enabled = false;
host_resolver_ = HostResolver::CreateStandaloneNetworkBoundResolver(
- context->net_log(), bound_network_, manager_options);
+ context->net_log(), bound_network_, manager_options_);
if (!quic_context_)
set_quic_context(std::make_unique<QuicContext>());
@@ -394,6 +393,10 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() {
http_network_session_params_.ignore_ip_address_changes = true;
}
+ if (client_socket_factory_) {
+ storage->set_client_socket_factory(std::move(client_socket_factory_));
+ }
+
if (host_resolver_) {
DCHECK(host_mapping_rules_.empty());
DCHECK(!host_resolver_manager_);
@@ -440,8 +443,8 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() {
if (cookie_store_set_by_client_) {
storage->set_cookie_store(std::move(cookie_store_));
} else {
- std::unique_ptr<CookieStore> cookie_store(new CookieMonster(
- nullptr /* store */, context->net_log(), first_party_sets_enabled_));
+ auto cookie_store = std::make_unique<CookieMonster>(
+ nullptr /* store */, context->net_log(), first_party_sets_enabled_);
storage->set_cookie_store(std::move(cookie_store));
}
@@ -502,11 +505,11 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() {
if (!proxy_resolution_service_) {
#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
// TODO(willchan): Switch to using this code when
- // ConfiguredProxyResolutionService::CreateSystemProxyConfigService()'s
+ // ProxyConfigService::CreateSystemProxyConfigService()'s
// signature doesn't suck.
if (!proxy_config_service_) {
proxy_config_service_ =
- ConfiguredProxyResolutionService::CreateSystemProxyConfigService(
+ ProxyConfigService::CreateSystemProxyConfigService(
base::ThreadTaskRunnerHandle::Get().get());
}
#endif // !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) &&
@@ -567,7 +570,7 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() {
SetHttpNetworkSessionComponents(
context.get(), &network_session_context,
suppress_setting_socket_performance_watcher_factory_for_testing_,
- client_socket_factory_);
+ client_socket_factory_raw_);
storage->set_http_network_session(std::make_unique<HttpNetworkSession>(
http_network_session_params_, network_session_context));
diff --git a/chromium/net/url_request/url_request_context_builder.h b/chromium/net/url_request/url_request_context_builder.h
index 572a7642eab..cec74606d04 100644
--- a/chromium/net/url_request/url_request_context_builder.h
+++ b/chromium/net/url_request/url_request_context_builder.h
@@ -30,8 +30,8 @@
#include "build/build_config.h"
#include "build/buildflag.h"
#include "net/base/net_export.h"
-#include "net/base/network_change_notifier.h"
#include "net/base/network_delegate.h"
+#include "net/base/network_handle.h"
#include "net/base/proxy_delegate.h"
#include "net/disk_cache/disk_cache.h"
#include "net/dns/host_resolver.h"
@@ -40,15 +40,14 @@
#include "net/network_error_logging/network_error_logging_service.h"
#include "net/proxy_resolution/proxy_config_service.h"
#include "net/proxy_resolution/proxy_resolution_service.h"
+#include "net/socket/client_socket_factory.h"
#include "net/ssl/ssl_config_service.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h"
#include "net/url_request/url_request_job_factory.h"
-namespace base {
-namespace android {
+namespace base::android {
class ApplicationStatusListener;
-}
-} // namespace base
+} // namespace base::android
namespace net {
@@ -345,14 +344,24 @@ class NET_EXPORT URLRequestContextBuilder {
set_client_socket_factory(client_socket_factory_for_testing);
}
+ // Sets a ClientSocketFactory when the network service sandbox is enabled. The
+ // unique_ptr is moved to a URLRequestContextStorage once Build() is called.
+ void set_client_socket_factory(
+ std::unique_ptr<ClientSocketFactory> client_socket_factory) {
+ set_client_socket_factory(client_socket_factory.get());
+ client_socket_factory_ = std::move(client_socket_factory);
+ }
+
// Binds the context to `network`. All requests scheduled through the context
// built by this builder will be sent using `network`. Requests will fail if
- // `network` disconnects.
+ // `network` disconnects. `options` allows to specify the ManagerOptions that
+ // will be passed to the special purpose HostResolver created internally.
// This also imposes some limitations on the context capabilities:
- // * Currently, URLs will only be resolved using the System DNS.
// * By design, QUIC connection migration will be turned off.
// Only implemented for Android (API level > 23).
- void BindToNetwork(NetworkChangeNotifier::NetworkHandle network);
+ void BindToNetwork(
+ handles::NetworkHandle network,
+ absl::optional<HostResolver::ManagerOptions> options = absl::nullopt);
// Creates a mostly self-contained URLRequestContext. May only be called once
// per URLRequestContextBuilder. After this is called, the Builder can be
@@ -391,7 +400,7 @@ class NET_EXPORT URLRequestContextBuilder {
// URLRequestContext that will be built.
// `client_socket_factory` must outlive the context.
void set_client_socket_factory(ClientSocketFactory* client_socket_factory) {
- client_socket_factory_ = client_socket_factory;
+ client_socket_factory_raw_ = client_socket_factory;
}
bool enable_brotli_ = false;
@@ -409,8 +418,10 @@ class NET_EXPORT URLRequestContextBuilder {
bool suppress_setting_socket_performance_watcher_factory_for_testing_ = false;
bool first_party_sets_enabled_ = false;
- NetworkChangeNotifier::NetworkHandle bound_network_ =
- NetworkChangeNotifier::kInvalidNetworkHandle;
+ handles::NetworkHandle bound_network_ = handles::kInvalidNetworkHandle;
+ // Used only if the context is bound to a network to customize the
+ // HostResolver created internally.
+ HostResolver::ManagerOptions manager_options_;
HttpCacheParams http_cache_params_;
HttpNetworkSessionParams http_network_session_params_;
@@ -435,6 +446,7 @@ class NET_EXPORT URLRequestContextBuilder {
std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer_;
std::unique_ptr<SCTAuditingDelegate> sct_auditing_delegate_;
std::unique_ptr<QuicContext> quic_context_;
+ std::unique_ptr<ClientSocketFactory> client_socket_factory_ = nullptr;
#if BUILDFLAG(ENABLE_REPORTING)
std::unique_ptr<ReportingService> reporting_service_;
std::unique_ptr<ReportingPolicy> reporting_policy_;
@@ -447,7 +459,7 @@ class NET_EXPORT URLRequestContextBuilder {
std::map<std::string, std::unique_ptr<URLRequestJobFactory::ProtocolHandler>>
protocol_handlers_;
- raw_ptr<ClientSocketFactory> client_socket_factory_ = nullptr;
+ raw_ptr<ClientSocketFactory> client_socket_factory_raw_ = nullptr;
};
} // namespace net
diff --git a/chromium/net/url_request/url_request_context_builder_unittest.cc b/chromium/net/url_request/url_request_context_builder_unittest.cc
index 4180b9eebce..effeb506bb1 100644
--- a/chromium/net/url_request/url_request_context_builder_unittest.cc
+++ b/chromium/net/url_request/url_request_context_builder_unittest.cc
@@ -290,7 +290,7 @@ TEST_F(URLRequestContextBuilderTest, BindToNetworkFinalConfiguration) {
// The actual network handle doesn't really matter, this test just wants to
// check that all the pieces are in place and configured correctly.
- constexpr NetworkChangeNotifier::NetworkHandle network = 2;
+ constexpr handles::NetworkHandle network = 2;
auto scoped_mock_network_change_notifier =
std::make_unique<test::ScopedMockNetworkChangeNotifier>();
test::MockNetworkChangeNotifier* mock_ncn =
@@ -325,6 +325,38 @@ TEST_F(URLRequestContextBuilderTest, BindToNetworkFinalConfiguration) {
#endif // BUILDFLAG(IS_ANDROID)
}
+TEST_F(URLRequestContextBuilderTest, BindToNetworkCustomManagerOptions) {
+#if BUILDFLAG(IS_ANDROID)
+ if (base::android::BuildInfo::GetInstance()->sdk_int() <
+ base::android::SDK_VERSION_MARSHMALLOW) {
+ GTEST_SKIP()
+ << "BindToNetwork is supported starting from Android Marshmallow";
+ }
+
+ // The actual network handle doesn't really matter, this test just wants to
+ // check that all the pieces are in place and configured correctly.
+ constexpr handles::NetworkHandle network = 2;
+ auto scoped_mock_network_change_notifier =
+ std::make_unique<test::ScopedMockNetworkChangeNotifier>();
+ test::MockNetworkChangeNotifier* mock_ncn =
+ scoped_mock_network_change_notifier->mock_network_change_notifier();
+ mock_ncn->ForceNetworkHandlesSupported();
+
+ // Set non-default value for check_ipv6_on_wifi and check that this is what
+ // HostResolverManager receives.
+ HostResolver::ManagerOptions options;
+ options.check_ipv6_on_wifi = !options.check_ipv6_on_wifi;
+ builder_.BindToNetwork(network, options);
+ std::unique_ptr<URLRequestContext> context = builder_.Build();
+ EXPECT_EQ(context->host_resolver()
+ ->GetManagerForTesting()
+ ->check_ipv6_on_wifi_for_testing(),
+ options.check_ipv6_on_wifi);
+#else // !BUILDFLAG(IS_ANDROID)
+ GTEST_SKIP() << "BindToNetwork is supported only on Android";
+#endif // BUILDFLAG(IS_ANDROID)
+}
+
} // namespace
} // namespace net
diff --git a/chromium/net/url_request/url_request_context_getter_observer.h b/chromium/net/url_request/url_request_context_getter_observer.h
index a59d0e6a34c..1ebbbb31636 100644
--- a/chromium/net/url_request/url_request_context_getter_observer.h
+++ b/chromium/net/url_request/url_request_context_getter_observer.h
@@ -14,7 +14,7 @@ class URLRequestContextGetter;
// URLRequestContextGetter is shutting down.
class NET_EXPORT URLRequestContextGetterObserver {
public:
- URLRequestContextGetterObserver() {}
+ URLRequestContextGetterObserver() = default;
URLRequestContextGetterObserver(const URLRequestContextGetterObserver&) =
delete;
@@ -28,7 +28,7 @@ class NET_EXPORT URLRequestContextGetterObserver {
virtual void OnContextShuttingDown() = 0;
protected:
- virtual ~URLRequestContextGetterObserver() {}
+ virtual ~URLRequestContextGetterObserver() = default;
};
} // namespace net
diff --git a/chromium/net/url_request/url_request_filter.cc b/chromium/net/url_request/url_request_filter.cc
index 9a19dde37df..a07bf8301a6 100644
--- a/chromium/net/url_request/url_request_filter.cc
+++ b/chromium/net/url_request/url_request_filter.cc
@@ -70,10 +70,6 @@ void URLRequestFilter::RemoveHostnameHandler(const std::string& scheme,
DCHECK(OnMessageLoopForInterceptorRemoval());
int removed = hostname_interceptor_map_.erase(make_pair(scheme, hostname));
DCHECK(removed);
-
- // Note that we don't unregister from the URLRequest ProtocolFactory as
- // this would leave no protocol factory for the remaining hostname and URL
- // handlers.
}
bool URLRequestFilter::AddUrlInterceptor(
@@ -96,9 +92,6 @@ void URLRequestFilter::RemoveUrlHandler(const GURL& url) {
DCHECK(OnMessageLoopForInterceptorRemoval());
size_t removed = url_interceptor_map_.erase(url.spec());
DCHECK(removed);
- // Note that we don't unregister from the URLRequest ProtocolFactory as
- // this would leave no protocol factory for the remaining hostname and URL
- // handlers.
}
void URLRequestFilter::ClearHandlers() {
diff --git a/chromium/net/url_request/url_request_filter.h b/chromium/net/url_request/url_request_filter.h
index 134f029fc5f..48d7a7e9ad3 100644
--- a/chromium/net/url_request/url_request_filter.h
+++ b/chromium/net/url_request/url_request_filter.h
@@ -59,8 +59,7 @@ class NET_EXPORT URLRequestFilter : public URLRequestInterceptor {
void RemoveUrlHandler(const GURL& url);
- // Clear all the existing URL handlers and unregister with the
- // ProtocolFactory. Resets the hit count.
+ // Clear all the existing URL and hostname handlers. Resets the hit count.
void ClearHandlers();
// Returns the number of times a handler was used to service a request.
diff --git a/chromium/net/url_request/url_request_filter_unittest.cc b/chromium/net/url_request/url_request_filter_unittest.cc
index c330f6144a2..0da85940f27 100644
--- a/chromium/net/url_request/url_request_filter_unittest.cc
+++ b/chromium/net/url_request/url_request_filter_unittest.cc
@@ -37,8 +37,9 @@ class TestURLRequestInterceptor : public URLRequestInterceptor {
// URLRequestInterceptor implementation:
std::unique_ptr<URLRequestJob> MaybeInterceptRequest(
URLRequest* request) const override {
- job_ = new URLRequestTestJob(request);
- return base::WrapUnique<URLRequestJob>(job_.get());
+ auto job = std::make_unique<URLRequestTestJob>(request);
+ job_ = job.get();
+ return job;
}
// Is |job| the URLRequestJob generated during interception?
@@ -67,18 +68,17 @@ TEST(URLRequestFilter, BasicMatching) {
// Check AddUrlInterceptor checks for invalid URLs.
EXPECT_FALSE(filter->AddUrlInterceptor(
- GURL(),
- std::unique_ptr<URLRequestInterceptor>(new TestURLRequestInterceptor())));
+ GURL(), std::make_unique<TestURLRequestInterceptor>()));
// Check URLRequestInterceptor URL matching.
filter->ClearHandlers();
- TestURLRequestInterceptor* interceptor = new TestURLRequestInterceptor();
- EXPECT_TRUE(filter->AddUrlInterceptor(
- kUrl1, std::unique_ptr<URLRequestInterceptor>(interceptor)));
+ auto interceptor1 = std::make_unique<TestURLRequestInterceptor>();
+ auto* interceptor1_ptr = interceptor1.get();
+ EXPECT_TRUE(filter->AddUrlInterceptor(kUrl1, std::move(interceptor1)));
{
std::unique_ptr<URLRequestJob> found =
filter->MaybeInterceptRequest(request1.get());
- EXPECT_TRUE(interceptor->WasLastJobCreated(found.get()));
+ EXPECT_TRUE(interceptor1_ptr->WasLastJobCreated(found.get()));
}
EXPECT_EQ(filter->hit_count(), 1);
@@ -94,14 +94,14 @@ TEST(URLRequestFilter, BasicMatching) {
// Check hostname matching.
filter->ClearHandlers();
EXPECT_EQ(0, filter->hit_count());
- interceptor = new TestURLRequestInterceptor();
- filter->AddHostnameInterceptor(
- kUrl1.scheme(), kUrl1.host(),
- std::unique_ptr<URLRequestInterceptor>(interceptor));
+ auto interceptor2 = std::make_unique<TestURLRequestInterceptor>();
+ auto* interceptor2_ptr = interceptor2.get();
+ filter->AddHostnameInterceptor(kUrl1.scheme(), kUrl1.host(),
+ std::move(interceptor2));
{
std::unique_ptr<URLRequestJob> found =
filter->MaybeInterceptRequest(request1.get());
- EXPECT_TRUE(interceptor->WasLastJobCreated(found.get()));
+ EXPECT_TRUE(interceptor2_ptr->WasLastJobCreated(found.get()));
}
EXPECT_EQ(1, filter->hit_count());
diff --git a/chromium/net/url_request/url_request_http_job.cc b/chromium/net/url_request/url_request_http_job.cc
index 1975492c29a..bd336369896 100644
--- a/chromium/net/url_request/url_request_http_job.cc
+++ b/chromium/net/url_request/url_request_http_job.cc
@@ -108,18 +108,18 @@ base::Value CookieInclusionStatusNetLogParams(
const std::string& cookie_path,
const net::CookieInclusionStatus& status,
net::NetLogCaptureMode capture_mode) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("operation", operation);
- dict.SetStringKey("status", status.GetDebugString());
+ base::Value::Dict dict;
+ dict.Set("operation", operation);
+ dict.Set("status", status.GetDebugString());
if (net::NetLogCaptureIncludesSensitive(capture_mode)) {
if (!cookie_name.empty())
- dict.SetStringKey("name", cookie_name);
+ dict.Set("name", cookie_name);
if (!cookie_domain.empty())
- dict.SetStringKey("domain", cookie_domain);
+ dict.Set("domain", cookie_domain);
if (!cookie_path.empty())
- dict.SetStringKey("path", cookie_path);
+ dict.Set("path", cookie_path);
}
- return dict;
+ return base::Value(std::move(dict));
}
// Records details about the most-specific trust anchor in |spki_hashes|,
@@ -335,7 +335,11 @@ void URLRequestHttpJob::OnGotFirstPartySetMetadata(
cookie_partition_key_ = CookiePartitionKey::FromNetworkIsolationKey(
request_->isolation_info().network_isolation_key(),
- base::OptionalOrNullptr(first_party_set_metadata_.top_frame_owner()));
+ base::OptionalOrNullptr(
+ first_party_set_metadata_.top_frame_entry().has_value()
+ ? absl::make_optional(
+ first_party_set_metadata_.top_frame_entry()->primary())
+ : absl::nullopt));
AddCookieHeaderAndStart();
} else {
StartTransaction();
@@ -451,8 +455,8 @@ void URLRequestHttpJob::DestroyTransaction() {
transaction_->GetTotalReceivedBytes();
total_sent_bytes_from_previous_transactions_ +=
transaction_->GetTotalSentBytes();
- transaction_.reset();
response_info_ = nullptr;
+ transaction_.reset();
override_response_headers_ = nullptr;
receive_headers_end_ = base::TimeTicks();
}
@@ -575,50 +579,16 @@ void URLRequestHttpJob::StartTransactionInternal() {
}
void URLRequestHttpJob::AddExtraHeaders() {
- if (!request_info_.extra_headers.HasHeader(
- HttpRequestHeaders::kAcceptEncoding)) {
- // If a range is specifically requested, set the "Accepted Encoding" header
- // to "identity"
- if (request_info_.extra_headers.HasHeader(HttpRequestHeaders::kRange)) {
- request_info_.extra_headers.SetHeader(HttpRequestHeaders::kAcceptEncoding,
- "identity");
- } else {
- // Supply Accept-Encoding headers first so that it is more likely that
- // they will be in the first transmitted packet. This can sometimes make
- // it easier to filter and analyze the streams to assure that a proxy has
- // not damaged these headers. Some proxies deliberately corrupt
- // Accept-Encoding headers.
- std::vector<std::string> advertised_encoding_names;
- if (request_->Supports(SourceStream::SourceType::TYPE_GZIP)) {
- advertised_encoding_names.push_back("gzip");
- }
- if (request_->Supports(SourceStream::SourceType::TYPE_DEFLATE)) {
- advertised_encoding_names.push_back("deflate");
- }
- // Advertise "br" encoding only if transferred data is opaque to proxy.
- if (request()->context()->enable_brotli() &&
- request_->Supports(SourceStream::SourceType::TYPE_BROTLI)) {
- if (request()->url().SchemeIsCryptographic() ||
- IsLocalhost(request()->url())) {
- advertised_encoding_names.push_back("br");
- }
- }
- if (!advertised_encoding_names.empty()) {
- // Tell the server what compression formats are supported.
- request_info_.extra_headers.SetHeader(
- HttpRequestHeaders::kAcceptEncoding,
- base::JoinString(base::make_span(advertised_encoding_names), ", "));
- }
- }
- }
+ request_info_.extra_headers.SetAcceptEncodingIfMissing(
+ request()->url(), request()->accepted_stream_types(),
+ request()->context()->enable_brotli());
if (http_user_agent_settings_) {
// Only add default Accept-Language if the request didn't have it
// specified.
std::string accept_language =
http_user_agent_settings_->GetAcceptLanguage();
- if (base::FeatureList::IsEnabled(features::kAcceptLanguageHeader) &&
- !accept_language.empty()) {
+ if (!accept_language.empty()) {
request_info_.extra_headers.SetHeaderIfMissing(
HttpRequestHeaders::kAcceptLanguage,
accept_language);
@@ -648,15 +618,11 @@ void URLRequestHttpJob::AddCookieHeaderAndStart() {
is_main_frame_navigation, force_ignore_site_for_cookies);
bool is_in_nontrivial_first_party_set =
- first_party_set_metadata_.frame_owner().has_value();
+ first_party_set_metadata_.frame_entry().has_value();
CookieOptions options = CreateCookieOptions(
same_site_context, first_party_set_metadata_.context(),
request_->isolation_info(), is_in_nontrivial_first_party_set);
- UMA_HISTOGRAM_ENUMERATION(
- "Cookie.FirstPartySetsContextType.HTTP.Read",
- first_party_set_metadata_.first_party_sets_context_type());
-
cookie_store->GetCookieListWithOptionsAsync(
request_->url(), options,
CookiePartitionKeyCollection::FromOptional(cookie_partition_key_.value()),
@@ -833,8 +799,7 @@ void URLRequestHttpJob::AnnotateAndMoveUserBlockedCookies(
if (request()->network_delegate()) {
can_get_cookies =
request()->network_delegate()->AnnotateAndMoveUserBlockedCookies(
- *request(), maybe_included_cookies, excluded_cookies,
- /*allowed_from_caller=*/true);
+ *request(), maybe_included_cookies, excluded_cookies);
}
if (!can_get_cookies) {
@@ -889,15 +854,11 @@ void URLRequestHttpJob::SaveCookiesAndNotifyHeadersComplete(int result) {
force_ignore_site_for_cookies);
bool is_in_nontrivial_first_party_set =
- first_party_set_metadata_.frame_owner().has_value();
+ first_party_set_metadata_.frame_entry().has_value();
CookieOptions options = CreateCookieOptions(
same_site_context, first_party_set_metadata_.context(),
request_->isolation_info(), is_in_nontrivial_first_party_set);
- UMA_HISTOGRAM_ENUMERATION(
- "Cookie.FirstPartySetsContextType.HTTP.Write",
- first_party_set_metadata_.first_party_sets_context_type());
-
// Set all cookies, without waiting for them to be set. Any subsequent
// read will see the combined result of all cookie operation.
const base::StringPiece name("Set-Cookie");
diff --git a/chromium/net/url_request/url_request_http_job.h b/chromium/net/url_request/url_request_http_job.h
index 10516a902b0..9d9e968d01a 100644
--- a/chromium/net/url_request/url_request_http_job.h
+++ b/chromium/net/url_request/url_request_http_job.h
@@ -232,7 +232,6 @@ class NET_EXPORT_PRIVATE URLRequestHttpJob : public URLRequestJob {
RequestPriority priority_ = DEFAULT_PRIORITY;
HttpRequestInfo request_info_;
- raw_ptr<const HttpResponseInfo> response_info_ = nullptr;
// Used for any logic, e.g. DNS-based scheme upgrade, that needs to synthesize
// response info to override the real response info. Transaction should be
@@ -248,6 +247,12 @@ class NET_EXPORT_PRIVATE URLRequestHttpJob : public URLRequestJob {
std::unique_ptr<HttpTransaction> transaction_;
+ // This needs to be declared after `transaction_` and
+ // `override_response_info_` because `response_info_` holds a pointer that's
+ // itself owned by one of those, so `response_info_` needs to be destroyed
+ // first.
+ raw_ptr<const HttpResponseInfo> response_info_ = nullptr;
+
// This is used to supervise traffic and enforce exponential
// back-off. May be NULL.
scoped_refptr<URLRequestThrottlerEntryInterface> throttling_entry_;
diff --git a/chromium/net/url_request/url_request_http_job_unittest.cc b/chromium/net/url_request/url_request_http_job_unittest.cc
index 6cfcbd5fa44..22f7ad48487 100644
--- a/chromium/net/url_request/url_request_http_job_unittest.cc
+++ b/chromium/net/url_request/url_request_http_job_unittest.cc
@@ -260,7 +260,7 @@ TEST_F(URLRequestHttpJobWithProxyTest, TestSuccessfulWithOneProxy) {
ProxyUriToProxyServer("http://origin.net:80", ProxyServer::SCHEME_HTTP);
std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
ProxyServerToPacResultElement(proxy_server),
TRAFFIC_ANNOTATION_FOR_TESTS);
@@ -302,7 +302,7 @@ TEST_F(URLRequestHttpJobWithProxyTest,
// Connection to |proxy_server| would fail. Request should be fetched over
// DIRECT.
std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
- ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+ ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
ProxyServerToPacResultElement(proxy_server) + "; DIRECT",
TRAFFIC_ANNOTATION_FOR_TESTS);
@@ -1843,21 +1843,24 @@ TEST_P(PartitionedCookiesURLRequestHttpJobTest, SetPartitionedCookie) {
/*first_party_sets_enabled=*/false));
auto context = context_builder->Build();
- TestDelegate delegate;
- std::unique_ptr<URLRequest> req(context->CreateRequest(
- https_test.GetURL("/set-cookie?__Host-foo=bar;SameSite=None;Secure;Path=/"
- ";Partitioned;"),
- DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
-
const url::Origin kTopFrameOrigin =
url::Origin::Create(GURL("https://www.toplevelsite.com"));
const IsolationInfo kTestIsolationInfo =
IsolationInfo::CreateForInternalRequest(kTopFrameOrigin);
- req->set_isolation_info(kTestIsolationInfo);
- req->Start();
- ASSERT_TRUE(req->is_pending());
- delegate.RunUntilComplete();
+ {
+ TestDelegate delegate;
+ std::unique_ptr<URLRequest> req(context->CreateRequest(
+ https_test.GetURL(
+ "/set-cookie?__Host-foo=bar;SameSite=None;Secure;Path=/"
+ ";Partitioned;"),
+ DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
+
+ req->set_isolation_info(kTestIsolationInfo);
+ req->Start();
+ ASSERT_TRUE(req->is_pending());
+ delegate.RunUntilComplete();
+ }
{ // Test request from the same top-level site.
TestDelegate delegate;
@@ -1917,31 +1920,34 @@ TEST_P(PartitionedCookiesURLRequestHttpJobTest,
const IsolationInfo kNonMemberIsolationInfo =
IsolationInfo::CreateForInternalRequest(kNonMemberOrigin);
- base::flat_map<SchemefulSite, std::set<SchemefulSite>> first_party_sets;
- first_party_sets.insert(std::make_pair(
- kOwnerSite, std::set<SchemefulSite>({kOwnerSite, kMemberSite})));
-
auto context_builder = CreateTestURLRequestContextBuilder();
auto cookie_monster = std::make_unique<CookieMonster>(
/*store=*/nullptr, /*net_log=*/nullptr,
/*first_party_sets_enabled=*/false);
auto cookie_access_delegate = std::make_unique<TestCookieAccessDelegate>();
- cookie_access_delegate->SetFirstPartySets(first_party_sets);
+ cookie_access_delegate->SetFirstPartySets({
+ {kOwnerSite, net::FirstPartySetEntry(kOwnerSite, net::SiteType::kPrimary,
+ absl::nullopt)},
+ {kMemberSite,
+ net::FirstPartySetEntry(kOwnerSite, net::SiteType::kAssociated, 0)},
+ });
cookie_monster->SetCookieAccessDelegate(std::move(cookie_access_delegate));
context_builder->SetCookieStore(std::move(cookie_monster));
auto context = context_builder->Build();
- TestDelegate delegate;
- std::unique_ptr<URLRequest> req(context->CreateRequest(
- https_test.GetURL("/set-cookie?__Host-foo=0;SameSite=None;Secure;Path=/"
- ";Partitioned;"),
- DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
+ {
+ TestDelegate delegate;
+ std::unique_ptr<URLRequest> req(context->CreateRequest(
+ https_test.GetURL("/set-cookie?__Host-foo=0;SameSite=None;Secure;Path=/"
+ ";Partitioned;"),
+ DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
- // Start with the set's owner as the top-level site.
- req->set_isolation_info(kOwnerIsolationInfo);
- req->Start();
- ASSERT_TRUE(req->is_pending());
- delegate.RunUntilComplete();
+ // Start with the set's owner as the top-level site.
+ req->set_isolation_info(kOwnerIsolationInfo);
+ req->Start();
+ ASSERT_TRUE(req->is_pending());
+ delegate.RunUntilComplete();
+ }
{
// Test the cookie is present in a request with the same top-frame site as
@@ -1969,15 +1975,18 @@ TEST_P(PartitionedCookiesURLRequestHttpJobTest,
EXPECT_EQ("__Host-foo=0", delegate.data_received());
}
- // Set a cookie from the member site.
- req = context->CreateRequest(
- https_test.GetURL("/set-cookie?__Host-bar=1;SameSite=None;Secure;Path=/"
- ";Partitioned;"),
- DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS);
- req->set_isolation_info(kMemberIsolationInfo);
- req->Start();
- ASSERT_TRUE(req->is_pending());
- delegate.RunUntilComplete();
+ {
+ // Set a cookie from the member site.
+ TestDelegate delegate;
+ std::unique_ptr<URLRequest> req(context->CreateRequest(
+ https_test.GetURL("/set-cookie?__Host-bar=1;SameSite=None;Secure;Path=/"
+ ";Partitioned;"),
+ DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
+ req->set_isolation_info(kMemberIsolationInfo);
+ req->Start();
+ ASSERT_TRUE(req->is_pending());
+ delegate.RunUntilComplete();
+ }
{
// Check request whose top-frame site is the owner site has the cookie set
@@ -2029,17 +2038,19 @@ TEST_P(PartitionedCookiesURLRequestHttpJobTest, PrivacyMode) {
const IsolationInfo kTestIsolationInfo =
IsolationInfo::CreateForInternalRequest(kTopFrameOrigin);
- // Set an unpartitioned and partitioned cookie.
- TestDelegate delegate;
- std::unique_ptr<URLRequest> req(context->CreateRequest(
- https_test.GetURL(
- "/set-cookie?__Host-partitioned=0;SameSite=None;Secure;Path=/"
- ";Partitioned;&__Host-unpartitioned=1;SameSite=None;Secure;Path=/"),
- DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
- req->set_isolation_info(kTestIsolationInfo);
- req->Start();
- ASSERT_TRUE(req->is_pending());
- delegate.RunUntilComplete();
+ {
+ // Set an unpartitioned and partitioned cookie.
+ TestDelegate delegate;
+ std::unique_ptr<URLRequest> req(context->CreateRequest(
+ https_test.GetURL(
+ "/set-cookie?__Host-partitioned=0;SameSite=None;Secure;Path=/"
+ ";Partitioned;&__Host-unpartitioned=1;SameSite=None;Secure;Path=/"),
+ DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
+ req->set_isolation_info(kTestIsolationInfo);
+ req->Start();
+ ASSERT_TRUE(req->is_pending());
+ delegate.RunUntilComplete();
+ }
{ // Get both cookies when privacy mode is disabled.
TestDelegate delegate;
@@ -2133,23 +2144,26 @@ TEST_P(PartitionedCookiesURLRequestHttpJobTest,
/*first_party_sets_enabled=*/false));
auto context = context_builder->Build();
- TestDelegate delegate;
- std::unique_ptr<URLRequest> req(context->CreateRequest(
- https_test.GetURL("/set-cookie?__Host-foo=bar;SameSite=None;Secure;Path=/"
- ";Partitioned;"),
- DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
-
const url::Origin kTopFrameOrigin =
url::Origin::Create(GURL("https://www.toplevelsite.com"));
const IsolationInfo kTestIsolationInfo =
IsolationInfo::CreateForInternalRequest(kTopFrameOrigin);
- req->set_isolation_info(kTestIsolationInfo);
- req->Start();
- ASSERT_TRUE(req->is_pending());
- delegate.RunUntilComplete();
+ {
+ TestDelegate delegate;
+ std::unique_ptr<URLRequest> req(context->CreateRequest(
+ https_test.GetURL(
+ "/set-cookie?__Host-foo=bar;SameSite=None;Secure;Path=/"
+ ";Partitioned;"),
+ DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
- ASSERT_TRUE(req->HasPartitionedCookie());
+ req->set_isolation_info(kTestIsolationInfo);
+ req->Start();
+ ASSERT_TRUE(req->is_pending());
+ delegate.RunUntilComplete();
+
+ ASSERT_TRUE(req->HasPartitionedCookie());
+ }
{ // Test request from the same top-level site.
TestDelegate delegate;
diff --git a/chromium/net/url_request/url_request_job.cc b/chromium/net/url_request/url_request_job.cc
index 9262d5b3aa6..b788b8a3c89 100644
--- a/chromium/net/url_request/url_request_job.cc
+++ b/chromium/net/url_request/url_request_job.cc
@@ -40,9 +40,9 @@ namespace {
// Callback for TYPE_URL_REQUEST_FILTERS_SET net-internals event.
base::Value SourceStreamSetParams(SourceStream* source_stream) {
- base::Value event_params(base::Value::Type::DICTIONARY);
- event_params.SetStringKey("filters", source_stream->Description());
- return event_params;
+ base::Value::Dict event_params;
+ event_params.Set("filters", source_stream->Description());
+ return base::Value(std::move(event_params));
}
} // namespace
@@ -86,8 +86,7 @@ class URLRequestJob::URLRequestJobSourceStream : public SourceStream {
URLRequestJob::URLRequestJob(URLRequest* request) : request_(request) {}
-URLRequestJob::~URLRequestJob() {
-}
+URLRequestJob::~URLRequestJob() = default;
void URLRequestJob::SetUpload(UploadDataStream* upload) {
}
@@ -408,11 +407,6 @@ void URLRequestJob::NotifyHeadersComplete() {
if (has_handled_response_)
return;
- // The URLRequest status should still be IO_PENDING, which it was set to
- // before the URLRequestJob was started. On error or cancellation, this
- // method should not be called.
- DCHECK_EQ(ERR_IO_PENDING, request_->status());
-
// Initialize to the current time, and let the subclass optionally override
// the time stamps if it has that information. The default request_time is
// set by URLRequest before it calls our Start method.
diff --git a/chromium/net/url_request/url_request_netlog_params.cc b/chromium/net/url_request/url_request_netlog_params.cc
index 178663fb822..cec31242801 100644
--- a/chromium/net/url_request/url_request_netlog_params.cc
+++ b/chromium/net/url_request/url_request_netlog_params.cc
@@ -20,11 +20,11 @@ base::Value NetLogURLRequestConstructorParams(
const GURL& url,
RequestPriority priority,
NetworkTrafficAnnotationTag traffic_annotation) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("url", url.possibly_invalid_spec());
- dict.SetStringKey("priority", RequestPriorityToString(priority));
- dict.SetIntKey("traffic_annotation", traffic_annotation.unique_id_hash_code);
- return dict;
+ base::Value::Dict dict;
+ dict.Set("url", url.possibly_invalid_spec());
+ dict.Set("priority", RequestPriorityToString(priority));
+ dict.Set("traffic_annotation", traffic_annotation.unique_id_hash_code);
+ return base::Value(std::move(dict));
}
base::Value NetLogURLRequestStartParams(
@@ -35,12 +35,12 @@ base::Value NetLogURLRequestStartParams(
const SiteForCookies& site_for_cookies,
const absl::optional<url::Origin>& initiator,
int64_t upload_id) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("url", url.possibly_invalid_spec());
- dict.SetStringKey("method", method);
- dict.SetIntKey("load_flags", load_flags);
- dict.SetStringKey("network_isolation_key",
- isolation_info.network_isolation_key().ToDebugString());
+ base::Value::Dict dict;
+ dict.Set("url", url.possibly_invalid_spec());
+ dict.Set("method", method);
+ dict.Set("load_flags", load_flags);
+ dict.Set("network_isolation_key",
+ isolation_info.network_isolation_key().ToDebugString());
std::string request_type;
switch (isolation_info.request_type()) {
case IsolationInfo::RequestType::kMainFrame:
@@ -53,13 +53,13 @@ base::Value NetLogURLRequestStartParams(
request_type = "other";
break;
}
- dict.SetStringKey("request_type", request_type);
- dict.SetStringKey("site_for_cookies", site_for_cookies.ToDebugString());
- dict.SetStringKey("initiator", initiator.has_value() ? initiator->Serialize()
- : "not an origin");
+ dict.Set("request_type", request_type);
+ dict.Set("site_for_cookies", site_for_cookies.ToDebugString());
+ dict.Set("initiator",
+ initiator.has_value() ? initiator->Serialize() : "not an origin");
if (upload_id > -1)
- dict.SetStringKey("upload_id", base::NumberToString(upload_id));
- return dict;
+ dict.Set("upload_id", base::NumberToString(upload_id));
+ return base::Value(std::move(dict));
}
} // namespace net
diff --git a/chromium/net/url_request/url_request_quic_perftest.cc b/chromium/net/url_request/url_request_quic_perftest.cc
index 0ac808142c2..56f9a4c29b5 100644
--- a/chromium/net/url_request/url_request_quic_perftest.cc
+++ b/chromium/net/url_request/url_request_quic_perftest.cc
@@ -83,8 +83,7 @@ perf_test::PerfResultReporter SetUpURLRequestQuicReporter(
std::unique_ptr<test_server::HttpResponse> HandleRequest(
const test_server::HttpRequest& request) {
- std::unique_ptr<test_server::BasicHttpResponse> http_response(
- new test_server::BasicHttpResponse());
+ auto http_response = std::make_unique<test_server::BasicHttpResponse>();
std::string alpn =
quic::AlpnForVersion(DefaultSupportedQuicVersions().front());
http_response->AddCustomHeader(
@@ -105,14 +104,14 @@ class URLRequestQuicPerfTest : public ::testing::Test {
memory_dump_manager_ =
base::trace_event::MemoryDumpManager::CreateInstanceForTesting();
base::trace_event::InitializeMemoryDumpManagerForInProcessTesting(
- /*is_coordinator_process=*/false);
+ /*is_coordinator=*/false);
memory_dump_manager_->set_dumper_registrations_ignored_for_testing(false);
memory_dump_manager_->set_dumper_registrations_ignored_for_testing(true);
StartTcpServer();
StartQuicServer();
// Host mapping.
- std::unique_ptr<MockHostResolver> resolver(new MockHostResolver());
+ auto resolver = std::make_unique<MockHostResolver>();
resolver->rules()->AddRule(kAltSvcHost, "127.0.0.1");
auto host_resolver =
std::make_unique<MappedHostResolver>(std::move(resolver));
diff --git a/chromium/net/url_request/url_request_quic_unittest.cc b/chromium/net/url_request/url_request_quic_unittest.cc
index 8e792a7719b..b6736ea9a6b 100644
--- a/chromium/net/url_request/url_request_quic_unittest.cc
+++ b/chromium/net/url_request/url_request_quic_unittest.cc
@@ -12,6 +12,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/test/bind.h"
#include "base/test/scoped_feature_list.h"
+#include "base/time/time.h"
#include "build/build_config.h"
#include "net/base/features.h"
#include "net/base/isolation_info.h"
@@ -23,6 +24,7 @@
#include "net/cert/mock_cert_verifier.h"
#include "net/dns/mapped_host_resolver.h"
#include "net/dns/mock_host_resolver.h"
+#include "net/http/http_response_headers.h"
#include "net/http/transport_security_state.h"
#include "net/log/net_log_event_type.h"
#include "net/log/test_net_log_util.h"
@@ -33,6 +35,7 @@
#include "net/test/test_data_directory.h"
#include "net/test/test_with_task_environment.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.h"
+#include "net/third_party/quiche/src/quiche/quic/core/quic_time.h"
#include "net/third_party/quiche/src/quiche/quic/test_tools/crypto_test_utils.h"
#include "net/third_party/quiche/src/quiche/quic/tools/quic_memory_cache_backend.h"
#include "net/third_party/quiche/src/quiche/quic/tools/quic_simple_dispatcher.h"
@@ -219,6 +222,14 @@ class URLRequestQuicTest
std::string(path);
}
+ void SetDelay(absl::string_view host,
+ absl::string_view path,
+ base::TimeDelta delay) {
+ memory_cache_backend_.SetResponseDelay(
+ host, path,
+ quic::QuicTime::Delta::FromMilliseconds(delay.InMilliseconds()));
+ }
+
private:
void StartQuicServer(quic::ParsedQuicVersion version) {
// Set up in-memory cache.
@@ -247,7 +258,7 @@ class URLRequestQuicTest
server_->Listen(net::IPEndPoint(net::IPAddress::IPv4AllZeros(), 0));
EXPECT_GE(rv, 0) << "Quic server fails to start";
- std::unique_ptr<MockHostResolver> resolver(new MockHostResolver());
+ auto resolver = std::make_unique<MockHostResolver>();
resolver->rules()->AddRule("test.example.com", "127.0.0.1");
host_resolver_ = std::make_unique<MappedHostResolver>(std::move(resolver));
// Use a mapped host resolver so that request for test.example.com
@@ -280,7 +291,7 @@ class URLRequestQuicTest
// received.
class CheckLoadTimingDelegate : public TestDelegate {
public:
- CheckLoadTimingDelegate(bool session_reused)
+ explicit CheckLoadTimingDelegate(bool session_reused)
: session_reused_(session_reused) {}
CheckLoadTimingDelegate(const CheckLoadTimingDelegate&) = delete;
@@ -449,6 +460,25 @@ TEST_P(URLRequestQuicTest, RequestHeadersCallback) {
EXPECT_EQ(OK, delegate.request_status());
}
+TEST_P(URLRequestQuicTest, DelayedResponseStart) {
+ auto context = BuildContext();
+ TestDelegate delegate;
+ std::unique_ptr<URLRequest> request =
+ CreateRequest(context.get(), GURL(UrlFromPath(kHelloPath)), &delegate);
+
+ constexpr auto delay = base::Milliseconds(300);
+
+ this->SetDelay(kTestServerHost, kHelloPath, delay);
+ request->Start();
+ ASSERT_TRUE(request->is_pending());
+ delegate.RunUntilComplete();
+ LoadTimingInfo timing_info;
+ request->GetLoadTimingInfo(&timing_info);
+ EXPECT_EQ(OK, delegate.request_status());
+ EXPECT_GE((timing_info.receive_headers_start - timing_info.request_start),
+ delay);
+}
+
// Tests that if there's an Expect-CT failure at the QUIC layer, a report is
// generated.
TEST_P(URLRequestQuicTest, ExpectCT) {
diff --git a/chromium/net/url_request/url_request_test_util.cc b/chromium/net/url_request/url_request_test_util.cc
index e186610df1e..2c0b36aab42 100644
--- a/chromium/net/url_request/url_request_test_util.cc
+++ b/chromium/net/url_request/url_request_test_util.cc
@@ -58,7 +58,7 @@ const char kTestNetworkDelegateRequestIdKey[] =
class TestRequestId : public base::SupportsUserData::Data {
public:
- TestRequestId(int id) : id_(id) {}
+ explicit TestRequestId(int id) : id_(id) {}
~TestRequestId() override = default;
int id() const { return id_; }
@@ -390,8 +390,8 @@ int TestNetworkDelegate::OnHeadersReceived(
next_states_[req_id] |= kStageBeforeStartTransaction;
if (!redirect_on_headers_received_url_.is_empty()) {
- *override_response_headers =
- new HttpResponseHeaders(original_response_headers->raw_headers());
+ *override_response_headers = base::MakeRefCounted<HttpResponseHeaders>(
+ original_response_headers->raw_headers());
(*override_response_headers)->ReplaceStatusLine("HTTP/1.1 302 Found");
(*override_response_headers)->RemoveHeader("Location");
(*override_response_headers)
@@ -402,8 +402,8 @@ int TestNetworkDelegate::OnHeadersReceived(
// Since both values are absl::optionals, can just copy this over.
*preserve_fragment_on_redirect_url = preserve_fragment_on_redirect_url_;
} else if (add_header_to_first_response_ && is_first_response) {
- *override_response_headers =
- new HttpResponseHeaders(original_response_headers->raw_headers());
+ *override_response_headers = base::MakeRefCounted<HttpResponseHeaders>(
+ original_response_headers->raw_headers());
(*override_response_headers)
->AddHeader("X-Network-Delegate", "Greetings, planet");
}
@@ -502,9 +502,8 @@ void TestNetworkDelegate::OnURLRequestDestroyed(URLRequest* request) {
bool TestNetworkDelegate::OnAnnotateAndMoveUserBlockedCookies(
const URLRequest& request,
net::CookieAccessResultList& maybe_included_cookies,
- net::CookieAccessResultList& excluded_cookies,
- bool allowed_from_caller) {
- bool allow = allowed_from_caller;
+ net::CookieAccessResultList& excluded_cookies) {
+ bool allow = true;
if (cookie_options_bit_mask_ & NO_GET_COOKIES)
allow = false;
@@ -527,9 +526,8 @@ NetworkDelegate::PrivacySetting TestNetworkDelegate::OnForcePrivacyMode(
bool TestNetworkDelegate::OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie,
- CookieOptions* options,
- bool allowed_from_caller) {
- bool allow = allowed_from_caller;
+ CookieOptions* options) {
+ bool allow = true;
if (cookie_options_bit_mask_ & NO_SET_COOKIE)
allow = false;
@@ -566,18 +564,19 @@ FilteringTestNetworkDelegate::~FilteringTestNetworkDelegate() = default;
bool FilteringTestNetworkDelegate::OnCanSetCookie(
const URLRequest& request,
const net::CanonicalCookie& cookie,
- CookieOptions* options,
- bool allowed_from_caller) {
+ CookieOptions* options) {
// Filter out cookies with the same name as |cookie_name_filter_| and
// combine with |allowed_from_caller|.
- bool allowed = allowed_from_caller && !(cookie.Name() == cookie_name_filter_);
+ bool allowed = cookie.Name() != cookie_name_filter_;
++set_cookie_called_count_;
if (!allowed)
++blocked_set_cookie_count_;
- return TestNetworkDelegate::OnCanSetCookie(request, cookie, options, allowed);
+ // Call the nested delegate's method first to avoid a short circuit.
+ return TestNetworkDelegate::OnCanSetCookie(request, cookie, options) &&
+ allowed;
}
NetworkDelegate::PrivacySetting
@@ -599,11 +598,10 @@ FilteringTestNetworkDelegate::OnForcePrivacyMode(
bool FilteringTestNetworkDelegate::OnAnnotateAndMoveUserBlockedCookies(
const URLRequest& request,
net::CookieAccessResultList& maybe_included_cookies,
- net::CookieAccessResultList& excluded_cookies,
- bool allowed_from_caller) {
+ net::CookieAccessResultList& excluded_cookies) {
// Filter out cookies if |block_annotate_cookies_| is set and
// combine with |allowed_from_caller|.
- bool allowed = allowed_from_caller && !block_annotate_cookies_;
+ bool allowed = !block_annotate_cookies_;
++annotate_cookies_called_count_;
@@ -630,8 +628,10 @@ bool FilteringTestNetworkDelegate::OnAnnotateAndMoveUserBlockedCookies(
MoveExcludedCookies(maybe_included_cookies, excluded_cookies);
}
+ // Call the nested delegate's method first to avoid a short circuit.
return TestNetworkDelegate::OnAnnotateAndMoveUserBlockedCookies(
- request, maybe_included_cookies, excluded_cookies, allowed);
+ request, maybe_included_cookies, excluded_cookies) &&
+ allowed;
}
// URLRequestInterceptor that intercepts only the first request it sees,
diff --git a/chromium/net/url_request/url_request_test_util.h b/chromium/net/url_request/url_request_test_util.h
index 05e5399fb81..e8fa60fb4c2 100644
--- a/chromium/net/url_request/url_request_test_util.h
+++ b/chromium/net/url_request/url_request_test_util.h
@@ -311,8 +311,7 @@ class TestNetworkDelegate : public NetworkDelegateImpl {
bool OnAnnotateAndMoveUserBlockedCookies(
const URLRequest& request,
net::CookieAccessResultList& maybe_included_cookies,
- net::CookieAccessResultList& excluded_cookies,
- bool allowed_from_caller) override;
+ net::CookieAccessResultList& excluded_cookies) override;
NetworkDelegate::PrivacySetting OnForcePrivacyMode(
const GURL& url,
const SiteForCookies& site_for_cookies,
@@ -320,8 +319,7 @@ class TestNetworkDelegate : public NetworkDelegateImpl {
SamePartyContext::Type same_party_context_type) const override;
bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie,
- CookieOptions* options,
- bool allowed_from_caller) override;
+ CookieOptions* options) override;
bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
const URLRequest& request,
const GURL& target_url,
@@ -380,8 +378,7 @@ class FilteringTestNetworkDelegate : public TestNetworkDelegate {
bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie,
- CookieOptions* options,
- bool allowed_from_caller) override;
+ CookieOptions* options) override;
void SetCookieFilter(std::string filter) {
cookie_name_filter_ = std::move(filter);
@@ -398,8 +395,7 @@ class FilteringTestNetworkDelegate : public TestNetworkDelegate {
bool OnAnnotateAndMoveUserBlockedCookies(
const URLRequest& request,
net::CookieAccessResultList& maybe_included_cookies,
- net::CookieAccessResultList& excluded_cookies,
- bool allowed_from_caller) override;
+ net::CookieAccessResultList& excluded_cookies) override;
NetworkDelegate::PrivacySetting OnForcePrivacyMode(
const GURL& url,
diff --git a/chromium/net/url_request/url_request_throttler_entry.cc b/chromium/net/url_request/url_request_throttler_entry.cc
index c7f44694b45..ddfbf2f4387 100644
--- a/chromium/net/url_request/url_request_throttler_entry.cc
+++ b/chromium/net/url_request/url_request_throttler_entry.cc
@@ -54,12 +54,12 @@ const int URLRequestThrottlerEntry::kDefaultEntryLifetimeMs = 2 * 60 * 1000;
base::Value NetLogRejectedRequestParams(const std::string* url_id,
int num_failures,
const base::TimeDelta& release_after) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetStringKey("url", *url_id);
- dict.SetIntKey("num_failures", num_failures);
- dict.SetIntKey("release_after_ms",
- static_cast<int>(release_after.InMilliseconds()));
- return dict;
+ base::Value::Dict dict;
+ dict.Set("url", *url_id);
+ dict.Set("num_failures", num_failures);
+ dict.Set("release_after_ms",
+ static_cast<int>(release_after.InMilliseconds()));
+ return base::Value(std::move(dict));
}
URLRequestThrottlerEntry::URLRequestThrottlerEntry(
diff --git a/chromium/net/url_request/url_request_throttler_entry_interface.h b/chromium/net/url_request/url_request_throttler_entry_interface.h
index e7c5a1ab039..0e15419ba54 100644
--- a/chromium/net/url_request/url_request_throttler_entry_interface.h
+++ b/chromium/net/url_request/url_request_throttler_entry_interface.h
@@ -19,7 +19,7 @@ class URLRequest;
class NET_EXPORT URLRequestThrottlerEntryInterface
: public base::RefCountedThreadSafe<URLRequestThrottlerEntryInterface> {
public:
- URLRequestThrottlerEntryInterface() {}
+ URLRequestThrottlerEntryInterface() = default;
URLRequestThrottlerEntryInterface(const URLRequestThrottlerEntryInterface&) =
delete;
@@ -61,7 +61,7 @@ class NET_EXPORT URLRequestThrottlerEntryInterface
protected:
friend class base::RefCountedThreadSafe<URLRequestThrottlerEntryInterface>;
- virtual ~URLRequestThrottlerEntryInterface() {}
+ virtual ~URLRequestThrottlerEntryInterface() = default;
private:
friend class base::RefCounted<URLRequestThrottlerEntryInterface>;
diff --git a/chromium/net/url_request/url_request_throttler_manager.cc b/chromium/net/url_request/url_request_throttler_manager.cc
index 5927ee91e3e..fc91eceff29 100644
--- a/chromium/net/url_request/url_request_throttler_manager.cc
+++ b/chromium/net/url_request/url_request_throttler_manager.cc
@@ -68,7 +68,7 @@ scoped_refptr<URLRequestThrottlerEntryInterface>
// Create the entry if needed.
if (entry.get() == nullptr) {
- entry = new URLRequestThrottlerEntry(this, url_id);
+ entry = base::MakeRefCounted<URLRequestThrottlerEntry>(this, url_id);
// We only disable back-off throttling on an entry that we have
// just constructed. This is to allow unit tests to explicitly override
@@ -92,14 +92,14 @@ scoped_refptr<URLRequestThrottlerEntryInterface>
void URLRequestThrottlerManager::OverrideEntryForTests(
const GURL& url,
- URLRequestThrottlerEntry* entry) {
+ scoped_refptr<URLRequestThrottlerEntry> entry) {
// Normalize the url.
std::string url_id = GetIdFromUrl(url);
// Periodically garbage collect old entries.
GarbageCollectEntriesIfNecessary();
- url_entries_[url_id] = entry;
+ url_entries_[url_id] = std::move(entry);
}
void URLRequestThrottlerManager::EraseEntryForTests(const GURL& url) {
diff --git a/chromium/net/url_request/url_request_throttler_manager.h b/chromium/net/url_request/url_request_throttler_manager.h
index 8bc39d19942..e32ecbdca92 100644
--- a/chromium/net/url_request/url_request_throttler_manager.h
+++ b/chromium/net/url_request/url_request_throttler_manager.h
@@ -53,7 +53,8 @@ class NET_EXPORT_PRIVATE URLRequestThrottlerManager
// Registers a new entry in this service and overrides the existing entry (if
// any) for the URL. The service will hold a reference to the entry.
// It is only used by unit tests.
- void OverrideEntryForTests(const GURL& url, URLRequestThrottlerEntry* entry);
+ void OverrideEntryForTests(const GURL& url,
+ scoped_refptr<URLRequestThrottlerEntry> entry);
// Explicitly erases an entry.
// This is useful to remove those entries which have got infinite lifetime and
diff --git a/chromium/net/url_request/url_request_throttler_simulation_unittest.cc b/chromium/net/url_request/url_request_throttler_simulation_unittest.cc
index f7c2bac1243..9d79f695a3b 100644
--- a/chromium/net/url_request/url_request_throttler_simulation_unittest.cc
+++ b/chromium/net/url_request/url_request_throttler_simulation_unittest.cc
@@ -98,12 +98,12 @@ class DiscreteTimeSimulation {
TimeTicks start_time = TimeTicks();
TimeTicks now = start_time;
while ((now - start_time) <= maximum_simulated_duration) {
- for (auto it = actors_.begin(); it != actors_.end(); ++it) {
- (*it)->AdvanceTime(now);
+ for (auto* actor : actors_) {
+ actor->AdvanceTime(now);
}
- for (auto it = actors_.begin(); it != actors_.end(); ++it) {
- (*it)->PerformAction();
+ for (auto* actor : actors_) {
+ actor->PerformAction();
}
now += time_between_ticks;
@@ -225,7 +225,7 @@ class Server : public DiscreteTimeSimulation::Actor {
if (num_ticks % ticks_per_column)
++num_columns;
DCHECK_LE(num_columns, terminal_width);
- std::unique_ptr<int[]> columns(new int[num_columns]);
+ auto columns = std::make_unique<int[]>(num_columns);
for (int tx = 0; tx < num_ticks; ++tx) {
int cx = tx / ticks_per_column;
if (tx % ticks_per_column == 0)
@@ -488,27 +488,26 @@ void SimulateAttack(Server* server,
for (size_t i = 0; i < kNumAttackers; ++i) {
// Use a tiny time_between_requests so the attackers will ping the
// server at every tick of the simulation.
- scoped_refptr<MockURLRequestThrottlerEntry> throttler_entry(
- new MockURLRequestThrottlerEntry(&manager));
+ auto throttler_entry =
+ base::MakeRefCounted<MockURLRequestThrottlerEntry>(&manager);
if (!enable_throttling)
throttler_entry->DisableBackoffThrottling();
- std::unique_ptr<Requester> attacker(
- new Requester(throttler_entry.get(), base::Milliseconds(1), server,
- attacker_results));
+ auto attacker = std::make_unique<Requester>(
+ throttler_entry.get(), base::Milliseconds(1), server, attacker_results);
attacker->SetStartupJitter(base::Seconds(120));
simulation.AddActor(attacker.get());
requesters.push_back(std::move(attacker));
}
for (size_t i = 0; i < kNumClients; ++i) {
// Normal clients only make requests every 2 minutes, plus/minus 1 minute.
- scoped_refptr<MockURLRequestThrottlerEntry> throttler_entry(
- new MockURLRequestThrottlerEntry(&manager));
+ auto throttler_entry =
+ base::MakeRefCounted<MockURLRequestThrottlerEntry>(&manager);
if (!enable_throttling)
throttler_entry->DisableBackoffThrottling();
- std::unique_ptr<Requester> client(new Requester(
- throttler_entry.get(), base::Minutes(2), server, client_results));
+ auto client = std::make_unique<Requester>(
+ throttler_entry.get(), base::Minutes(2), server, client_results);
client->SetStartupJitter(base::Seconds(120));
client->SetRequestJitter(base::Minutes(1));
simulation.AddActor(client.get());
@@ -585,8 +584,8 @@ double SimulateDowntime(const base::TimeDelta& duration,
server.SetDowntime(start_downtime, duration);
URLRequestThrottlerManager manager;
- scoped_refptr<MockURLRequestThrottlerEntry> throttler_entry(
- new MockURLRequestThrottlerEntry(&manager));
+ auto throttler_entry =
+ base::MakeRefCounted<MockURLRequestThrottlerEntry>(&manager);
if (!enable_throttling)
throttler_entry->DisableBackoffThrottling();
@@ -699,17 +698,17 @@ TEST(URLRequestThrottlerSimulation, PerceivedDowntimeRatio) {
// If things don't converge by the time we've done 100K trials, then
// clearly one or more of the expected intervals are wrong.
while (global_stats.num_runs < 100000) {
- for (size_t i = 0; i < std::size(trials); ++i) {
+ for (auto& trial : trials) {
++global_stats.num_runs;
- ++trials[i].stats.num_runs;
+ ++trial.stats.num_runs;
double ratio_unprotected = SimulateDowntime(
- trials[i].duration, trials[i].average_client_interval, false);
- double ratio_protected = SimulateDowntime(
- trials[i].duration, trials[i].average_client_interval, true);
+ trial.duration, trial.average_client_interval, false);
+ double ratio_protected =
+ SimulateDowntime(trial.duration, trial.average_client_interval, true);
global_stats.total_ratio_unprotected += ratio_unprotected;
global_stats.total_ratio_protected += ratio_protected;
- trials[i].stats.total_ratio_unprotected += ratio_unprotected;
- trials[i].stats.total_ratio_protected += ratio_protected;
+ trial.stats.total_ratio_unprotected += ratio_unprotected;
+ trial.stats.total_ratio_protected += ratio_protected;
}
double increase_ratio;
@@ -727,12 +726,12 @@ TEST(URLRequestThrottlerSimulation, PerceivedDowntimeRatio) {
// Print individual trial results for optional manual evaluation.
double max_increase_ratio = 0.0;
- for (size_t i = 0; i < std::size(trials); ++i) {
+ for (auto& trial : trials) {
double increase_ratio;
- trials[i].stats.DidConverge(&increase_ratio);
+ trial.stats.DidConverge(&increase_ratio);
max_increase_ratio = std::max(max_increase_ratio, increase_ratio);
- trials[i].PrintTrialDescription();
- trials[i].stats.ReportTrialResult(increase_ratio);
+ trial.PrintTrialDescription();
+ trial.stats.ReportTrialResult(increase_ratio);
}
VerboseOut("Average increase ratio was %.4f\n", average_increase_ratio);
diff --git a/chromium/net/url_request/url_request_throttler_unittest.cc b/chromium/net/url_request/url_request_throttler_unittest.cc
index 98c2aeac76f..0297899726f 100644
--- a/chromium/net/url_request/url_request_throttler_unittest.cc
+++ b/chromium/net/url_request/url_request_throttler_unittest.cc
@@ -122,10 +122,9 @@ class MockURLRequestThrottlerManager : public URLRequestThrottlerManager {
std::string fake_url_string("http://www.fakeurl.com/");
fake_url_string.append(base::NumberToString(create_entry_index_++));
GURL fake_url(fake_url_string);
- OverrideEntryForTests(
- fake_url,
- new MockURLRequestThrottlerEntry(this, time, TimeTicks::Now(),
- TimeTicks::Now()));
+ OverrideEntryForTests(fake_url,
+ base::MakeRefCounted<MockURLRequestThrottlerEntry>(
+ this, time, TimeTicks::Now(), TimeTicks::Now()));
}
private:
@@ -181,7 +180,7 @@ void URLRequestThrottlerEntryTest::SetUp() {
request_->SetLoadFlags(0);
now_ = TimeTicks::Now();
- entry_ = new MockURLRequestThrottlerEntry(&manager_);
+ entry_ = base::MakeRefCounted<MockURLRequestThrottlerEntry>(&manager_);
entry_->ResetToBlank(now_);
}
diff --git a/chromium/net/url_request/url_request_unittest.cc b/chromium/net/url_request/url_request_unittest.cc
index 66b18c53108..9c45ace4a25 100644
--- a/chromium/net/url_request/url_request_unittest.cc
+++ b/chromium/net/url_request/url_request_unittest.cc
@@ -335,8 +335,7 @@ bool ContainsString(const std::string& haystack, const char* needle) {
}
std::unique_ptr<UploadDataStream> CreateSimpleUploadData(const char* data) {
- std::unique_ptr<UploadElementReader> reader(
- new UploadBytesElementReader(data, strlen(data)));
+ auto reader = std::make_unique<UploadBytesElementReader>(data, strlen(data));
return ElementsUploadDataStream::CreateWithReader(std::move(reader), 0);
}
@@ -727,7 +726,7 @@ class URLRequestTest : public PlatformTest, public WithTaskEnvironment {
static std::unique_ptr<ConfiguredProxyResolutionService>
CreateFixedProxyResolutionService(const std::string& proxy) {
- return ConfiguredProxyResolutionService::CreateFixed(
+ return ConfiguredProxyResolutionService::CreateFixedForTest(
proxy, TRAFFIC_ANNOTATION_FOR_TESTS);
}
@@ -3732,12 +3731,11 @@ int FixedDateNetworkDelegate::OnHeadersReceived(
scoped_refptr<HttpResponseHeaders>* override_response_headers,
const IPEndPoint& endpoint,
absl::optional<GURL>* preserve_fragment_on_redirect_url) {
- HttpResponseHeaders* new_response_headers =
- new HttpResponseHeaders(original_response_headers->raw_headers());
+ *override_response_headers = base::MakeRefCounted<HttpResponseHeaders>(
+ original_response_headers->raw_headers());
- new_response_headers->SetHeader("Date", fixed_date_);
+ (*override_response_headers)->SetHeader("Date", fixed_date_);
- *override_response_headers = new_response_headers;
return TestNetworkDelegate::OnHeadersReceived(
request, std::move(callback), original_response_headers,
override_response_headers, endpoint, preserve_fragment_on_redirect_url);
@@ -3988,8 +3986,8 @@ class URLRequestTestHTTP : public URLRequestTest {
void HTTPUploadDataOperationTest(const std::string& method) {
const int kMsgSize = 20000; // multiple of 10
const int kIterations = 50;
- char* uploadBytes = new char[kMsgSize + 1];
- char* ptr = uploadBytes;
+ auto uploadBytes = std::make_unique<char[]>(kMsgSize + 1);
+ char* ptr = uploadBytes.get();
char marker = 'a';
for (int idx = 0; idx < kMsgSize / 10; idx++) {
memcpy(ptr, "----------", 10);
@@ -4010,7 +4008,7 @@ class URLRequestTestHTTP : public URLRequestTest {
TRAFFIC_ANNOTATION_FOR_TESTS));
r->set_method(method.c_str());
- r->set_upload(CreateSimpleUploadData(uploadBytes));
+ r->set_upload(CreateSimpleUploadData(uploadBytes.get()));
r->Start();
EXPECT_TRUE(r->is_pending());
@@ -4021,9 +4019,9 @@ class URLRequestTestHTTP : public URLRequestTest {
<< "request failed. Error: " << d.request_status();
EXPECT_FALSE(d.received_data_before_response());
- EXPECT_EQ(uploadBytes, d.data_received());
+ EXPECT_EQ(base::StringPiece(uploadBytes.get(), kMsgSize),
+ d.data_received());
}
- delete[] uploadBytes;
}
HttpTestServer* http_test_server() { return &test_server_; }
@@ -4044,8 +4042,7 @@ std::unique_ptr<test_server::HttpResponse> HandleRedirectConnect(
return nullptr;
}
- std::unique_ptr<test_server::BasicHttpResponse> http_response(
- new test_server::BasicHttpResponse);
+ auto http_response = std::make_unique<test_server::BasicHttpResponse>();
http_response->set_code(HTTP_FOUND);
http_response->AddCustomHeader("Location",
"http://www.destination.com/foo.js");
@@ -4134,7 +4131,6 @@ TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) {
BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
BlockingNetworkDelegate::ON_HEADERS_RECEIVED};
- static const size_t blocking_stages_length = std::size(blocking_stages);
ASSERT_TRUE(http_test_server()->Start());
@@ -4155,10 +4151,9 @@ TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) {
TRAFFIC_ANNOTATION_FOR_TESTS));
r->Start();
- for (size_t i = 0; i < blocking_stages_length; ++i) {
+ for (auto stage : blocking_stages) {
network_delegate.RunUntilBlocked();
- EXPECT_EQ(blocking_stages[i],
- network_delegate.stage_blocked_for_callback());
+ EXPECT_EQ(stage, network_delegate.stage_blocked_for_callback());
network_delegate.DoCallback(OK);
}
d.RunUntilComplete();
@@ -4678,12 +4673,11 @@ std::unique_ptr<test_server::HttpResponse> HandleServerAuthConnect(
return nullptr;
}
- std::unique_ptr<test_server::BasicHttpResponse> http_response(
- new test_server::BasicHttpResponse);
+ auto http_response = std::make_unique<test_server::BasicHttpResponse>();
http_response->set_code(HTTP_UNAUTHORIZED);
http_response->AddCustomHeader("WWW-Authenticate",
"Basic realm=\"WallyWorld\"");
- return std::move(http_response);
+ return http_response;
}
} // namespace
@@ -5921,7 +5915,7 @@ TEST_F(URLRequestTestHTTP, PostFileTest) {
ASSERT_EQ(true, base::GetFileSize(path, &size64));
ASSERT_LE(size64, std::numeric_limits<int>::max());
int size = static_cast<int>(size64);
- std::unique_ptr<char[]> buf(new char[size]);
+ auto buf = std::make_unique<char[]>(size);
ASSERT_EQ(size, base::ReadFile(path, buf.get(), size));
@@ -6006,8 +6000,7 @@ TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) {
std::unique_ptr<URLRequest> r(default_context().CreateRequest(
http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
TRAFFIC_ANNOTATION_FOR_TESTS));
- std::unique_ptr<ChunkedUploadDataStream> upload_data_stream(
- new ChunkedUploadDataStream(0));
+ auto upload_data_stream = std::make_unique<ChunkedUploadDataStream>(0);
std::unique_ptr<ChunkedUploadDataStream::Writer> writer =
upload_data_stream->CreateWriter();
r->set_upload(std::move(upload_data_stream));
@@ -6030,8 +6023,7 @@ TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) {
std::unique_ptr<URLRequest> r(default_context().CreateRequest(
http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
TRAFFIC_ANNOTATION_FOR_TESTS));
- std::unique_ptr<ChunkedUploadDataStream> upload_data_stream(
- new ChunkedUploadDataStream(0));
+ auto upload_data_stream = std::make_unique<ChunkedUploadDataStream>(0);
std::unique_ptr<ChunkedUploadDataStream::Writer> writer =
upload_data_stream->CreateWriter();
r->set_upload(std::move(upload_data_stream));
@@ -6053,8 +6045,7 @@ TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) {
std::unique_ptr<URLRequest> r(default_context().CreateRequest(
http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
TRAFFIC_ANNOTATION_FOR_TESTS));
- std::unique_ptr<ChunkedUploadDataStream> upload_data_stream(
- new ChunkedUploadDataStream(0));
+ auto upload_data_stream = std::make_unique<ChunkedUploadDataStream>(0);
std::unique_ptr<ChunkedUploadDataStream::Writer> writer =
upload_data_stream->CreateWriter();
r->set_upload(std::move(upload_data_stream));
@@ -9006,15 +8997,15 @@ TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) {
{"/echoheader?Accept-Charset", "None"},
{"/echoheader?User-Agent", ""}};
- for (size_t i = 0; i < std::size(tests); i++) {
+ for (const auto& test : tests) {
TestDelegate d;
std::unique_ptr<URLRequest> req(context->CreateRequest(
- http_test_server()->GetURL(tests[i].request), DEFAULT_PRIORITY, &d,
+ http_test_server()->GetURL(test.request), DEFAULT_PRIORITY, &d,
TRAFFIC_ANNOTATION_FOR_TESTS));
req->Start();
d.RunUntilComplete();
- EXPECT_EQ(tests[i].expected_response, d.data_received())
- << " Request = \"" << tests[i].request << "\"";
+ EXPECT_EQ(test.expected_response, d.data_received())
+ << " Request = \"" << test.request << "\"";
}
}
@@ -9121,7 +9112,16 @@ class FailingHttpTransactionFactory : public HttpTransactionFactory {
// This currently only happens when in suspend mode and there's no cache, but
// just use a special HttpTransactionFactory, to avoid depending on those
// behaviors.
-TEST_F(URLRequestTestHTTP, NetworkCancelAfterCreateTransactionFailsTest) {
+//
+// Flaky crash: https://crbug.com/1348418
+#if BUILDFLAG(IS_CHROMEOS)
+#define MAYBE_NetworkCancelAfterCreateTransactionFailsTest \
+ DISABLED_NetworkCancelAfterCreateTransactionFailsTest
+#else
+#define MAYBE_NetworkCancelAfterCreateTransactionFailsTest \
+ NetworkCancelAfterCreateTransactionFailsTest
+#endif
+TEST_F(URLRequestTestHTTP, MAYBE_NetworkCancelAfterCreateTransactionFailsTest) {
auto context_builder = CreateTestURLRequestContextBuilder();
context_builder->SetCreateHttpTransactionFactoryCallback(
base::BindOnce([](HttpNetworkSession* session) {
@@ -10729,9 +10729,9 @@ class HTTPSCertNetFetchingTest : public HTTPSRequestTest {
};
// The test EV policy OID used for generated certs.
-static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1";
+static const char kEVTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1";
-class HTTPSOCSPTest : public HTTPSCertNetFetchingTest {
+class HTTPSEVTest : public HTTPSCertNetFetchingTest {
public:
void SetUp() override {
HTTPSCertNetFetchingTest::SetUp();
@@ -10743,19 +10743,22 @@ class HTTPSOCSPTest : public HTTPSCertNetFetchingTest {
ev_test_policy_ = std::make_unique<ScopedTestEVPolicy>(
EVRootCAMetadata::GetInstance(),
X509Certificate::CalculateFingerprint256(root_cert->cert_buffer()),
- kOCSPTestCertPolicy);
+ kEVTestCertPolicy);
}
void TearDown() override { HTTPSCertNetFetchingTest::TearDown(); }
+ private:
+ std::unique_ptr<ScopedTestEVPolicy> ev_test_policy_;
+};
+
+class HTTPSOCSPTest : public HTTPSCertNetFetchingTest {
+ public:
CertVerifier::Config GetCertVerifierConfig() override {
CertVerifier::Config config;
config.enable_rev_checking = true;
return config;
}
-
- private:
- std::unique_ptr<ScopedTestEVPolicy> ev_test_policy_;
};
static bool UsingBuiltinCertVerifier() {
@@ -10766,6 +10769,10 @@ static bool UsingBuiltinCertVerifier() {
if (base::FeatureList::IsEnabled(features::kCertVerifierBuiltinFeature))
return true;
#endif
+#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
+ if (base::FeatureList::IsEnabled(features::kChromeRootStoreUsed))
+ return true;
+#endif
return false;
#endif
}
@@ -10803,7 +10810,7 @@ static bool SystemUsesChromiumEVMetadata() {
static bool SystemSupportsOCSP() {
#if BUILDFLAG(IS_ANDROID)
- // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported.
+ // Unsupported, see http://crbug.com/117478.
return false;
#else
return true;
@@ -10830,6 +10837,25 @@ static bool SystemSupportsCRLSets() {
#endif
}
+TEST_F(HTTPSEVTest, EVCheckNoOCSP) {
+ if (!SystemUsesChromiumEVMetadata()) {
+ LOG(WARNING) << "Skipping test because system doesn't support EV";
+ return;
+ }
+ EmbeddedTestServer::ServerCertificateConfig cert_config;
+ cert_config.policy_oids = {kEVTestCertPolicy};
+
+ CertStatus cert_status;
+ DoConnection(cert_config, &cert_status);
+
+ EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
+
+ EXPECT_EQ(SystemUsesChromiumEVMetadata(),
+ static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
+
+ EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
+}
+
TEST_F(HTTPSOCSPTest, Valid) {
if (!SystemSupportsOCSP()) {
LOG(WARNING) << "Skipping test because system doesn't support OCSP";
@@ -10837,7 +10863,6 @@ TEST_F(HTTPSOCSPTest, Valid) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
{{OCSPRevocationStatus::GOOD,
EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
@@ -10847,9 +10872,6 @@ TEST_F(HTTPSOCSPTest, Valid) {
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
-
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
@@ -10860,7 +10882,6 @@ TEST_F(HTTPSOCSPTest, Revoked) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
{{OCSPRevocationStatus::REVOKED,
EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
@@ -10880,7 +10901,6 @@ TEST_F(HTTPSOCSPTest, Invalid) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
EmbeddedTestServer::OCSPConfig::ResponseType::kInvalidResponse);
@@ -10901,7 +10921,6 @@ TEST_F(HTTPSOCSPTest, IntermediateValid) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
cert_config.intermediate = EmbeddedTestServer::IntermediateType::kInHandshake;
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
{{OCSPRevocationStatus::GOOD,
@@ -10915,9 +10934,6 @@ TEST_F(HTTPSOCSPTest, IntermediateValid) {
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
-
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
@@ -10928,7 +10944,6 @@ TEST_F(HTTPSOCSPTest, IntermediateResponseOldButStillValid) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
cert_config.intermediate = EmbeddedTestServer::IntermediateType::kInHandshake;
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
{{OCSPRevocationStatus::GOOD,
@@ -10936,17 +10951,25 @@ TEST_F(HTTPSOCSPTest, IntermediateResponseOldButStillValid) {
// Use an OCSP response for the intermediate that would be too old for a leaf
// cert, but is still valid for an intermediate.
cert_config.intermediate_ocsp_config = EmbeddedTestServer::OCSPConfig(
- {{OCSPRevocationStatus::GOOD,
+ {{OCSPRevocationStatus::REVOKED,
EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kLong}});
CertStatus cert_status;
DoConnection(cert_config, &cert_status);
- EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
-
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
-
+ if (UsingBuiltinCertVerifier()) {
+ EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
+ } else {
+#if BUILDFLAG(IS_WIN)
+ // TODO(mattm): Seems to be flaky on Windows. Either returns
+ // CERT_STATUS_UNABLE_TO_CHECK_REVOCATION (which gets masked off due to
+ // soft-fail), or CERT_STATUS_REVOKED.
+ EXPECT_THAT(cert_status & CERT_STATUS_ALL_ERRORS,
+ AnyOf(0u, CERT_STATUS_REVOKED));
+#else
+ EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
+#endif
+ }
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
@@ -10957,28 +10980,29 @@ TEST_F(HTTPSOCSPTest, IntermediateResponseTooOld) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
cert_config.intermediate = EmbeddedTestServer::IntermediateType::kInHandshake;
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
{{OCSPRevocationStatus::GOOD,
EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
cert_config.intermediate_ocsp_config = EmbeddedTestServer::OCSPConfig(
- {{OCSPRevocationStatus::GOOD,
+ {{OCSPRevocationStatus::REVOKED,
EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kLonger}});
CertStatus cert_status;
DoConnection(cert_config, &cert_status);
if (UsingBuiltinCertVerifier()) {
- // The builtin verifier enforces the baseline requirements for max age of an
- // intermediate's OCSP response, so the connection is considered non-EV.
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_EQ(0u, cert_status & CERT_STATUS_IS_EV);
} else {
- // The platform verifiers are more lenient.
- EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
+#if BUILDFLAG(IS_WIN)
+ // TODO(mattm): Seems to be flaky on Windows. Either returns
+ // CERT_STATUS_UNABLE_TO_CHECK_REVOCATION (which gets masked off due to
+ // soft-fail), or CERT_STATUS_REVOKED.
+ EXPECT_THAT(cert_status & CERT_STATUS_ALL_ERRORS,
+ AnyOf(0u, CERT_STATUS_REVOKED));
+#else
+ EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
+#endif
}
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
@@ -10990,7 +11014,6 @@ TEST_F(HTTPSOCSPTest, IntermediateRevoked) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
cert_config.intermediate = EmbeddedTestServer::IntermediateType::kInHandshake;
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
{{OCSPRevocationStatus::GOOD,
@@ -11002,6 +11025,9 @@ TEST_F(HTTPSOCSPTest, IntermediateRevoked) {
CertStatus cert_status;
DoConnection(cert_config, &cert_status);
+ if (UsingBuiltinCertVerifier()) {
+ EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
+ } else {
#if BUILDFLAG(IS_WIN)
// TODO(mattm): Seems to be flaky on Windows. Either returns
// CERT_STATUS_UNABLE_TO_CHECK_REVOCATION (which gets masked off due to
@@ -11011,7 +11037,7 @@ TEST_F(HTTPSOCSPTest, IntermediateRevoked) {
#else
EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
#endif
- EXPECT_EQ(0u, cert_status & CERT_STATUS_IS_EV);
+ }
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
@@ -11023,7 +11049,6 @@ TEST_F(HTTPSOCSPTest, ValidStapled) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
// AIA OCSP url is included, but does not return a successful ocsp response.
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
@@ -11037,10 +11062,6 @@ TEST_F(HTTPSOCSPTest, ValidStapled) {
DoConnection(cert_config, &cert_status);
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
-
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
-
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
@@ -11052,7 +11073,6 @@ TEST_F(HTTPSOCSPTest, RevokedStapled) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
// AIA OCSP url is included, but does not return a successful ocsp response.
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
@@ -11066,7 +11086,6 @@ TEST_F(HTTPSOCSPTest, RevokedStapled) {
DoConnection(cert_config, &cert_status);
EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
@@ -11078,7 +11097,6 @@ TEST_F(HTTPSOCSPTest, OldStapledAndInvalidAIA) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
// Stapled response indicates good, but is too old.
cert_config.stapled_ocsp_config = EmbeddedTestServer::OCSPConfig(
@@ -11093,7 +11111,6 @@ TEST_F(HTTPSOCSPTest, OldStapledAndInvalidAIA) {
DoConnection(cert_config, &cert_status);
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
@@ -11105,7 +11122,6 @@ TEST_F(HTTPSOCSPTest, OldStapledButValidAIA) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
// Stapled response indicates good, but response is too old.
cert_config.stapled_ocsp_config = EmbeddedTestServer::OCSPConfig(
@@ -11121,8 +11137,6 @@ TEST_F(HTTPSOCSPTest, OldStapledButValidAIA) {
DoConnection(cert_config, &cert_status);
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
@@ -11334,7 +11348,6 @@ TEST_P(HTTPSOCSPVerifyTest, VerifyResult) {
OCSPVerifyTestData test = GetParam();
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
cert_config.stapled_ocsp_config = test.ocsp_config;
SSLInfo ssl_info;
@@ -11403,7 +11416,7 @@ class HTTPSHardFailTest : public HTTPSOCSPTest {
}
};
-TEST_F(HTTPSHardFailTest, FailsOnOCSPInvalid) {
+TEST_F(HTTPSHardFailTest, Valid) {
if (!SystemSupportsOCSP()) {
LOG(WARNING) << "Skipping test because system doesn't support OCSP";
return;
@@ -11416,96 +11429,152 @@ TEST_F(HTTPSHardFailTest, FailsOnOCSPInvalid) {
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
- EmbeddedTestServer::OCSPConfig::ResponseType::kInvalidResponse);
+ {{OCSPRevocationStatus::GOOD,
+ EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
CertStatus cert_status;
DoConnection(cert_config, &cert_status);
- EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
- cert_status & CERT_STATUS_ALL_ERRORS);
+ EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
+ EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
+}
+
+TEST_F(HTTPSHardFailTest, Revoked) {
+ if (!SystemSupportsOCSP()) {
+ LOG(WARNING) << "Skipping test because system doesn't support OCSP";
+ return;
+ }
+
+ if (!SystemSupportsHardFailRevocationChecking()) {
+ LOG(WARNING) << "Skipping test because system doesn't support hard fail "
+ << "revocation checking";
+ return;
+ }
- // Without a positive OCSP response, we shouldn't show the EV status.
+ EmbeddedTestServer::ServerCertificateConfig cert_config;
+ cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
+ {{OCSPRevocationStatus::REVOKED,
+ EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
+
+ CertStatus cert_status;
+ DoConnection(cert_config, &cert_status);
+
+ EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
-class HTTPSEVCRLSetTest : public HTTPSOCSPTest {
- protected:
- CertVerifier::Config GetCertVerifierConfig() override {
- CertVerifier::Config config;
- return config;
+TEST_F(HTTPSHardFailTest, FailsOnOCSPInvalid) {
+ if (!SystemSupportsOCSP()) {
+ LOG(WARNING) << "Skipping test because system doesn't support OCSP";
+ return;
}
-};
-TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) {
+ if (!SystemSupportsHardFailRevocationChecking()) {
+ LOG(WARNING) << "Skipping test because system doesn't support hard fail "
+ << "revocation checking";
+ return;
+ }
+
+ EmbeddedTestServer::ServerCertificateConfig cert_config;
+ cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
+ EmbeddedTestServer::OCSPConfig::ResponseType::kInvalidResponse);
+
+ CertStatus cert_status;
+ DoConnection(cert_config, &cert_status);
+
+ EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
+ cert_status & CERT_STATUS_ALL_ERRORS);
+ EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
+}
+
+TEST_F(HTTPSHardFailTest, IntermediateResponseOldButStillValid) {
if (!SystemSupportsOCSP()) {
LOG(WARNING) << "Skipping test because system doesn't support OCSP";
return;
}
+ if (!SystemSupportsHardFailRevocationChecking()) {
+ LOG(WARNING) << "Skipping test because system doesn't support hard fail "
+ << "revocation checking";
+ return;
+ }
+
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
+ cert_config.intermediate = EmbeddedTestServer::IntermediateType::kInHandshake;
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
- EmbeddedTestServer::OCSPConfig::ResponseType::kInvalidResponse);
+ {{OCSPRevocationStatus::GOOD,
+ EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
+ // Use an OCSP response for the intermediate that would be too old for a leaf
+ // cert, but is still valid for an intermediate.
+ cert_config.intermediate_ocsp_config = EmbeddedTestServer::OCSPConfig(
+ {{OCSPRevocationStatus::GOOD,
+ EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kLong}});
CertStatus cert_status;
DoConnection(cert_config, &cert_status);
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
+ EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
-TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndRevokedOCSP) {
+TEST_F(HTTPSHardFailTest, IntermediateResponseTooOld) {
if (!SystemSupportsOCSP()) {
LOG(WARNING) << "Skipping test because system doesn't support OCSP";
return;
}
+ if (!SystemSupportsHardFailRevocationChecking()) {
+ LOG(WARNING) << "Skipping test because system doesn't support hard fail "
+ << "revocation checking";
+ return;
+ }
+
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
+ cert_config.intermediate = EmbeddedTestServer::IntermediateType::kInHandshake;
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
- {{OCSPRevocationStatus::REVOKED,
+ {{OCSPRevocationStatus::GOOD,
EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
+ // Use an OCSP response for the intermediate that is too old.
+ cert_config.intermediate_ocsp_config = EmbeddedTestServer::OCSPConfig(
+ {{OCSPRevocationStatus::GOOD,
+ EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kLonger}});
CertStatus cert_status;
DoConnection(cert_config, &cert_status);
- // The CertVerifyProc implementations handle revocation on the EV
- // verification differently. Some will return a revoked error, others will
- // return the non-EV verification result. For example on NSS it's not
- // possible to determine whether the EV verification attempt failed because
- // of actual revocation or because there was an OCSP failure.
if (UsingBuiltinCertVerifier()) {
- // TODO(https://crbug.com/410574): Handle this in builtin verifier too?
- EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
+ EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
+ cert_status & CERT_STATUS_ALL_ERRORS);
} else {
-#if BUILDFLAG(IS_APPLE)
- EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
-#elif BUILDFLAG(IS_WIN)
- EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
-#else
+ // Platform verifier are more lenient.
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
-#endif
}
- EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
+ EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
-TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) {
- if (!SystemSupportsOCSP()) {
- LOG(WARNING) << "Skipping test because system doesn't support OCSP";
+TEST_F(HTTPSHardFailTest, ValidStapled) {
+ if (!SystemSupportsOCSPStapling()) {
+ LOG(WARNING)
+ << "Skipping test because system doesn't support OCSP stapling";
+ return;
+ }
+
+ if (!SystemSupportsHardFailRevocationChecking()) {
+ LOG(WARNING) << "Skipping test because system doesn't support hard fail "
+ << "revocation checking";
return;
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
+
+ // AIA OCSP url is included, but does not return a successful ocsp response.
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
+ EmbeddedTestServer::OCSPConfig::ResponseType::kTryLater);
+
+ cert_config.stapled_ocsp_config = EmbeddedTestServer::OCSPConfig(
{{OCSPRevocationStatus::GOOD,
EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
@@ -11513,94 +11582,101 @@ TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) {
DoConnection(cert_config, &cert_status);
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
-
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
+ EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
-TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) {
- if (!SystemSupportsOCSP()) {
- LOG(WARNING) << "Skipping test because system doesn't support OCSP";
+TEST_F(HTTPSHardFailTest, RevokedStapled) {
+ if (!SystemSupportsOCSPStapling()) {
+ LOG(WARNING)
+ << "Skipping test because system doesn't support OCSP stapling";
+ return;
+ }
+
+ if (!SystemSupportsHardFailRevocationChecking()) {
+ LOG(WARNING) << "Skipping test because system doesn't support hard fail "
+ << "revocation checking";
return;
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
+
+ // AIA OCSP url is included, but does not return a successful ocsp response.
cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
- EmbeddedTestServer::OCSPConfig::ResponseType::kInvalidResponse);
+ EmbeddedTestServer::OCSPConfig::ResponseType::kTryLater);
- CertVerifier::Config cert_verifier_config = GetCertVerifierConfig();
- cert_verifier_config.crl_set = CRLSet::ExpiredCRLSetForTesting();
- context_->cert_verifier()->SetConfig(cert_verifier_config);
+ cert_config.stapled_ocsp_config = EmbeddedTestServer::OCSPConfig(
+ {{OCSPRevocationStatus::REVOKED,
+ EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
CertStatus cert_status;
DoConnection(cert_config, &cert_status);
- EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
+ EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
+ EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
-TEST_F(HTTPSEVCRLSetTest, FreshCRLSetCovered) {
- if (!SystemSupportsOCSP()) {
- LOG(WARNING) << "Skipping test because system doesn't support OCSP";
+TEST_F(HTTPSHardFailTest, OldStapledAndInvalidAIA) {
+ if (!SystemSupportsOCSPStapling()) {
+ LOG(WARNING)
+ << "Skipping test because system doesn't support OCSP stapling";
+ return;
+ }
+
+ if (!SystemSupportsHardFailRevocationChecking()) {
+ LOG(WARNING) << "Skipping test because system doesn't support hard fail "
+ << "revocation checking";
return;
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
- cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
- EmbeddedTestServer::OCSPConfig::ResponseType::kInvalidResponse);
- CertVerifier::Config cert_verifier_config = GetCertVerifierConfig();
- SHA256HashValue root_cert_spki_hash;
- ASSERT_TRUE(GetTestRootCertSPKIHash(&root_cert_spki_hash));
- cert_verifier_config.crl_set =
- CRLSet::ForTesting(false, &root_cert_spki_hash, "", "", {});
- context_->cert_verifier()->SetConfig(cert_verifier_config);
+ // Stapled response indicates good, but is too old.
+ cert_config.stapled_ocsp_config = EmbeddedTestServer::OCSPConfig(
+ {{OCSPRevocationStatus::GOOD,
+ EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kOld}});
+
+ // AIA OCSP url is included, but does not return a successful ocsp response.
+ cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
+ EmbeddedTestServer::OCSPConfig::ResponseType::kTryLater);
CertStatus cert_status;
DoConnection(cert_config, &cert_status);
- // With a fresh CRLSet that covers the issuing certificate, we shouldn't do a
- // revocation check for EV.
- EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
- EXPECT_FALSE(
- static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
+ EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
+ cert_status & CERT_STATUS_ALL_ERRORS);
+ EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
-TEST_F(HTTPSEVCRLSetTest, FreshCRLSetNotCovered) {
- if (!SystemSupportsOCSP()) {
- LOG(WARNING) << "Skipping test because system doesn't support OCSP";
+TEST_F(HTTPSHardFailTest, OldStapledButValidAIA) {
+ if (!SystemSupportsOCSPStapling()) {
+ LOG(WARNING)
+ << "Skipping test because system doesn't support OCSP stapling";
+ return;
+ }
+
+ if (!SystemSupportsHardFailRevocationChecking()) {
+ LOG(WARNING) << "Skipping test because system doesn't support hard fail "
+ << "revocation checking";
return;
}
EmbeddedTestServer::ServerCertificateConfig cert_config;
- cert_config.policy_oids = {kOCSPTestCertPolicy};
- cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
- EmbeddedTestServer::OCSPConfig::ResponseType::kInvalidResponse);
- CertVerifier::Config cert_verifier_config = GetCertVerifierConfig();
- cert_verifier_config.crl_set = CRLSet::EmptyCRLSetForTesting();
- context_->cert_verifier()->SetConfig(cert_verifier_config);
+ // Stapled response indicates good, but response is too old.
+ cert_config.stapled_ocsp_config = EmbeddedTestServer::OCSPConfig(
+ {{OCSPRevocationStatus::GOOD,
+ EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kOld}});
- CertStatus cert_status = 0;
+ // AIA OCSP url is included, and returns a successful ocsp response.
+ cert_config.ocsp_config = EmbeddedTestServer::OCSPConfig(
+ {{OCSPRevocationStatus::GOOD,
+ EmbeddedTestServer::OCSPConfig::SingleResponse::Date::kValid}});
+
+ CertStatus cert_status;
DoConnection(cert_config, &cert_status);
- // Even with a fresh CRLSet, we should still do online revocation checks when
- // the certificate chain isn't covered by the CRLSet, which it isn't in this
- // test. Since the online revocation check returns an invalid OCSP response,
- // the result should be non-EV but with REV_CHECKING_ENABLED status set to
- // indicate online revocation checking was attempted.
EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
- EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
- EXPECT_EQ(SystemUsesChromiumEVMetadata(),
- static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
+ EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
}
class HTTPSCRLSetTest : public HTTPSCertNetFetchingTest {};
@@ -12150,7 +12226,8 @@ TEST_F(URLRequestTestHTTP, HeadersCallbacksAuthRetry) {
auto req_headers_callback = base::BindRepeating(
[](ReqHeadersVector* vec, HttpRawRequestHeaders headers) {
- vec->emplace_back(new HttpRawRequestHeaders(std::move(headers)));
+ vec->emplace_back(
+ std::make_unique<HttpRawRequestHeaders>(std::move(headers)));
},
&raw_req_headers);
auto resp_headers_callback = base::BindRepeating(
@@ -12379,7 +12456,7 @@ class ZeroRTTResponse : public test_server::BasicHttpResponse {
ZeroRTTResponse(const ZeroRTTResponse&) = delete;
ZeroRTTResponse& operator=(const ZeroRTTResponse&) = delete;
- ~ZeroRTTResponse() override {}
+ ~ZeroRTTResponse() override = default;
void SendResponse(
base::WeakPtr<test_server::HttpResponseDelegate> delegate) override {
diff --git a/chromium/net/websockets/websocket_basic_handshake_stream.cc b/chromium/net/websockets/websocket_basic_handshake_stream.cc
index 0c335802425..c8bdabfa03a 100644
--- a/chromium/net/websockets/websocket_basic_handshake_stream.cc
+++ b/chromium/net/websockets/websocket_basic_handshake_stream.cc
@@ -23,6 +23,7 @@
#include "crypto/random.h"
#include "net/base/io_buffer.h"
#include "net/base/ip_endpoint.h"
+#include "net/http/http_network_session.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_request_info.h"
#include "net/http/http_response_body_drainer.h"
@@ -161,10 +162,10 @@ bool ValidateConnection(const HttpResponseHeaders* headers,
}
base::Value NetLogFailureParam(int net_error, const std::string& message) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetIntKey("net_error", net_error);
- dict.SetStringKey("message", message);
- return dict;
+ base::Value::Dict dict;
+ dict.Set("net_error", net_error);
+ dict.Set("message", message);
+ return base::Value(std::move(dict));
}
} // namespace
@@ -375,8 +376,8 @@ void WebSocketBasicHandshakeStream::PopulateNetErrorDetails(
}
void WebSocketBasicHandshakeStream::Drain(HttpNetworkSession* session) {
- HttpResponseBodyDrainer* drainer = new HttpResponseBodyDrainer(this);
- drainer->Start(session);
+ session->StartResponseDrainer(
+ std::make_unique<HttpResponseBodyDrainer>(this));
// |drainer| will delete itself.
}
@@ -385,7 +386,8 @@ void WebSocketBasicHandshakeStream::SetPriority(RequestPriority priority) {
// gone, then copy whatever has happened there over here.
}
-HttpStream* WebSocketBasicHandshakeStream::RenewStreamForAuth() {
+std::unique_ptr<HttpStream>
+WebSocketBasicHandshakeStream::RenewStreamForAuth() {
DCHECK(IsResponseBodyComplete());
DCHECK(!parser()->IsMoreDataBuffered());
// The HttpStreamParser object still has a pointer to the connection. Just to
@@ -400,7 +402,7 @@ HttpStream* WebSocketBasicHandshakeStream::RenewStreamForAuth() {
stream_request_->OnBasicHandshakeStreamCreated(handshake_stream.get());
- return handshake_stream.release();
+ return handshake_stream;
}
const std::set<std::string>& WebSocketBasicHandshakeStream::GetDnsAliases()
diff --git a/chromium/net/websockets/websocket_basic_handshake_stream.h b/chromium/net/websockets/websocket_basic_handshake_stream.h
index f50cabb6dda..56fc995979d 100644
--- a/chromium/net/websockets/websocket_basic_handshake_stream.h
+++ b/chromium/net/websockets/websocket_basic_handshake_stream.h
@@ -80,7 +80,7 @@ class NET_EXPORT_PRIVATE WebSocketBasicHandshakeStream final
void Drain(HttpNetworkSession* session) override;
void SetPriority(RequestPriority priority) override;
void PopulateNetErrorDetails(NetErrorDetails* details) override;
- HttpStream* RenewStreamForAuth() override;
+ std::unique_ptr<HttpStream> RenewStreamForAuth() override;
const std::set<std::string>& GetDnsAliases() const override;
base::StringPiece GetAcceptChViaAlps() const override;
diff --git a/chromium/net/websockets/websocket_basic_stream.cc b/chromium/net/websockets/websocket_basic_stream.cc
index 558de4e9117..9df4137dc30 100644
--- a/chromium/net/websockets/websocket_basic_stream.cc
+++ b/chromium/net/websockets/websocket_basic_stream.cc
@@ -106,22 +106,21 @@ int CalculateSerializedSizeAndTurnOnMaskBit(
}
base::Value NetLogBufferSizeParam(int buffer_size) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetIntKey("read_buffer_size_in_bytes", buffer_size);
- return dict;
+ base::Value::Dict dict;
+ dict.Set("read_buffer_size_in_bytes", buffer_size);
+ return base::Value(std::move(dict));
}
base::Value NetLogFrameHeaderParam(const WebSocketFrameHeader* header) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetBoolKey("final", header->final);
- dict.SetBoolKey("reserved1", header->reserved1);
- dict.SetBoolKey("reserved2", header->reserved2);
- dict.SetBoolKey("reserved3", header->reserved3);
- dict.SetIntKey("opcode", header->opcode);
- dict.SetBoolKey("masked", header->masked);
- dict.SetDoubleKey("payload_length",
- static_cast<double>(header->payload_length));
- return dict;
+ base::Value::Dict dict;
+ dict.Set("final", header->final);
+ dict.Set("reserved1", header->reserved1);
+ dict.Set("reserved2", header->reserved2);
+ dict.Set("reserved3", header->reserved3);
+ dict.Set("opcode", header->opcode);
+ dict.Set("masked", header->masked);
+ dict.Set("payload_length", static_cast<double>(header->payload_length));
+ return base::Value(std::move(dict));
}
} // namespace
diff --git a/chromium/net/websockets/websocket_basic_stream_adapters.cc b/chromium/net/websockets/websocket_basic_stream_adapters.cc
index 88144bd2d9a..734336a797d 100644
--- a/chromium/net/websockets/websocket_basic_stream_adapters.cc
+++ b/chromium/net/websockets/websocket_basic_stream_adapters.cc
@@ -23,7 +23,8 @@ WebSocketClientSocketHandleAdapter::WebSocketClientSocketHandleAdapter(
std::unique_ptr<ClientSocketHandle> connection)
: connection_(std::move(connection)) {}
-WebSocketClientSocketHandleAdapter::~WebSocketClientSocketHandleAdapter() {}
+WebSocketClientSocketHandleAdapter::~WebSocketClientSocketHandleAdapter() =
+ default;
int WebSocketClientSocketHandleAdapter::Read(IOBuffer* buf,
int buf_len,
diff --git a/chromium/net/websockets/websocket_basic_stream_adapters_test.cc b/chromium/net/websockets/websocket_basic_stream_adapters_test.cc
index 2b77b3bd00c..28738759b58 100644
--- a/chromium/net/websockets/websocket_basic_stream_adapters_test.cc
+++ b/chromium/net/websockets/websocket_basic_stream_adapters_test.cc
@@ -50,9 +50,7 @@ using testing::Test;
using testing::StrictMock;
using testing::_;
-namespace net {
-
-namespace test {
+namespace net::test {
class WebSocketClientSocketHandleAdapterTest : public TestWithTaskEnvironment {
protected:
@@ -1059,6 +1057,4 @@ TEST_F(WebSocketSpdyStreamAdapterTest,
ASSERT_EQ(ERR_CONNECTION_CLOSED, rv);
}
-} // namespace test
-
-} // namespace net
+} // namespace net::test
diff --git a/chromium/net/websockets/websocket_basic_stream_test.cc b/chromium/net/websockets/websocket_basic_stream_test.cc
index 1d5ab3876e1..1786a4e86fd 100644
--- a/chromium/net/websockets/websocket_basic_stream_test.cc
+++ b/chromium/net/websockets/websocket_basic_stream_test.cc
@@ -233,7 +233,7 @@ class WebSocketBasicStreamSocketChunkedReadTest
static_cast<int>(data + data_size - start) < len) {
len = static_cast<int>(data + data_size - start);
}
- reads_.push_back(MockRead(mode, start, len));
+ reads_.emplace_back(mode, start, len);
start += len;
}
CreateStream(reads_, base::span<MockWrite>());
@@ -842,7 +842,7 @@ TEST_F(WebSocketBasicStreamSocketChunkedReadTest, OneMegFrame) {
const size_t kWireSize = kPayloadSize + kLargeFrameHeaderSize;
const size_t kExpectedFrameCount =
(kWireSize + kReadBufferSize - 1) / kReadBufferSize;
- std::unique_ptr<char[]> big_frame(new char[kWireSize]);
+ auto big_frame = std::make_unique<char[]>(kWireSize);
memcpy(big_frame.get(), "\x81\x7F", 2);
base::WriteBigEndian(big_frame.get() + 2, kPayloadSize);
memset(big_frame.get() + kLargeFrameHeaderSize, 'A', kPayloadSize);
diff --git a/chromium/net/websockets/websocket_channel.cc b/chromium/net/websockets/websocket_channel.cc
index 8360beff228..4d9392fc182 100644
--- a/chromium/net/websockets/websocket_channel.cc
+++ b/chromium/net/websockets/websocket_channel.cc
@@ -127,11 +127,11 @@ void GetFrameTypeForOpcode(WebSocketFrameHeader::OpCode opcode,
base::Value NetLogFailParam(uint16_t code,
base::StringPiece reason,
base::StringPiece message) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetDoubleKey("code", code);
- dict.SetStringKey("reason", reason);
- dict.SetStringKey("internal_reason", message);
- return dict;
+ base::Value::Dict dict;
+ dict.Set("code", code);
+ dict.Set("reason", reason);
+ dict.Set("internal_reason", message);
+ return base::Value(std::move(dict));
}
class DependentIOBuffer : public WrappedIOBuffer {
@@ -607,8 +607,8 @@ ChannelState WebSocketChannel::OnReadDone(bool synchronous, int result) {
// with no data read, not an empty response.
DCHECK(!read_frames_.empty())
<< "ReadFrames() returned OK, but nothing was read.";
- for (size_t i = 0; i < read_frames_.size(); ++i) {
- if (HandleFrame(std::move(read_frames_[i])) == CHANNEL_DELETED)
+ for (auto& read_frame : read_frames_) {
+ if (HandleFrame(std::move(read_frame)) == CHANNEL_DELETED)
return CHANNEL_DELETED;
}
read_frames_.clear();
@@ -1008,7 +1008,11 @@ void WebSocketChannel::CloseTimeout() {
net::NetLogEventType::WEBSOCKET_CLOSE_TIMEOUT);
stream_->Close();
SetState(CLOSED);
- DoDropChannel(false, kWebSocketErrorAbnormalClosure, "");
+ if (has_received_close_frame_) {
+ DoDropChannel(true, received_close_code_, received_close_reason_);
+ } else {
+ DoDropChannel(false, kWebSocketErrorAbnormalClosure, "");
+ }
// |this| has been deleted.
}
diff --git a/chromium/net/websockets/websocket_channel_test.cc b/chromium/net/websockets/websocket_channel_test.cc
index 0f9462e4f7b..13bc5f43660 100644
--- a/chromium/net/websockets/websocket_channel_test.cc
+++ b/chromium/net/websockets/websocket_channel_test.cc
@@ -395,9 +395,9 @@ class EqualsFramesMatcher : public ::testing::MatcherInterface<
explicit EqualsFramesMatcher(const InitFrame (*expect_frames)[N])
: expect_frames_(expect_frames) {}
- virtual bool MatchAndExplain(
+ bool MatchAndExplain(
std::vector<std::unique_ptr<WebSocketFrame>>* actual_frames,
- ::testing::MatchResultListener* listener) const {
+ ::testing::MatchResultListener* listener) const override {
if (actual_frames->size() != N) {
*listener << "the vector size is " << actual_frames->size();
return false;
@@ -436,11 +436,11 @@ class EqualsFramesMatcher : public ::testing::MatcherInterface<
return true;
}
- virtual void DescribeTo(std::ostream* os) const {
+ void DescribeTo(std::ostream* os) const override {
*os << "matches " << *expect_frames_;
}
- virtual void DescribeNegationTo(std::ostream* os) const {
+ void DescribeNegationTo(std::ostream* os) const override {
*os << "does not match " << *expect_frames_;
}
@@ -901,8 +901,7 @@ class WebSocketChannelEventInterfaceTest : public WebSocketChannelTest {
std::make_unique<StrictMock<MockWebSocketEventInterface>>()) {
}
- ~WebSocketChannelEventInterfaceTest() override {
- }
+ ~WebSocketChannelEventInterfaceTest() override = default;
// Tests using this fixture must set expectations on the event_interface_ mock
// object before calling CreateChannelAndConnect() or
@@ -1738,7 +1737,7 @@ TEST_F(WebSocketChannelEventInterfaceTest,
EXPECT_CALL(checkpoint, Call(1));
EXPECT_CALL(*event_interface_, OnClosingHandshake());
EXPECT_CALL(*event_interface_,
- OnDropChannel(false, kWebSocketErrorAbnormalClosure, _))
+ OnDropChannel(true, kWebSocketNormalClosure, _))
.WillOnce(InvokeClosure(&completion));
}
CreateChannelAndConnectSuccessfully();
@@ -2656,7 +2655,7 @@ TEST_F(WebSocketChannelEventInterfaceTest, OnAuthRequiredCalled) {
connect_data_.socket_url = wss_url;
AuthChallengeInfo auth_info;
absl::optional<AuthCredentials> credentials;
- scoped_refptr<HttpResponseHeaders> response_headers =
+ auto response_headers =
base::MakeRefCounted<HttpResponseHeaders>("HTTP/1.1 200 OK");
IPEndPoint remote_endpoint(net::IPAddress(127, 0, 0, 1), 80);
diff --git a/chromium/net/websockets/websocket_deflate_predictor.h b/chromium/net/websockets/websocket_deflate_predictor.h
index fde316e8cb8..50b3f37991d 100644
--- a/chromium/net/websockets/websocket_deflate_predictor.h
+++ b/chromium/net/websockets/websocket_deflate_predictor.h
@@ -32,7 +32,7 @@ class NET_EXPORT_PRIVATE WebSocketDeflatePredictor {
TRY_DEFLATE,
};
- virtual ~WebSocketDeflatePredictor() {}
+ virtual ~WebSocketDeflatePredictor() = default;
// Predicts and returns whether the deflater should deflate the message
// which begins with |frames[frame_index]| or not.
diff --git a/chromium/net/websockets/websocket_deflate_predictor_impl.h b/chromium/net/websockets/websocket_deflate_predictor_impl.h
index 3a0b09c6f04..39472ec84f7 100644
--- a/chromium/net/websockets/websocket_deflate_predictor_impl.h
+++ b/chromium/net/websockets/websocket_deflate_predictor_impl.h
@@ -20,7 +20,7 @@ struct WebSocketFrame;
class NET_EXPORT_PRIVATE WebSocketDeflatePredictorImpl
: public WebSocketDeflatePredictor {
public:
- ~WebSocketDeflatePredictorImpl() override {}
+ ~WebSocketDeflatePredictorImpl() override = default;
Result Predict(const std::vector<std::unique_ptr<WebSocketFrame>>& frames,
size_t frame_index) override;
diff --git a/chromium/net/websockets/websocket_deflate_stream.cc b/chromium/net/websockets/websocket_deflate_stream.cc
index 709d9a14708..5755c7f39e0 100644
--- a/chromium/net/websockets/websocket_deflate_stream.cc
+++ b/chromium/net/websockets/websocket_deflate_stream.cc
@@ -260,8 +260,7 @@ int WebSocketDeflateStream::AppendPossiblyCompressedMessage(
if (original_payload_length <=
static_cast<uint64_t>(compressed_payload->size())) {
// Compression is not effective. Use the original frames.
- for (size_t i = 0; i < frames->size(); ++i) {
- std::unique_ptr<WebSocketFrame> frame = std::move((*frames)[i]);
+ for (auto& frame : *frames) {
predictor_->RecordWrittenDataFrame(frame.get());
frames_to_write->push_back(std::move(frame));
}
@@ -286,9 +285,9 @@ int WebSocketDeflateStream::Inflate(
std::vector<std::unique_ptr<WebSocketFrame>> frames_to_output;
std::vector<std::unique_ptr<WebSocketFrame>> frames_passed;
frames->swap(frames_passed);
- for (size_t i = 0; i < frames_passed.size(); ++i) {
- std::unique_ptr<WebSocketFrame> frame(std::move(frames_passed[i]));
- frames_passed[i] = nullptr;
+ for (auto& frame_passed : frames_passed) {
+ std::unique_ptr<WebSocketFrame> frame(std::move(frame_passed));
+ frame_passed = nullptr;
DVLOG(3) << "Input frame: opcode=" << frame->header.opcode
<< " final=" << frame->header.final
<< " reserved1=" << frame->header.reserved1
diff --git a/chromium/net/websockets/websocket_deflate_stream_test.cc b/chromium/net/websockets/websocket_deflate_stream_test.cc
index f98f092885c..c3a3b125657 100644
--- a/chromium/net/websockets/websocket_deflate_stream_test.cc
+++ b/chromium/net/websockets/websocket_deflate_stream_test.cc
@@ -169,13 +169,13 @@ class WebSocketDeflatePredictorMock : public WebSocketDeflatePredictor {
}
void AddFramesToBeInput(
const std::vector<std::unique_ptr<WebSocketFrame>>& frames) {
- for (size_t i = 0; i < frames.size(); ++i)
- AddFrameToBeInput(frames[i].get());
+ for (const auto& frame : frames)
+ AddFrameToBeInput(frame.get());
}
void VerifySentFrames(
const std::vector<std::unique_ptr<WebSocketFrame>>& frames) {
- for (size_t i = 0; i < frames.size(); ++i)
- VerifySentFrame(frames[i].get());
+ for (const auto& frame : frames)
+ VerifySentFrame(frame.get());
}
// Call this method in order to disable checks in the destructor when
// WriteFrames fails.
@@ -214,11 +214,13 @@ class WebSocketDeflateStreamTest : public ::testing::Test {
parameters.SetClientNoContextTakeOver();
}
parameters.SetClientMaxWindowBits(window_bits);
- mock_stream_ = new testing::StrictMock<MockWebSocketStream>;
- predictor_ = new WebSocketDeflatePredictorMock;
+ auto mock_stream =
+ std::make_unique<testing::StrictMock<MockWebSocketStream>>();
+ auto predictor = std::make_unique<WebSocketDeflatePredictorMock>();
+ mock_stream_ = mock_stream.get();
+ predictor_ = predictor.get();
deflate_stream_ = std::make_unique<WebSocketDeflateStream>(
- base::WrapUnique(mock_stream_.get()), parameters,
- base::WrapUnique(predictor_.get()));
+ std::move(mock_stream), parameters, std::move(predictor));
}
void AppendTo(std::vector<std::unique_ptr<WebSocketFrame>>* frames,
@@ -1192,8 +1194,7 @@ TEST_F(WebSocketDeflateStreamTest, LargeDeflatedFramesShouldBeSplit) {
ASSERT_THAT(deflate_stream_->WriteFrames(&frames, CompletionOnceCallback()),
IsOk());
for (auto& frame : *stub.frames()) {
- buffers.push_back(
- std::string(frame->payload, frame->header.payload_length));
+ buffers.emplace_back(frame->payload, frame->header.payload_length);
frame->payload = (buffers.end() - 1)->data();
}
total_compressed_frames.insert(
diff --git a/chromium/net/websockets/websocket_deflater_test.cc b/chromium/net/websockets/websocket_deflater_test.cc
index fd06bda889d..2501d745a0c 100644
--- a/chromium/net/websockets/websocket_deflater_test.cc
+++ b/chromium/net/websockets/websocket_deflater_test.cc
@@ -69,8 +69,8 @@ TEST(WebSocketDeflaterTest, MultipleAddBytesCalls) {
std::string input(32, 'a');
scoped_refptr<IOBufferWithSize> actual;
- for (size_t i = 0; i < input.size(); ++i) {
- ASSERT_TRUE(deflater.AddBytes(&input[i], 1));
+ for (char& c : input) {
+ ASSERT_TRUE(deflater.AddBytes(&c, 1));
}
ASSERT_TRUE(deflater.Finish());
actual = deflater.GetOutput(deflater.CurrentOutputSize());
diff --git a/chromium/net/websockets/websocket_end_to_end_test.cc b/chromium/net/websockets/websocket_end_to_end_test.cc
index 2eb011ca532..87b07b110e8 100644
--- a/chromium/net/websockets/websocket_end_to_end_test.cc
+++ b/chromium/net/websockets/websocket_end_to_end_test.cc
@@ -319,9 +319,10 @@ class WebSocketEndToEndTest : public TestWithTaskEnvironment {
IsolationInfo isolation_info =
IsolationInfo::Create(IsolationInfo::RequestType::kOther, origin,
origin, SiteForCookies::FromOrigin(origin));
- event_interface_ = new ConnectTestingEventInterface();
- channel_ = std::make_unique<WebSocketChannel>(
- base::WrapUnique(event_interface_.get()), context_.get());
+ auto event_interface = std::make_unique<ConnectTestingEventInterface>();
+ event_interface_ = event_interface.get();
+ channel_ = std::make_unique<WebSocketChannel>(std::move(event_interface),
+ context_.get());
channel_->SendAddChannelRequest(
GURL(socket_url), sub_protocols_, origin, site_for_cookies,
isolation_info, HttpRequestHeaders(), TRAFFIC_ANNOTATION_FOR_TESTS);
@@ -361,7 +362,7 @@ TEST_F(WebSocketEndToEndTest, DISABLED_HttpsProxyUnauthedFails) {
std::string proxy_config =
"https=" + proxy_server.host_port_pair().ToString();
std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
- ConfiguredProxyResolutionService::CreateFixed(
+ ConfiguredProxyResolutionService::CreateFixedForTest(
proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS));
ASSERT_TRUE(proxy_resolution_service);
context_builder_->set_proxy_resolution_service(
@@ -397,8 +398,9 @@ TEST_F(WebSocketEndToEndTest, MAYBE_HttpsWssProxyUnauthedFails) {
proxy_config.proxy_rules().bypass_rules.AddRulesToSubtractImplicit();
std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
- ConfiguredProxyResolutionService::CreateFixed(ProxyConfigWithAnnotation(
- proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS)));
+ ConfiguredProxyResolutionService::CreateFixedForTest(
+ ProxyConfigWithAnnotation(proxy_config,
+ TRAFFIC_ANNOTATION_FOR_TESTS)));
ASSERT_TRUE(proxy_resolution_service);
context_builder_->set_proxy_resolution_service(
std::move(proxy_resolution_service));
@@ -425,8 +427,9 @@ TEST_F(WebSocketEndToEndTest, MAYBE_HttpsProxyUsed) {
proxy_config.proxy_rules().bypass_rules.AddRulesToSubtractImplicit();
std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
- ConfiguredProxyResolutionService::CreateFixed(ProxyConfigWithAnnotation(
- proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS)));
+ ConfiguredProxyResolutionService::CreateFixedForTest(
+ ProxyConfigWithAnnotation(proxy_config,
+ TRAFFIC_ANNOTATION_FOR_TESTS)));
context_builder_->set_proxy_resolution_service(
std::move(proxy_resolution_service));
InitialiseContext();
@@ -695,7 +698,9 @@ TEST_F(WebSocketEndToEndTest, HostResolverEndpointResult) {
HostResolverEndpointResult result;
result.ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), port)};
result.metadata.supported_protocol_alpns = {"http/1.1"};
- host_resolver->rules()->AddRule(std::move(resolve_key), std::vector{result});
+ host_resolver->rules()->AddRule(
+ std::move(resolve_key),
+ MockHostResolverBase::RuleResolver::RuleResult(std::vector{result}));
context_builder_->set_host_resolver(std::move(host_resolver));
EXPECT_TRUE(ConnectAndWait(wss_url));
@@ -746,7 +751,9 @@ TEST_F(WebSocketEndToEndTest, EncryptedClientHello) {
IPEndPoint(IPAddress::IPv4Localhost(), wss_url.IntPort())};
result.metadata.supported_protocol_alpns = {"http/1.1"};
result.metadata.ech_config_list = ech_config_list;
- host_resolver->rules()->AddRule(std::move(resolve_key), std::vector{result});
+ host_resolver->rules()->AddRule(
+ std::move(resolve_key),
+ MockHostResolverBase::RuleResolver::RuleResult(std::vector{result}));
context_builder_->set_host_resolver(std::move(host_resolver));
EXPECT_FALSE(ConnectAndWait(wss_url));
diff --git a/chromium/net/websockets/websocket_event_interface.h b/chromium/net/websockets/websocket_event_interface.h
index 326caa12d9f..956732de1ce 100644
--- a/chromium/net/websockets/websocket_event_interface.h
+++ b/chromium/net/websockets/websocket_event_interface.h
@@ -39,7 +39,7 @@ class NET_EXPORT WebSocketEventInterface {
WebSocketEventInterface(const WebSocketEventInterface&) = delete;
WebSocketEventInterface& operator=(const WebSocketEventInterface&) = delete;
- virtual ~WebSocketEventInterface() {}
+ virtual ~WebSocketEventInterface() = default;
// Called when a URLRequest is created for handshaking.
virtual void OnCreateURLRequest(URLRequest* request) = 0;
@@ -117,7 +117,7 @@ class NET_EXPORT WebSocketEventInterface {
// due to layering constraints).
class NET_EXPORT SSLErrorCallbacks {
public:
- virtual ~SSLErrorCallbacks() {}
+ virtual ~SSLErrorCallbacks() = default;
// Cancels the SSL response in response to the error.
virtual void CancelSSLRequest(int error, const SSLInfo* ssl_info) = 0;
@@ -156,7 +156,7 @@ class NET_EXPORT WebSocketEventInterface {
absl::optional<AuthCredentials>* credentials) = 0;
protected:
- WebSocketEventInterface() {}
+ WebSocketEventInterface() = default;
};
} // namespace net
diff --git a/chromium/net/websockets/websocket_extension_parser_test.cc b/chromium/net/websockets/websocket_extension_parser_test.cc
index a3a6debdabe..ab4caef6bc2 100644
--- a/chromium/net/websockets/websocket_extension_parser_test.cc
+++ b/chromium/net/websockets/websocket_extension_parser_test.cc
@@ -142,9 +142,9 @@ TEST(WebSocketExtensionParserTest, InvalidPatterns) {
"foo; bar=\"baz\\" // ends with backslash
};
- for (size_t i = 0; i < std::size(patterns); ++i) {
+ for (const auto* pattern : patterns) {
WebSocketExtensionParser parser;
- EXPECT_FALSE(parser.Parse(patterns[i]));
+ EXPECT_FALSE(parser.Parse(pattern));
EXPECT_EQ(0U, parser.extensions().size());
}
}
diff --git a/chromium/net/websockets/websocket_frame_parser_test.cc b/chromium/net/websockets/websocket_frame_parser_test.cc
index f9aa351c68d..c7a9ca47d9a 100644
--- a/chromium/net/websockets/websocket_frame_parser_test.cc
+++ b/chromium/net/websockets/websocket_frame_parser_test.cc
@@ -132,10 +132,8 @@ TEST(WebSocketFrameParserTest, DecodeManyFrames) {
std::vector<char> input;
// Concatenate all frames.
- for (int i = 0; i < kNumInputs; ++i) {
- input.insert(input.end(),
- kInputs[i].frame,
- kInputs[i].frame + kInputs[i].frame_length);
+ for (const auto& data : kInputs) {
+ input.insert(input.end(), data.frame, data.frame + data.frame_length);
}
WebSocketFrameParser parser;
@@ -318,10 +316,10 @@ TEST(WebSocketFrameParserTest, DecodePartialMaskedFrame) {
}
TEST(WebSocketFrameParserTest, DecodeFramesOfVariousLengths) {
- for (int i = 0; i < kNumFrameHeaderTests; ++i) {
- const char* frame_header = kFrameHeaderTests[i].frame_header;
- size_t frame_header_length = kFrameHeaderTests[i].frame_header_length;
- uint64_t frame_length = kFrameHeaderTests[i].frame_length;
+ for (const auto& test : kFrameHeaderTests) {
+ const char* frame_header = test.frame_header;
+ size_t frame_header_length = test.frame_header_length;
+ uint64_t frame_length = test.frame_length;
std::vector<char> input(frame_header, frame_header + frame_header_length);
// Limit the payload size not to flood the console on failure.
@@ -332,10 +330,10 @@ TEST(WebSocketFrameParserTest, DecodeFramesOfVariousLengths) {
WebSocketFrameParser parser;
std::vector<std::unique_ptr<WebSocketFrameChunk>> frames;
- EXPECT_EQ(kFrameHeaderTests[i].error_code == kWebSocketNormalClosure,
+ EXPECT_EQ(test.error_code == kWebSocketNormalClosure,
parser.Decode(input.data(), input.size(), &frames));
- EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.websocket_error());
- if (kFrameHeaderTests[i].error_code != kWebSocketNormalClosure) {
+ EXPECT_EQ(test.error_code, parser.websocket_error());
+ if (test.error_code != kWebSocketNormalClosure) {
EXPECT_EQ(0u, frames.size());
} else {
EXPECT_EQ(1u, frames.size());
@@ -435,20 +433,19 @@ TEST(WebSocketFrameParserTest, InvalidLengthEncoding) {
size_t frame_header_length;
};
static const TestCase kTests[] = {
- // For frames with two-byte extended length field, the payload length
- // should be 126 (0x7E) bytes or more.
- { "\x81\x7E\x00\x00", 4 },
- { "\x81\x7E\x00\x7D", 4 },
- // For frames with eight-byte extended length field, the payload length
- // should be 0x10000 bytes or more.
- { "\x81\x7F\x00\x00\x00\x00\x00\x00\x00\x00", 10 },
- { "\x81\x7E\x00\x00\x00\x00\x00\x00\xFF\xFF", 10 },
+ // For frames with two-byte extended length field, the payload length
+ // should be 126 (0x7E) bytes or more.
+ {"\x81\x7E\x00\x00", 4},
+ {"\x81\x7E\x00\x7D", 4},
+ // For frames with eight-byte extended length field, the payload length
+ // should be 0x10000 bytes or more.
+ {"\x81\x7F\x00\x00\x00\x00\x00\x00\x00\x00", 10},
+ {"\x81\x7E\x00\x00\x00\x00\x00\x00\xFF\xFF", 10},
};
- static const int kNumTests = std::size(kTests);
- for (int i = 0; i < kNumTests; ++i) {
- const char* frame_header = kTests[i].frame_header;
- size_t frame_header_length = kTests[i].frame_header_length;
+ for (const auto& test : kTests) {
+ const char* frame_header = test.frame_header;
+ size_t frame_header_length = test.frame_header_length;
WebSocketFrameParser parser;
@@ -473,31 +470,29 @@ TEST(WebSocketFrameParserTest, FrameTypes) {
WebSocketFrameHeader::OpCode opcode;
};
static const TestCase kTests[] = {
- { "\x80\x00", 2, WebSocketFrameHeader::kOpCodeContinuation },
- { "\x81\x00", 2, WebSocketFrameHeader::kOpCodeText },
- { "\x82\x00", 2, WebSocketFrameHeader::kOpCodeBinary },
- { "\x88\x00", 2, WebSocketFrameHeader::kOpCodeClose },
- { "\x89\x00", 2, WebSocketFrameHeader::kOpCodePing },
- { "\x8A\x00", 2, WebSocketFrameHeader::kOpCodePong },
- // These are undefined opcodes, but the parser needs to be able to parse
- // them anyway.
- { "\x83\x00", 2, 0x3 },
- { "\x84\x00", 2, 0x4 },
- { "\x85\x00", 2, 0x5 },
- { "\x86\x00", 2, 0x6 },
- { "\x87\x00", 2, 0x7 },
- { "\x8B\x00", 2, 0xB },
- { "\x8C\x00", 2, 0xC },
- { "\x8D\x00", 2, 0xD },
- { "\x8E\x00", 2, 0xE },
- { "\x8F\x00", 2, 0xF }
- };
- static const int kNumTests = std::size(kTests);
-
- for (int i = 0; i < kNumTests; ++i) {
- const char* frame_header = kTests[i].frame_header;
- size_t frame_header_length = kTests[i].frame_header_length;
- WebSocketFrameHeader::OpCode opcode = kTests[i].opcode;
+ {"\x80\x00", 2, WebSocketFrameHeader::kOpCodeContinuation},
+ {"\x81\x00", 2, WebSocketFrameHeader::kOpCodeText},
+ {"\x82\x00", 2, WebSocketFrameHeader::kOpCodeBinary},
+ {"\x88\x00", 2, WebSocketFrameHeader::kOpCodeClose},
+ {"\x89\x00", 2, WebSocketFrameHeader::kOpCodePing},
+ {"\x8A\x00", 2, WebSocketFrameHeader::kOpCodePong},
+ // These are undefined opcodes, but the parser needs to be able to parse
+ // them anyway.
+ {"\x83\x00", 2, 0x3},
+ {"\x84\x00", 2, 0x4},
+ {"\x85\x00", 2, 0x5},
+ {"\x86\x00", 2, 0x6},
+ {"\x87\x00", 2, 0x7},
+ {"\x8B\x00", 2, 0xB},
+ {"\x8C\x00", 2, 0xC},
+ {"\x8D\x00", 2, 0xD},
+ {"\x8E\x00", 2, 0xE},
+ {"\x8F\x00", 2, 0xF}};
+
+ for (const auto& test : kTests) {
+ const char* frame_header = test.frame_header;
+ size_t frame_header_length = test.frame_header_length;
+ WebSocketFrameHeader::OpCode opcode = test.opcode;
WebSocketFrameParser parser;
@@ -545,15 +540,14 @@ TEST(WebSocketFrameParserTest, FinalBitAndReservedBits) {
{ "\x71\x00", 2, false, true, true, true },
{ "\xF1\x00", 2, true, true, true, true }
};
- static const int kNumTests = std::size(kTests);
-
- for (int i = 0; i < kNumTests; ++i) {
- const char* frame_header = kTests[i].frame_header;
- size_t frame_header_length = kTests[i].frame_header_length;
- bool final = kTests[i].final;
- bool reserved1 = kTests[i].reserved1;
- bool reserved2 = kTests[i].reserved2;
- bool reserved3 = kTests[i].reserved3;
+
+ for (const auto& test : kTests) {
+ const char* frame_header = test.frame_header;
+ size_t frame_header_length = test.frame_header_length;
+ bool final = test.final;
+ bool reserved1 = test.reserved1;
+ bool reserved2 = test.reserved2;
+ bool reserved3 = test.reserved3;
WebSocketFrameParser parser;
diff --git a/chromium/net/websockets/websocket_frame_test.cc b/chromium/net/websockets/websocket_frame_test.cc
index 748068a82a0..268a476e099 100644
--- a/chromium/net/websockets/websocket_frame_test.cc
+++ b/chromium/net/websockets/websocket_frame_test.cc
@@ -24,24 +24,21 @@ TEST(WebSocketFrameHeaderTest, FrameLengths) {
uint64_t frame_length;
};
static const TestCase kTests[] = {
- { "\x81\x00", 2, UINT64_C(0) },
- { "\x81\x7D", 2, UINT64_C(125) },
- { "\x81\x7E\x00\x7E", 4, UINT64_C(126) },
- { "\x81\x7E\xFF\xFF", 4, UINT64_C(0xFFFF) },
- { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, UINT64_C(0x10000) },
- { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10,
- UINT64_C(0x7FFFFFFFFFFFFFFF) }
- };
- static const int kNumTests = std::size(kTests);
-
- for (int i = 0; i < kNumTests; ++i) {
+ {"\x81\x00", 2, UINT64_C(0)},
+ {"\x81\x7D", 2, UINT64_C(125)},
+ {"\x81\x7E\x00\x7E", 4, UINT64_C(126)},
+ {"\x81\x7E\xFF\xFF", 4, UINT64_C(0xFFFF)},
+ {"\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, UINT64_C(0x10000)},
+ {"\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10,
+ UINT64_C(0x7FFFFFFFFFFFFFFF)}};
+
+ for (const auto& test : kTests) {
WebSocketFrameHeader header(WebSocketFrameHeader::kOpCodeText);
header.final = true;
- header.payload_length = kTests[i].frame_length;
+ header.payload_length = test.frame_length;
std::vector<char> expected_output(
- kTests[i].frame_header,
- kTests[i].frame_header + kTests[i].frame_header_length);
+ test.frame_header, test.frame_header + test.frame_header_length);
std::vector<char> output(expected_output.size());
EXPECT_EQ(static_cast<int>(expected_output.size()),
WriteWebSocketFrameHeader(header, nullptr, output.data(),
@@ -62,31 +59,28 @@ TEST(WebSocketFrameHeaderTest, FrameLengthsWithMasking) {
uint64_t frame_length;
};
static const TestCase kTests[] = {
- { "\x81\x80\xDE\xAD\xBE\xEF", 6, UINT64_C(0) },
- { "\x81\xFD\xDE\xAD\xBE\xEF", 6, UINT64_C(125) },
- { "\x81\xFE\x00\x7E\xDE\xAD\xBE\xEF", 8, UINT64_C(126) },
- { "\x81\xFE\xFF\xFF\xDE\xAD\xBE\xEF", 8, UINT64_C(0xFFFF) },
- { "\x81\xFF\x00\x00\x00\x00\x00\x01\x00\x00\xDE\xAD\xBE\xEF", 14,
- UINT64_C(0x10000) },
- { "\x81\xFF\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xDE\xAD\xBE\xEF", 14,
- UINT64_C(0x7FFFFFFFFFFFFFFF) }
- };
- static const int kNumTests = std::size(kTests);
+ {"\x81\x80\xDE\xAD\xBE\xEF", 6, UINT64_C(0)},
+ {"\x81\xFD\xDE\xAD\xBE\xEF", 6, UINT64_C(125)},
+ {"\x81\xFE\x00\x7E\xDE\xAD\xBE\xEF", 8, UINT64_C(126)},
+ {"\x81\xFE\xFF\xFF\xDE\xAD\xBE\xEF", 8, UINT64_C(0xFFFF)},
+ {"\x81\xFF\x00\x00\x00\x00\x00\x01\x00\x00\xDE\xAD\xBE\xEF", 14,
+ UINT64_C(0x10000)},
+ {"\x81\xFF\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xDE\xAD\xBE\xEF", 14,
+ UINT64_C(0x7FFFFFFFFFFFFFFF)}};
WebSocketMaskingKey masking_key;
std::copy(kMaskingKey,
kMaskingKey + WebSocketFrameHeader::kMaskingKeyLength,
masking_key.key);
- for (int i = 0; i < kNumTests; ++i) {
+ for (const auto& test : kTests) {
WebSocketFrameHeader header(WebSocketFrameHeader::kOpCodeText);
header.final = true;
header.masked = true;
- header.payload_length = kTests[i].frame_length;
+ header.payload_length = test.frame_length;
std::vector<char> expected_output(
- kTests[i].frame_header,
- kTests[i].frame_header + kTests[i].frame_header_length);
+ test.frame_header, test.frame_header + test.frame_header_length);
std::vector<char> output(expected_output.size());
EXPECT_EQ(static_cast<int>(expected_output.size()),
WriteWebSocketFrameHeader(header, &masking_key, output.data(),
@@ -102,34 +96,31 @@ TEST(WebSocketFrameHeaderTest, FrameOpCodes) {
WebSocketFrameHeader::OpCode opcode;
};
static const TestCase kTests[] = {
- { "\x80\x00", 2, WebSocketFrameHeader::kOpCodeContinuation },
- { "\x81\x00", 2, WebSocketFrameHeader::kOpCodeText },
- { "\x82\x00", 2, WebSocketFrameHeader::kOpCodeBinary },
- { "\x88\x00", 2, WebSocketFrameHeader::kOpCodeClose },
- { "\x89\x00", 2, WebSocketFrameHeader::kOpCodePing },
- { "\x8A\x00", 2, WebSocketFrameHeader::kOpCodePong },
- // These are undefined opcodes, but the builder should accept them anyway.
- { "\x83\x00", 2, 0x3 },
- { "\x84\x00", 2, 0x4 },
- { "\x85\x00", 2, 0x5 },
- { "\x86\x00", 2, 0x6 },
- { "\x87\x00", 2, 0x7 },
- { "\x8B\x00", 2, 0xB },
- { "\x8C\x00", 2, 0xC },
- { "\x8D\x00", 2, 0xD },
- { "\x8E\x00", 2, 0xE },
- { "\x8F\x00", 2, 0xF }
- };
- static const int kNumTests = std::size(kTests);
-
- for (int i = 0; i < kNumTests; ++i) {
- WebSocketFrameHeader header(kTests[i].opcode);
+ {"\x80\x00", 2, WebSocketFrameHeader::kOpCodeContinuation},
+ {"\x81\x00", 2, WebSocketFrameHeader::kOpCodeText},
+ {"\x82\x00", 2, WebSocketFrameHeader::kOpCodeBinary},
+ {"\x88\x00", 2, WebSocketFrameHeader::kOpCodeClose},
+ {"\x89\x00", 2, WebSocketFrameHeader::kOpCodePing},
+ {"\x8A\x00", 2, WebSocketFrameHeader::kOpCodePong},
+ // These are undefined opcodes, but the builder should accept them anyway.
+ {"\x83\x00", 2, 0x3},
+ {"\x84\x00", 2, 0x4},
+ {"\x85\x00", 2, 0x5},
+ {"\x86\x00", 2, 0x6},
+ {"\x87\x00", 2, 0x7},
+ {"\x8B\x00", 2, 0xB},
+ {"\x8C\x00", 2, 0xC},
+ {"\x8D\x00", 2, 0xD},
+ {"\x8E\x00", 2, 0xE},
+ {"\x8F\x00", 2, 0xF}};
+
+ for (const auto& test : kTests) {
+ WebSocketFrameHeader header(test.opcode);
header.final = true;
header.payload_length = 0;
std::vector<char> expected_output(
- kTests[i].frame_header,
- kTests[i].frame_header + kTests[i].frame_header_length);
+ test.frame_header, test.frame_header + test.frame_header_length);
std::vector<char> output(expected_output.size());
EXPECT_EQ(static_cast<int>(expected_output.size()),
WriteWebSocketFrameHeader(header, nullptr, output.data(),
@@ -147,28 +138,24 @@ TEST(WebSocketFrameHeaderTest, FinalBitAndReservedBits) {
bool reserved2;
bool reserved3;
};
- static const TestCase kTests[] = {
- { "\x81\x00", 2, true, false, false, false },
- { "\x01\x00", 2, false, false, false, false },
- { "\xC1\x00", 2, true, true, false, false },
- { "\xA1\x00", 2, true, false, true, false },
- { "\x91\x00", 2, true, false, false, true },
- { "\x71\x00", 2, false, true, true, true },
- { "\xF1\x00", 2, true, true, true, true }
- };
- static const int kNumTests = std::size(kTests);
-
- for (int i = 0; i < kNumTests; ++i) {
+ static const TestCase kTests[] = {{"\x81\x00", 2, true, false, false, false},
+ {"\x01\x00", 2, false, false, false, false},
+ {"\xC1\x00", 2, true, true, false, false},
+ {"\xA1\x00", 2, true, false, true, false},
+ {"\x91\x00", 2, true, false, false, true},
+ {"\x71\x00", 2, false, true, true, true},
+ {"\xF1\x00", 2, true, true, true, true}};
+
+ for (const auto& test : kTests) {
WebSocketFrameHeader header(WebSocketFrameHeader::kOpCodeText);
- header.final = kTests[i].final;
- header.reserved1 = kTests[i].reserved1;
- header.reserved2 = kTests[i].reserved2;
- header.reserved3 = kTests[i].reserved3;
+ header.final = test.final;
+ header.reserved1 = test.reserved1;
+ header.reserved2 = test.reserved2;
+ header.reserved3 = test.reserved3;
header.payload_length = 0;
std::vector<char> expected_output(
- kTests[i].frame_header,
- kTests[i].frame_header + kTests[i].frame_header_length);
+ test.frame_header, test.frame_header + test.frame_header_length);
std::vector<char> output(expected_output.size());
EXPECT_EQ(static_cast<int>(expected_output.size()),
WriteWebSocketFrameHeader(header, nullptr, output.data(),
@@ -183,34 +170,31 @@ TEST(WebSocketFrameHeaderTest, InsufficientBufferSize) {
bool masked;
size_t expected_header_size;
};
- static const TestCase kTests[] = {
- { UINT64_C(0), false, 2u },
- { UINT64_C(125), false, 2u },
- { UINT64_C(126), false, 4u },
- { UINT64_C(0xFFFF), false, 4u },
- { UINT64_C(0x10000), false, 10u },
- { UINT64_C(0x7FFFFFFFFFFFFFFF), false, 10u },
- { UINT64_C(0), true, 6u },
- { UINT64_C(125), true, 6u },
- { UINT64_C(126), true, 8u },
- { UINT64_C(0xFFFF), true, 8u },
- { UINT64_C(0x10000), true, 14u },
- { UINT64_C(0x7FFFFFFFFFFFFFFF), true, 14u }
- };
- static const int kNumTests = std::size(kTests);
-
- for (int i = 0; i < kNumTests; ++i) {
+ static const TestCase kTests[] = {{UINT64_C(0), false, 2u},
+ {UINT64_C(125), false, 2u},
+ {UINT64_C(126), false, 4u},
+ {UINT64_C(0xFFFF), false, 4u},
+ {UINT64_C(0x10000), false, 10u},
+ {UINT64_C(0x7FFFFFFFFFFFFFFF), false, 10u},
+ {UINT64_C(0), true, 6u},
+ {UINT64_C(125), true, 6u},
+ {UINT64_C(126), true, 8u},
+ {UINT64_C(0xFFFF), true, 8u},
+ {UINT64_C(0x10000), true, 14u},
+ {UINT64_C(0x7FFFFFFFFFFFFFFF), true, 14u}};
+
+ for (const auto& test : kTests) {
WebSocketFrameHeader header(WebSocketFrameHeader::kOpCodeText);
header.final = true;
header.opcode = WebSocketFrameHeader::kOpCodeText;
- header.masked = kTests[i].masked;
- header.payload_length = kTests[i].payload_length;
+ header.masked = test.masked;
+ header.payload_length = test.payload_length;
char dummy_buffer[14];
// Set an insufficient size to |buffer_size|.
EXPECT_EQ(ERR_INVALID_ARGUMENT,
WriteWebSocketFrameHeader(header, nullptr, dummy_buffer,
- kTests[i].expected_header_size - 1));
+ test.expected_header_size - 1));
}
}
@@ -223,30 +207,28 @@ TEST(WebSocketFrameTest, MaskPayload) {
size_t data_length;
};
static const TestCase kTests[] = {
- { "\xDE\xAD\xBE\xEF", 0, "FooBar", "\x98\xC2\xD1\xAD\xBF\xDF", 6 },
- { "\xDE\xAD\xBE\xEF", 1, "FooBar", "\xEB\xD1\x80\x9C\xCC\xCC", 6 },
- { "\xDE\xAD\xBE\xEF", 2, "FooBar", "\xF8\x80\xB1\xEF\xDF\x9D", 6 },
- { "\xDE\xAD\xBE\xEF", 3, "FooBar", "\xA9\xB1\xC2\xFC\x8E\xAC", 6 },
- { "\xDE\xAD\xBE\xEF", 4, "FooBar", "\x98\xC2\xD1\xAD\xBF\xDF", 6 },
- { "\xDE\xAD\xBE\xEF", 42, "FooBar", "\xF8\x80\xB1\xEF\xDF\x9D", 6 },
- { "\xDE\xAD\xBE\xEF", 0, "", "", 0 },
- { "\xDE\xAD\xBE\xEF", 0, "\xDE\xAD\xBE\xEF", "\x00\x00\x00\x00", 4 },
- { "\xDE\xAD\xBE\xEF", 0, "\x00\x00\x00\x00", "\xDE\xAD\xBE\xEF", 4 },
- { "\x00\x00\x00\x00", 0, "FooBar", "FooBar", 6 },
- { "\xFF\xFF\xFF\xFF", 0, "FooBar", "\xB9\x90\x90\xBD\x9E\x8D", 6 },
+ {"\xDE\xAD\xBE\xEF", 0, "FooBar", "\x98\xC2\xD1\xAD\xBF\xDF", 6},
+ {"\xDE\xAD\xBE\xEF", 1, "FooBar", "\xEB\xD1\x80\x9C\xCC\xCC", 6},
+ {"\xDE\xAD\xBE\xEF", 2, "FooBar", "\xF8\x80\xB1\xEF\xDF\x9D", 6},
+ {"\xDE\xAD\xBE\xEF", 3, "FooBar", "\xA9\xB1\xC2\xFC\x8E\xAC", 6},
+ {"\xDE\xAD\xBE\xEF", 4, "FooBar", "\x98\xC2\xD1\xAD\xBF\xDF", 6},
+ {"\xDE\xAD\xBE\xEF", 42, "FooBar", "\xF8\x80\xB1\xEF\xDF\x9D", 6},
+ {"\xDE\xAD\xBE\xEF", 0, "", "", 0},
+ {"\xDE\xAD\xBE\xEF", 0, "\xDE\xAD\xBE\xEF", "\x00\x00\x00\x00", 4},
+ {"\xDE\xAD\xBE\xEF", 0, "\x00\x00\x00\x00", "\xDE\xAD\xBE\xEF", 4},
+ {"\x00\x00\x00\x00", 0, "FooBar", "FooBar", 6},
+ {"\xFF\xFF\xFF\xFF", 0, "FooBar", "\xB9\x90\x90\xBD\x9E\x8D", 6},
};
- static const int kNumTests = std::size(kTests);
- for (int i = 0; i < kNumTests; ++i) {
+ for (const auto& test : kTests) {
WebSocketMaskingKey masking_key;
- std::copy(kTests[i].masking_key,
- kTests[i].masking_key + WebSocketFrameHeader::kMaskingKeyLength,
+ std::copy(test.masking_key,
+ test.masking_key + WebSocketFrameHeader::kMaskingKeyLength,
masking_key.key);
- std::vector<char> frame_data(kTests[i].input,
- kTests[i].input + kTests[i].data_length);
- std::vector<char> expected_output(kTests[i].output,
- kTests[i].output + kTests[i].data_length);
- MaskWebSocketFramePayload(masking_key, kTests[i].frame_offset,
+ std::vector<char> frame_data(test.input, test.input + test.data_length);
+ std::vector<char> expected_output(test.output,
+ test.output + test.data_length);
+ MaskWebSocketFramePayload(masking_key, test.frame_offset,
frame_data.empty() ? nullptr : frame_data.data(),
frame_data.size());
EXPECT_EQ(expected_output, frame_data);
diff --git a/chromium/net/websockets/websocket_handshake_constants.cc b/chromium/net/websockets/websocket_handshake_constants.cc
index 4bd4bd119d9..8b90373be2f 100644
--- a/chromium/net/websockets/websocket_handshake_constants.cc
+++ b/chromium/net/websockets/websocket_handshake_constants.cc
@@ -4,8 +4,7 @@
#include "net/websockets/websocket_handshake_constants.h"
-namespace net {
-namespace websockets {
+namespace net::websockets {
const char kHttpProtocolVersion[] = "HTTP/1.1";
@@ -24,5 +23,4 @@ const char kWebSocketGuid[] = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
const char kWebSocketLowercase[] = "websocket";
-} // namespace websockets
-} // namespace net
+} // namespace net::websockets
diff --git a/chromium/net/websockets/websocket_handshake_constants.h b/chromium/net/websockets/websocket_handshake_constants.h
index 3794d3ffafe..89c92612ff6 100644
--- a/chromium/net/websockets/websocket_handshake_constants.h
+++ b/chromium/net/websockets/websocket_handshake_constants.h
@@ -18,8 +18,7 @@
// This file plases constants inside the ::net::websockets namespace to avoid
// risk of collisions with other symbols in libnet.
-namespace net {
-namespace websockets {
+namespace net::websockets {
// "HTTP/1.1"
// RFC6455 only requires HTTP/1.1 "or better" but in practice an HTTP version
@@ -60,7 +59,6 @@ extern const char NET_EXPORT kWebSocketGuid[];
// (except in obsolete versions of the protocol).
extern const char kWebSocketLowercase[];
-} // namespace websockets
-} // namespace net
+} // namespace net::websockets
#endif // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_CONSTANTS_H_
diff --git a/chromium/net/websockets/websocket_handshake_stream_base.h b/chromium/net/websockets/websocket_handshake_stream_base.h
index 66cfde2eb3c..9cb7f0949cc 100644
--- a/chromium/net/websockets/websocket_handshake_stream_base.h
+++ b/chromium/net/websockets/websocket_handshake_stream_base.h
@@ -95,7 +95,7 @@ class NET_EXPORT WebSocketHandshakeStreamBase : public HttpStream {
// WebSocket connection.
class NET_EXPORT_PRIVATE CreateHelper : public base::SupportsUserData::Data {
public:
- ~CreateHelper() override {}
+ ~CreateHelper() override = default;
// Create a WebSocketBasicHandshakeStream. This is called after the
// underlying connection has been established but before any handshake data
diff --git a/chromium/net/websockets/websocket_http2_handshake_stream.cc b/chromium/net/websockets/websocket_http2_handshake_stream.cc
index dfbe5038d69..f8fa7e1abe8 100644
--- a/chromium/net/websockets/websocket_http2_handshake_stream.cc
+++ b/chromium/net/websockets/websocket_http2_handshake_stream.cc
@@ -235,7 +235,8 @@ void WebSocketHttp2HandshakeStream::SetPriority(RequestPriority priority) {
stream_->SetPriority(priority_);
}
-HttpStream* WebSocketHttp2HandshakeStream::RenewStreamForAuth() {
+std::unique_ptr<HttpStream>
+WebSocketHttp2HandshakeStream::RenewStreamForAuth() {
// Renewing the stream is not supported.
return nullptr;
}
@@ -296,8 +297,6 @@ void WebSocketHttp2HandshakeStream::OnHeadersReceived(
http_response_info_->alpn_negotiated_protocol =
HttpResponseInfo::ConnectionInfoToString(
http_response_info_->connection_info);
- http_response_info_->vary_data.Init(*request_info_,
- *http_response_info_->headers.get());
if (callback_)
std::move(callback_).Run(ValidateResponse());
diff --git a/chromium/net/websockets/websocket_http2_handshake_stream.h b/chromium/net/websockets/websocket_http2_handshake_stream.h
index f04e76d8428..feec88f7020 100644
--- a/chromium/net/websockets/websocket_http2_handshake_stream.h
+++ b/chromium/net/websockets/websocket_http2_handshake_stream.h
@@ -20,7 +20,7 @@
#include "net/base/net_export.h"
#include "net/base/request_priority.h"
#include "net/log/net_log_with_source.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/websockets/websocket_basic_stream_adapters.h"
#include "net/websockets/websocket_handshake_stream_base.h"
#include "net/websockets/websocket_stream.h"
@@ -92,7 +92,7 @@ class NET_EXPORT_PRIVATE WebSocketHttp2HandshakeStream
void Drain(HttpNetworkSession* session) override;
void SetPriority(RequestPriority priority) override;
void PopulateNetErrorDetails(NetErrorDetails* details) override;
- HttpStream* RenewStreamForAuth() override;
+ std::unique_ptr<HttpStream> RenewStreamForAuth() override;
const std::set<std::string>& GetDnsAliases() const override;
base::StringPiece GetAcceptChViaAlps() const override;
diff --git a/chromium/net/websockets/websocket_inflater_test.cc b/chromium/net/websockets/websocket_inflater_test.cc
index 29c92c000e8..ad2eda35a71 100644
--- a/chromium/net/websockets/websocket_inflater_test.cc
+++ b/chromium/net/websockets/websocket_inflater_test.cc
@@ -101,8 +101,8 @@ TEST(WebSocketInflaterTest, MultipleAddBytesCalls) {
std::string input("\xf2\x48\xcd\xc9\xc9\x07\x00", 7);
scoped_refptr<IOBufferWithSize> actual;
- for (size_t i = 0; i < input.size(); ++i) {
- ASSERT_TRUE(inflater.AddBytes(&input[i], 1));
+ for (char& c : input) {
+ ASSERT_TRUE(inflater.AddBytes(&c, 1));
}
ASSERT_TRUE(inflater.Finish());
actual = inflater.GetOutput(5);
diff --git a/chromium/net/websockets/websocket_stream_create_test_base.cc b/chromium/net/websockets/websocket_stream_create_test_base.cc
index 2c60fdfdca6..08f27ae76cd 100644
--- a/chromium/net/websockets/websocket_stream_create_test_base.cc
+++ b/chromium/net/websockets/websocket_stream_create_test_base.cc
@@ -122,7 +122,7 @@ WebSocketStreamCreateTestBase::RequestHeadersToVector(
HttpRequestHeaders::Iterator it(headers);
std::vector<HeaderKeyValuePair> result;
while (it.GetNext())
- result.push_back(HeaderKeyValuePair(it.name(), it.value()));
+ result.emplace_back(it.name(), it.value());
return result;
}
@@ -133,7 +133,7 @@ WebSocketStreamCreateTestBase::ResponseHeadersToVector(
std::string name, value;
std::vector<HeaderKeyValuePair> result;
while (headers.EnumerateHeaderLines(&iter, &name, &value))
- result.push_back(HeaderKeyValuePair(name, value));
+ result.emplace_back(name, value);
return result;
}
diff --git a/chromium/net/websockets/websocket_stream_test.cc b/chromium/net/websockets/websocket_stream_test.cc
index a7b9fe8764e..1b7c0e817fa 100644
--- a/chromium/net/websockets/websocket_stream_test.cc
+++ b/chromium/net/websockets/websocket_stream_test.cc
@@ -79,7 +79,7 @@ std::unique_ptr<SequencedSocketData> BuildNullSocketData() {
class MockWeakTimer : public base::MockOneShotTimer,
public base::SupportsWeakPtr<MockWeakTimer> {
public:
- MockWeakTimer() {}
+ MockWeakTimer() = default;
};
const char kOrigin[] = "http://www.example.org";
@@ -183,10 +183,9 @@ class WebSocketStreamCreateTest : public TestWithParam<HandshakeStreamType>,
// connection preface, initial settings, and window update.
// HTTP/2 connection preface.
- frames_.push_back(spdy::SpdySerializedFrame(
- const_cast<char*>(spdy::kHttp2ConnectionHeaderPrefix),
- spdy::kHttp2ConnectionHeaderPrefixSize,
- /* owns_buffer = */ false));
+ frames_.emplace_back(const_cast<char*>(spdy::kHttp2ConnectionHeaderPrefix),
+ spdy::kHttp2ConnectionHeaderPrefixSize,
+ /* owns_buffer = */ false);
AddWrite(&frames_.back());
// Server advertises WebSockets over HTTP/2 support.
@@ -203,6 +202,7 @@ class WebSocketStreamCreateTest : public TestWithParam<HandshakeStreamType>,
write_settings[spdy::SETTINGS_INITIAL_WINDOW_SIZE] = 6 * 1024 * 1024;
write_settings[spdy::SETTINGS_MAX_HEADER_LIST_SIZE] =
kSpdyMaxHeaderListSize;
+ write_settings[spdy::SETTINGS_ENABLE_PUSH] = 0;
frames_.push_back(spdy_util_.ConstructSpdySettings(write_settings));
AddWrite(&frames_.back());
@@ -284,7 +284,7 @@ class WebSocketStreamCreateTest : public TestWithParam<HandshakeStreamType>,
}
// EOF.
- reads_.push_back(MockRead(ASYNC, 0, sequence_number_++));
+ reads_.emplace_back(ASYNC, 0, sequence_number_++);
auto socket_data = std::make_unique<SequencedSocketData>(reads_, writes_);
socket_data->set_connect_data(MockConnect(SYNCHRONOUS, OK));
@@ -377,13 +377,13 @@ class WebSocketStreamCreateTest : public TestWithParam<HandshakeStreamType>,
private:
void AddWrite(const spdy::SpdySerializedFrame* frame) {
- writes_.push_back(
- MockWrite(ASYNC, frame->data(), frame->size(), sequence_number_++));
+ writes_.emplace_back(ASYNC, frame->data(), frame->size(),
+ sequence_number_++);
}
void AddRead(const spdy::SpdySerializedFrame* frame) {
- reads_.push_back(
- MockRead(ASYNC, frame->data(), frame->size(), sequence_number_++));
+ reads_.emplace_back(ASYNC, frame->data(), frame->size(),
+ sequence_number_++);
}
protected:
@@ -1323,14 +1323,14 @@ TEST_P(WebSocketStreamCreateTest, CancellationDuringConnect) {
TEST_P(WebSocketStreamCreateTest, CancellationDuringWrite) {
// First write never completes.
MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 0)};
- SequencedSocketData* socket_data(
- new SequencedSocketData(base::span<MockRead>(), writes));
+ auto socket_data =
+ std::make_unique<SequencedSocketData>(base::span<MockRead>(), writes);
+ auto* socket_data_ptr = socket_data.get();
socket_data->set_connect_data(MockConnect(SYNCHRONOUS, OK));
CreateAndConnectRawExpectations("ws://www.example.org/", NoSubProtocols(),
- HttpRequestHeaders(),
- base::WrapUnique(socket_data));
+ HttpRequestHeaders(), std::move(socket_data));
base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(socket_data->AllWriteDataConsumed());
+ EXPECT_TRUE(socket_data_ptr->AllWriteDataConsumed());
stream_request_.reset();
// WaitUntilConnectDone doesn't work in this case.
base::RunLoop().RunUntilIdle();
diff --git a/chromium/net/websockets/websocket_test_util.cc b/chromium/net/websockets/websocket_test_util.cc
index 65c615a2ff4..6d8a39da150 100644
--- a/chromium/net/websockets/websocket_test_util.cc
+++ b/chromium/net/websockets/websocket_test_util.cc
@@ -206,11 +206,11 @@ void WebSocketMockClientSocketFactoryMaker::SetExpectations(
// detail into account if |return_to_read| is big enough.
for (size_t place = 0; place < detail_->return_to_read.size();
place += kHttpStreamParserBufferSize) {
- detail_->reads.push_back(
- MockRead(SYNCHRONOUS, detail_->return_to_read.data() + place,
- std::min(detail_->return_to_read.size() - place,
- kHttpStreamParserBufferSize),
- sequence++));
+ detail_->reads.emplace_back(SYNCHRONOUS,
+ detail_->return_to_read.data() + place,
+ std::min(detail_->return_to_read.size() - place,
+ kHttpStreamParserBufferSize),
+ sequence++);
}
auto socket_data = std::make_unique<SequencedSocketData>(
detail_->reads, base::make_span(&detail_->write, 1));
@@ -257,8 +257,9 @@ void WebSocketTestURLRequestContextHost::AddSSLSocketDataProvider(
void WebSocketTestURLRequestContextHost::SetProxyConfig(
const std::string& proxy_rules) {
DCHECK(!url_request_context_);
- auto proxy_resolution_service = ConfiguredProxyResolutionService::CreateFixed(
- proxy_rules, TRAFFIC_ANNOTATION_FOR_TESTS);
+ auto proxy_resolution_service =
+ ConfiguredProxyResolutionService::CreateFixedForTest(
+ proxy_rules, TRAFFIC_ANNOTATION_FOR_TESTS);
url_request_context_builder_->set_proxy_resolution_service(
std::move(proxy_resolution_service));
}
diff --git a/chromium/net/websockets/websocket_test_util.h b/chromium/net/websockets/websocket_test_util.h
index 43314e8f480..82dff864a8d 100644
--- a/chromium/net/websockets/websocket_test_util.h
+++ b/chromium/net/websockets/websocket_test_util.h
@@ -16,7 +16,7 @@
#include "net/http/http_request_headers.h"
#include "net/http/http_stream_parser.h"
#include "net/socket/client_socket_handle.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_header_block.h"
+#include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "net/url_request/url_request_test_util.h"
#include "net/websockets/websocket_handshake_stream_create_helper.h"